BNF语法中运算符的优先级

时间:2015-02-18 19:32:44

标签: syntax bnf operator-precedence

我正在完成一项家庭作业,我会给出一些BNF语法:

<assign> -> <id> = <expr>
<id> -> A | B | C
<expr> -> <expr> + <term>
      | <term>
<term> -> <term> * <factor>
      | <factor>
<factor> -> ( <expr> )
      | <id>

问题是:

&#34;重写此语法,以使+运算符与权限相关联,并优先于*运算符。&#34;

一位同学建议我们只需切换+*运算符,然后+将具有优先权并获得正确关联,但我不认为这是正确的,因为问题是递归的。

我的问题是,+运算符是否通过简单地使用*运算符来获得优先权和正确关联?我的两个想法是删除递归并执行我的同学建议,或将+运算符置于必须被()包围的条件下才能工作。

也许我在想这个?

1 个答案:

答案 0 :(得分:1)

在语法中交换+和*将明显地交换优先级,但使它们成为右关联是一个单独的步骤,因此很容易。

然而,对于右与左的关联性,我无法理解您的建议,但两者似乎都是错误的。

如果我们采用示例输入A = A + B + C,那么您的语法就像这样解析它:

assign: <id> = <expr>
    id: A
    expr: <expr> + <term>
        expr: <expr> + <term>
            expr: <expr> + <term>
                expr: <term>
                term: <factor>
                    factor: <id>
                         id: A
            term: <factor>
                factor: <id>
                    id: B
        term: <factor>
            factor: <id>
                id: C

或者,如果您更喜欢括号格式的相同内容:

(A) = ((((A))+(B))+(C))

请注意,最里面且因此首先评估的+是距 left 最远的那个。因此,你的语法有左倾相关性。您需要更改exprterm,以便评估的第一个是 right 最远的一个,以使语法具有正确的关联性。括号提供了一种超越&#34;的方法。无论语法有什么相关性,但其他方面都与相关性无关。