我为LL(1)形式的简单编程语言编写语法。
对于表达式,我有以下
<expression> ::=
<term> “+” <expression>
| <term> “-” <expression>
| <term>
<term> ::=
<factor> “*” <expression>
| <factor> “/” <expression>
| <factor>
<factor> ::=
“(” <expression> “)”
| id
| num
对于我的作业
<assignment> ::= id “=“ <expression>
据我所知,这不是LL(1)形式,因为左侧的ID可能意味着表达式或赋值,我需要额外的前瞻才能确定哪一个。
我怎样才能重写这个以LL(1)形式?
答案 0 :(得分:0)
您只显示语法的一部分,但除非您允许独立表达作为有效陈述,否则您不应该对所显示的内容有任何歧义。
如果你允许自由表达式作为语句,你可以像这样定义语法:
<assignment> ::= <expression> <assignment2>
<assignment2> ::= "=" <expression>
| E
然后让语义分析阶段确定第一个表达式是否是有效的左值。这可能是好事,因为它可能允许分配比仅仅标识符更复杂的事情,例如,数组表达式或取消引用的指针。