Comment résoudre le Bison d'avertissement “... n'a pas déclaré de type”
L'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 mises en garde du genre de:
avertissement: $$ de 'exp' a pas de déclaration de type.
Que signifie et comment puis-je le résoudre?
- +1: pour apparaître en premier lors de googler
bison error has no declared type
- Juste une petite clarté. J'ai
%union { int intValue; int floatValue; }
mais il ne me permet pas d'utiliser$$.intValue
ou$1.intValue
. Il diterror: request for member ‘floatValue’ in something not a structure or union
. Pourquoi donc?
Vous devez vous connecter pour publier un commentaire.
L'union (%union) définie n'est pas destiné à être utilisé directement. Plutôt, vous devez dire à Bison membre de l'union est utilisé par l'expression de qui.
Cela se fait avec la %type de directive.
Une version corrigée du code est:
%type<val> exp NUM
ne signifie pas que le particulier à la réductionexp NUM
a typeval
; cela signifie queexp
a typeVAL
etNUM
a typeval
. Ce posté réponse, d'ailleurs, est plus utile, que de la documentation officielle pour le type de directive, qui n'a pas d'exemples.Comme 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:
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ère que cette aide avec votre futur Bison/Lex frontaux et ...
Bonne Chance
%type
travaillé.