似乎无法弄清楚是什么导致了这个语法中的移位/减少冲突。将最右边的运算符优先级分配给 CMD 和 LCURLY 似乎已解决,但我不知道到底是什么问题。有什么帮助吗?
ContentList : Content
| Content ContentList
;
Content : CMD
| CMD LCURLY TEXT RCURLY
| LCURLY CMD WS TEXT RCURLY
;
似乎无法弄清楚是什么导致了这个语法中的移位/减少冲突。将最右边的运算符优先级分配给 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)
它可以准确地告诉您问题出在哪里。在这种情况下,在看到 a 之后CMD
,当下一个标记是时LCURLY
,它不知道是否减少第 3 条规则 ( Content: CMD
),因此它可以开始解析将匹配第 5 条规则的内容,或者是否LCURLY
将第 4 条规则。
在这种情况下,它可以通过更多的前瞻来判断(2 个标记就足够了——将决定 之后的标记LCURLY
是 aTEXT
还是 a CMD
),但是 yacc(和大多数 LR 解析器生成器)只使用一个前瞻标记.