Я сталкиваюсь с проблемой в 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
Есть ли способ получить два объекта distnict, каждый из которых представляет отдельный узел списка выражений.
И правило 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>$
или вставьте его в какой-нибудь
другой объект, который будет управлять его памятью. Это не так
сложно, как это звучит, но это требует некоторого внимания к
подробно.
Других решений пока нет …