Antlr4表达式是链接的

时间:2017-07-08 13:32:31

标签: antlr4

从我已经阅读的方式来看,我定义了我的'表达',这应该为我提供以下内容:

这是我的意见:

xyz = a + b + c + d

这应该是我的输出:

xyz = ( ( a + b ) + ( c + d) ) 

但我得到了:

xyz = ( a + (b + (c + d) ) )

我敢打赌以前这个问题已经解决了,我只是找不到解决方案。

statementList       : s=statement sl=statementList  #multipleStatementList
                    | s=statement                   #singleStatementList
                    ;

statement           : statementAssign
                    | statementIf
                    ;

statementAssign     : var=VAR ASSIGN expr=expression        #overwriteStatementAssign
                    | var=VAR PLUS ASSIGN expr=expression   #addStatementAssign
                    | var=VAR MINUS ASSIGN expr=expression  #subStatementAssign
                    ;


                    ;

expression          : BRACKET_OPEN expr=expression BRACKET_CLOSE                    #priorityExp
                    | left=expression operand=('*'|'/') right=expression            #mulDivExp
                    | left=expression operand=('+'|'-') right=expression            #addSubExp
                    | <assoc=right> left=expression POWER right=expression          #powExp
                    | variable=VAR                                                  #varExp
                    | number=NUMBER                                                 #numExp
                    ;



BRACKET_OPEN        : '(' ;
BRACKET_CLOSE       : ')' ;

ASTERISK            : '*' ;
SLASH               : '/' ;
PLUS                : '+' ;
MINUS               : '-' ;
POWER               : '^' ;
MODULO              : '%' ;


ASSIGN              : '=' ;

NUMBER              : [0-9]+ ;

VAR                 : [a-z][a-zA-Z0-9\-]* ;

WS                  : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

1 个答案:

答案 0 :(得分:0)

如果你想要表达式

 xyz = ( ( a + b ) + ( c + d) ) 

然后,您需要控制+运算符与括号的绑定,就像您在预期输出中所做的一样。否则,用

 xyz = ( a + (b + (c + d) ) )

是解析器解析它的方式,因为所有+运算符具有相同的优先级,解析器继续解析直到它到达表达式的末尾。

递归应用

left=expression operand=('+'|'-') right=expression 

直到表达完成。

你得到了你的分组。因此,如果您想强制执行表达式评估的顺序,请使用这些括号,这是他们所要做的。 ;)

如果您将输入更改为

xyz = a * b + c + d

你会看到我对优先级的意思,因为乘法规则出现在加法规则之前 - 因此更早结合 - 这是一个数学约定(缺少括号组术语。)

你做得对,解析器也是。如果您想要特定的绑定订单,只需将您想要的内容分组。

相关问题