这个语法中的转换/减少冲突在哪里?

时间:2013-06-13 20:44:58

标签: shift-reduce-conflict

似乎无法弄清楚导致此语法中的转换/减少冲突的原因。似乎通过将最右边的运算符优先级分配给CMD和LCURLY来修复,但我不确切地知道问题是什么。有什么帮助吗?

ContentList : Content
            | Content ContentList
;

Content : CMD
        | CMD LCURLY TEXT RCURLY
        | LCURLY CMD WS TEXT RCURLY
;

1 个答案:

答案 0 :(得分:2)

使用yacc的-v选项获取生成语法的更多详细信息。这会为您提供一个包含以下内容的.output文件:

State 1 conflicts: 1 shift/reduce
       :
state 1

    3 Content: CMD .
    4        | CMD . LCURLY TEXT RCURLY

    LCURLY  shift, and go to state 5

    LCURLY    [reduce using rule 3 (Content)]
    $default  reduce using rule 3 (Content)

显示问题的确切位置。在这种情况下,在看到CMD后,当下一个标记为LCURLY时,它不知道是否要减少第3个规则(Content: CMD),以便它可以开始解析会匹配第5条规则,或是否转移LCURLY以继续匹配第4条规则。

在这种情况下,它可以告诉更多的前瞻(2个令牌就足够了 - 将决定LCURLY之后的令牌是TEXT还是{{1} }),但yacc(和大多数LR解析器生成器)只使用一个前瞻标记。