2 + 2=4および2.2+2=4.2を実行するプログラムを作成することになっています。
すべてを浮動小数点として扱うようにすでに実行しましたが、それは「間違っています」。私はそれらを区別する必要があります。これが私がこれまでに持っているものです:
%{
#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;
}
私が抱えている問題は、各式が持つことができるタイプは1つだけであるということです。現在、すべてが基本的にフロートであるため、操作は正しいものの、これは適切なソリューションではありません。
基本的にfactor_intとfactor_floatを使用して、より多くの式を定義し、その中のすべてを置き換えることを考えましたが、それは本当に間違っているようです。しかし、これをどのように行うかはわかりません。また、私が見たチュートリアルは実際には役に立ちませんでした。