我在 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);
}
ast
AST
是具有方法的类的对象
TreeNode * createNode(TreeNode * left, TreeNode* right, NodeType nt);
在 ast 树中创建一个新节点并连接它。
先感谢您。