语法 LL(1) 冲突

grammar LL(1) conflicts

你好我不明白为什么assgnStmt制作有冲突。我正在使用 coco/R,我得到 "LL1 warning in assgnStmt: ID is start & successor of deletable structure"。 谢谢。

 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.

{ID "=="} 是 "deletable structure",表示它是可选的。显然,它可以以 ID 开头。但是 expr 也可以以 ID 开头,如果 {ID "=="} 不存在,解析器必须尝试识别 expr.

LL 解析器总是需要知道它们试图识别的产生式。但是当解析器在此上下文中遇到 ID 时,它无法判断是期望 {ID "=="} 还是 expr.

这就是错误信息的意思。修复它比较棘手,但并非不可能。您可以先尝试 ID {"==" ID} rest-of-expr 之类的东西,但这只会识别某些作业(恰恰是 expr 确实以 ID 开头的作业)。

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