2016-09-07 73 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