2012-07-10 117 views
0

我在yacc編譯期間遇到了衝突問題。yacc轉換/減少衝突

錯誤以下消息:下面

24: shift/reduce conflict (shift 66, reduce 99) on '/' 
state 24 
arithmetic_leaf : absolute_path . (99) 
absolute_path : absolute_path . '/' relative_path (102) 

代碼:

arithmetic_leaf: '(' arithmetic_expression ')' 
    { 
    } 
| integer_value 
    { 
    } 
| real_value 
    { 
    } 
| absolute_path 
    { 
    } 
; 

absolute_path: '/' 
    { 
    } 
| '/' relative_path 
    { 
    } 
| absolute_path '/' relative_path 
    { 
    } 
; 

relative_path: path_segment 
    { 
    } 
| relative_path '/' path_segment 
    { 
    } 
; 

path_segment: V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF 
    { 
    } 
| V_ATTRIBUTE_IDENTIFIER '[' V_ARCHETYPE_ID ']' 
    { 
    } 
| V_ATTRIBUTE_IDENTIFIER 
    { 
    } 
; 

此時,會發生 '移/減少' 衝突。

我不知道是什麼問題。如何解決這個衝突?

謝謝。

回答

0

衝突(在我看來)是在absolute_path的替代方案之間。

看來,像'/a/b字符串將匹配的absolute_path '/' relative_path規則,'/' relative_path規則。

至少對我來說,看起來你只是想消除其中的一個。我可能會寫爲:

absolute_path: '/' 
      | '/' relative_path 
      ; 

或者,它可能會更有意義,讓一個relative_path僅僅是一個空字符串,在這種情況下,你可能會喜歡的東西最終會:

absolute_path: '/' relative_path 
      ; 

relative_path: 
      | path_segment 
      | relative_path '/' path_segment 
      ; 
+0

謝謝。我解決衝突。首先我刪除'absolute_path'/'relative_path'並將'%right'/''添加到標題部分。但是當'/'用作算術標記時,我擔心錯誤發生。 – 2012-07-10 08:00:47

+0

@Hoon:是的,這可能是一個合理的擔憂 - 但是「上下文」可以防止衝突的機會相當不錯。然而,給定類似'a/b'的東西,卻無法猜測它是相對路徑還是「一分爲二」。 – 2012-07-10 08:05:27