【问题标题】:Precedence of operators in BNF grammarBNF语法中运算符的优先级
【发布时间】:2015-02-18 19:32:43
【问题描述】:

我正在做一个家庭作业,我要给出一些 BNF 语法:

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

问题是:

“重写此语法,使+ 运算符具有右结合性并优先于* 运算符。”

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

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

也许我想多了?

【问题讨论】:

  • 在语法中交换 +* 显然会交换优先级,但使它们右关联是一个单独的步骤
  • @MooningDuck 让我拍张照片,这样我就可以说我告诉过你我的朋友...好的。那么现在提到右关联,我是否可以简单地在括号中递归地进行加法运算符并在那时去掉乘法?我相信这将是正确的关联。前任。 A = B * (C + (C + (C + C)))
  • 关联性(在我看来)与递归的类型有关。正如您在示例中看到的那样, expr 和 term 都是左递归的并且具有左关联性。也许改变你感兴趣的生产中使用的递归类型也会改变它的关联性。

标签: syntax bnf operator-precedence


【解决方案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))

请注意,最里面的+ 是最靠近左边 的。因此,您的语法具有左结合性。您需要更改 exprterm 以便评估的第一个是离 right 最远的一个,以便语法具有正确的关联性。括号提供了一种“否决”语法所具有的任何关联性的方法,但与关联性并不真正相关。

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2021-10-25
    • 2015-03-20
    • 1970-01-01
    相关资源
    最近更新 更多