2012-04-18 96 views
0

我有一個語法,所述符號中的一個可以取不同的值YACC(野牛)解析樹無序打印

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 

我的結構有什麼問題?

請記住,這是一個如此丟失或錯位的分號或括號可以忽略的示例。 :-)

謝謝

回答

1

insert_repeat_statement_list需要聲明追加到現有rstlist的結束,而不是前面加上到列表的開頭。

insert_statement_list將rstlist *作爲第一個參數,將st *作爲第二個arg,但您使用反轉的參數類型調用它。這應該會給你一個編譯錯誤,除非你的%type聲明(你沒有顯示)被搞砸了(如果它們搞砸了,一切都可能會失敗)。

+0

是的就是這樣。另外我刪除了RepeatStatementList並向StatementList添加了第二個選項。簡 – Nitrate 2012-04-19 14:24:37