如何在bison输入文件中修复type clash类型冲突警告
问题根源
你已经将statement声明为<value>返回类型,Bison要求该非终结符的所有产生式分支都必须为$$(返回值)赋值。你当前缺失两个分支的语义动作,Bison默认执行$$ = $1,而$1的类型和<value>不匹配,因此抛出类型冲突警告:
- IF分支的
$1是无类型的IF关键字 - CASE分支的
$1是未声明返回类型的case_statement非终结符
修复步骤
1. 补充缺失的非终结符类型声明
在%type段追加case相关非终结符的<value>类型声明:
%type <value> body statement_ statement reductions expression relation term factor primary power conjunction case_statement cases case cases_others
2. 补全所有产生式的语义动作
按你解释器的语义需求,明确给每个分支的返回值赋值,参考示例:
statement: expression {$$ = $1;} | REDUCE operator reductions ENDREDUCE {$$ = $3;} | /* IF分支:条件为真返回THEN后的语句值,否则返回ELSE后的语句值 */ IF expression THEN statement_ ELSE statement_ ENDIF {$$ = $2 ? $4 : $6;} | /* CASE分支:返回case语句的执行结果 */ case_statement ENDCASE {$$ = $1;} ; /* case匹配项返回对应执行语句的值 */ case: WHEN INT_LITERAL ARROW statement_ {$$ = $4;}; /* 多分支匹配可根据你的匹配逻辑返回对应值,示例为先匹配到的项优先返回 */ cases: case cases_others {$$ = /* 你的匹配逻辑,比如匹配成功返回$1否则返回$2 */}; /* case语句整体返回匹配到的分支值,未匹配到返回OTHERS分支的值 */ case_statement: CASE expression IS cases OTHERS ARROW statement_ ';' {$$ = /* 匹配逻辑,匹配到cases返回$4否则返回$7 */} | error ';' {$$ = 0;} ; /* 空分支给默认返回值 */ cases_others: case cases_others {$$ = /* 匹配逻辑 */} | {$$ = 0; /* 可替换为你定义的未匹配标识 */};
所有产生式都显式声明返回值后,警告就会消失。
内容的提问来源于stack exchange,提问作者heck
相关产品推荐
相关产品推荐

