![实验报告一编写词法分析程序_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/ff5f4873-aa04-4c0f-824b-b4a87132f559/ff5f4873-aa04-4c0f-824b-b4a87132f5591.gif)
![实验报告一编写词法分析程序_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/ff5f4873-aa04-4c0f-824b-b4a87132f559/ff5f4873-aa04-4c0f-824b-b4a87132f5592.gif)
![实验报告一编写词法分析程序_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/ff5f4873-aa04-4c0f-824b-b4a87132f559/ff5f4873-aa04-4c0f-824b-b4a87132f5593.gif)
![实验报告一编写词法分析程序_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/ff5f4873-aa04-4c0f-824b-b4a87132f559/ff5f4873-aa04-4c0f-824b-b4a87132f5594.gif)
![实验报告一编写词法分析程序_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/ff5f4873-aa04-4c0f-824b-b4a87132f559/ff5f4873-aa04-4c0f-824b-b4a87132f5595.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理实验报告实验名称:编写词法分析程序_实验类型:设计型实验_指导教师:_专业班级:_姓 名:_学 号:_实验地点:_实验成绩:_日期:20172017 年 4 4 月 1515 日实验一编写语法分析程序一、实验目的1)通过设计、调试词法分析程序,掌握词法分析程序的设计工具,即有穷自动机,进一步理解自动机理论;2)掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机的实现方法;3)会确定词法分析程序的输出形式及标识符与关键字的区分方法;4)加深对课堂教学的理解,提高词法分析方法的实践能力,掌握使用实验环境的技能技巧以及程序的调试方法。二、实验设计1、 写出 TEST 语言每条词法规则
2、对应的正则文法或者正则表达式1)标识符:字母打头,后接任意字母或数字。正则表达式:(a|b| |z|A|B |Z )( 0|1|9| a|b| |z|A|B |Z )*2)保留字:标符的子集,包括:if, else, for, while, do, i nt, write, read。正则表达式:if | else | for | while | do | int | write | read3)无符号整数:由数字组成,但最高位不能为0,允许一位的 0。正则表达式:(1|9 )( 0|1|9)* )|04)分界符:(、)、;、正则表达式:(| ) | ; | | 5)运算符: +、-、*、/、
3、=、=、=、!=、=正则表达式:+ | - |*| / | = | | = | = | != | =6)注释符:/*/正则表达式:/*(没有连续的*/的任意字符串| ?)*/2、 对每个文法或者正则表达式分别构造NFA1) 标识符:(a|b| |z|A|B|Z )( 0|1|9| a|b| |z|A|B|Z )*a|b| z|A|B Z )z|A|B2)无符号整数:(1|2|9 )( 0|1|9)* )|03、将 NFA 合并,确定化,化简得到最终的DFANFA3)4)a|b| z|A|B Z )DFA:aIbI zIAIB Z0I1I I9E2三、实验过程1、完成整个实验的先后步骤a)根据
4、TEST 语言的词法规则,分别写出每条规则的正则文法或者正则表达式;b)将每一个正则文法或者正则表达式转换为NFAc)将多个 NFA 合并后进行确定化并化简;d)根据化简后的 DFA 画出流程图;e)参阅教材 PP.69-71 的 TEST 语言语法规则,确定单词分类、单词输出方案;f)编写词法分析程序;g)对下面的 TEST 语言源程序进行词法分析,将合法单词存入 lex.txt ,并报告词法错误及其位置。注:不能修改源程序zIAIB1|2|9D1非*I非/E1/*This a test program.*/int abc;int 123;int A$;int i;int n;int b,c
5、;int 2a;int a2;read n;n = 012345;for (i=1;i=n; i= i+1)abc=abc+i;if(i!=n) n = n+i;if (!n) b = b+c;/*The loop en dedwrite abc;2、实验调试记录(问题表现,分析原因,解决方案,解决结果)a)问题表现:1.不能处理除号2.不能处理不完整的注释符3.对于”0123”这类字符串的处理不正确,我之前处理为直接报错说一位以上的数字首位不 能为 0b)分析原因:问题 1,2 的原因都是在“/”符号处理时出现的问题导致的,程序中出现 bug 使得一遇到/就会进入死循环。问题 3 ,不应该直
6、接报错说一位以上的数字首位不能为0,遇到 0 应该直接输出 0 这个单词,再接着读数字。c)解决方案:d)对于问题 1,2,重新梳理逻辑,一步一步对照流程图和DFA 来调试修改代码。对于问题 3,遇到 0 应该直接输出 0 这个单词,再接着读数字。e)解决结果:成功解决了程序遇到/进入死循环问题和“ 0123 ”这类字符串的处理。三、实验结果列出实验结果并进行分析(含分步测试结果)9;请输入要编译的文件的路径:0: SoftwareMicrosoft Visual C+ 6. 0Microsoft Visual StudioMvProjects编译原理实验in. txt 请输入词法分折结果文件
7、存储路径:D: SoftirareMicrosoft Visual C+ 6, 0Microsoft Visual StudioMyProjects编译原更实验一out. Txt errorl line4:今未知符号?rror2line4: 未知符号&rror3 line7: T 耒知特寻error4 linel7/ tJ不合法的符号!errors line20:匹配错误,缺少槪编译失败。共发现 5个错 i 吴!Pressany key tocontinuelex.txt 文件(存放编译的合法内容)内容:1 2/*This a test program.*/*This a test p
8、rogram.*/3int int3ID abc3;4int int4NUM 1234;5int int5ID A5;6int int6ID i6;7int int7ID n7;8int int8ID b8ID c8 ;9int int9NUM 29ID a列出实验结果并进行分析(含分步测试结果)9;10int intID a2ID nNUM 0NUM 12345for for(IDNUM 1ID i=ID nID iID i+ +NUM 1) ID abcID abc+ +ID i10101111111212121212131313131313131313131313131313131415
9、151515151516readID nread17ifif17(17IDi17!=!=17IDn17)17IDn17=17IDn17+17IDi175518ifif18(18IDn18)18IDb18=18IDb18+18IDc1855四、 讨论与分析1.你的编写词法分析程序满足最长匹配原则吗?如果满足请给出你的实现方案。如果不满足请给出改进方案。答:不满足,我的处理先后顺序是:标识符或保留字、数字、分界符、运算符(除开/ )、除或者注释,我应该吧注释放在前面,因为一般来说注释都比其它类型符号长些。改进措施便是将注释 这一条词法规则最早处理。2.给出你的单词分类方案,并说明理由。答:根据 T
10、EST 语言可将单词分为六类:a) 标识符:字母打头,后接任意字母或数字。b) 保留字:标识符的子集,包括: if, else, for, while, do, int, write, read。c) 无符号整数:由数字组成,但最高位不能为0,允许一位的 0。d) 分界符:(、)、;、e)运算符: +、-、*、/、=、=、=、!=、=f)注释符:/*/3.构建词法分析程序一般过程是怎样的?答:构建词法分析程序的一般过程:1、 根据词法规则写出正则文法或者正则文法。2、 为每一个正则表达式构造一个NFA 然后将多个 NFA 合并为一个 NFA3、 将 NFA 转化成 DFA 并且化简最小化 DF
11、A4、 确定单词的输出形式5、 根据化简后的 DFA 和单词输出程序构造词法分析程序(主要部分:通过实验对课程知识点的理解;回答实验指导书的实验思考提出的问题等)五、附录:关键代码(给出适当注释,可读性高)# in elude # in elude # in elude # in elude # in elude using n amespaee std;con st i nt KWN=8;/con st i nt MAXSIZE=400;/ehar kwordKWN10 = /if,else,for,while,do,in t,read,write;int line = 1;/int err
12、ors = 0;关键字的个数标识符最长个数关键字行号/记录错误个数ofstream fout;ifstream fin;/输出文件流II输入文件流ofstream lexout;char type630=ID,保留字,NUMII5分界符,运算符,注释符;int mai n()int TEST();/函数声明TEST();if(errors=0)cout编译成功。endl;elsecout编译失败。共发现errors=a&ch=A&ch=Z)return 1;return 0;/判断是否为无符号整数/存放合法单词的文件流endl;in t is_ Uin t(char ch)if
13、(0=ch&ch;没有考虑 / 号for(int i=0;i8;i+)if(ch=Operateri)return 1;return 0;/输入控制 int in( char &ch)fin. get(ch);if(n =ch)lin e+;if(fin .eof()ch=EOF;return 1;/输出控制void out(char *type,char *buf)if(strcmp(type,ID)=O|strcmp(type,NUM)=O) lexoutli ne typebufendl;elselexoutli ne bufbufe ndl;couttype:bufe
14、ndl;/编译程序主要的函数int TEST()int even t=0; /用于判断输入是否为文件末/char file name300;/打开文件的操作/打开编译程序存放合法单词的文件lexout.ope n(lex.txt);/打开用户的文件/cout请输入要编译的文件的路径:e ndl;rei nput_i n:存储文件的路径/cin .get(file name,300,n);/char file name300=D:SoftwareMicrosoft Visual C+ 6.0Microsoft Visual编译原理实验一 in.txt;fin. ope n(i n. txt);i
15、f(fin=NULL)cout文件打开失败,请重新输入文件路径:endl;goto rein put_ in;cout请输入词法分析结果文件存储路径:e ndl;rein put_out:ci n.clear(); /清理输出缓冲ci n.s yn c(); /清空流/ci n.get(file name,300,n);/char file name300=D:SoftwareMicrosoftVisual C+ 6.0Microsoft编译原理实验一 out.txt;fout.ope n( out.txt);if(fout=NULL)cout文件打开失败,请重新输入文件路径:endl;got
16、o rein put_out;. 开始判断char buf300;char ch;ci n.clear(); /清理输出缓冲ci n.s yn c(); /清空流in (ch);while (!fi n.eof()while(ch= |ch=n|ch=t|ch=r)Visualin (ch);/判断是否为标识符或保留字if(is_Char(ch)int t=0;while(is_Char(ch)buft+=ch;in (ch);buft=O:/判断保留字int j=0;for(;j=KWN)while(is_Char(ch)|is_Ui nt(ch)buft+=ch;in (ch);buft=
17、0;out(type0,buf);/判断是否为数字 else if(is_Ui nt(ch)int t=0;while(is_Ui nt(ch)buft+=ch;in (ch);buft=O:if(t=1)out(type2,buf);else if(bufO=O)int i=-1;while(it&buf+i=0)out(type2, &0);out(type2,buf+i);elseout(type2,buf);/判断是否为分界符else if(is_Deli(ch)buf0=ch;buf1=0:out(type3,buf);/判断是否为运算符(除开/)else if(is
18、_Oper(ch)if(ch=+|ch=-|ch=*)buf0=ch;buf1=0:out(type4,buf);in (ch);else if(ch=!)buf0=ch;in (ch);if(ch=)buf1=ch;buf2=0;out(type4,buf);in (ch);else|ch=|ch=)buf0=ch;in (ch);if(ch=)buf1=ch;couterror+errors lin eli ne:!buf2=0;out(type4,buf);in (ch);elsebuf1=0;out(type4,buf);else if(ch=/)判断是除还是注释int t=0;buft+=ch;char ch0 ;in( ch0);while(1)if(ch0 = EOF)couterror+errorslineline:匹配错误,缺少*/e ndl;break;ch = ch0;buft+=ch;in( ch0);if(ch =* & ch0 = /) buft+=ch0; buft=O:out(type 5,bu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳务合同范例粉水
- 2025年公共艺术设计市场调研报告
- 公路护栏工程合同范例
- 学校保安聘任合同范本
- 出售鱼苗批发合同范本
- 公司卖旧车合同范例
- 2025年度燃气设施建设与运营管理合同范本
- 2025年度建筑施工单位临时用工劳务派遣与职业健康合同
- 餐饮服务合同范本
- 船舶设备零部件行业深度研究报告
- 低空飞行旅游观光项目可行性实施报告
- 2024年版:煤矿用压力罐设计与安装合同
- 2024年贵州云岩区总工会招聘工会社会工作者笔试真题
- 《算法定价垄断属性问题研究的国内外文献综述》4200字
- 2024年04月浙江义乌农商银行春季招考笔试历年参考题库附带答案详解
- 涉密计算机保密培训
- 挂靠免责协议书范本
- 2024年浙江省五校联盟高考地理联考试卷(3月份)
- 在线心理健康咨询行业现状分析及未来三至五年行业发展报告
- 电动三轮车购销合同
- 淋巴瘤的免疫靶向治疗
评论
0/150
提交评论