BNF语法关联性

时间:2018-05-16 11:00:11

标签: grammar bnf associativity ambiguous-grammar

我试图理解左右联想语法是如何工作的,我需要一些帮助。所以我决定举一个例子并要求澄清一下。 基本上,我想为两个逻辑操作创建一个语法:and + implication。我想这样做and是左联想的,而implication是正确联想的。这是我到目前为止所得到的。它是否正确?我觉得它可能是模棱两可的。 (我还记得and的优先级高于implication

<exp> := <and>
<and> := <impl> | <and> ^ <impl>
<impl> := <term> | <term> -> <impl>
<term> := (<exp>) | <bool>
<bool> := true | false

1 个答案:

答案 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