Question

J'essaie d'inclure une structure dans le cadre de l'union avec Bison, mais une erreur est générée dans les arguments de noeud de structure dans% union:

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

Le code:

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

%}

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

%token <string> CD WORD PWD EXIT

%type <args> arg_list

Quelqu'un sait ce que je fais mal?

Était-ce utile?

La solution

Encore mieux, utilisez la directive% code avec le " Nécessite &>; option, c'est-à-dire:

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

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

Ceci inclura le code dans le " nécessite & le; bloquer dans le fichier tab.h ainsi que le fichier source de l’analyseur.

Dans la documentation: http://www.gnu.org /software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  
      
  • nécessite   
        
    • Objectif: C’est le meilleur endroit pour écrire le code de dépendance requis pour   YYSTYPE et YYLTYPE. En d'autres termes,   c'est le meilleur endroit pour définir les types   référencé dans% directives syndicales, et   c'est le meilleur endroit pour passer outre   YYSTYPE et YYLTYPE par défaut de Bison   définitions.
    •   
  •   

Autres conseils

Cela revient à la sortie boiteuse y.tab.h que vous obtenez.

Vous devez résoudre ce problème en vous assurant que " struct node " est défini avant d’inclure y.tab.h n’importe où.

Pour cela, créez un fichier node.h avec la définition de la structure.

Ensuite, incluez node.h avant y.tab.h dans votre fichier parser.l, votre fichier parser.y ainsi que tout fichier c que vous possédez, notamment y.tab.h. C'est un peu ennuyeux.

Vous pouvez également changer & "; struct node args &"; à " struct node * args " puisque vous n’auriez pas besoin de connaître le type complet avant de l’utiliser quelque part. Vous ne savez pas si cela correspond à votre code.

L'un ou l'autre devrait fonctionner.

Peut-être plus simple (je pense) - utilisé moi-même:

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

Ensuite, en flex, vous pouvez utiliser " yylval.s.name " , ou & "; yylval.s.type &" ;, etc .. pendant que vous êtes à Bison, au lieu de $$=0, $1=bla ... vous pouvez maintenant écrire $<s.type>$=0 , $<s.type>1=bla...

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top