Parsing 为什么';这个语法不存在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

考虑以下语法(无可否认,这是毫无意义的——为了说明这一点,它被大大简化了):

Bison在使用这种语法时并没有抱怨reduce/reduce冲突,但在我看来似乎有一种冲突。假设我们已经解析了一个
否定表达式
和一个
常量表达式
;在我看来,基于上述定义,解析器现在可以做两件事:

  • 使用上面的规则1将序列缩减为
    testRule
  • 使用上面的规则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冲突


    这不正是这里的情况吗?

    不,这里不适用

    “输入顺序”是一个不恰当的措辞;其含义实际上是“相同的输入”,或者更明确地说是“有效输入的相同前缀子序列”。换句话说,如果有两个或两个以上的规则可以应用于整个输入,直到当前读取点(并考虑到前瞻性)

    在语法中,
    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)