C++ 如何在yacc union中保存以相同规则显示的两个相同类型的对象?
我在yacc联盟面临一个问题,简言之,就是:我宣布成立这样一个联盟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
%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);