编译原理第一次上机实验报告软工_李_U2014172xx_第1页
编译原理第一次上机实验报告软工_李_U2014172xx_第2页
编译原理第一次上机实验报告软工_李_U2014172xx_第3页
编译原理第一次上机实验报告软工_李_U2014172xx_第4页
编译原理第一次上机实验报告软工_李_U2014172xx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理第一次上机实验报告姓名:李x 班级:软工140x班学号:U2014172xx实验一设计实现简单语言的词法分析器1、实验目的通过该实验,熟练应用编译原理关于词法分析的基本理论和方法;学会用C/C+高级程序设计语言设计一个词法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。2、实验条件计算机上安装C/C+编译处理软件。3、实验内容及要求对下述单词表定义的语言设计编制一个词法分析器。单词符号及种别表和词法分析器功能及基本要求如下:(1)单词符号及种别表单词符号种别编码单词值main1int 2float3double4char5if 6else 7do8while9l

2、(l|d)*10内部字符串 ( +|-| ) dd*(.dd* | )( e ( +|-| ) dd*|) 20二进制数值表示=21+22- 23* 24/ 25(26)272829,30;3132=3334=35=36!=37#0(2)词法分析器功能及基本要求处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。(1) 总体设计思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字种类,拼出相应的单一符号;(2) 详细算法设计当ch!=$时,while循环扫描输入的每一个字符;跳过空格、换行、注释;如果是字符,则拼字

3、符串;判断是否为关键字,是则输出对应关键字的单词种别码,否则表明是l(l|d)*即内部字符串;如果是数字,则拼数,整型、浮点型、指数;如果是运算符、界符,输出相应种别码;算符中应该注意+号和-号,做出相应判断是运算符还是表示数字的正负号;如果是表示正负号则调到判断数字的地方;其他则报错;(3) 流程框图(4) 函数相关说明void main()主函数void scanner()扫描判断函数char input300;/存放输入的字符串char token20;/存放符合C语言词法规则的单词char ch;/单个字符char previous;/ch的前一个字符char latter;/ch的后

4、一个字符char ch1, ch2;/当处理注释的时候使用int typenum;/表示单词的种别码int p, m, n, cx;double decimal;/记录小数double sum;/存放数字int index;/存放指数int isNum;/是否是数字int isDecimal;/记录是否为小数int isExp;/记录是否为指数int isNegative;/是否带负号(对于指数)int isNegative1;/是否为负数 (5) 输入与输出(包括出错处理)输入以$结束回车即可运行程序输出以(xxx,typenumber)的形式;出错则会报error!例如:输入:a+b=5$

5、 输出:(10, a) (22, +) (10, b) (21, =) (20, 5) (0, $)(6) 程序运行结果(屏幕截图)1. +-123.456e-127*+45.99e+200+abc+-cnt+49(7) 词法分析器使用说明打开编译器VS或者VC+;文件新建项目;将代码复制粘贴,编译运行,按照提示输入即可使用;(8) 心得与体会提高了自己的编程能力,在上机实验中,特别是后期细节的处理很繁琐,需要很多的判断,判断+、-号是否为数字正负号时需要判断前面和后面的字符;又分为好几种情况,每一种情况的判断语句很长容易出错;同时还有指数的处理,e/E后面需要判断正负号以及把字符转换成数字以

6、及识别数字的DFA和运算符加减等融合在一起;(9) 源程序清单/ 词法编译器01.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include#include#includechar input300;/存放输入的字符串char token20;/存放符合C语言词法规则的单词char ch;/单个字符char previous;/ch的前一个字符char latter;/ch的后一个字符char ch1, ch2;/当处理注释的时候使用int typenum;/表示单词的种别码int p, m, n, cx;double decimal;/记录小数double

7、sum;/存放数字int index;/存放指数int isNum;/是否是数字int isDecimal;/记录是否为小数int isExp;/记录是否为指数int isNegative;/是否带负号(对于指数)int isNegative1;/是否为负数void scanner();char *rwtab11 = main, int, float, double, char, if, else, while, do, end ;void main()printf(请输入词法:(以$结束);p = 0;doch = getchar();inputp+ = ch; while (ch != $

8、);p = 0;doscanner();switch (typenum)case 20:if (isDecimal = 0) & (isExp = 0)printf(%d,%d)n, typenum, int(sum);else if (isDecimal = 1) & (isExp = 0)printf(%d,%f)n, typenum, sum);else if (isExp = 1)printf(%d,%e)n, typenum, sum);break;case -1:printf(%d,Error!)n,typenum);break;default:printf(%d,%s)n, ty

9、penum, token); while (typenum != 0);getchar();getchar();void scanner()cx = 0;/用来记录小数点后面的位数m = 0;sum = 0;decimal = 0;index = 0;isDecimal = 0;isNegative = 0;isNegative1 = 0;isExp = 0;for (n = 0; n= a) & (ch = A) & (ch = a) & (ch = A) & (ch = 0) & (ch = 9)tokenm+ = ch;ch = inputp+;tokenm+ = 0;typenum =

10、 10;/10表示l(l|d)*p = p - 1;/回退一步for (n = 0; n = 0) & (ch = 0) & (ch = 0 & ch = 9)cx = cx + 1;decimal = decimal * 10 + (ch - 0);ch = inputp+;if (ch = )typenum = -1;return;for (int a = 0; a = 0) & (ch = 9)index = index * 10 + (ch - 0);ch = inputp+;if (isNegative = 1)/如果指数为负数for (int k = 0; k index; k+)

11、sum = sum*0.1;elsefor (int k = 0; k = 0) & (latter = 0) & (latter = a) & (latter = A) & (latter = a) & (previous = A) & (previous = 0) & (previous = 0) | (latter = 0) & (latter = 0) & (latter = a) & (latter = A) & (latter = a) & (previous = A) & (previous = 0) & (previous = 0) | (latter :tokenm+ = c

12、h;ch = inputp+;if (ch = =)typenum = 33;tokenm+ = ch;elsetypenum = 32;p-;break;case:tokenm+ = ch;ch = inputp+;if (ch = =)typenum = 35;tokenm+ = ch;elsetypenum = 34;p-;break;case(:typenum = 26;tokenm+ = ch;break;case):typenum = 27;tokenm+ = ch;break;case:typenum = 28;tokenm+ = ch;break;case:typenum = 29;tokenm+ = ch;break;case:typenum = 30;tokenm+ = ch;break;case;:typenum = 31;tokenm+ = ch;bre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论