2012-07-10 115 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