Comment résoudre l'avertissement de Bison & # 8220; & # 8230; n'a pas de type déclaré & # 8221;

StackOverflow https://stackoverflow.com/questions/1014619

  •  06-07-2019
  •  | 
  •  

Question

Exécution de Bison sur ce fichier:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%%

exp :   NUM     {$.val = $1.val;}
    | ID        {$.val = vars[$1.name];}
    | exp '+' exp   {$.val = $1.val + $3.val;}
    | ID '=' exp    {$.val = vars[$1.name] = $3.val;}
;

%%

conduit à des avertissements du type de:

  

avertissement: le type de $$ de 'exp' n'a pas de type déclaré.

Qu'est-ce que cela signifie et comment le résoudre?

Était-ce utile?

La solution

L'union (% union) définie n'est pas destinée à être utilisée directement. Vous devez plutôt indiquer à Bison quel membre du syndicat est utilisé par quelle expression.

C’est fait avec la directive% type . .

Une version corrigée du code est la suivante:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%type<val> exp NUM
%type<name> ID

%%

exp :   NUM     {$ = $1;}
    | ID        {$ = vars[$1];}
    | exp '+' exp   {$ = $1 + $3;}
    | ID '=' exp    {$ = vars[$1] = $3;}
;

%%

Autres conseils

Si vous souhaitez être plus explicite avec vos réductions (si vous effectuez l'annotation AST, cela peut être pratique), vous pouvez alors faire en sorte que vos valeurs de pile soient des pointeurs, puis gérer vous-même les valeurs de type. Tout comme les types scalaires avec:

struct myScalar {
    union {
        int num;
        char *id;
        char *float_lexeme;
    }payload;

    enum {
        TYPE_NUM,
        TYPE_IDENTIFIER,
        TYPE_FLOAT_CHAR
    } type;
    char *orig_lexeme;
};

Et avoir un typedef et scalar_val * val pour la pile.

Lorsque vous passez à des frontaux de compilateur plus complexes, il peut être utile de construire votre AST de cette manière. Ainsi, lorsque vous parcourez l'arborescence, vous disposez de meilleures méta-données et vous pouvez également augmenter la traduction avec des traductions pour les types pré-sémantiques. . Cela se résume ensuite à vos productions feuille, telles que ID, pour mélanger le lexème dans la charge utile scalaire appropriée.

Ce n’est pas une explication complète, mais vous avez l’idée.

J'espère que cela vous aidera dans vos futurs frontaux Bison / Lex et ...

Bonne chance

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