如何在yacc联合中保存出现在同一规则下的两个相同类型的对象

how to save two objects of the same type in yacc union which appear at the same rule?

本文关键字:两个 对象 同类型 规则 yacc 保存      更新时间:2023-10-16

我在yacc union中遇到了一个问题,简而言之:我声明了一个这样的union

   %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);
    }

我的问题是:这个规则会不会产生两个不同的TreeNode*对象?如果对于两个$<node>1$<node>3给出相同的对象,是否有任何技术可以得到两个不同的对象,每个对象都代表不同的表达列表节点?

对于expression_list规则,我做了如下操作:

   expression_list: expression_list COMMA expr  
                {
                    $<node>$ = ast->addToLastRight($<node>1, ast->createNode($<node>3, 0, exprListNode));
              }
       |expr              
                 {
                      $<node>$ = ast->createNode($<node>1, 0, exprListNode);
                }

ast是类AST的对象,其方法为

    TreeNode * createNode(TreeNode * left, TreeNode* right, NodeType nt);

命令在ast树中创建一个新节点并连接它。

提前感谢。

这完全取决于您在函数中做什么。有每个词单独的联合实例,所以$<node>1$<node>2指向指针的不同实例。它们是否指向同一事物取决于什么你把它们放进去;yacc只是复制union合适。

如果你有一个指针指向动态分配的内存union,你必须对每一个有术语的规则都有一个动作哪个将接收指针,这个操作必须是哪个删除它,或传递它作为$<node>$,或插入到一些其他将管理其内存的对象。它不是听起来很难,但确实需要注意细节。