编译原理-用Bison构造语法分析程序-二进制转换十进制

来源:互联网 发布:怎样装饰淘宝店铺 编辑:程序博客网 时间:2024/05/03 03:45

问题描述:

从给定的文法构造语法分析程序

要求实现:输入二进制数 ,输出十进制数

给定文法:

N :S1 . B {N.v=S1.v+S.v*2(-S.L);}

;

S : S1 B {S.v=S1.v*2+B.v,S.L=S1.L+1;}

| B {S.v=B.v,S.L=1;}

;

B:0 {B.v=0;}

1 {B.v=1;}

;


代码:       

1,bTod.h

定义了一个结构体,文法符号(终结符和非终结符)的类型

#ifndef BTOD_H_INCLUDED#define BTOD_H_INCLUDEDtypedef struct{    double val;    int len;}myStruct;#endif // BTOD_H_INCLUDED


2,bTod.lex

词法分析程序,识别0、1、‘.’、换行符

返回给语法分析程序

%%0 {yylval.val=0;return B;}1 {yylval.val=1;return B;}\n|\. return *yytext;. ;%%int yywrap(void){  return 1;}

3,bTod.y

语法分析程序,实现二进制到十进制的转换

%token B%{#include "btod.h"#include <math.h>#define YYSTYPE myStructvoid yyerror(char*);%}%%n:n s '.' s '\n' {$$.val = $2.val + $4.val * pow(2.0,-(double)($4.len));printf("s.s->n(%.3f)\n\n",$$);}|;s:s B {$$.val = $1.val * 2 + $2.val;$$.len = $1.len + 1;printf("s B->s(%.3f)\n",$$);}|B {$$.val = $1.val;$$.len = 1;printf("B->s(%.3f)\n",$$);};%%void yyerror(char*a){}#include "lex.yy.c"int main(){yyparse();return 0;}

运行结果:



小结:

读懂文法之后写程序就不会很麻烦了

这个文法主要是用到了两个属性值,所以要定义一个结构体来实现

今天有时间,就把之前几周写的程序发上来

不能一直在自己的世界里啊

0 0