首页 > 解决方案 > 计算器语法中的优先顺序

问题描述

我开始研究 ANTLR,目前正在通过“Definitive 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

在此处输入图像描述

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

标签: antlrantlr4

解决方案


好的,我想我得到了答案(我只需要在 SO 上发布问题)。

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

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

推荐阅读