您好,我不明白为什么在assgnStmt生产中会有冲突。我正在使用coco/R,我得到了"LL1 warning in assgnStmt: ID is start &in 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.发布于 2016-09-07 22:16:11
{ID "=="}是一个“可删除结构”,也就是说它是可选的。显然,它可以从ID开始。但是expr也可以从ID开始,如果{ID "=="}不存在,解析器必须尝试识别expr。
LL解析器总是需要知道他们试图识别的产品是什么。但是,当解析器在此上下文中遇到ID时,它无法判断是期望{ID "=="}还是expr。
这就是错误消息的含义。修复它更棘手,尽管不是不可能。你可以从尝试像ID {"==" ID} rest-of-expr这样的东西开始,但这只能识别一些赋值(正是expr以ID开头的那些赋值)。
(这就是为什么我觉得LL(1)解析器生成器不是很令人满意的一个例子。LR(1)解析器不会有这种语法问题。因此,我对Coco/R了解不够,无法提供更多建议。)
https://stackoverflow.com/questions/39366516
复制相似问题