Yacc/Bison中%union使用后出现成员访问错误与指针类型警告求助
解决Yacc/Bison中Union类型使用与AST指针不兼容问题
问题1:访问结构体成员报错
错误示例
parser.y:393:28: error: request for member 'op' in something not a structure or union 393 | addop : ADDOP{ $$->op = OP_ADD; } parser.y:372:36: error: request for member 'string' in something not a structure or union 372 | strcpy(str, $1->string); parser.y:292:21: error: request for member 'nodeType' in something not a structure or union 292 | $$->nodeType = NODE_VAR_OR_PROC;
原因
你虽然定义了%union{ nodeType *node; },但没有为需要使用AST节点的非终结符/终结符指定对应的union成员类型。Yacc/Bison默认会将语义值($num、$$)视为int类型指针,而非nodeType*,因此无法识别结构体成员。
解决步骤
在
parser.y中,为所有涉及AST节点操作的非终结符添加%type <node>声明,例如:%type <node> addop expr stmt var_or_proc empty_stmt这里的
<node>对应你%union中定义的成员名。如果终结符(比如
ADDOP)需要传递AST节点或关联数据,也要用%token <node>声明:%token <node> ADDOP IDENTIFIER NUMBER
问题2:指针类型不兼容警告
警告示例
parser.y:286:22: warning: assignment to 'int *' from incompatible pointer type 'struct nodeType *' [-Wincompatible-pointer-types] 286 | $$ = newNode(NODE_EMPTY); parser.y:388:24: warning: passing argument 1 of 'addChild' from incompatible pointer type [-Wincompatible-pointer-types] 388 | addChild($$, $2); | ~~~~~~^~ | | | int * parser.y:383:30: warning: passing argument 1 of 'deleteNode' from incompatible pointer type [-Wincompatible-pointer-types] 383 | deleteNode($1); | ~~~~ ^ | | | int *
原因
同样是因为未指定语义值类型,$$、$num被默认当作int*,而newNode返回nodeType*,addChild/deleteNode需要nodeType*参数,导致类型不匹配。
解决步骤
和问题1的解决方法完全一致:为对应的非终结符/终结符添加%type <node>或%token <node>声明,让Yacc/Bison明确语义值的类型为nodeType*,这样赋值和函数调用的类型就会匹配。
额外注意事项
- 确保
parser.y中正确包含ast.h头文件,且ast.h里的nodeType结构体定义完整,Yacc/Bison需要知道结构体的成员才能正确编译语义动作中的成员访问代码。 - 检查
newNode、addChild、deleteNode的函数声明是否在parser.y中可见(比如通过包含ast.h),确保函数参数和返回值类型是nodeType*。
内容的提问来源于stack exchange,提问作者sdragon
相关产品推荐
相关产品推荐

