C и bison: указатели на структуру в определении %union

У меня возникли проблемы с использованием указателей на структуры в определении объединения bison, так как мне нужны позиции в памяти этих элементов, но все они кажется, указывает на одну и ту же позицию объединения. Не уверен, правильно ли я использую. Мой код выглядит так:

основной.ч:

typedef struct _control *control;
struct _control { ... };

typedef struct _symbol *symbol;
struct _symbol { ... };
...
#include "parser.h"

parser.y

%{
    #include "main.h"
%}

%union {
    control ctrl;
    symbol s_head;
    symbol s_tail;
}
...
%%
...
%%
int main (int argc, char** argv) {
    ...
    yylval.ctrl = malloc(sizeof(struct _control));
    yylval.s_head = malloc(sizeof(struct _symbol));
    yylval.s_tail = malloc(sizeof(struct _symbol));

    // This will give me the same memory position
    printf("%ld %ld %ld %ld\n",
        yylval, yylval.ctrl,
        yylval.s_head, yylval.s_tail);
    ...
}

person vmassuchetto    schedule 15.04.2012    source источник
comment
В Bison (как и в его предшественнике Yacc) %union объявляет C union, и вам, вероятно, следует больше узнать об этом.   -  person Some programmer dude    schedule 15.04.2012


Ответы (1)


Не уверен, что это правильный способ сделать это, но я только что сопоставил свои элементы объединения, как только я «преобразовал» их в структуру.

main.h

typedef struct _control *control;
struct _control { ... };

typedef struct _symbol *symbol;
struct _symbol { ... };

typedef struct _global *global;
struct _global { ... };

parser.y

%{
    #include "main.h"
%}

%union {
    global g;
}
...
%%
...
%%
int main (int argc, char** argv) {
    ...
    yylval.g->ctrl->some_element ...
    yylval.g->s_head ...
    ...
}

Ну, это просто работает.

person vmassuchetto    schedule 17.04.2012