语法LL(1)冲突

时间:2016-09-07 09:45:47

标签: compilation compiler-warnings formal-languages

您好我不明白为什么assgnStmt生产中存在冲突。我使用coco / R,我在assgnStmt中得到" LL1警告:ID是start&可删除结构的继承者"。 谢谢。

 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.

1 个答案:

答案 0 :(得分:0)

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

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

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

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