如何在yacc联合中保存出现在同一规则下的两个相同类型的对象
how to save two objects of the same type in yacc union which appear at the same rule?
我在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>$
,或插入到一些其他将管理其内存的对象。它不是听起来很难,但确实需要注意细节。
相关文章:
- 如何返回一个类的两个对象相加的结果
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何在Qt中连接来自不同窗口的两个对象?
- C++两个对象,其中包含指向同一数组不同部分的指针
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- C++:在另外两个对象之间共享一个对象
- 在单元测试中,如何在不使用 operator== 的情况下比较两个对象,这可能会错过新成员?
- 同一类的两个对象相互引用
- 将类对象传递给两个对象
- 如何调用运算符函数添加两个对象?
- 让一个名为A的类.传递以下两个对象有什么区别:(a)obj1和(b)obj1()
- 比较矢量迭代中的两个对象C
- 当我有两个对象时<<如何重载运算符?(有关系)
- 声明一个模板函数,将模板类友元的两个对象(仅)带到这两个专用化
- 使用指针将两个对象(每个都与一个类)相关联
- 比较类的两个对象之间的数据