我现在对 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 会抛出一个错误,因为 plus,minus,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 - *
并且语法会比实际情况更复杂。
希望你们能帮助我