Antlr4语法左递归错误
题
我现在对antlr4有很大的问题。
每当我尝试使用此RPN语法提取ANTLR
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
plus : expression expression '+';
minus : expression expression '-';
mult : expression expression '*';
div : expression expression '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
antlr将抛出错误,因为加上,减去,multi和div是相互留下的。
我不知道如何解决这个问题。
(我知道这是因为这个语法“表达”可以无限循环,我之前有过这个问题,但我可以自己解决这个问题)
我的唯一解决方案是以以下方式限制语法
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
exp2 : plus2 | minus2 | mult2 | div2 | NUMBER;
plus : exp2 exp2'+';
minus : exp2 exp2'-';
mult: exp2 exp2'*';
div: exp2 exp2'/';
plus2 : NUMBER NUMBER '+';
minus2 : NUMBER NUMBER '-';
mult2: NUMBER NUMBER '*';
div2: NUMBER NUMBER '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
但这并不是真的我想要的是,因为现在我可以最大限度地工作,如
这样的表达式2 3 + 5 4 - *
.
和语法将比实际上更复杂。
希望你们可以帮助我
解决方案
antlr4仅支持“直接”左递归规则,而不是“间接”,就像您拥有它们一样。
尝试这样的东西:
grammar RPN;
parse : expression EOF;
expression
: expression expression '+'
| expression expression '-'
| expression expression '*'
| expression expression '/'
| NUMBER
;
NUMBER : '-'? ('0'..'9')+;
SPACES : [ \t\r\n] -> skip;
.
btw,23+54-*
不是有效的RPN表达式:它必须以两个数字开头。
不隶属于 StackOverflow