编译原理-用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
词法分析程序,识别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
- 编译原理-用Bison构造语法分析程序-二进制转换十进制
- 编译原理-用Bison构造语法分析程序-小小计算器
- 编译原理:用bison实现输入二进制数,输出十进制数
- 十进制转换为二进制原理
- 编译原理:使用flex和bison工具实现语法分析树的建立
- 语法分析——Bison介绍以及Flex、Bison联合编译
- 语法分析——Bison介绍以及Flex、Bison联合编译
- 编译原理—二进制转十进制
- 十进制转换成二进制的程序
- 二进制转换为十进制的小程序
- 十进制转换为二进制的小程序
- 十进制转换为二进制、八进制、十六进制程序
- C++进制转换程序(二进制转换为十进制,十进制转换为二进制)
- 【编译原理】用Yacc做语法分析
- 编译原理语法分析LR1
- 编译原理语法分析
- 编译原理之语法分析
- 【编译原理】语法分析
- QT 连接数据库的详细步骤
- 【快速幂】HDU2065"红色病毒"问题
- 新奇的@SafeVarargs注解
- Ubuntu下安装Selenium
- 完美解决MySQL安装后无法远程连接的问题
- 编译原理-用Bison构造语法分析程序-二进制转换十进制
- HBuilder写的第一个表单文件
- Maximum Product of Word Lengths
- 别人源码的解析
- 再来说说Linux文件权限那些事儿
- PHP数据类型
- C# 通俗解释网络通信中的“报头”
- SGU 139 Help Needed!(机智)
- Linux进程调度