reduce-reduce意味着它已经达到了这样一种状态,在一个语言符号前面,它可以减少两个不同的规则,导致两个不同的语法树代表你的句子。由于下一个符号在两种情况下都有效,并且是一个单符号解析器,这意味着您的语法不明确,您需要提供更多信息(如优先规则或类似规则)以使解析器接受一个减少或其他。
yacc
您可以从类型语法编译器或shift-reduce收到此错误,这再次意味着您的语法有歧义。虽然没有解决方案,只能改变语法的定义方式,或者切换到基于运算符优先级的语法来解决这个问题,但在这两种情况下,我们都在寻找某种歧义,导致两种不同的语法树描述你的语言句子.
在你的情况下,规则
expression : expression OPER expression
充满了歧义,因为您无法猜测:
3 + 5 + 8
将产生一个解析树:
/--- <3> expression : CONSTANT
<+> expression : expression OPER expression
\ /--- <5> expression : CONSTANT
\--- <+> expression : expression OPER
\--- <8> expression : CONSTANT
或者
/--- <3> expression : CONSTANT
/--- <+> expression : expression OPER expression
/ \--- <5> expression : CONSTANT
<+> expression : expression OPER expression
\--- <8> expression : CONSTANT
第一个表示表达式被解析为(以完整的括号表示)(3 + (5 + 8))
,第二个表示您的解析器已解释((3 + 5) + 8)
。