似乎无法弄清楚导致此语法中的转换/减少冲突的原因。似乎通过将最右边的运算符优先级分配给CMD和LCURLY来修复,但我不确切地知道问题是什么。有什么帮助吗?
ContentList : Content
| Content ContentList
;
Content : CMD
| CMD LCURLY TEXT RCURLY
| LCURLY CMD WS TEXT RCURLY
;
答案 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解析器生成器)只使用一个前瞻标记。