根据我有限的知识,在我看来,您的优先级颠倒了。
在语法级别,左结合运算符具有以下格式:
exp = exp op other | other
...并且右结合运算符将具有以下格式:
exp = other op exp | other
如您所见,这取决于您对递归的使用:左关联性将使用左递归规则,而右关联性将使用右递归规则。
至于优先级,语法中的规则越晚,其优先级越高。在下面的语法中, whereopL
表示左结合运算符并opR
表示右结合运算符,其exp0
优先级低于exp1
,其优先级低于other
:
exp0 = exp0 opL exp1 | exp1
exp1 = other opR exp1 | other
other = ...
例如,如果opL
是“+”并且opR
是“**”并且other
是一个字母,请查看如何构建一些表达式的解析树:
左结合性:
a + b + c -> (a + b) + c
exp0 -+-> exp0 +-> exp0 --> exp1 --> other --> a
| |
| +-> opL --> "+"
| |
| \-> exp1 --> other --> b
|
+-> opL --> "+"
|
\-> exp1 --> c
右结合性:
a ** b ** c -> a ** (b ** c)
exp0 --> exp1 +-> other --> a
|
+-> opR --> "**"
|
\-> exp1 +-> other --> b
|
+-> opR --> "**"
|
\-> exp1 --> other --> c
优先级:
a + b ** c -> a + (b ** c)
exp0 +-> exp0 +-> exp1 --> other --> a
|
+-> opL --> "+"
|
\-> exp1 +-> other --> b
|
+-> opR --> "**"
|
\-> exp1 --> other --> c