我想编写一个词法分析器和解析器,它可以使用像
这样的表达式(4+y)*8
4+5*x
(3)+(z*(4+w))*6
然后考虑乘法优先于加法来解析它们。特别是,我无法弄清楚如何避免
4+5*x
被分组为
MULTIPLICATION(ADDITION(4,5),5) instead of ADDITION(4+MULTIPLICATION)
我的词霸似乎是这样的:
PLUS : '+';
TIMES : '*';
NUMBER : [0-9]+'.'?[0-9]*;
VARIABLE : [(a-z)|(A-Z)]+;
OPENING : '(';
CLOSING : ')';
WHITESPACE : [ \t\r\n]+ -> skip ;
答案 0 :(得分:1)
如果您定义的优先级较低的操作更接近“根表达式”规则而不是优先级较高的操作,则会自动进行正确的分组:
expr
: e=multDivExpr
( PLUS e=multDivExpr
| MINUS e=multDivExpr
)*
;
multDivExpr
: e=atomExpr
( TIMES e=atom
| DIV e=atom
| REM e=atom
)*
;
atom
: NUMBER
| VARIABLE
| OPENING e=expr CLOSING
;
理解正在发生的事情的一种简单方法是认为ANTLR生成的递归下降解析器将使用multDivExpr
非终端作为“添加”expr
非终端的“构建块”因此,在考虑加法和减法之前,应用分组进行乘法和除法。