Shift reduce conflict 该语法中的移位/减少冲突在哪里?
似乎无法找出此语法中移位/减少冲突的原因。将最右边的运算符优先级指定给CMD和LCURLY似乎可以解决这个问题,但我不知道到底是什么问题。有什么帮助吗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选项获取生成语法的更多详细信息。这将为您
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解析器生成器)只使用一个前瞻性标记