编译原理实验报告一.docx
- 文档编号:7183941
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:8
- 大小:17.49KB
编译原理实验报告一.docx
《编译原理实验报告一.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告一.docx(8页珍藏版)》请在冰豆网上搜索。
编译原理实验报告一
内蒙古工业大学信息工程学院
实验报告
课程名称:
编译原理
实验名称:
无符号数的有穷自动机的实现
实验类型:
验证性□综合性□设计性□
实验室名称:
班级:
学号:
姓名:
组别:
同组人:
成绩:
实验日期:
预习报告成绩:
指导教师审核(签名):
年月日
预习报告
实验一无符号数的有穷自动机的实现
一、实验目的
通过上机实习,熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。
掌握文法转换成自动机的技术及有穷自动机实现的方法。
二、实验题目
无符号数的有穷自动机的实现
三、要求及提示
1、无符号数的BNF描述如下:
0.<无符号数>d<余留无符号数>|.<十进制数>|e<指数部分>
1.<余留无符号数>d<余留无符号数>|.<十进制数>|e<指数部分>|ε
2.<十进制小数>d<余留十进制小数>
3.<余留十进制小数>e<指数部分>|d<余留十进制小数>|ε
4.<指数部分>d<余留整指数>|+<整指数>|-<整指数>
5.<整指数>d<余留整指数>
6.<余留整指数>d<余留整指数>|ε
2、将G[<无符号数>]文法转换成有穷自动机。
3、构造状态矩阵;将有穷自动机的状S1S2……Sn及输入的字a1a2……am构成一个n*m的矩阵。
1、状态矩阵设计出一个词法分析程序识别无符号数。
2、扫描无符号数,根据文法给出无符号数出错的位置。
3、工具:
C语言或其它高级语言
实验报告成绩:
指导教师审核(签名):
年月日
实验报告
一、实验目的
通过上机实习,熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。
掌握文法转换成自动机的技术及有穷自动机实现的方法。
二、实验题目
无符号数的有穷自动机的实现
三、要求及提示
1、无符号数的BNF描述如下:
0.<无符号数>d<余留无符号数>|.<十进制数>|e<指数部分>
1.<余留无符号数>d<余留无符号数>|.<十进制数>|e<指数部分>|ε
2.<十进制小数>d<余留十进制小数>
3.<余留十进制小数>e<指数部分>|d<余留十进制小数>|ε
4.<指数部分>d<余留整指数>|+<整指数>|-<整指数>
5.<整指数>d<余留整指数>
6.<余留整指数>d<余留整指数>|ε
2、将G[<无符号数>]文法转换成有穷自动机。
3、构造状态矩阵;将有穷自动机的状S1S2……Sn及输入的字a1a2……am构成一个n*m的矩阵。
1、状态矩阵设计出一个词法分析程序识别无符号数。
2、扫描无符号数,根据文法给出无符号数出错的位置。
3、工具:
C语言或其它高级语言
四、代码清单
#include
#include"stdio.h"
#include"iostream"
usingnamespacestd;
#include"afx.h"
#defineMAXR7
#defineMAXC4//状态的行列最大值
intstate[MAXR][MAXC];//状态矩阵
voidbuild_state(ints[MAXR][MAXC])//构建状态矩阵
{
s[0][0]=1;s[0][1]=2;s[0][2]=4;s[0][3]=-1;
s[1][0]=1;s[1][1]=2;s[1][2]=4;s[1][3]=-1;
s[2][0]=3;s[2][1]=-1;s[2][2]=-1;s[2][3]=-1;
s[3][0]=3;s[3][1]=-1;s[3][2]=4;s[3][3]=-1;
s[4][0]=6;s[4][1]=-1;s[4][2]=-1;s[4][3]=5;
s[5][0]=6;s[5][1]=-1;s[5][2]=-1;s[5][3]=-1;
s[6][0]=6;s[6][1]=-1;s[6][2]=-1;s[6][3]=-1;
}
voidtf_endspa(CString&str)//将字符串的最后的空串全部去掉
{
intnum,tf_num=-1;//循环数及最后空串的起始位置
CStringstr_tem;
boolspa_bool=true;
for(num=0;num { str_tem=str.Mid(num,1); if(str_tem==""&&spa_bool) { spa_bool=false; tf_num=num; } if(str_tem! =""&&! (spa_bool)&&str_tem! ="\n") { spa_bool=true; tf_num=-1; } } if(tf_num! =-1) { if(tf_num==0)str="\n"; else { str_tem=str.Mid(0,tf_num); str=str_tem; } } } boolcheck_space(CStringstr,int&spa_num)//判断字符串中是否存在空格(第二个参数为: 第一个空)串的位置) {//存在返回TRUE boolcheck_ret=false; for(spa_num=0;spa_num { if(str.Mid(spa_num,1)=="") { check_ret=true; break; } } spa_num++; returncheck_ret; } boolcheck_invchar(CStringstr,int&inv_num)//判断字符串中是否存为无效字符(第二个参数为: 第一个)无效字符的位置) {//存在返回TRUE boolinv_ret=false; booldozero_bool=true;//当出现00*的情况下,不再向下执行的向量 CStringc_str=str; if(str.Mid(0,1)=="0") if(str.Mid(1,1)! ="."&&str.Mid(1,1)! ="\n"&&str.Mid(1,1)! ="")//出现非(0.*)情况 { inv_num=2; inv_ret=true; dozero_bool=false; } if(dozero_bool) { for(inv_num=0;inv_num<(c_str.GetLength()-1);inv_num++) { CStringtem_str=c_str.Mid(inv_num,1); if((tem_str<"0"||tem_str>"9")&&tem_str! ="."&&tem_str! ="e"&&tem_str! ="+"&&tem_str! ="-"&&tem_str! ="E") { inv_ret=true; break; } } inv_num++; } returninv_ret; } intget_nextsta(ints,CStringnext_char)//返回下一状态(当前的状态S,及下一个字符now_char) { intnext_sta; intnext_r=s; intnext_c; if(next_char==".")next_c=1; elseif(next_char=="e"||next_char=="E")next_c=2; elseif(next_char=="+"||next_char=="-")next_c=3; elsenext_c=0; next_sta=state[next_r][next_c]; returnnext_sta; } boolcheck_unint(CStringstr,int&un_num,int&n_sta)//判断是否为无符号整数(un_num第一个出错的地方,当前状态n_sta) {//是,返回TRUE boolcun_ret=true; ints_tem;//临时状态值 n_sta=0; for(un_num=0;un_num { n_sta=get_nextsta(n_sta,str.Mid(un_num,1)); if(n_sta==-1) { cun_ret=false; break; } } un_num++; returncun_ret; } voidmain() { printf(": : : : : : : : : : : : : : : : : : : : : : 无符号判断实验: : : : : : : : : : : : : : : : : : : : : : \n"); intret_num=-1;//用来接收相应的返回位置 charc; CStringstr,strtem; charesc; cout<<"请输入字符串: (Trips: 按ESC退出)"< esc=_getch(); while(esc! =27) { printf("%c",esc); c=esc; str=c; while(c! ='\n') { c=getchar(); strtem=c; str=str+strtem; } tf_endspa(str);//将字符的后面没用的空格去掉 if(str=="\n")//输入为空串或是仅回车 printf("所输入的是无效字符串\n"); elseif(check_space(str,ret_num))//字符串中有空格存在 printf("该字符不是无符号整数,其第%d含有空字符\n",ret_num); elseif(check_invchar(str,ret_num))//字符串中存在非无符号整数外的字符 printf("该字符不是无符号整数,其第%d含有非法字符(或无效字符)\n",ret_num); else//进行状态图判断 { build_state(state);//构建状态矩阵 intret_sta;//出错时状态值 boolret_unit=check_unint(str,ret_num,ret_sta);//测试符号是否能接受 if(! ret_unit)//非正常输入 printf("该字符不是无符号整数,其第%d字符无法被正确接受\n当前状态为: %d\n",ret_num,ret_sta); elseif(ret_unit&&ret_sta! =1&&ret_sta! =3&&ret_sta! =6)//结束状态不为终止状态 printf("该字符不是无符号整数,其最后字符不是无符号的结束字符\n当前状态为: %d\n",ret_sta); else printf("字符串%s为可以接受的无符号整数\n",str.Mid(0,str.GetLength()-1)); } printf("PleaseinputtheString: --(Trips: pressESCToexit)\n"); esc=_getch(); } _getch(); } 实验心得体会: 编译原理程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都有不止一个高级语言的编译程序,从功能上看,一个编译程序就是一个语言翻译程序。 因此,学好编译原理这门课程对于计算机专业的学生有重要意义。 通过这次实践对于无符号数有穷自动机的实现,了解了词法分析在整个编译过程中的重要作用词法分析是编译的第一个阶段,它的主要任务是从左到右扫描字符对原程序进行扫描,产生一个个单词序列,用以语法分析,其它阶段。 这次实践只是对词法分析的一次模拟,词法分析阶段中分若干步骤从不确定的有穷自动机BNF到确定的有穷自动机DFA的实现,最后确定的有穷自动机DFA的最小化。 本次实践只需从NFA到有穷自动机的实现。 通过本次实践把理论知识转化成了实际结果,强化了理论知识的学习把课本知识生动的得到了验证。 对今后从事实践工作打下了坚实的基础。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告