flex&bison实现二进制转换器

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

运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值