2012-01-17 74 views
0

情況是我寫了一個非常非常簡單的語法,但編譯時,我得到了衝突。 我不知道爲什麼這樣一個簡單的語法可以發生衝突。yacc有一個轉換/減少衝突

%token SCRIPT_ID 
%token STRING 
%start functions 

%% 
functions: SCRIPT_ID '(' STRING ')' {printf("script_id is %s", $3);}; 
%% 

我只想用yacc來解析我的文件。在我的文件中有些東西像script_id(「1232444」)。

我在yacc手冊上進行搜索,並在討論shift/reduce衝突時發現,它引發了一個例如'if and else'的例子。我明白,爲什麼'如果和別人'有衝突,如果沒有指定的權利。 但我不知道如果其他衝突與我遇到的衝突有什麼關係。

有人能告訴我我的代碼有什麼問題嗎?

+0

您能展示如何定義SCRIPT_ID和STRING標記嗎? – Zuljin 2012-01-17 11:56:33

+1

yacc的詳細輸出可能會顯示詳細信息。用'-v'選項編譯語法。這會生成一個文件'y.output'(或類似的東西)和其中的信息。 – 2012-01-17 11:56:42

回答

1

你還沒有說明你得到了什麼精確的錯誤。你也幾乎可以肯定沒有向我們展示整個語法,因爲你不能只用一條規則就能在語法中得到一個轉換/減少衝突。然而,一般來說,如果你想了解一個轉換/減少衝突是什麼,你可能需要學習更多關於LR分析狀態機的理論,而不是你真正想要的。假設你想,不過,你可能會與這些維基百科的頁面開始:

在這一總體主題的最佳的整體文本和參考書是所謂的「龍Book「,(真實姓名:編譯器:原理,技術和工具):http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools