2009-09-16 10 views
15

Próbuję obejmują struct w ramach unii z Bison, ale pojawia się błąd na „struct node args” w% unii:Dołącz struct w def% związków z Bison/Yacc

parser.y:17: error: field ‘args’ has incomplete type 

Kod:

struct node { 
    char * val; 
    struct node * next; 
}; 

%} 

%union { 
    char * string; 
    struct node args; 
} 

%token <string> CD WORD PWD EXIT 

%type <args> arg_list 

ktoś wie co robię źle?

Odpowiedz

13

Sprowadza się do marnego wyniku y.tab.h.

Musisz to naprawić, upewniając się, że zdefiniowano "węzeł struktury", zanim dodasz wszędzie plik y.tab.h.

Aby to zrobić, utwórz plik node.h z definicją struktury.

Następnie należy dołączyć plik node.h przed y.tab.h do pliku parser.l, parser.y oraz do wszystkich plików c, które zawierają plik y.tab.h. To trochę denerwujące.

Alternatywnie można zmienić "arginy węzłów strukturalnych" na "węzeł struktury * args", ponieważ nie trzeba znać pełnego typu, dopóki nie użyje się go gdzieś. Nie jestem pewien, czy pasowałoby to do twojego kodu.

Każdy powinien zadziałać.

22

Nawet lepiej użyć dyrektywy kod% z opcją „wymaga”, to znaczy:

%code requires { 
    struct node { 
     char * val; 
     struct node * next; 
    }; 
} 

%union { 
    char * string; 
    struct node args; 
} 

ten będzie zawierać kod w „wymaga” blok w pliku tab.h jak parser Plik źródłowy.

Z dokumentacji: http://www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  • wymaga
    • Cel: To jest najlepsze miejsce, aby napisać kod zależność wymaganej do YYSTYPE i YYLTYPE. Innymi słowy: to najlepsze miejsce do zdefiniowania typów , do których odniesienia znajdują się w dyrektywach dotyczących związków, i jest to najlepsze miejsce do nadpisania domyślnych definicji YYSTYPE i YYLTYPE Bison'a o definicjach Jison'a .
1

Może prościej (myślę) - stosuje się ten sam:

%union { 
    char c; 
    struct { 
    char name[30]; 
    int type; 
    } s; 
} 

Następnie w Flex można użyć "yylval.s.name" lub „yylval.s. wpisz ", itp., podczas gdy na żubrze zamiast $$=0, $1=bla ... możesz teraz pisać $<s.type>$=0 , $<s.type>1=bla...