如何识别jison中的重复标记?
How to recognize repetition of tokens in jison?
TL;TR
这个练习的 objective 是检测某个标记的重复,我试图用正则表达式中的 * 符号来做,但它不起作用。
问题描述
我正在做一个基本的转译器,它包括用已经定义的语法翻译某些语法。在定义多个标记的检测时,我仍然有一些缺点。也就是说,使用*来指定一个正则表达式的重复(我认为*
是用来定义一个令牌的重复),例如(见SENTENCE*
):
FUNCTION
: DEF ID PAR_OPEN PAR_CLOSE
SENTENCE*
END
{ $$ = 'function ' + + '(){' + + '}' };
SENTENCE
: PRINT
| VAR_ASSIGN
|;
语法适用于输入:
def hello()
println "dsasd"
end
但它不适用于条目:
def hello()
a = 3
println "dsasd"
end
抛出的错误是:
bash
Error: Parse error on line 3:
...llo() a = 3 println "dsasd"end
---------------------^
Expecting 'EOF', '+', 'OR', 'AND', '=', '<>', '-', '*', '/', '>', '<', '>=', '<=','^', 'PAR_CLOSE', '%', 'END', got 'PRINTLN'
你能告诉我我做错了什么吗?
See Gist complete code
通过在语法中添加 %ebnf
解决。参见 here
TL;TR
这个练习的 objective 是检测某个标记的重复,我试图用正则表达式中的 * 符号来做,但它不起作用。
问题描述
我正在做一个基本的转译器,它包括用已经定义的语法翻译某些语法。在定义多个标记的检测时,我仍然有一些缺点。也就是说,使用*来指定一个正则表达式的重复(我认为*
是用来定义一个令牌的重复),例如(见SENTENCE*
):
FUNCTION
: DEF ID PAR_OPEN PAR_CLOSE
SENTENCE*
END
{ $$ = 'function ' + + '(){' + + '}' };
SENTENCE
: PRINT
| VAR_ASSIGN
|;
语法适用于输入:
def hello()
println "dsasd"
end
但它不适用于条目:
def hello()
a = 3
println "dsasd"
end
抛出的错误是:
bash
Error: Parse error on line 3:
...llo() a = 3 println "dsasd"end
---------------------^
Expecting 'EOF', '+', 'OR', 'AND', '=', '<>', '-', '*', '/', '>', '<', '>=', '<=','^', 'PAR_CLOSE', '%', 'END', got 'PRINTLN'
你能告诉我我做错了什么吗?
See Gist complete code
通过在语法中添加 %ebnf
解决。参见 here