Bison语法错误处理与位置信息应用解析
1. Bison语法冲突处理
在使用Bison进行语法分析时,常常会遇到语法冲突的问题,尤其是reduce/reduce冲突和shift/reduce冲突。这些冲突很多时候是由模糊的语法规则引起的。
如果在语法规则中存在对男孩(boys)和女孩(girls)的引用,需要对其进行修正。由于原始语法存在模糊性,GLR(Generalized LR)解析器在此处的帮助有限,仍然需要处理这种模糊性。当无法将可选项分离时,若找不到清晰的方法来消除重叠部分,就只能保留reduce/reduce冲突,使用GLR解析器,并运用相关技术来明确处理这种模糊性。
若不使用GLR解析器,Bison会采用默认的消除冲突规则,即选择Bison描述中的第一个定义。例如,在之前的“girls | boys”示例中,如果不做处理,CHRIS和DARRYL会一直被视为女孩;若交换男孩和女孩列表的位置,他们则会一直被视为男孩。不过,此时仍会收到reduce/reduce警告,且Bison会自动分离可选项,这可能并非我们所期望的结果。
为了解决Bison语法中的冲突问题,可以按照以下步骤进行:
1. 在 name.output 中找到shift/reduce错误。
2. 确定reduce规则。
3. 确定相关的shift规则。
4. 查看reduce规则会归约到何处。
5. 根据这些信息,识别导致冲突的令牌流。
通常情况下,查看reduce规则归约到的位置比较直接,但有时语法过于复杂,“四处查找”的方法可能不太实用,这时就需要深入了解状态机的详细操作,以找到归
超级会员免费看
订阅专栏 解锁全文
3

被折叠的 条评论
为什么被折叠?



