运营商相关性

时间:2016-09-14 22:21:37

标签: grammar operator-keyword bnf associativity

我有以下EBNF表达式语法:

<expr>    ->  <term> { (+|-) <term> }
<term>    ->  <factor> { (*|/|%) <factor> }
<factor>  ->  <pow> { ** <pow> }
<pow>     ->  ( <expr> )  |  <id>
<id>      ->  A | B | C

我需要确定语法是否对其运算符强制执行任何特定的关联,或者是否必须在解析器代码中实现。从我到目前为止所看到的情况来看,它看起来并不像,但我很难理解导致相关性的原因。任何帮助都会有很大的帮助!

1 个答案:

答案 0 :(得分:1)

mutilates 的标准转换将表达式语法转换为可以用自上而下(LL)语法解析的形式已经删除了关联性信息,因为LL语法不能处理左 - 联合操作。实际上,解析树由LL语法引用,使所有双重运算符都是右关联的。但是,您通常可以在语义操作中重新关联运算符而不会有太多麻烦。

这就是为什么乘法和取幂运算符似乎有类似的语法产生,尽管通常取幂是正确关联的,而其他二元运算符是左关联的。

在LR语法中,这很明显:

<expr>   -> <term> | <expr> + <term> | <expr> - <term>
<term>   -> <factor> | <term> *  <factor> | <term> / <factor> | <term> % <factor>
<factor> -> <pow> | <pow> ** <factor>
<pow>    -> ( <expr> ) | <id>
<id>     -> A | B | C

在上面的语法中,如果生成是左递归的,则运算符是左关联的(因为运算符只能作为运算符左边的非终端的一部分出现)。类似地,出于同样的原因,右关联运算符具有右递归规则。