web-dev-qa-db-fra.com

Comment résoudre l'avertissement Bison "... n'a pas de type déclaré"

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:

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

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

44
Asaf R

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

Cela se fait avec la directive% type .

Une version fixe du code est:

%{
    #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;}
;

%%
45
Asaf R

En outre, si vous voulez être plus explicite avec vos réductions (si vous faites une annotation AST, cela peut être pratique), vous pouvez créer des pointeurs de valeurs de pile, puis gérer 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 compilation plus complexes, cela peut aider à créer votre AST comme ceci afin que lorsque vous traversez l'arborescence, vous ayez de meilleures métadonnées et que vous puissiez également augmenter la traduction avec traductions pour les types pré-sémantiques. Ensuite, cela revient à vos productions foliaires telles que l'ID pour mélanger le lexème dans la charge utile scalaire appropriée.

Pas une explication complète, mais vous avez l'idée.

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

bonne chance

8
Aiden Bell