2012-04-18 3 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, а не предваряя его на начало списка.

Вставка_statement_list принимает в качестве первого аргумента rstlist * как и второй аргумент st *, но вы вызываете его с теми типами аргументов, которые были отменены. Это должно дать вам ошибку компиляции, если только ваши объявления %type (которые вы не показываете) испорчены (и если они перепутаны, все, скорее всего, ошибочно).

+0

да, это все. Также я удалил RepeatStatementList и добавил второй вариант в StatementList. упрощенный – Nitrate

Смежные вопросы