似乎弄不清楚是什么导致了这个语法中的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解析器生成器)只使用一个前瞻性标记。