【问题标题】:grammar LL(1) conflicts语法 LL(1) 冲突
【发布时间】:2016-09-07 09:45:46
【问题描述】:

您好,我不明白为什么在 assgnStmt 生产中存在冲突。我正在使用 coco/R,我收到“assgnStmt 中的 LL1 警告:ID 是可删除结构的开始和继任者”。 谢谢。

 COMPILER program

 CHARACTERS
 Letter= 'a'..'z'.
 Digit= '0'..'9'.

 TOKENS
 NUM= Digit {Digit}.
 ID= Letter {Letter}.

 PRODUCTIONS  
 program
   = stmts
   .
  stmts = assgnStmt { assgnStmt ';' } .

  assgnStmt
     = {ID "==" }  expr
  .
  expr = term { ('+' | '-') term } .

  term = factor { ( '*' | '/'  ) factor  } .

  factor
     = '(' expr ')'
     | ID
     | NUM
     .
  END program.

【问题讨论】:

    标签: compilation compiler-warnings formal-languages


    【解决方案1】:

    {ID "=="} 是一个“可删除结构”,这是一种说它是可选的方式。显然,它可以以ID 开头。但expr 也可以以ID 开头,如果{ID "=="} 不存在,解析器必须尝试识别expr

    LL 解析器总是需要知道他们试图识别什么产品。但是当解析器在这种上下文中遇到ID 时,它无法判断是期待{ID "=="} 还是expr

    这就是错误消息的含义。修复它比较棘手,尽管并非不可能。您可以先尝试ID {"==" ID} rest-of-expr 之类的方法,但这只会识别一些分配(恰恰是expr 确实以ID 开头的那些)。

    (这是我为什么不觉得 LL(1) 解析器生成器非常令人满意的一个例子。LR(1) 解析器在这种语法上没有问题。所以我对 Coco/R 的了解不够提供更多建议。)

    【讨论】:

    • 我加了,这样更笼统,让语义分析做正确的工作。
    • 是的,我应该提到那个选项。无论如何,我希望答案有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多