词法分析的设计与实现_第1页
词法分析的设计与实现_第2页
词法分析的设计与实现_第3页
词法分析的设计与实现_第4页
词法分析的设计与实现_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上题 目 词法分析的设计与实现 学 院 专业名称 计算机科学与技术 姓 名 导师姓名 2010年 12 月目录1课程设计的目的12课程设计的内容13、 课程设计的要求 14课程设计报告内容1 4.1设计功能分析1 4.2 设计思路1 4.3 正规文法24.4 状态图 3 4.5设计词法分析算法代码 5 4.6基本测试数据 12 4.7结果截图 125设计体会 126参考文献137思考题13专心-专注-专业词法分析的设计与实现一、课程设计的目的1、基本掌握计算机语言的词法分析程序的开发方法。2、实现一个词法分析程序,将字符串流分解成终结符流供语法分析使用。3、通过设计编制

2、调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。4、了解当前常用的软件开发工具Visual C+,熟练掌握基于MFC的程序设计,培养解决实际问题的能力。5、对C语言和数据结构的进一步巩固加深。二课程设计的内容编制一个能够分析三种数、标识符、主要运算符、分隔符和主要关键字的词法分析程序。三、课程设计的要求1根据以下的正规式,编制正规文法,画出状态图;    标识符         <字母&g

3、t;(<字母>|<数字字符>)*   十进制数 (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|

4、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)*     运算符和分隔符    +  -  *  /  >  <  =  (  )  ;     关键字        

5、;          if  then  else  while  do  2根据状态图,设计词法分析函数int scan( ),完成以下功能:1)从键盘读入数据,分析出一个单词。2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。3编写测试程序,反复调用函数scan( ),输出单词种别和属性。四、课程设计报告内容 4.1、设计功能分析程序能够从左到右一个字符一个字符地读入源程序,并对构成的源程序的字符流进行扫描和分解,

6、从而识别出一个个单词,并给出单词的种别和属性。 4.2、设计思路主函数main()的思想:先输入一串字符,将字符串用空格打断,若是分隔出的单元不为空,则对此单元继续分析,根据所输入的字符串判断出是标识符、八进制数、十进制数、十六进制数、运算符、分隔符还是关键字,然后赋予那单词的种别和属性。 4.3、正规文法对于十进制数: A1>B1C1 B1>D1B1| C1>E1B1 E1> |. D1>0|1|2|3|4|5|6|7|8|9 对于八进制数: A2>0B2 B2>C2D2 C2>E2F2 E2>1|2|3|4|5|6|7 F2>GF

7、| D2>H2F2 H2> |. D2>1|2|3|4|5|6|7 G2>0|1|2|3|4|5|6|7对于十六进制: A3>0xB3 B3>C3D3 C3>E3C3| E3> 0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f D3>F3C3 F3> |.对于运算符和分隔符: A4>+|-|*|/|>|<|=|(|)|;对于标识符和关键字: A5>B5C5 B5>D5E5 D5>a|b|y|z E5>F5E5| F5>a|b|y|z|0|1|2|3|4|5|6|7|8|9

8、C5>G5E5 G5> |.综上正规文法为: S>A1|A2|A3|A4|A5 A1>B1C1 B1>D1B1| C1>E1B1 E1> |. D1>0|1|2|3|4|5|6|7|8|9 A2>0B2 B2>C2D2 C2>E2F2 E2>1|2|3|4|5|6|7 F2>GF| D2>H2F2 H2> |. D2>1|2|3|4|5|6|7 G2>0|1|2|3|4|5|6|7 A3>0xB3 B3>C3D3 C3>E3C3| E3> 0|1|2|3|4|5|6|7

9、|8|9|a|b|c|d|e|f D3>F3C3 F3> |. A4>+|-|*|/|>|<|=|(|)|; A5>B5C5 B5>D5E5 D5>a|b|y|z E5>F5E5| F5>a|b|y|z|0|1|2|3|4|5|6|7|8|9 C5>G5E5 G5> |.4.4、状态图070*0.9/az/AZ1909其他开始空白a.z/ AZ023469其他。09非数字。07非o.7且非。110007非o.7。75812111319/a.f/ AF14非1.9且非a.f且非A.F150.9/a.f/A.F16非0.9且非

10、a.f且非A.F。17。018190+/-/ /;If/while/then/dox/X4.4设计词法分析算法代码:#include<string.h>#include<stdio.h>#include "stdafx.h"union chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值char kind7;int id;union chars pro;int scan(cha

11、r *a); /对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类void Prints(char a15,int id,int a_long); /将分析后的每个token输出void save(char *a,int id,int x); /将分析后的结果保存到一个结构数组中char nowChar15; /临时的存储单元,用来存储被空格打断以后单元char kinds118=" ","INT10","INT8","INT16","IDN"," ","

