0

これらの要素のメモリ位置が必要ですが、それらすべてが同じユニオン位置を指しているように見えるため、バイソンのユニオン定義で構造体へのポインターを使用する際に問題があります。正しい方法を使用しているかどうかはわかりません。私のコードは次のようになります:

main.h:

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);
    ...
}
4

1 に答える 1

0

それが正しい方法かどうかはわかりませんが、ユニオン要素を構造体に「変換」すると、それらがマップされました。

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 ...
    ...
}

まあ、これはうまくいきます。

于 2012-04-17T01:41:50.670 に答える