2010-02-14 15 views
2

J'ai un problème.Problèmes avec les types de données en flex

J'écris un programme avec flex et je suis en utilisant ce code:

%union { 

    int entero; 

    char *cadena; 

    TipoDato tipo; 

} 

Ce code est pour mes types de données.

Je veux évaluer la ligne suivante: expresion SUM expresion où SUM est la somme de fonctionnement pour évaluer, par exemple 69 + 60

Quand j'écris cette

if (($1.tipo == ENT) && ($3.tipo == ENT)){ 

      $$.tipo = ENT; 

} else if (($1.tipo == CADEN) && ($3.tipo == CADEN)) { 

    $$.tipo = CADEN; 

    } else { 

      printf ("Error en la suma: Tipos de datos incompatibles Revise los tipos\n"); 

      yyerror(parser); 

} 

J'ai l'erreur suivante

../src/buggy.y:350.37-38: 1 $ de `expresion 'no tiene tipo declarado

../src/buggy.y:351.28-29: 1 $ de` expresion' no tiene tipo declarad o

buggy.tab.c: En fonction 'yyparse':

buggy.tab.c: 1646: avertissement: déclaration implicite de la fonction 'yylex'

../src/buggy.y : Au niveau supérieur:

lex.yy.c: 1577: avertissement: 'yyunput' définie mais non utilisée

lex.yy.c: 1618: ** avertissement: 'entrée' définie mais non utilisée

Leyend o fichero '../docs/prog1.bgy'.

Quel est le problème?

Merci!

Salut !!

Répondre

5

Ce ne sont en fait que des avertissements, pas des erreurs, donc votre code devrait fonctionner malgré eux, mais ils sont agaçants. Pour se débarrasser des avertissements de bison, vous devez utiliser une déclaration %type dans la section supérieure de votre fichier .y. Quelque chose comme %type <tipo> expression, puis vous venez de se référer à $1 et $3 et $$ dans votre code d'action (pas de suffixe .tipo, qui est automatiquement fourni par bison en raison de la %type). Pour supprimer l'avertissement du compilateur dans buggy.tab.c, vous devez déclarer yylex dans votre fichier .y; quelque chose comme:

%{ 
extern int yylex(); 
%} 

dans la partie supérieure, en supposant ne #define YYLEX_PARAM

Se débarrasser des avertissements du compilateur de lex.yy.c est plus difficile; votre meilleur pari est probablement juste de ne pas utiliser -Wall lors de la compilation, comme le code généré par flex n'est pas -wall propre

modifier

après quelques recherches, il semble que vous pouvez vous débarrasser de l'avertissement à propos de l'entrée en mettant un #define YY_NO_INPUT dans la section supérieure de votre fichier .l.

+5

flex a des instructions spéciales pour éviter les définitions inutilisées: 'option% noinput' ' option% nounput' – jmster