您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 词法分析的设计与实现
题目词法分析的设计与实现学院专业名称计算机科学与技术姓名导师姓名2010年12月目录1.课程设计的目的………………………………………………………………12.课程设计的内容………………………………………………………………13、课程设计的要求………………………………………………………………14.课程设计报告内容……………………………………………………………14.1设计功能分析……………………………………………………………14.2设计思路…………………………………………………………………14.3正规文法…………………………………………………………………24.4状态图…………………………………………………………………34.5设计词法分析算法代码…………………………………………………54.6基本测试数据……………………………………………………124.7结果截图………………………………………………………125.设计体会………………………………………………………………126.参考文献………………………………………………………………………137.思考题………………………………………………………………………131词法分析的设计与实现一、课程设计的目的1、基本掌握计算机语言的词法分析程序的开发方法。2、实现一个词法分析程序,将字符串流分解成终结符流供语法分析使用。3、通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。4、了解当前常用的软件开发工具VisualC++,熟练掌握基于MFC的程序设计,培养解决实际问题的能力。5、对C语言和数据结构的进一步巩固加深。二课程设计的内容编制一个能够分析三种数、标识符、主要运算符、分隔符和主要关键字的词法分析程序。三、课程设计的要求1.根据以下的正规式,编制正规文法,画出状态图;标识符字母(字母|数字字符)*十进制数(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(ε|.)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*八进制数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*(ε|.)(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*(ε|.)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符+-*/=();关键字ifthenelsewhiledo2.根据状态图,设计词法分析函数intscan(),完成以下功能:1)从键盘读入数据,分析出一个单词。2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。3.编写测试程序,反复调用函数scan(),输出单词种别和属性。四、课程设计报告内容4.1、设计功能分析程序能够从左到右一个字符一个字符地读入源程序,并对构成的源程序的2字符流进行扫描和分解,从而识别出一个个单词,并给出单词的种别和属性。4.2、设计思路主函数main()的思想:先输入一串字符,将字符串用空格打断,若是分隔出的单元不为空,则对此单元继续分析,根据所输入的字符串判断出是标识符、八进制数、十进制数、十六进制数、运算符、分隔符还是关键字,然后赋予那单词的种别和属性。4.3、正规文法对于十进制数:A1——B1C1B1——D1B1|εC1——E1B1E1——ε|.D1——0|1|2|3|4|5|6|7|8|9对于八进制数:A2——0B2B2——C2D2C2——E2F2E2——1|2|3|4|5|6|7F2——GF|εD2——H2F2H2——ε|.D2——1|2|3|4|5|6|7G2——0|1|2|3|4|5|6|7对于十六进制:A3——0xB3B3——C3D3C3——E3C3|εE3——0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|fD3——F3C3F3——ε|.对于运算符和分隔符:A4——+|-|*|/|||=|(|)|;对于标识符和关键字:A5——B5C5B5——D5E5D5——a|b|……|y|zE5——F5E5|εF5——a|b|……|y|z|0|1|2|3|4|5|6|7|8|9C5——G5E5G5——ε|.综上正规文法为:3S——A1|A2|A3|A4|A5A1——B1C1B1——D1B1|εC1——E1B1E1——ε|.D1——0|1|2|3|4|5|6|7|8|9A2——0B2B2——C2D2C2——E2F2E2——1|2|3|4|5|6|7F2——GF|εD2——H2F2H2——ε|.D2——1|2|3|4|5|6|7G2——0|1|2|3|4|5|6|7A3——0xB3B3——C3D3C3——E3C3|εE3——0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|fD3——F3C3F3——ε|.A4——+|-|*|/|||=|(|)|;A5——B5C5B5——D5E5D5——a|b|……|y|zE5——F5E5|εF5——a|b|……|y|z|0|1|2|3|4|5|6|7|8|9C5——G5E5G5——ε|.4.4、状态图40…70。*0….9/a…z/A…Z1…90…9其他开始空白a….z/A…Z023469其他。0…9非数字。0…7非o..7且非。11000…7非o..7。。7581211131…9/a….f/A…F14非1….9且非a...f且非A...F150….9/a...f/A...F16非0….9且非a...f且非A...F。17。018190+/-/…/;If/while/then/dox/X54.4设计词法分析算法代码:#includestring.h#includestdio.h#includestdafx.hunionchars{//联合,可存储字符串,整型和浮点型charpro_char[15];intpro_number;floatreal;};structdata{//将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值charkind[7];intid;unioncharspro;};intscan(char*a);//对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类voidPrints(chara[15],intid,inta_long);//将分析后的每个token输出voidsave(char*a,intid,intx);//将分析后的结果保存到一个结构数组中charnowChar[15];//临时的存储单元,用来存储被空格打断以后单元charkinds[11][8]={,INT10,INT8,INT16,IDN,,,,REAL10,REAL8,REAL16};//单词的不同种别structdatalink[100];//用来存放词法分析以后的结果的结构数组intlink_long=0;//全局变量intscan(char*a){intid;inta_long=0;intdoc=0;while(*a!=NULL){nowChar[0]='\0';a_long=0;doc=0;//对数值的判断及处理if('0'=*a&&*a='9'){//如果第一个字符为数值nowChar[a_long]=*a;*a++;a_long++;//对十六进制的判断及处理if(nowChar[0]=='0'&&(*a=='x'||*a=='X')){//如果第一个字符为0且第二个字符为x,则为十六进制数nowChar[a_long]=*a;6*a++;a_long++;while(*a!=NULL&&(('0'=*a&&*a='9')||('a'=*a&&*a='f')||('A'=*a&&*a='F')||*a=='.')){nowChar[a_long]=*a;//一直将此十六进制数完全读入,若为浮点型的,则加以标记if(*a=='.')doc=1;*a++;a_long++;}nowChar[a_long]='\0';//判断输入的十六进制数是否合法if(a_long==2){//输入的只有0x,则输入错误Prints(nowChar,7,a_long);return0;}if(doc)//输入的十六进制数是浮点型的Prints(nowChar,10,a_long);//则将其具体的类型属性定为10else//输入的十六进制数是整型的Prints(nowChar,3,a_long);//则将其具体的类型属性定义为3continue;}//对八进制的判断及处理if(nowChar[0]=='0'&&'0'=*a&&*a='7'){//如果第一个字符为0且第二个字符为0~7,则为八进制数nowChar[a_long]=*a;*a++;a_long++;while(*a!=NULL&&(('0'=*a&&*a='7')||*a=='.')){nowChar[a_long]=*a;//一直将此八进制数完全读入,若为浮点型的,则加以标记if(*a=='.')doc=1;*a++;a_long++;}nowChar[a_long]='\0';if(doc)//输入的八进制数是浮点型的Prints(nowChar,9,a_long);//则将其具体的类型属性定为9else//输入的十六进制数是整型的Prints(nowChar,2,a_long);//则将其具体的类型属性定义为2continue;}//对十进制数的判断及处理else{while(*a!=NULL&&(('0'=*a&&*a='9')||*a=='.')){nowChar[a_long]=*a;//一直将此十进制数完全读入,若为浮点型的,则加以标记7if(*a=='.')doc=1;*a++;a_long++;}nowChar[a_long]='\0';if(doc)//输入的十进制数是浮点型的Prints(nowChar,8,a_long);//则将其具体的类型属性定为8else//输入的十进制数是整型的Prints(nowChar,1,a_long);//则将其具体的类型属性定义为1continue;}}//完成了对数值的判断及处理//对字符的判断及处理else{nowChar[a_long]=*a;*a++;a_long++;//判断输入的字符是否为运算符或其他的分隔符switch(nowChar[0]){case'+':case'-':case'*':case'/':case'':case'':case'(':case')':case'=':case';':nowChar[a_long]='\0';Prints(nowChar,5,a_long);//将其具体的类型属性定义为5continue;default:break;}//判断输入的第一个字符是否为字母if(('a'=nowChar[0]&&nowChar[0]='z')||('A'=nowChar[0]&&nowChar[0]='Z')){while(*a!=NULL&&(('a'=*a&&*a='z')||('A'=*a&&*a='Z')||('0'=*a&&*a='9')||(*a=='.')||(*a=='_'))){//一直将此字符串完全读入nowChar[a_long]=*a;*a++;a_long++;}nowChar[a_long]='\0';//判断输入的字符串是否为特殊的标识符,若是,则将其具
本文标题:词法分析的设计与实现
链接地址:https://www.777doc.com/doc-5626154 .html