语法 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 提供更多建议。)
你好我不明白为什么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 提供更多建议。)