%token A B
%%
start: {printf("Starting…\n");} A A
| A B;我的书中说,当令牌为A时,会出现shift-reduce冲突,因为yacc会将代码转换为A。
%token A B
%%
start: empty A A
| A B;
empty: {printf("Starting…\n");} ; 我不明白这个。在这里,开始的第二个规则转移,空规则减少。start的第一个规则也改变了,所以第一个输入是A,而第二个规则是B。这怎么会有冲突呢?据我所知,一条规则必须减少,另一条规则应该改变,这两条规则对于这种冲突的输入应该是相同的。然而,有一条规则在这里同时移动和减少(第一条规则),而第二条规则只移动,他们也希望在这些操作之后有不同的标记。
发布于 2019-10-22 06:12:37
冲突在于,在移动A之前,它不知道是否减少空规则(运行操作)。两个规则都希望A作为第一个令牌,因此您会得到一个shift/reduce冲突。应该做什么取决于第二个令牌,因此语法是不模糊的,并且可以通过使用更多的先行(使用GLR或回溯解析器)来解决冲突。
https://stackoverflow.com/questions/58494632
复制相似问题