2010-07-02 140 views
4

我正在使用CUP創建我需要的論文的解析器。我的語法有一個轉換/減少衝突。我有這樣的產生式規則:如何解決轉變/減少衝突?

command ::= IDENTIFIER | IDENTIFIER LPAREN parlist RPAREN; 

,我有這樣的警告:

Warning : *** Shift/Reduce conflict found in state #3 
between command ::= IDENTIFIER (*) 
and  command ::= IDENTIFIER (*) LPAREN parlist RPAREN 
under symbol LPAREN 

現在,我其實想它轉移,所以我與它相當不錯,但我的教授告訴我要找到一種解決衝突的方法。我瞎了。我一直在閱讀關於if/else的衝突,但對我來說這似乎並不是這樣。 你能幫我嗎?

P.S .: IDENTIFIER,LPAREN「(」和RPAREN「)」是終端,parlist和命令不是。

回答

6

你的問題不是出在這些規則可言。儘管Michael Mrozek的回答是解決「懸而未決的問題」的正確方法,但它並沒有把握手頭的問題。

如果您查看錯誤消息,您會發現在LPAREN中存在移位/縮減衝突。我相當確信單單規則不會產生衝突。

我看不到你的語法,所以我幫不了你。但是您的衝突可能是command後跟一個以LPAREN開頭的不同規則。

查看可能在command之後的任何其他規則,並從LPAREN開始。您將不得不鞏固規則。對於特定的輸入語法錯誤很有可能是錯誤的。

+0

是的,你很棒。問題出在這一行上面。 4天前我解決了這個問題。我忘了更新這個問題。 – dierre 2010-07-22 17:58:29

4

你有兩個作品:

command ::= IDENTIFIER 
command ::= IDENTIFIER LPAREN parlist RPAREN; 

這是一個轉變/減少衝突,當輸入令牌IDENTIFIER LPAREN,因爲:

  • LPAREN可能是一個新的開始生產你有沒有列出,在這種情況下解析器應該將已經在堆棧中的IDENTIFIER減少爲command,並且還有command LPAREN剩餘的
  • 它們可能都是第二次生產的開始,所以它應該將LPAREN轉移到IDENTIFIER旁邊的堆棧上並繼續閱讀,試圖找到parlist

你可以做這樣的事情解決它:

command ::= IDENTIFIER command2 
command2 ::= LPAREN parlist RPAREN |; 
+0

謝謝,但即使使用此解決方案,我也有相同的轉換/減少衝突。我沒有語法錯誤,所以我很確定CUP不使用一些奇怪的「空符號」,但我正在檢查它。 – dierre 2010-07-02 17:22:52

1

嘗試設置優先級:

precedence left  LPAREN, RPARENT; 

它迫使銀聯決定的矛盾,採取左側匹配。