You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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*,因此无法识别结构体成员。

解决步骤

  1. 在parser.y中,为所有涉及AST节点操作的非终结符添加%type <node>声明,例如:

    %type <node> addop expr stmt var_or_proc empty_stmt
    

    这里的<node>对应你%union中定义的成员名。

  2. 如果终结符(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:55:31