运行.y文件遇type clash警告:<symp> != <>求解决方案
解决YACC/Bison的"type clash on default action"警告
这个警告的核心原因是产生式的默认动作类型不匹配:
- YACC/Bison会给没有显式写动作的产生式自动添加默认动作:
$$ = $1;,也就是把第一个符号的类型赋值给当前非终结符的类型。 - 你的
factor非终结符在第二个产生式里被定义为symp结构体类型(因为你操作了$$.type和$$.name),但第一个产生式factor : LPAREN exp RPAREN没有写动作,默认会把$1(LPAREN的类型,一般是int型的token值)赋值给$$,这就导致了<symp>和<>(int类型)的类型冲突。
修复方案
给第一个产生式加上明确的动作,把exp的结果赋值给factor,确保两个产生式的$$类型一致:
factor : LPAREN exp RPAREN { $$ = $2; } | INT_LITERAL { strcpy($$.type ,"int"); strcpy($$.name,""); }
这样默认动作被覆盖,两个产生式都返回symp类型,警告就会消失。
内容的提问来源于stack exchange,提问作者rema
相关产品推荐
相关产品推荐

