Includi struct in% union def con Bison / Yacc
Domanda
Sto cercando di includere una struttura come parte dell'unione con Bison, ma ricevo un errore sul 'nodo di struttura args' in% union:
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 cosa sto facendo di sbagliato?
Soluzione
Ancora meglio, usa la direttiva% code con " richiede " opzione, ad es .:
%code requires {
struct node {
char * val;
struct node * next;
};
}
%union {
char * string;
struct node args;
}
Questo includerà il codice tra " richiede " blocco nel file tab.h e nel file sorgente del parser.
Dalla documentazione: http://www.gnu.org /software/bison/manual/html_node/Decl-Summary.html#Decl-Summary
- richiede
- Scopo: questo è il posto migliore per scrivere il codice di dipendenza richiesto YYSTYPE e YYLTYPE. In altre parole, è il posto migliore per definire i tipi menzionato in% direttive sindacali e è il posto migliore per scavalcare YYSTYPE e YYLTYPE predefiniti di Bison definizioni.
Altri suggerimenti
Si riduce all'output y.tab.h di scarsa qualità che si ottiene.
Devi risolvere questo problema assicurandoti che " struct node " è definito prima di includere y.tab.h ovunque.
Per fare ciò, creare un file node.h con la definizione di struttura.
Quindi includi node.h prima di y.tab.h nel tuo file parser.l, nel file parser.y e in tutti i file c che hai incluso y.tab.h. Questo è un po 'fastidioso.
In alternativa puoi cambiare " struct node args " a " nodo nodo * args " dal momento che non avresti bisogno di conoscere il tipo completo fino a quando non lo usi da qualche parte. Non sono sicuro se questo si adatterebbe con il tuo codice.
O uno dovrebbe funzionare.
Forse più semplice (penso) - ho usato questo da solo:
%union {
char c;
struct {
char name[30];
int type;
} s;
}
Quindi, in flex puoi usare " yylval.s.name " o " yylval.s.type " ;, ecc. mentre sei in bisonte, invece di $$=0, $1=bla
... ora puoi scrivere $<s.type>$=0 , $<s.type>1=bla...