0
%token A B
%%
start:  {printf("Starting…\n");} A A
 | A B;

我的书说,当令牌是 A 时,会发生移位减少冲突,因为 yacc 会转换为代码。

%token A B
%%
start: empty A A
 | A B;
empty: {printf("Starting…\n");} ; 

我没有得到这个。这里开始的第二条规则转移,空规则减少。start 的第一个规则也发生了变化,所以第一个输入需要 A,而第二个规则需要 B。这怎么冲突?据我所知,一个规则必须减少,另一个应该改变,而不是两个规则应该期望相同的标记作为这种冲突的输入。但是,这里有一条规则既移动又减少(第一条规则),而第二条规则只移动,它们也期望在这些操作之后有不同的令牌。

4

1 回答 1

1

冲突在于它不知道在移动 A 之前是否减少空规则(运行操作)。两个规则都期望 A 作为第一个标记,因此您会遇到移位/减少冲突。该做什么取决于第二个标记,因此语法没有歧义,并且可以通过使用更多前瞻(使用 GLR 或回溯解析器)来解决冲突。

于 2019-10-21T22:12:37.040 回答