1

我想写一个词法分析器和解析器,它可以接受像这样的表达式

(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 ;
4

1 回答 1

2

如果您将低优先级操作定义为比高优先级更接近“根表达式”规则,则正确的分组将自动发生:

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非终结符的“构建块”,因此在考虑加法和除法之前将分组应用于乘法和除法减法。

于 2013-10-06T18:49:52.783 回答