《实验报告一编写词法分析程序》

上传人:tang****xu5 文档编号:159692972 上传时间:2021-01-07 格式:DOCX 页数:20 大小:22.34KB
返回 下载 相关 举报
《实验报告一编写词法分析程序》_第1页
第1页 / 共20页
《实验报告一编写词法分析程序》_第2页
第2页 / 共20页
《实验报告一编写词法分析程序》_第3页
第3页 / 共20页
《实验报告一编写词法分析程序》_第4页
第4页 / 共20页
《实验报告一编写词法分析程序》_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《《实验报告一编写词法分析程序》》由会员分享,可在线阅读,更多相关《《实验报告一编写词法分析程序》(20页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告实验名称:编写词法分析程序实验类型:设计型实验指导教师:专业班级:姓 名:学 号:实验地点:实验成绩:日期:2017年4月15日实验一编写语法分析程序一、实验目的1) 通过设计、调试词法分析程序,掌握词法分析程序的设计工具,即有穷自动机,进一步理解自动机理论;2) 掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机的实现方法;3) 会确定词法分析程序的输出形式及标识符与关键字的区分方法;4) 加深对课堂教学的理解,提高词法分析方法的实践能力,掌握使用实验环境的技能技巧以及程序的调试方法。二、实验设计1、写出TEST语言每条词法规则对应的正则文法或者正则表达式1) 标识符

2、:字母打头,后接任意字母或数字。正则表达式:(a|b| |z|A|B |Z)( 0|1| |9| a|b| |z|A|B |Z )*2) 保留字:标符的子集,包括: if, else, for, while, do, int, 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 )2)无符号整数:(1|2|9 )( 0|1|9)* )|0(0|1|9)3、将NFA合并,确定化,化简得到最终的DFANFADFA:三、实验过程1、完成整个实验的先后步骤a) 根据TEST语言的词法规则,分别写出每条规则的正则文法或者正则表达式;b) 将每一个正则文法或者

4、正则表达式转换为NFAc) 将多个NFA合并后进行确定化并化简;d) 根据化简后的DFA画出流程图;e) 参阅教材PP.69-71的TEST语言语法规则,确定单词分类、单词输出方案;f) 编写词法分析程序;g) 对下面的TEST语言源程序进行词法分析,将合法单词存入lex.txt ,并报告词法错误及其位 置。注:不能修改源程序(/*This a test program.*/ int abc;int 123;int A$;int i;int n;int b,c;int 2a;int a2;read n;n = 012345;for (i=1;i=n; i= i+1)(abc=abc+i;if(

5、i!=n) n = n+i;if (!n) b = b+c;/*The loop ended write abc;2、实验调试记录(问题表现,分析原因,解决方案,解决结果)a) 问题表现:1. 不能处理除号2. 不能处理不完整的注释符3. 对于”0123”这类字符串的处理不正确,我之前处理为直接报错说一位以上的数字首位不能为0b) 分析原因:问题1,2的原因都是在“/”符号处理时出现的问题导致的,程序中出现bug使得一遇到/就会进入死循环。问题3 ,不应该直接报错说一位以上的数字首位不能为0,遇到0应该直接输出0这个单词,再接着读数字。c) 解决方案:d) 对于问题1,2,重新梳理逻辑,一步一

6、步对照流程图和DFA来调试修改代码。对于问题3,遇到0应该直接输出0这个单词,再接着读数字。e) 解决结果:成功解决了程序遇到/进入死循环问题和“ 0123”这类字符串的处理。、实验结果列出实验结果并进行分析(含分步测试结果)请输入要编译的文件的路径:0: SoftwareMicrosoft Visual C+ 6. 0Microsoft Visual StudioMvProjects编译原理实验in. txt 请输入词法分析结果文件存情路径:D: SoftirareMicrosoft Vi sue 1 C+ 6, 0Microsoft Visual StudioMyPr o ject s编译

7、原理实验一out. Txterrorl line4: r SP 未知符号error2 line4:敏未知符与&rror3 line7: 未知特号error4 linel7:f tJ不合法的符号!error5 line20:匹配错误,缺少矽编译失败.共发现5个错i吴!Press any key to continuelex.txt 文件(存放编译的合法内容)内容:1 (/*This a test program.*/2 /*This a test program.*/3 int int3 ID abc3 ;4 int int4 NUM 1235 int int5 ID A6 intint6 ID

8、i6 ;7 intint7 IDn7 ;8 intint8 ID b8 ID c8 ;9 int int9 NUM 29 ID a10101111111212121212131313131313131313131313131313131415151515151516ID a2read readID n ;ID nNUM 0NUM 12345;for for(ID iNUM 1 ;ID i =ID n;ID iID i +NUM 1)ID abcID abc+ID i ;if if(ID i!=!=ID n)ID nID n+ID i;if if(ID n)ID bID b+ID c;讨论与分析

9、你的编写词法分析程序满足最长匹配原则吗?如果满足请给出你的实现方案。如果不满足请给出改进方案。答:不满足,我的处理先后顺序是:标识符或保留字、数字、分界符、运算符(除开/ )、除或者注释,我应该吧注释放在前面,因为一般来说注释都比其它类型符号长些。改进措施便是将注释这一条词法规则最早处理。给出你的单词分类方案,并说明理由。答:根据TEST语言可将单词分为六类:a) 标识符:字母打头,后接任意字母或数字。b) 保留字:标识符的子集,包括: if, else, for, while, do, int, write, read。c) 无符号整数:由数字组成,但最高位不能为0,允许一位的0。17171

10、717171717171717171718181818181818181818四、1.2.d) 分界符:(、)、;、e)运算符:+、f)注释符:/*、/、*/、=、=、!=、3.构建词法分析程序一般过程是怎样的?答:构建词法分析程序的一般过程:1、根据词法规则写出正则文法或者正则文法。2、 为每一个正则表达式构造一个NFA然后将多个NFA合并为一个NFA3、 将NFA转化成DFA并且化简最小化 DFA4、确定单词的输出形式5、根据化简后的DFA和单词输出程序构造词法分析程序(主要部分:通过实验对课程知识点的理解;回答实验指导书的实验思考提出的问题等)五、附录:关键代码(给出适当注释,可读性高)

11、# include # include # include # include # include using namespace std;const int KWN=8;/const int MAXSIZE=400;/char kwordKWN10 = /if,else,for,while,do,int,read,write;int line = 1;/int errors = 0;关键字的个数标识符最长个数关键字/记录错误个数ofstream fout;ifstream fin;/输出文件流/输入文件流/存放合法单词的文件流ofstream lexout;char type630=(ID”,保留字,NUM,”分界符,运算符,注释符;int main()(int TEST();/函数声明TEST();if(errors=0)(cout编译成功。endl;else(endl;cout编译失败。共发现errors=a&ch=A&ch=Z)(return 1;return 0;/判断是否为无符号整数int is_Uint(char ch) (if(0=ch&ch=9)(return 1;return 0;/判断是否为分界符int is_Deli(char ch)(if(ch=(|ch=)|ch=;|ch=|ch=)(return 1;return 0;/判断是否为操作符int

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号