我正在完成一项家庭作业,我会给出一些BNF语法:
<assign> -> <id> = <expr>
<id> -> A | B | C
<expr> -> <expr> + <term>
| <term>
<term> -> <term> * <factor>
| <factor>
<factor> -> ( <expr> )
| <id>
问题是:
&#34;重写此语法,以使+
运算符与权限相关联,并优先于*
运算符。&#34;
一位同学建议我们只需切换+
和*
运算符,然后+
将具有优先权并获得正确关联,但我不认为这是正确的,因为问题是递归的。
我的问题是,+
运算符是否通过简单地使用*
运算符来获得优先权和正确关联?我的两个想法是删除递归并执行我的同学建议,或将+
运算符置于必须被(
和)
包围的条件下才能工作。
也许我在想这个?
答案 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 最远的那个。因此,你的语法有左倾相关性。您需要更改expr
和term
,以便评估的第一个是 right 最远的一个,以使语法具有正确的关联性。括号提供了一种超越&#34;的方法。无论语法有什么相关性,但其他方面都与相关性无关。