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
    {
    }
; 

此时,将发生"偏移/减少"冲突。

我不知道问题出在哪里。如何解决这一冲突?

谢谢。

冲突(在我看来)在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
             ;

相关内容

  • 没有找到相关文章

最新更新