Linux下执行bison -d comp.y出现reduce/reduce冲突如何解决?
问题排查与解决方法
第一步:定位冲突的通用方法
执行带-v参数的bison命令生成状态报告:
bison -d -v comp.y
执行后会生成comp.output文件,里面会明确标注冲突所在的状态、涉及的两条产生式、触发冲突的lookahead token,所有bison冲突都可以通过这个文件定位。
第二步:本次冲突的根因
你代码里的Exp(表达式)产生式写错了:
Exp: INT x | FLOAT x | Num x | IDENTIFICADOR x;
INT、FLOAT是你定义的类型关键字token,本应该只出现在声明语句的开头(归约为Tipo产生式),但你错误的把它们加到了表达式的合法开头中。结合LALR(1)解析器只有1个前看token的特性,当解析器遇到INT/FLOAT token时,无法判断应该归约为Tipo走声明分支,还是归约为Exp前缀走表达式分支,就触发了reduce/reduce冲突。
第三步:修复方案
直接删除Exp产生式中多余的类型关键字分支即可:
// 修改前 // Exp: INT x | FLOAT x | Num x | IDENTIFICADOR x; // 修改后 Exp: Num x | IDENTIFICADOR x;
修改后重新执行bison -d comp.y就不会再报冲突告警。
其他可选优化点
- 你目前的
LISTA_VAR、x、y产生式都是右递归,大批量输入时会消耗更多栈空间,可以改成左递归优化性能 extern int linhas变量只声明了未定义,需要在配套的lex词法分析文件中维护行号变量并导出yyerror函数调用时传参逻辑有问题,默认的yyerror只接收1个字符串参数,你自定义了双参数版本,需要在代码开头补充yyerror的前置声明避免隐式声明报错
内容的提问来源于stack exchange,提问作者Julia_Gubolin
相关产品推荐
相关产品推荐

