计算器语法中的优先顺序

时间:2019-09-05 19:58:08

标签: antlr antlr4

我开始研究ANTLR,目前正在通过“权威ANTLR4”参考,想知道为什么在计算器示例中优先顺序有效?使用的语法是:

grammar LabeledExpr; 

prog:   stat+ ;

stat:   expr NEWLINE                # printExpr
    |   ID '=' expr NEWLINE         # assign
    |   NEWLINE                     # blank
    |   CLEAR                       # clearMemory
    ;

expr:   expr op=('*'|'/') expr      # MulDiv
    |   expr op=('+'|'-') expr      # AddSub
    |   INT                         # int
    |   ID                          # id
    |   '(' expr ')'                # parens
    ;

CLEAR: 'clear';

MUL :   '*' ; // assigns token name to '*' used above in grammar
DIV :   '/' ;

ADD :   '+' ;
SUB :   '-' ;

ID  :   [a-zA-Z]+ ;      // match identifiers
INT :   [0-9]+ ;         // match integers
NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal)
WS  :   [ \t]+ -> skip ; // toss out whitespace

2 + 2 * 2产生这棵树,而6

enter image description here

为什么不首先计算加法?我的意思是正确的,我只是不知道为什么。

1 个答案:

答案 0 :(得分:2)

好吧,我想我得到了答案(花了我所有的时间在SO上发帖)。

如果我没记错的话,是因为在解析器中乘法和除法是第一个规则。

expr:   expr op=('*'|'/') expr      # MulDiv
    |   expr op=('+'|'-') expr      # AddSub