这个语法中的shift/reduce冲突在哪里?



似乎弄不清楚是什么导致了这个语法中的shift/reduce冲突。它似乎是固定分配最右边的操作符优先级CMD和LCURLY,但我不知道到底是什么问题。任何帮助吗?

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

使用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时,它不知道是否减少第三条规则(Content: CMD),以便它可以开始解析将匹配第5条规则的内容,或者是否移动LCURLY以继续匹配第4条规则。

在这种情况下,它可以通过更多的前瞻性来判断(2个标记就足够了——将决定LCURLY之后的标记是TEXT还是CMD),但是yacc(和大多数LR解析器生成器)只使用一个前瞻性标记。

相关内容

  • 没有找到相关文章

最新更新