《编译原理第一次上机实验报告软工李U2014172xx.docx》由会员分享,可在线阅读,更多相关《编译原理第一次上机实验报告软工李U2014172xx.docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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 su
7、m;/存放数字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, type
9、num, 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 = 1
10、0;/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+)su
11、m = 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+ = ch;
12、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;break;case=:typenum = 36;tokenm+ = ch;break;case!:tokenm+ = ch;ch = inputp+;if (ch = =)typenum = 37;tokenm+ = ch;elsep-;typenum = -1;break;case$:typenum = 0;tokenm+ = ch;break;default:typenum = -1;