您好我不明白为什么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.
答案 0 :(得分:0)
{ID "=="}
是一个"可删除的结构",这是一种说明它是可选的方式。显然,它可以从ID
开始。但expr
也可以从ID
开始,如果{ID "=="}
不存在,则解析器必须尝试识别expr
。
ID
时,它无法判断是期望{ID "=="}
还是expr
。
这就是错误消息的含义。修复它比较棘手,尽管并非不可能。您可以先尝试类似ID {"==" ID} rest-of-expr
之类的内容,但这只能识别某些分配(恰好是expr
以ID
开头的分配)。
(这是为什么我没有找到LL(1)解析器生成器非常令人满意的一个例子。一个LR(1)解析器在语法上没有问题。所以我不太了解Coco / R提供更多建议。)