您的位置:首页 > 其它

编译原理:用bison实现输入二进制数,输出十进制数

2016-04-20 11:24 405 查看


输入二进制数,输出十进制数

G:
N S1

.S
{ N.v=S1

.v+S.v*2-S.L }

S
S1

B
{ S.v=S1

.v*2+B.v, S.L=S1

.L+1 }

S
B
{ S.v=B.v, S.L=1 }

B
0
{ B.v=0 }

B
1
{ B.v=1 }

(1)ershi.lex的源程序如下:
%%
0    { yylval.v =0;return BS;}
1    { yylval.v =1;return BS;}
\.|\n  {return *yytext;}
.;
%%
int yywrap(void){return 1;}


(2)ershi.h文件如下:
#ifndef BTOD_H_INCLUDED
#define BTOD_H_INCLUDED
typedef struct
{
double v;
int len;
}eStruct;
#endif


(3)ershi.y源程序如下:
%token    BS
%{
#include "ershi.h"
#include <math.h>
#define YYSTYPE eStruct
void yyerror(char*);
%}
%%
n:
n s '.' s '\n'{
$$.v=$2.v+$4.v*pow(2.0,-(double)($4.len));
printf("s.s->n(%.3f)\n\n",$$);}
|n s '\n' {
printf("s->n(%.3f)\n\n",$2);  }
|
;
s:
s BS{
$$.v = $1.v * 2 + $2.v;
$$.len = $1.len + 1;
printf("s BS->s(%.3f)\n",$$);   }
|BS  {
$$.v = $1.v;
$$.len = 1;
printf("BS->s(%.3f)\n",$$);  }
;
%%
void yyerror(char* s){}
#include "lex.yy.c"
int main(void)
{
yyparse();
return 0;
}




心得体会:
经过这次的实验,我学到了很多新的知识和好的学习方法。第一次实验做成功了给了我很大的信心,开始很顺利,后来遇到文法相关的知识,我就又收到了挫败。不断的失败不断的重复实验,不会的问同学内部是怎么传值的,看书看相关的文法知识,百度,总之就是不断重复。终于,修改了很多次,我做出来了。这离不开同学的耐心讲解和一直坚持的自己。有时候别人告诉我放弃,可我还是选择了坚持。我一定要坚守原则坚持下去。或许,有些事开始认为不可能,只有在自己坚持做了,才会取得成果!下次继续努力吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: