0

似乎无法弄清楚是什么导致了这个语法中的移位/减少冲突。将最右边的运算符优先级分配给 CMD 和 LCURLY 似乎已解决,但我不知道到底是什么问题。有什么帮助吗?

ContentList : Content
            | Content ContentList
;

Content : CMD
        | CMD LCURLY TEXT RCURLY
        | LCURLY CMD WS TEXT RCURLY
;
4

1 回答 1

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)

它可以准确地告诉您问题出在哪里。在这种情况下,在看到 a 之后CMD,当下一个标记是时LCURLY,它不知道是否减少第 3 条规则 ( Content: CMD),因此它可以开始解析将匹配第 5 条规则的内容,或者是否LCURLY将第 4 条规则。

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

于 2013-06-13T23:06:40.380 回答