区分LL(1)语法中的赋值和表达式

时间:2015-12-07 20:52:02

标签: compiler-construction bnf

我为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)形式?

1 个答案:

答案 0 :(得分:0)

您只显示语法的一部分,但除非您允许独立表达作为有效陈述,否则您不应该对所显示的内容有任何歧义。

如果你允许自由表达式作为语句,你可以像这样定义语法:

<assignment>  ::= <expression> <assignment2>
<assignment2> ::= "=" <expression>
                  | E

然后让语义分析阶段确定第一个表达式是否是有效的左值。这可能是好事,因为它可能允许分配比仅仅标识符更复杂的事情,例如,数组表达式或取消引用的指针。