C++ 如何在yacc union中保存以相同规则显示的两个相同类型的对象?

C++ 如何在yacc union中保存以相同规则显示的两个相同类型的对象?,c++,yacc,abstract-syntax-tree,C++,Yacc,Abstract Syntax Tree,我在yacc联盟面临一个问题,简言之,就是:我宣布成立这样一个联盟 %union{ struct R{ int col_no,line_no; int i; float f; char c; char* str; }r; class TreeNode * node; } 那么在语法中我有一条规则: assign_statmen

我在yacc联盟面临一个问题,简言之,就是:我宣布成立这样一个联盟

   %union{
         struct R{
         int col_no,line_no;
         int i;
         float f;
         char c;
         char* str;
            }r;
         class TreeNode * node;
       }
那么在语法中我有一条规则:

assign_statment:expression_list ASSIGN expression_list
         {
           $<node>$ = rePositionAssign($<node>1,$<node>3,yylval.r.line_no, yylval.r.col_no);
    }
ast
是类
ast
的对象,该类具有

    TreeNode * createNode(TreeNode * left, TreeNode* right, NodeType nt);
在ast树中创建新节点并连接它


提前谢谢。

这取决于您在功能中所做的工作。有 每个术语的联合的单独实例,因此
$1
$2
引用指针的不同实例。 它们是否指向同一事物取决于什么 你把它们放进去了;yacc仅在以下情况下复制
联合
合适

如果您有一个指向动态分配内存的指针
union
,您必须对每个具有术语的规则执行操作 它将接收指针,并且此操作必须 删除它,或将其作为
$$
传递,或将其插入到 将管理其内存的其他对象。这不像 虽然听起来很难,但确实需要注意
详细信息。

谢谢@James Kanaze,如果输入文件是:t.i,x=5,3//等于t.i=5;x=3我将得到两个
TreeNode
@creativeCreative如果您的扫描仪返回两个不同的
TreeNode
,您将得到两个不同的
TreeNode
yacc
不在乎;它只是将扫描器返回的指针分配给union。但在规则中,每个
$i
都是一个单独的变量,就像
$
一样。(规则减少后,
$i
变量将消失,因此请确保对它们进行任何必要的内存管理——将指针复制到另一个对象中可能就足够了。)@creativeCreative当然,如果扫描仪返回指向
树节点
的同一静态实例的指针,然后所有
$i
都将引用相同的
TreeNode
    TreeNode * createNode(TreeNode * left, TreeNode* right, NodeType nt);