我應該編寫一個程序來做2 + 2 = 4和2.2 + 2 = 4.2。yacc:從浮點數中區分整數
我已經做到了,所以它將所有事情視爲浮點,但那是「錯誤的」。我必須區分它們。這是我到目前爲止:
%{
#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,然後替換它中的所有東西,但這似乎是錯誤的。我不知道如何做到這一點,我看到的教程並沒有真正幫助我。
我認爲factor_int和factor_float方法是正確的。基本上,真正的編譯器是如何工作的。每個表達式都是浮點或整數。 – 2010-03-02 20:46:10
所以如果我有8種不同的類型,我會有2個操作數的2^8表達式?太瘋狂了!!!或者我正在做數學錯誤。 – 2010-03-02 20:48:48
你有沒有聽說過lex?我認爲較新的一個叫做flex。 – 2010-03-02 20:53:55