编译原理:用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的源程序如下:
(2)ershi.h文件如下:
(3)ershi.y源程序如下:
心得体会:
经过这次的实验,我学到了很多新的知识和好的学习方法。第一次实验做成功了给了我很大的信心,开始很顺利,后来遇到文法相关的知识,我就又收到了挫败。不断的失败不断的重复实验,不会的问同学内部是怎么传值的,看书看相关的文法知识,百度,总之就是不断重复。终于,修改了很多次,我做出来了。这离不开同学的耐心讲解和一直坚持的自己。有时候别人告诉我放弃,可我还是选择了坚持。我一定要坚守原则坚持下去。或许,有些事开始认为不可能,只有在自己坚持做了,才会取得成果!下次继续努力吧!
输入二进制数,输出十进制数
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; }
心得体会:
经过这次的实验,我学到了很多新的知识和好的学习方法。第一次实验做成功了给了我很大的信心,开始很顺利,后来遇到文法相关的知识,我就又收到了挫败。不断的失败不断的重复实验,不会的问同学内部是怎么传值的,看书看相关的文法知识,百度,总之就是不断重复。终于,修改了很多次,我做出来了。这离不开同学的耐心讲解和一直坚持的自己。有时候别人告诉我放弃,可我还是选择了坚持。我一定要坚守原则坚持下去。或许,有些事开始认为不可能,只有在自己坚持做了,才会取得成果!下次继续努力吧!
相关文章推荐
- c#中的快捷键
- 欢迎使用CSDN-markdown编辑器
- 时间片轮转
- php算法之冒泡排序
- 锁,同步,可重入锁,读写锁
- hdu 2571 命运
- windows10 安装Laravel Homestead
- 行人检测(Pedestrian Detection)资源
- Android自定义ViewGroup:实现简单的垂直方向线性布局(2)
- Eclipse-去除空白行
- 学习进度表
- vconfig 的使用
- Nginx配置proxy_pass转发的/路径
- wc命令
- Laravel5.2多级一对多的实现
- 安装 Java 和 配置 Java 环境变量
- 整体管理、范围管理
- homebrew安装问题解决
- Hibernate基本示例
- Spring Boot入门教程