2011-04-10 70 views
2

我需要yacc的幫助。 我正在研究一箇中綴/後綴翻譯器,後綴部分的中綴非常簡單,但我在後綴中綴翻譯時遇到了一些問題。 這裏是什麼我打算做一個例子(只是爲了翻譯一個簡單的AB + C-或ABC + - )Yacc「規則因衝突而無用」

exp: num {printf("+ ");} exp '+' 
    | num {printf("- ");} exp '-' 
    | exp {printf("+ ");} num '+' 
    | exp {printf("- ");} num '-'  
    |/* empty*/ 
    ; 

num: number {printf("%d ", $1);} 
    ; 

obiously這是行不通的,因爲我所要求的動作(與用printfs )前的實際身體的話,在編譯時,我得到很多

警告:解析器規則無用,由於衝突

的問題是,用printfs是正是我需要他們(或者我的輸出不會是一箇中綴表達)。有沒有一種方法可以保持正確的打印行爲,並讓yacc識別它需要使用哪一個?

回答

1

基本上,沒有沒有。問題是要解決你的問題,yacc必須擁有無限的前瞻。這是......有問題的,因爲yacc是一個相當簡單的工具,所以相反它需要一個(壞)猜測,並用警告拋出一些規則。您需要更改語法,以便yacc可以決定如何處理令牌(只有一個令牌IIRC)。通常的做法是將值的解釋附加到標記上,或者使用後置操作,或者更實際地構建一棵樹,將其作爲單獨的步驟遍歷(從其語法中打印出中綴表達式樹是微不足道的)。

請注意,當您發出yacc警告時,通常意味着您的語法錯誤,並且生成的解析器會執行非常意想不到的操作。細化它直到得到來自該階段的警告。也就是說,將語法警告視爲錯誤;別的,你會後悔的。

+0

yacc是一個「相當簡單的工具」,在我眼中是一件好事。這意味着你可以預測地使用它;過於複雜的工具會帶來更多麻煩,更多! – 2011-04-10 16:32:38