考虑以下(当然是荒谬的 - 为了说明这一点,它已被大大简化)语法:
negationExpression
: TOK_MINUS constantExpression %prec UNARYOP
| testRule
;
constantExpression
: TOK_INTEGER_CONSTANT
| TOK_FLOAT_CONSTANT
;
testRule
: negationExpression constantExpression // call this Rule 1
| constantExpression // Rule 2
;
在此语法上运行时,Bison 不会抱怨减少/减少冲突,但对我来说似乎有一个。假设我们已经解析了 anegationExpression
和 a constantExpression
; 对我来说,基于上述定义,解析器现在可以做两件事:
testRule
使用上面的规则 1将序列简化为- 使用上面的规则 2将 减少
constantExpression
到(在这种情况下将保持不变,因此解析堆栈将如下所示:)testRule
negationExpression
negationExpression testRule
但是没有发出警告,当我查看 Bison 生成的 .output 文件时,似乎没有任何歧义:
state 5
6 testRule: constantExpression .
$default reduce using rule 6 (testRule)
...
state 9
5 testRule: negationExpression constantExpression .
$default reduce using rule 5 (testRule)
根据野牛文档:
如果有两个或多个规则适用于相同的输入序列,则会发生 reduce/reduce 冲突。
这不正是这里的情况吗?