Parsing 为什么';这个语法不存在reduce/reduce冲突吗?
考虑以下语法(无可否认,这是毫无意义的——为了说明这一点,它被大大简化了): Bison在使用这种语法时并没有抱怨reduce/reduce冲突,但在我看来似乎有一种冲突。假设我们已经解析了一个Parsing 为什么';这个语法不存在reduce/reduce冲突吗?,parsing,bison,reduce-reduce-conflict,Parsing,Bison,Reduce Reduce Conflict,考虑以下语法(无可否认,这是毫无意义的——为了说明这一点,它被大大简化了): Bison在使用这种语法时并没有抱怨reduce/reduce冲突,但在我看来似乎有一种冲突。假设我们已经解析了一个否定表达式和一个常量表达式;在我看来,基于上述定义,解析器现在可以做两件事: 使用上面的规则1将序列缩减为testRule 使用上面的规则2将constantExpression减少为testRule(在这种情况下,negationExpression将保持不变,因此解析堆栈将如下所示:negationE
否定表达式
和一个常量表达式
;在我看来,基于上述定义,解析器现在可以做两件事:
testRule
constantExpression
减少为testRule
(在这种情况下,negationExpression
将保持不变,因此解析堆栈将如下所示:negationExpression testRule
)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冲突
这不正是这里的情况吗?不,这里不适用 “输入顺序”是一个不恰当的措辞;其含义实际上是“相同的输入”,或者更明确地说是“有效输入的相同前缀子序列”。换句话说,如果有两个或两个以上的规则可以应用于整个输入,直到当前读取点(并考虑到前瞻性) 在语法中,
testRule
从不遵循任何规则。它(和否定表达式
)只能在某些派生的一开始就减少。因此,如果(部分减少的)输入以negationExpression constantExpression
结束,则不可能将constantExpression
减少为testRule
,因为起始符号的派生不能在非初始位置包含testRule
state 5
6 testRule: constantExpression .
$default reduce using rule 6 (testRule)
...
state 9
5 testRule: negationExpression constantExpression .
$default reduce using rule 5 (testRule)