如何在antlr中实现分组首选项?

时间:2013-10-06 18:42:32

标签: regex parsing antlr

我想编写一个词法分析器和解析器,它可以使用像

这样的表达式
(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 ;

1 个答案:

答案 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非终端的“构建块”因此,在考虑加法和减法之前,应用分组进行乘法和除法。