我有一个语法示例,其中一个符号可以采用不同的值
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
我的结构出了什么问题?
请记住,这是一个样本,因此可以忽略错误或错位的分号或括号。 : - )
谢谢
答案 0 :(得分:1)
insert_repeat_statement_list需要将语句附加到现有rstlist的末尾,而不是将其添加到列表的开头。
insert_statement_list将rstlist *
作为其第一个参数,将st *
作为第二个参数,但是您将这些参数类型反转调用它。这应该给你一个编译错误,除非你的%type
声明(你没有显示)搞砸了(如果它们搞砸了,一切都可能行为不端。)