Je suis supposé écrire un programme qui fait 2 + 2 = 4 et 2.2 + 2 = 4.2.yacc: Distinguer les entiers des nombres à virgule flottante
Je l'ai déjà fait pour que tout soit considéré comme un flottant, mais c'est "faux". Je dois les distinguer. Voici ce que j'ai jusqu'à présent:
%{
#include <stdio.h>
#include <ctype.h>
%}
%token <dval> FLOAT
%token <ival> INTEGER
%union
{
float dval;
int ival;
}
%type <dval> command exp term factor
%%
command : exp {printf("%f\n",$1);}
;
exp : exp '+' term {$$ = $1 + $3;}
| exp '-' term {$$ = $1 - $3;}
| term {$$ = $1;}
;
term : term '*' factor {$$ = $1 * $3;}
| factor {$$ = $1;}
;
factor : '(' exp ')' {$$ = $2;}
| FLOAT {$$ = $1;}
| INTEGER {$$ = $1;}
;
%%
int main()
{
return yyparse();
}
int yylex()
{
int c;
while((c=getchar()) == ' ');
if(isdigit(c))
{
ungetc(c, stdin);
float f1;
scanf("%f", &f1);
int i1 = (int) f1;
if(f1 == 0)
{
yylval.ival = 0;
return INTEGER;
}
else if((((float) i1)/f1) == 1)
{
yylval.ival = i1;
return INTEGER;
}
else
{
yylval.dval = f1;
return FLOAT;
}
//scanf("%f",&yylval.dval);
//return(NUMBER);
}
if(c == '\n') return 0;
return c;
}
int yyerror(char *s)
{
fprintf(stderr,"%s\n",s);
return 0;
}
Le problème que j'ai est que chaque expression ne peut avoir qu'un seul type. À l'heure actuelle, tout est essentiellement flottant, alors même si les opérations sont bonnes, ce n'est pas la bonne solution.
J'ai pensé à définir plus d'expressions, en ayant essentiellement factor_int et factor_float, puis en remplaçant tout, mais cela semble vraiment faux. Je n'ai aucune idée de comment y arriver, et les tutoriels que j'ai vus ne m'ont pas vraiment aidé.
Je pense que l'approche factor_int et factor_float est correcte. C'est essentiellement comment fonctionnent les vrais compilateurs. Chaque expression est flottante ou intégrale. –
Donc, si j'ai 8 types différents, je vais avoir, 2^8 expressions avec 2 opérandes? C'est fou!!! Ou je fais mal les maths. –
Avez-vous entendu parler de lex? Je pense que le plus récent s'appelle flex. –