2016-09-07 72 views
0

你好,我不明白为什么在assgnStmt生产中存在冲突。我正在使用coco/R,并在“assgnStmt:ID is start & successor of deletable structure”中得到“LL1警告”。 谢谢。语法LL(1)冲突

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

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

LL解析器总是需要知道他们试图识别什么产品。但是,当解析器在此上下文中遇到ID时,它无法分辨是否期望{ID "=="}expr

这就是错误信息的含义。修复它是棘手的,虽然不是不可能的。你可以从ID {"==" ID} rest-of-expr之类的东西开始,但是只能识别一些分配(正是expr确实以ID开头的分配)。 (这是一个为什么我没有发现LL(1)解析器生成器非常令人满意的例子,一个LR(1)解析器对这个语法没有任何问题,所以我对Coco/R还不太了解以提供更多建议。)

+0

我添加了,这是更一般化的,使语义分析能够做正确的工作。 – blob

+0

是的,我应该提到这个选项。无论如何,我希望答案有所帮助。 – rici