ANTLR4语法数学运算符结合性和运算顺序

ANTLR4语法数学运算符结合性和运算顺序,antlr,antlr4,Antlr,Antlr4,我试图创建一个ANTLR4语法来执行数学运算。然而,我发现在平衡操作顺序和运算符关联性之间存在一些困难。(例如,x+y+z是右关联的,应理解为x+(y+z),而减法是左关联的,因此x-y-z应理解为(x-y)-z) 此示例定义具有正确关联性的操作 expr : value = INTEGER #Integer | value = VARIABLE #Variable | <assoc=right> left = expression op = '^' r

我试图创建一个ANTLR4语法来执行数学运算。然而,我发现在平衡操作顺序和运算符关联性之间存在一些困难。(例如,x+y+z是右关联的,应理解为x+(y+z),而减法是左关联的,因此x-y-z应理解为(x-y)-z)

此示例定义具有正确关联性的操作

expr
   :  value = INTEGER #Integer
   |  value = VARIABLE  #Variable 
   |  <assoc=right> left = expression  op = '^' right = expression #Operation
   |  <assoc=left>  left = expression  op = '/' right = expression #Operation
   |  <assoc=right> left = expression  op = '*' right = expression #Operation
   |  <assoc=right> left = expression  op = '+' right = expression #Operation
   |  <assoc=left> left = expression  op = '-' right = expression #Operation

expr
   :  value = INTEGER #Integer
   |  value = VARIABLE  #Variable 
   |  <assoc=right> left = expression  op = OP_POW right = expression #Operation
   |  left = expression  op = ('/' | '*') right = expression #Operation
   |  left = expression  op = ('+' | '-') right = expression #Operation

expr
:value=INTEGER#INTEGER
|值=变量#变量
|左=表达式op='^'右=表达式#运算
|左=表达式op='/'右=表达式#运算
|左=表达式op='*'右=表达式#运算
|左=表达式op='+'右=表达式#运算
|左=表达式op='-'右=表达式#运算
然而,运算顺序决定了乘法和除法从左到右的优先级相等。乘法和减法也是如此。 此示例保持操作顺序,但拒绝添加关联性

expr
   :  value = INTEGER #Integer
   |  value = VARIABLE  #Variable 
   |  <assoc=right> left = expression  op = '^' right = expression #Operation
   |  <assoc=left>  left = expression  op = '/' right = expression #Operation
   |  <assoc=right> left = expression  op = '*' right = expression #Operation
   |  <assoc=right> left = expression  op = '+' right = expression #Operation
   |  <assoc=left> left = expression  op = '-' right = expression #Operation

expr
   :  value = INTEGER #Integer
   |  value = VARIABLE  #Variable 
   |  <assoc=right> left = expression  op = OP_POW right = expression #Operation
   |  left = expression  op = ('/' | '*') right = expression #Operation
   |  left = expression  op = ('+' | '-') right = expression #Operation

expr
:value=INTEGER#INTEGER
|值=变量#变量
|左=表达式op=op#POW右=表达式#操作
|左=表达式op=(“/”|“*”)右=表达式运算
|左=表达式op=(“+”|“-”)右=表达式运算

我所做的任何尝试都会使用左递归规则来解决这个问题。有没有一种方法可以使用ANTLR4保持操作符的关联性和正确的操作顺序?感谢您的帮助。提前谢谢。

为什么希望
+
*
正确关联?这似乎很不寻常。无论如何,我不清楚两个具有相同优先级但结合性不同的运算符的结果是什么。您希望解析树是什么,例如
a+b-c+d
a-b+c-d
<代码>(a+((b-c)+d)和
((a-b)+(c-d))
?这不等于给
-
分配了比
+
更高的优先级吗?我想我可能是被误导了。谢谢你的帮助,我收到了一些误导性的建议,后来又使用了第二个示例。我没有意识到所有+-/*操作都是关联的,而是认为只有/和-由于它们的可交换性而被保留为关联。感谢您快速而清晰的响应!这是一个很大的帮助。