【发布时间】: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