12、 "," ","REAL10","REAL8","REAL16"/单词的不同种别struct data link100; /用来存放词法分析以后的结果的结构数组int link_long=0; /全局变量int scan(char *a)int id;int a_long=0;int doc=0;while(*a!=NULL)nowChar0='0'a_long=0;doc=0;/对数值的判断及处理if('0'<=*a&&*a<='9&#

13、39;) /如果第一个字符为数值nowChara_long=*a;*a+;a_long+;/对十六进制的判断及处理if(nowChar0='0'&&(*a='x'|*a='X') /如果第一个字符为0且第二个字符为x,则为十六进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&&('0'<=*a&&*a<='9')|('a'<=*a&&*a<='f')|(

14、'A'<=*a&&*a<='F')|*a='.')nowChara_long=*a; /一直将此十六进制数完全读入,若为浮点型的,则加以标记if(*a='.')doc=1;*a+;a_long+;nowChara_long='0' /判断输入的十六进制数是否合法if(a_long=2) /输入的只有0x,则输入错误Prints(nowChar,7,a_long);return 0;if(doc) /输入的十六进制数是浮点型的Prints(nowChar,10,a_long); /则将其具

15、体的类型属性定为10else /输入的十六进制数是整型的Prints(nowChar,3,a_long); /则将其具体的类型属性定义为3continue;/对八进制的判断及处理if(nowChar0='0'&&'0'<=*a&&*a<='7') /如果第一个字符为0且第二个字符为07,则为八进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&&('0'<=*a&&*a<='7')|*a

16、='.')nowChara_long=*a; /一直将此八进制数完全读入,若为浮点型的,则加以标记if(*a='.')doc=1;*a+;a_long+;nowChara_long='0'if(doc) /输入的八进制数是浮点型的Prints(nowChar,9,a_long); /则将其具体的类型属性定为9else /输入的十六进制数是整型的Prints(nowChar,2,a_long); /则将其具体的类型属性定义为2continue;/对十进制数的判断及处理elsewhile(*a!=NULL&&('0'&

17、lt;=*a&&*a<='9')|*a='.')nowChara_long=*a; /一直将此十进制数完全读入,若为浮点型的,则加以标记if(*a='.')doc=1;*a+;a_long+;nowChara_long='0'if(doc) /输入的十进制数是浮点型的Prints(nowChar,8,a_long); /则将其具体的类型属性定为8else /输入的十进制数是整型的Prints(nowChar,1,a_long); /则将其具体的类型属性定义为1continue; /完成了对数值的判断及处理/对

18、字符的判断及处理elsenowChara_long=*a;*a+;a_long+;/判断输入的字符是否为运算符或其他的分隔符switch(nowChar0)case'+':case'-':case'*':case'/':case'<':case'>':case'(':case')':case'=':case'':nowChara_long='0'Prints(nowChar,5,a_long); /将其具体的

