我试图理解左右联想语法是如何工作的,我需要一些帮助。所以我决定举一个例子并要求澄清一下。
基本上,我想为两个逻辑操作创建一个语法:and
+ implication
。我想这样做and
是左联想的,而implication
是正确联想的。这是我到目前为止所得到的。它是否正确?我觉得它可能是模棱两可的。 (我还记得and
的优先级高于implication
)
<exp> := <and>
<and> := <impl> | <and> ^ <impl>
<impl> := <term> | <term> -> <impl>
<term> := (<exp>) | <bool>
<bool> := true | false
答案 0 :(得分:2)
从我有限的知识来看,在我看来你的优先顺序是倒置的。
在语法级别,左关联运算符具有以下格式:
exp = exp op other | other
...右关联运算符将具有以下格式:
exp = other op exp | other
正如您所看到的,它取决于您对递归的使用:左关联性将使用左递归规则,而右关联性将使用正确的递归规则。
至于优先级,后面的规则在语法中,其优先级越高。在下面的语法中,opL
表示左关联运算符而opR
表示右关联运算符,exp0
的优先级低于exp1
,其优先级低于other
{1}}:
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