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?

È stato utile?

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...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top