Compiler construction LL(1)语法中赋值与表达式的区分
我正在以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
<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)语法。