Parsing Antlr4语法左递归错误
我现在对antlr4有很大的问题。Parsing Antlr4语法左递归错误,parsing,recursion,grammar,antlr4,rpn,Parsing,Recursion,Grammar,Antlr4,Rpn,我现在对antlr4有很大的问题。 每当我试图用这个RPN语法来喂antlr时 grammar UPN; //Parser expression : plus | minus | mult | div | NUMBER; plus : expression expression '+'; minus : expression expression '-'; mult : expression expression '*';
每当我试图用这个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将抛出错误,因为加号、减号、mult和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;
顺便说一句,
23+54-*
不是有效的RPN表达式:它必须以两个数字开头。谢谢,它可以工作!顺便说一句,我只是没有在那里添加空格;)