2009-09-16 15 views
15

Sto cercando di includere una struttura come parte dell'unione con Bison, ma ottengo un errore sul 'struct nodo args' in% union:Includi struct nel DEF% unione con Bison/Yacc

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

Il Codice:

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

%} 

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

%token <string> CD WORD PWD EXIT 

%type <args> arg_list 

Qualcuno sa che cosa sto facendo male?

risposta

13

Si tratta dell'output lame.htb.h.

È necessario risolvere questo problema assicurandosi che "struct node" sia definito prima di includere y.tab.h ovunque.

Per fare ciò creare un file node.h con la definizione struct.

Quindi includere node.h prima di y.tab.h nel file parser.l, parser.y e tutti i file c in cui è presente y.tab.h. Questo è un po 'fastidioso.

In alternativa è possibile modificare "struct node args" in "struct node * args" in quanto non è necessario conoscere il tipo completo finché non si utilizza il comando da qualche parte. Non sono sicuro se questo si adatterebbe con il tuo codice.

O si dovrebbe funzionare.

22

Ancora meglio, utilizzare la direttiva del codice% con l'opzione "richiede", vale a dire:

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

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

Ciò includerà il codice che "richiede" blocco nel file tab.h così come il parser file sorgente.

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

  • richiede
    • Scopo: Questo è il posto migliore per scrivere codice dipendenza richiesta per YYSTYPE e YYLTYPE. In altre parole, è il posto migliore per definire i tipi a cui si fa riferimento in% union directives e è il posto migliore per sostituire le definizioni YYSTYPE e YYLTYPE di Bison predefinite di YYSTYPE e YYLTYPE .
1

Forse più semplice (credo) - usato questo me stesso:

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

Poi, in flessione è possibile utilizzare "yylval.s.name", o "yylval.s. digitare ", ecc. mentre in bisonte, invece di $$=0, $1=bla ... è ora possibile scrivere $<s.type>$=0 , $<s.type>1=bla...