Bison中因空规则导致的移进/归约冲突问题解决
无优先级解决Bison移进/归约冲突的语法重写
原语法的冲突根源在于:B和E的组合定义等价于一个或多个D(B: D | D D | ...),而A的a B C分支中,语法分析器遇到a后的D序列时,无法判断是继续移进下一个D(因为E可以递归扩展),还是归约当前D序列为B以处理后续的C(即error),由此产生移进/归约冲突。
不依赖优先级规则的重写方案,核心是扁平化递归结构,明确分支的语法结构,消除歧义:
%token a %start A %% A: a D_LIST error | /* empty */ ; // 定义一个或多个D的序列 D_LIST: D | D_LIST D ; D: error ;
重写后,D_LIST直接表示一个或多个D,A的a分支明确要求a后紧跟任意数量的D,再衔接error(对应原语法的C)。语法分析器不再需要做二选一的判断,冲突自然消除。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

