Как сохранить два объекта одного типа в Yacc Union, которые появляются в том же правиле?

Я сталкиваюсь с проблемой в 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 и подключить его.

Заранее спасибо.

0

Решение

Все зависит от того, что вы делаете в своих функциях. Есть
отдельные случаи объединения для каждого термина, так $<node>1 а также
$<node>2 ссылаются на разные случаи указатель.
От того, указывают ли они на одно и то же или нет, зависит
вы положили в них; YACC просто копирует union когда
подходящее.

Если у вас есть указатель на динамически распределенную память в
unionВы должны иметь действие для каждого правила, которое имеет термин
который получит указатель, и это действие должно либо
удалить или передать как $<node>$или вставьте его в какой-нибудь
другой объект, который будет управлять его памятью. Это не так
сложно, как это звучит, но это требует некоторого внимания к
подробно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]