Frage

Ich versuche, eine Struktur als Teil der Vereinigung mit Bison zu schließen, aber ich erhalte eine Fehlermeldung auf dem ‚struct Knoten args‘ in% Vereinigung:

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

Der Code:

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

%}

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

%token <string> CD WORD PWD EXIT

%type <args> arg_list

Wer weiß, was ich falsch mache?

War es hilfreich?

Lösung

Noch besser ist, verwenden Sie den Code% Direktive mit der "erfordert" Option, das heißt:.

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

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

Dies beinhaltet den Code in dem „erfordert“ Block in der tab.h Datei sowie die Parser-Quelldatei.

Aus der Dokumentation: http://www.gnu.org /software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  
      
  • erfordert   
        
    • Zweck: Dies ist der beste Ort, Abhängigkeits Code zu schreiben, die für   YYSTYPE und YYLTYPE. Mit anderen Worten,   es ist der beste Ort, Typen zu definieren   in% union Richtlinien verwiesen, und   es ist der beste Ort, außer Kraft zu setzen   Bison-Standard YYSTYPE und YYLTYPE   Definitionen.
    •   
  •   

Andere Tipps

Es kommt auf die lame y.tab.h Ausgabe, die Sie erhalten.

Sie müssen dieses Problem beheben, indem sichergestellt wird, dass „struct node“ definiert ist, bevor Sie y.tab.h überall sind.

diese eine Datei node.h mit der Struktur Definition Dazu erstellen.

Dann sind node.h vor y.tab.h in Ihrer parser.l Datei, parser.y Datei sowie alle Dateien c Sie haben die y.tab.h. enthalten Dies ist ein wenig ärgerlich.

Alternativ können Sie „struct Knoten args“ auf „struct node * args“ ändern, da Sie nicht die volle Art wissen müssen, bis Sie es irgendwo gehen zu verwenden. Nicht sicher, ob dies mit Ihrem Code passen würde.

Entweder man sollte funktionieren.

Vielleicht einfacher (glaube ich) - verwendet, um diese selbst:

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

Dann in flex können Sie "yylval.s.name" oder "yylval.s.type", etc .. verwenden, während in Bison, statt $$=0, $1=bla ... Sie jetzt $<s.type>$=0 , $<s.type>1=bla... schreiben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top