我有以下EBNF表达式语法:
<expr> -> <term> { (+|-) <term> }
<term> -> <factor> { (*|/|%) <factor> }
<factor> -> <pow> { ** <pow> }
<pow> -> ( <expr> ) | <id>
<id> -> A | B | C
我需要确定语法是否对其运算符强制执行任何特定的关联,或者是否必须在解析器代码中实现。从我到目前为止所看到的情况来看,它看起来并不像,但我很难理解导致相关性的原因。任何帮助都会有很大的帮助!
答案 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
在上面的语法中,如果生成是左递归的,则运算符是左关联的(因为运算符只能作为运算符左边的非终端的一部分出现)。类似地,出于同样的原因,右关联运算符具有右递归规则。