0

我在 yacc 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);
                }

astAST是具有方法的类的对象

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

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

先感谢您。

4

1 回答 1

1

这完全取决于您在函数中所做的事情。每个术语都有单独的联合实例,因此$<node>1$<node>2引用指针的不同实例。它们是否指向同一事物取决于您在其中放入的内容;yacc 只是union在适当的时候复制。

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

于 2013-05-22T09:28:50.897 回答