我在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
;