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

来源:互联网 发布:运动装 休闲装 知乎 编辑:程序博客网 时间:2024/05/17 17:16


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

G: N S1

.S { N.v=S1  

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

SS1

B  { S.v=S1

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

.L+1 }

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

B0      { B.v=0 }

B1      { 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;}

2ershi.h文件如下:

#ifndef BTOD_H_INCLUDED#define BTOD_H_INCLUDEDtypedef struct{    double v;    int len;}eStruct;#endif

3ershi.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;}


心得体会:

经过这次的实验,我学到了很多新的知识和好的学习方法。第一次实验做成功了给了我很大的信心,开始很顺利,后来遇到文法相关的知识,我就又收到了挫败。不断的失败不断的重复实验,不会的问同学内部是怎么传值的,看书看相关的文法知识,百度,总之就是不断重复。终于,修改了很多次,我做出来了。这离不开同学的耐心讲解和一直坚持的自己。有时候别人告诉我放弃,可我还是选择了坚持。我一定要坚守原则坚持下去。或许,有些事开始认为不可能,只有在自己坚持做了,才会取得成果!下次继续努力吧!


0 0
原创粉丝点击