Compiler construction LL(1)语法中赋值与表达式的区分

Compiler construction LL(1)语法中赋值与表达式的区分,compiler-construction,bnf,Compiler Construction,Bnf,我正在以LL(1)的形式为一种简单的编程语言编写语法 对于表达式,我有以下内容 <expression> ::= <term> “+” <expression> | <term> “-” <expression> | <term> <term> ::= <factor> “*” <expression> | <factor> “/” <expressio

我正在以LL(1)的形式为一种简单的编程语言编写语法

对于表达式,我有以下内容

<expression> ::= 
  <term> “+” <expression> 
| <term> “-” <expression> 
| <term>

<term> ::=
  <factor> “*” <expression> 
| <factor> “/” <expression>
| <factor>

<factor> ::= 
“(” <expression> “)”
| id
| num
:=
“+”  
|  “-”  
| 
::=
“*”  
|  “/” 
| 
::= 
“(”  “)”
|身份证
|num
还有我的作业

<assignment> ::= id “=“ <expression>
::=id=”
据我所知,这不是LL(1)形式,因为左侧的ID可能表示表达式或赋值,我需要额外的前瞻性来确定哪个


我怎样才能重写它,使它成为LL(1)形式?

您只显示部分语法,但除非您允许独立表达式作为有效语句,否则在显示的内容中不应有任何歧义

如果允许独立表达式作为语句,则可以如下定义赋值语法:

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

然后让语义分析阶段确定第一个表达式是否是一个有效的LValk。这可能是一个很好的事情,因为它可能允许分配比仅仅标识符更复杂的东西,例如数组表达式或阿德引用的指针。你应该能够调用像FUNC(x+y)这样的函数,其中x+y是一个独立的表达式。我不确定你的答案会起作用。考虑到我有一个非终结符,它包括并检查,然后发现操作符是“+”。这意味着我将不得不回溯,然后检查。如果我没有弄错的话,在示例C中写入5=4在语法上是不正确的。对不起,我简化了。请参阅我的编辑,尽管我建议对C的要求可能仍然有一个大致的简化。是的,您是正确的,当然,

5=4是一个完全有效的C语句。C的这种方式很奇怪:)顺便说一句,我认为不可能为C编写LL(1)语法。