首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YACC中以操作开头的规则的Shift-Reduce冲突

YACC中以操作开头的规则的Shift-Reduce冲突
EN

Stack Overflow用户
提问于 2019-10-22 05:56:27
回答 1查看 98关注 0票数 0
代码语言:javascript
复制
%token A B
%%
start:  {printf("Starting…\n");} A A
 | A B;

我的书中说,当令牌为A时,会出现shift-reduce冲突,因为yacc会将代码转换为A。

代码语言:javascript
复制
%token A B
%%
start: empty A A
 | A B;
empty: {printf("Starting…\n");} ; 

我不明白这个。在这里,开始的第二个规则转移,空规则减少。start的第一个规则也改变了,所以第一个输入是A,而第二个规则是B。这怎么会有冲突呢?据我所知,一条规则必须减少,另一条规则应该改变,这两条规则对于这种冲突的输入应该是相同的。然而,有一条规则在这里同时移动和减少(第一条规则),而第二条规则只移动,他们也希望在这些操作之后有不同的标记。

EN

回答 1

Stack Overflow用户

发布于 2019-10-22 06:12:37

冲突在于,在移动A之前,它不知道是否减少空规则(运行操作)。两个规则都希望A作为第一个令牌,因此您会得到一个shift/reduce冲突。应该做什么取决于第二个令牌,因此语法是不模糊的,并且可以通过使用更多的先行(使用GLR或回溯解析器)来解决冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58494632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档