0

我有一个语法示例,其中一个符号可以采用不同的值

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 将 arstlist *作为其第一个参数,将 ast *作为第二个参数,但是您在调用它时将这些参数类型颠倒了。这应该会给你一个编译错误,除非你的%type声明(你没有显示)被搞砸了(如果他们搞砸了,一切都可能行为不端。)

于 2012-04-18T21:26:38.260 回答