0

シンボルの1つが異なる値を取ることができる文法のこの例があります

StatementList : Statement RepeatStatementList { $$=insert_statement_list($1, $2); }
                ;

RepeatStatementList : RepeatStatementList SEMICOLON Statement { $$=insert_repeat_statement_list($1, $3); }
        | { $$ = NULL; }
                    ;

Statement : NUMBER { $$=insert_statement(NULL, $1); }
            ;

Statement : ID { $$=insert_statement($1, NULL); }
;

以下のように構造とインサートを定義しました。

struct statement_list_
{
    st* s;
    struct rstlist *r;

} stlist;

struct repeat_statement_list_
{
    st* s;
    struct repeat_statement_list_ *next;
} rstlist;


struct statement_
{
    char *id;
    int number;

} st;


stlist* insert_statement_list(rstlist *r, st* s)
{
    stlist* l = (stlist*)malloc(sizeof(stlist));
    l->s = s;
    l->r = r;

    return l;
} 

rstlist* insert_repeat_statement_list(rstlist *next, st *s)
{
    rstlist* l = (rstlist*)malloc(sizeof(rstlist));
    l->s = s;
    l->next = next;

    return l;
}

st* insert_statement(char* id, int n)
{
    st* l = (st*)malloc(sizeof(st));
    l->id = id;
    l->number = n;

    return l;
}

私が抱えている問題は、次のような入力を渡す場合です。

id1
1
2
3
id2

訪問したアイテムに関して私が得るものは次のとおりです。

id1
1
id2
3
2

私の構造の何が問題になっていますか?

これはサンプルであるため、セミコロンやブラケットの欠落や配置ミスは無視できることに注意してください。:-)

ありがとうございました

4

1 に答える 1

1

insert_repeat_statement_listは、ステートメントをリストの先頭に追加するのではなく、既存のrstlistの末尾に追加する必要があります。

insert_statement_listは、rstlist *最初の引数としてaを取りst *、2番目の引数としてaを取りますが、これらの引数タイプを逆にして呼び出しています。%typeこれにより、宣言(表示されていない)が混乱していない限り、コンパイルエラーが発生するはずです(混乱していると、すべてが誤動作する可能性があります)。

于 2012-04-18T21:26:38.260 に答える