Shift reduce conflict 该语法中的移位/减少冲突在哪里?

Shift reduce conflict 该语法中的移位/减少冲突在哪里?,shift-reduce-conflict,Shift Reduce Conflict,似乎无法找出此语法中移位/减少冲突的原因。将最右边的运算符优先级指定给CMD和LCURLY似乎可以解决这个问题,但我不知道到底是什么问题。有什么帮助吗 ContentList : Content | Content ContentList ; Content : CMD | CMD LCURLY TEXT RCURLY | LCURLY CMD WS TEXT RCURLY ; 使用yacc的-v选项获取生成语法的更多详细信息。这将为您

似乎无法找出此语法中移位/减少冲突的原因。将最右边的运算符优先级指定给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
),以便它可以开始解析将匹配第五条规则的内容,或者是否要移动
LCURLY
,以继续匹配第四条规则

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