flex&bison实现二进制转换器
文法
S->A.A|A
A->AB|B
B->0|1
calc.lex文件
%{
typedef struct
{
double v;
int len;
}myStruct;
#define YYSTYPE myStruct
#include "calc.tab.h"
%}
%%
0 { yylval.v =0.0;return B;}
1 { yylval.v =1.0;return B;}
\.|\n {return *yytext;}
.;
%%
int yywrap(void){return 1;}
calc.y文件
%{
typedef struct
{
double v;
int len;
}myStruct;
#define YYSTYPE myStruct //此处将后文的$$的类型转换为自定义的mystruct
#include<stdio.h>
#include <math.h>
#include<windows.h>
void yyerror(char*);
%}
%token B
%%
input :
| input line
;
line : '\n'
|exp '\n'
;
exp : A {printf("%.2f\n",$1.v);}
|A '.' A {
$3.len=$3.len+1;
printf ("The decimal value is %.5f\n",$1.v+$3.v*pow(2,-$3.len));
}
A : A B {
$$.v=$1.v*2+$2.v;
$$.len=$1.len+1;
//printf("%f+%f\n",$1.v*2,$2.v);
}
|B {$1.len=1;}
%%
void yyerror(char* s){}
int main(void)
{
yyparse();
system("pause");
return 1;
}
运行命令
flex calc.l
bison -d calc.y
gcc lex.yy.c calc.tab.c -o calc