2011-07-27 104 views
5

我正在學習YACC,並且在計算出它給我的警告信息時遇到了一些麻煩。這裏是我的文件的一部分:YACC規則沒有減少

define_character: WORD IS STRING COLOR 
{ 
    printf("%s's full name is %s and thier color is %s", $1, $3, $4); 
}; 

dialog: WORD COLON STRING 
{ 
    printf("%s says %s", $1, $3); 
}; 

change_scene: SCENE SETSCENE WORD 
{ 
    printf("%s is the new scene", $3); 
}; 

的警告,它給了我是:

2 rules never reduced 
2 useless nonterminals and 2 useless rules 
warning: useless nonterminal: dialog 
warning: useless nonterminal: change_scene 
warning: useless rule: dialog: WORD SEMICOLON STRING 
warning: useless rule: change_scene: SCENE SETSCENE WORD 

如何解決這些?我嘗試過搜索,發現有人因爲轉移/減少衝突而出現錯誤。看起來,YACC通常會在警告輸出中加入這些內容,但是爲了確保我嘗試從change_scene中刪除WORD,因此它不會尋找與其他任何相同的令牌,並且它不會減少。我可以測試所有規則,因爲無論哪一個在頂層都是可行的。我是否在第一條規則的末尾缺少一些語法,導致其他規則出現問題?

回答

3

我認爲問題在於yacc認爲第一個生產的左手邊是開始符號。在這種情況下,這意味着,因爲你有

define_character: WORD IS STRING COLOR 

YACC認爲define_character是開始符號。你有兩個其他作品,即

dialog: WORD COLON STRING 

change_scene: SCENE SETSCENE WORD 

通知,但是,有沒有辦法得到任何dialogdefine_characterchange_scene。因此,yacc告訴你,你有兩個無用的非終結符,即這兩個,因爲它們永遠不能派生。關於兩個無用產品的錯誤出現了,因爲上述兩個產品實際上都不能被解析器觸發。

我不確定我是否理解你要用這段代碼做什麼,但爲了解決這個問題,你需要以某種方式使它成爲可以聯繫到這些非終結者。你能詳細說明你想用yacc完成什麼嗎?

+0

謝謝,我想我現在已經修好了。我見過的所有例子都沒有真正向你展示如何處理多個動作。我有O'Reilly的書,我正在試着構建解析器。猜猜我應該讀更多。我正在爲一部視覺小說做翻譯。我通過在由|分隔的命令列表頂部放置命令語句來修復它。 – John