2013-11-27 31 views
2

我需要幫助來解決這個問題,並解釋如何在未來處理這個SHIFT/REDUCE CONFLICTS。如何解決SHIFT/REDUCE衝突 - 解析器生成器

我在我的杯子文件中的幾個州之間有一些衝突。

格拉默是這樣的:

我之間的衝突 「(」[ActPars] 「)」 狀態。

1. Statement = Designator ("=" Expr | "++" | "‐‐" | "(" [ActPars] ")") ";" 

2. Factor = number | charConst | Designator [ "(" [ActPars] ")" ]. 

我不想粘貼所有700行杯文件。 我會給你相關的狀態和錯誤輸出。

這是代碼的第1行)

Matched ::= Designator LPAREN ActParamsList RPAREN SEMI_COMMA 

ActParamsList ::= ActPars 
       | 
       /* EPS */ 
       ; 

ActPars ::= Expr 
     | 
     Expr ActPComma 
     ; 

ActPComma ::= COMMA ActPars;  

這是第2行)

Factor ::= Designator ActParamsOptional ; 


ActParamsOptional ::= LPAREN ActParamsList2 RPAREN 
       | 
       /* EPS */ 
       ; 

ActParamsList2 ::= ActPars 
       | 
       /* EPS */ 
       ; 

Expr ::= SUBSTRACT Term RepOptionalExpression 
     | 
     Term RepOptionalExpression 
     ; 

誤差輸出看起來像這樣:

Warning : *** Shift/Reduce conflict found in state #182 
between ActParamsOptional ::= LPAREN ActParamsList RPAREN (*) 
and  Matched ::= Designator LPAREN ActParamsList RPAREN (*) SEMI_COMMA 
under symbol SEMI_COMMA 
Resolved in favor of shifting. 

錯誤:*更多衝突en反駁高於預期 - 解析器代中止

+0

我THI nk'ActParamsList2'具有不平衡的括號。擴展的'ActParamsOptional'的例子看起來像這樣:'(Expr)''。 – tehlexx

+0

是的你是對的 - 我改變了 - 那是錯誤的。我改變了這一點,並更新錯誤輸出,因爲出現了新的換檔減少。 –

回答

1

我相信問題是,你的解析器會不知道它是否應該轉移到令牌:

SEMI_COMMA 

或減少令牌

ActParamsOptional 

因爲在這兩種ActParamsOptionalMatched定義的令牌是

LPAREN ActPars RPAREN 
+0

解決的辦法是給更多的前瞻,或者將語法切換成非模糊的東西。例如,用一個方括號代替其中一個令牌。 – sdasdadas

+0

謝謝你的回答 - 有沒有其他的方法 - 我必須保持這種語法 - 我必須保留父母關係「(」[ActPars]「)」 - 你可以在我的文章開頭看到這需要的樣子(命名爲1和2的行)我不能使用precedence關鍵字,因爲他們告訴我們不要使用它:-( –

+0

@MilanBojovic我試圖通過它看到語法,但我仍然有點你可以舉幾行例子來說明這個語言是什麼樣子的嗎? – sdasdadas