19、类型属性定义为5continue;default:break;/判断输入的第一个字符是否为字母if('a'<=nowChar0&&nowChar0<='z')|('A'<=nowChar0&&nowChar0<='Z')while(*a!=NULL&&('a'<=*a&&*a<='z')|('A'<=*a&&*a<='Z')|('0&

20、#39;<=*a&&*a<='9')|(*a='.')|(*a='_') /一直将此字符串完全读入nowChara_long=*a;*a+;a_long+;nowChara_long='0'/判断输入的字符串是否为特殊的标识符,若是,则将其具体类型值定义为6/判断输入的字符串是否为特殊的字符串ifif(a_long=2&&strcmp(nowChar,"if")=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符

21、串thenif(a_long=4&&strcmp(nowChar,"then")=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串elseif(a_long=4&&strcmp(nowChar,"else")=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串whileif(a_long=5&&strcmp(nowChar,"while")=0)Prints(nowCha

22、r,6,a_long);continue;/判断输入的字符串是否为特殊的字符串doif(a_long=2&&strcmp(nowChar,"do")=0)Prints(nowChar,6,a_long);continue;/若输入的字符串不符合以上几种情况,则输入的为变量/若输入的字符串为变量,则将其具体属性值定义为4Prints(nowChar,4,a_long);continue;/如果输入的既不是数值也不是字符串,则输入错误,将其具体类型之定义为7elsePrints(nowChar,7,a_long);return 0;return 1;main()

23、 char buf100; /用来存储从键盘上输入一串字符 char *tokenPtr; /用来存储用空格打断后的单元int id=1; /用来存储具体的类型号link_long=0;while(id)link_long=0;gets(buf); /从键盘上输入一串字符tokenPtr=strtok(buf," "); /用空格将字符串打断while(id&&*tokenPtr!=NULL) /分割出来的单元不为空 id=scan(tokenPtr); /将此单元进行继续分析,并返回其具体的类型值 tokenPtr=strtok(NULL," &

24、quot;); /将字符串继续用空格进行分割printf("nn");getchar();return 0;/将所分解后的单元存入结构数组中void save(char *a,int id,int x,float y)int i;if(link_long<100)linklink_long.id=id; /将具体的类型值存入if(id>=5)if(id>=8)/id=8,9,10/若为浮点型的数值,则将浮点型的y值(转换后的)存入其属性当中且存入单词的种别for(i=0;i<9&&kindsidi!='0'i+)lin

25、klink_long.kindi=kindsidi;linklink_.real=y;/id=5,6,7else/若为标识符,则将单词种别定为自身,属性值定为空for(i=0;i<15&&ai!='0'i+)linklink_long.kindi=ai;linklink__char0='-'linklink__char1='0'link_long+;/id=1,2,3,4elsefor(i=0;i<8&&kindsidi!='0&#

26、39;i+)linklink_long.kindi=kindsidi; /若分解后的token为变量或者整型数值,则将其单词种别直接输出if(id=4) /若token为变量,则将其属性值设为自身for(i=0;i<15&&ai!='0'i+)linklink__chari=ai;linklink__chari='0'else /若token为整型数值,则将其相应的十进制数值赋给其属性值linklink__number=x;link_long+; /继续存入下一个tok

27、enelseprintf("Full 100n"); /结构数组已经存满return;/将词法分析器分解后的结果输出出来void Prints(char a15,int id,int a_long)int i;int x=0;float y=0;/int float1;/char *c;if(id=1) /若为十进制整数for(i=1;i<a_long&&ai!='0'i+)x=x*10+(ai-48);printf("INT10t%sn",a);save(a,id,x,y); /存入结构数组return;if(id

28、=2) /若为八进制整数for(i=1;i<a_long&&ai!='0'i+)x=x*8+(ai-48); /换算为十进制数printf("INT8t%dn",x);save(a,id,x,y); /存入结构数组return;if(id=3) /若为十六进制整数for(i=2;i<a_long&&ai!='0'i+)if('0'<=ai&&ai<'9')x=x*16+(ai-48); /换算为十进制数elseif('a'&

29、lt;=ai&&ai<='f')x=x*16+(ai-87);elsex=x*16+(ai-55);printf("INT16t%dn",x);save(a,id,x,y); /存入结构数组return;if(id=4) /若为变量printf("IDNt%sn",a);save(a,id,x,y); /存入结构数组return;if(id=5|id=6) /若为标识符(+,-,*,/,+以及if,else,while,then,do)printf("%st-n",a);save(a,id,x,y

30、); /存入结构数组return;if(id=8) /若为十进制浮点型for(i=0;i<a_long&&ai!='.'i+)x=x*10+(ai-48);for(i=strlen(a)-1;i>=0&&ai!='.'i-)y=(y+(ai-48)/10;y=y+x; /整数部分与小数部分换算后相加printf("REAL10t%fn",y);save(a,id,x,y); /存入结构数组return;if(id=9) /若为八进制浮点型for(i=1;i<a_long&&ai

31、!='.'i+)x=x*8+(ai-48);for(i=strlen(a)-1;i>=0&&ai!='.'i-)y=(y+(ai-48)/8;y=y+x; /整数部分与小数部分换算后相加printf("REAL8t%fn",y);save(a,id,x,y); /存入结构数组return;if(id=10) /若为十六进制浮点型for(i=2;i<a_long&&ai!='.'i+) /将整数部分与小数部分分割开,并进行相应的换算x=x*16+(ai-48);for(i=strlen

32、(a)-1;i>=0&&ai!='.'i-)y=(y+(ai-48)/16;y=y+x; /整数部分与小数部分换算后相加printf("REAL16t%fn",y); /存入结构数组save(a,id,x,y);return;printf("Wrong Enter"); /所得的具体类型值为7,则输入有错误return ;4.5基本测试数据:输入数据例:00 96*name 25> 0x8d while 5;4.6结果截图:五、设计体会本次的课程设计使团队成员对词法分析的过程有了全新的了解,同时也明白了词法分析何时可以采用空格来区分单词,明白了程序设计中影响词法分析的效率的环节。比如,关键字的识别过程。因为当词法分析器识别出一个标识符时,就去和保留字表中的关键字进行比较,以确定它是否是关键字。如果关键字和标识符比较少,标识符在表中采取顺序比较的时间还可以接受,但如果关键字和标识符都比较多,那么查询比较的平均时间就会比较长,就会影响到词法分析的效率。且每一次比较都是字符串之间的比较,也很耽误

温馨提示

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

评论

0/150

提交评论