【问题标题】:Differentiating between assignment and expression in LL(1) grammarLL(1) 语法中赋值和表达式的区别
【发布时间】:2015-12-07 20:52:02
【问题描述】:

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

【问题讨论】:

    标签: compiler-construction bnf


    【解决方案1】:

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

    如果您确实允许将独立表达式作为语句,您可以像这样定义赋值语法:

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

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

    【讨论】:

    • 我认为我应该允许独立表达式,因为您应该能够调用像 func(x+y) 这样的函数,其中 x+y 是独立表达式。我不确定你的答案是否有效。考虑到我有一个包含 非终结符。首先检查 ,然后发现运算符是“+”,这意味着我必须回溯,然后检查 。如果我没记错的话,在例如 C 中写 5=4 在语法上也是不正确的。
    • 对不起,我过于简单化了。请看我的编辑,尽管我建议可能仍然对 C 的要求进行了粗略的简化。是的,你是对的,当然,5=4 是一个完全有效的 C 语句。 C 就是这样奇怪 :)
    • 顺便说一句,我认为不可能为 C 编写 LL(1) 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2018-10-22
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多