43 votes

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 le résoudre?

Merci,
Asaf

42voto

Asaf R Points 3425

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;}
;

%%
 

8voto

Aiden Bell Points 19856

Une autre pensée, si vous voulez être plus explicite avec votre réduction (si vous faites de l'AST annoation, cela peut être très pratique), vous pouvez alors faire votre pile de valeurs de pointeurs et de gérer les valeurs de type de vous-même. Un peu comme des 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 ont une définition de type et scalar_val *val pour la pile.

Quand vous vous déplacez sur plus complexes compilateur front-ends, il peut aider à construire votre AST comme cela, afin que, lorsque vous traversez l'arbre, vous avez mieux les méta-données et vous pouvez également augmenter la traduction, avec des traductions pour le pré-sémantique des types. Puis il se résume à votre feuille de productions telles que l'ID de mélanger le lexeme dans le droit scalaire de la charge utile.

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

Espérons que cela aide avec votre futur Bison/Lex frontaux et ...

Bonne Chance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X