从我已经阅读的方式来看,我定义了我的'表达',这应该为我提供以下内容:
这是我的意见:
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
答案 0 :(得分:0)
如果你想要表达式
xyz = ( ( a + b ) + ( c + d) )
然后,您需要控制+
运算符与括号的绑定,就像您在预期输出中所做的一样。否则,用
xyz = ( a + (b + (c + d) ) )
是解析器解析它的方式,因为所有+
运算符具有相同的优先级,解析器继续解析直到它到达表达式的末尾。
递归应用
left=expression operand=('+'|'-') right=expression
直到表达完成。
你得到了你的分组。因此,如果您想强制执行表达式评估的顺序,请使用这些括号,这是他们所要做的。 ;)
如果您将输入更改为
xyz = a * b + c + d
你会看到我对优先级的意思,因为乘法规则出现在加法规则之前 - 因此更早结合 - 这是一个数学约定(缺少括号组术语。)
你做得对,解析器也是。如果您想要特定的绑定订单,只需将您想要的内容分组。