我应该编写一个程序来做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