编译技术实验报告材料词法分析报告程序_第1页
编译技术实验报告材料词法分析报告程序_第2页
编译技术实验报告材料词法分析报告程序_第3页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、编译技术实验报告实验名称:词法分析程序姓名:和春辰学号:U200818016软件工程0801班指导老师:胡福林2010年10月21日目录、实验题目2、实验目的2三、实验要求2四、实验步骤3基本设计思路3流程框图3算法设计4函数相关说明5输入与输出7程序运行结果7五、实验方案设计实现8六、实验程序亮点描述8七、实验程序使用说明8八、实验心得体会8九、源程序清单8实验题目标识符、设计、编制、调试一个识别一简单语言单词的词法分析程序。程序能够识别基本字、无符号整数、浮点数、运算符和界符)。单词符号及种别表如下:单词符号种别编码begin1if2the n3while4do5end6l(l|d)*10

2、dd*11+13-14*15/1617:=18<20<>21<=22>23>=24=2526(27)28#0二、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。实验要求词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。(字符串以“ #”号结束)输出:二元组(syn,token 或sum)构成的序列。其中:syn为单词种别码;toke n为存放的单词自身字符串;sum为整型常数。例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #输出如下序列:(1,begi n)(10,x)(

3、18,:=)(11,9)(26,;)(2,if)的源文件,经过词法分析后四、实验步骤基本设计思路基本字作为一类特殊的标识符来处理:识别出标识符,差基本字表,给出相应种别码。(字基本字表置初值:char *rwtab6="begin","if","then","while","do","end"符指针的数组)识别无符号整数是将数字串转换为无符号整数。我们在getchar()的时候是把数字当做字符从外部输出读取的。将数字串345#转换为整数:(3*10+4)*10+5=345 送

4、到 sum 中程序主要由2个函数组成,主函数main()和扫描子函数scanner。扫描程序每次读取 1个独立意义的单词符号,并判断单词类型。主程序做相应处理后做控制台输出。流程框图调用扫描子理序输出电荷二亓织*图1主程序图2扫描子程序算法设计词法分析程序所用的较为重要的全局变量和需调用的函数如下:1) Ch字符变量,存放当前读进的源程序字符。2) token8字符数组,存放构成单词符号的字符串。3) prog80字符数组,存放 所有用户输入的字符。4) syn整数,存放当前单词的种别码。5) sum双精度浮点型变量,存放无符号整数,或者浮点数。6) isDecimal整数,是否为浮点数。is

5、Decimal为1,则为浮点数。7) decimal双精度浮点型变量(double),浮点数的小数部分。8) isExp整数,是否为指数形式表示的浮点数(即是否存在符号E或者e)。isExp为1,则为指数形式。9) index整数,指数形式的幕。10) isNegative 整数,是否为负数幕。isNegative 为1,则为负数幕,女口 123E-2。11) scanner。扫描子程序。12) getchar()从控制台读取一个字符数据。13) double pow(double x,double y) ,计算 x 的 y 次幕。14) int strcmp(char *str1,char

6、#str2),字符串比较。函数相关说明1. 接收用户输入:getchar()和dowhile循环的组合doch=getchar();progp+=ch;while(ch!='#'); /输入以#号键结束2. 输出到控制台:dowhile循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。doscann er(); / 扫描,单词switch(s yn)case 11:if(isDecimal=O)prin tf(”(2d,%8d)n",sy n,(i nt)sum);break;else if(isExp=1)prin tf("(%2d,%10.5e)

7、n",sy n,sum);isExp=0;isDecimal=0;break;else if(isDecimal=1)prin tf("(%2d,%8.4f)n",sy n, sum);isDecimal=0;break;case -1:prin tf("i nput errorn ”);break;default:prin tf("(%2d,%8s)n",sy n,toke n);while(s yn !=0);3. 浮点数的识别,先识别数字,再识别.,再识别数字,再识别E或e,再识别-,再识别数字。elseif(ch>=&#

8、39;0')&&(ch<='9')while(ch>='0')&&( ch<='9')sum=sum*1O+ch-'O: /ch中数字本身是当做字符存放的ch=progp+;if(ch='.')isDecimal=1;ch=progp+;while(ch>='0')&&(ch<='9')pow(x,y) 计算x的y次幕 temp=(ch-'0')*pow(0.1,+cou nt); deci

9、mal=decimal+temp;AddToDec(); ch=progp+; sum=sum+decimal;if(ch='e'|ch='E')isExp=1;ch=progp+;if(ch='-')isNegative=1; ch=progp+;while(ch>='0')&&(ch<='9')/指数in dex=i ndex*10+ch-'0'ch=progp+;if(isNegative)sum=sum*pow(0.1,i ndex);elsesum=sum*po

10、w(10,i ndex);p-;syn=11;输入与输出词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。(字符串以“ #”号结束)输出:二元组(syn,token 或sum)构成的序列。其中:syn为单词种别码;toke n为存放的单词自身字符串;sum为整型常数。程序运行结果*F:re<eiveTempErinErinExpl-2Debugte5Lexe,h1 Please input string:beginx:if x>9 then x;=2*x+l/3; end#k iFbegins<i«Fx><18,:=><11,

11、<17.9>< 2,<10,x><23. <11.竄< 3fthen><10, <1SFx><11.2><15,*>x><13f+><11.1>/><11.3><26,;< 6,end>< 0.fl)Pressany key to continue*C:UersEr n-Debugtest.exe"Please input string:322123 +-1234 _56e123 +1 +-2lt<10,2zzi

12、23><13,+>.23456e-120><11,1>C13,+><11,-2>Pressany key to cont inue五、实验方案设计实现用C语言实现。六、实验程序亮点描述浮点数处理部分:巧妙利用double pow(double x,double y)函数,简化了浮点数处理部分。如果是简单浮点数,如1.23,出现“.”符号,置isDeminal为1,用%f输出。如果稍微复杂一点,指数形式,但是正数幕,如1.23E2,出现“ E”符号,置isExp为1,用。输出。如果更复杂一点,指数形式,但是负数幕,如1.23E-2,出现“-”

13、号,置isNegative为1,仍然用e输出。如果是有符号数(有符号整数或者有符号浮点数),在识别出“ +”或者“-”之后,再读后边一个字符,如果是数字,那么转至识别数字的代码段, 并在末尾将sum进行相应处理。 如果后边字符不是数字,证明“ +”或者“-”是加减号,而非正负号。七、实验程序使用说明用户输入待识别字符串(并以“ #”结尾,表示字符串输入结束),回车后程序自动输出 词法分析结果。八、实验心得体会词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 通过本试验的完成,更加加深了对词法分析原理的

14、理解。最初是按照老师课堂上的 C语言实现这个思路进行的, 但是后来老师要求将识别数字拓 展到浮点数(即实数)。由于本人C语言功底不够扎实,最后只得再回过头去看了一下C语言的语法,不过最后还是通过自己的力量把东西给做出来了。很有成就感!九、源程序清单#in clude<stdio.h>#in clude<stri ng.h>#in clude<math.h>char prog80; II存放所有输入字符char toke n8; II存放词组char ch; / 单个字符int syn,p,m,n; syn:种另 U编码double sum;int count

15、;int isSignal; / 是否带正负号(0不带,1负号,2正号)int isDecimal; / 是否是小数double decimal; / 小数int isExp; /是否是指数int in dex; /指数幕int isNegative; /是否带负号double temp;int temp2;void sca nn er();char *rwtab 6="begi n","if',"the n","while","do","e nd"void mai n()p=

16、0;coun t=0;isDecimal=O;in dex=0;prin tf("n Please in put stri ng:n");doch=getchar();progp+=ch;while(ch!='#'); /输入以#号键结束p=0;doscann er(); /扫描,单词switch(s yn)case 11:if(isDecimal=0)/加了 1个强制类型转换prin tf(”(2d,%8d)n",sy n,(i nt)sum);break;else if(isExp=1)prin tf("(%2d,%10.5e)n&q

17、uot;,sy n,sum);isExp=0;isDecimal=0;break;else if(isDecimal=1)prin tf(”(2d,%8.4f)n" ,sy n,sum);isDecimal=0;break;case -1:prin tf("i nput error'n ”);break;default:prin tf("(%2d,%8s)n",sy n,toke n);while(sy n!=0);void sca nner()sum=0;decimal=0;m=0;for(n=0;n<8;n+)toke nn =NULL

18、;ch=progp+; / 从prog中读出一个字符到 ch中while(ch=' ') /跳过空字符(无效输入)ch=progp+;if(ch>='a') &&(ch<='z')|(ch>='A')&&( ch<='Z') /ch是字母字符while(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|(ch&

19、gt;='0') &&(ch<=9)toke n m+=ch; ch=>toke nch=progp+; /读下一个字符toke nm+='0'p-; / 回退一格sy n=10; / 标识符/ 如果是"begin","if","then","while","do","end"标识符中的一个for(n=0;n<6;n+)if(strcmp(toke n, rwtab n)=0)syn=n+1; break;el

20、se if(ch>='0')&&(ch<='9')IsNum:if(isSig nal=1)/toke nm+='-'while(ch>='0') &&(ch<='9')sum=sum*10+ch-'0: /ch中数字本身是当做字符存放的ch=progp+;if(ch='.')isDecimal=1;ch=progp+;while(ch>='0')&&( ch<='9')pow

21、(x,y) 计算x的y次幕 temp=(ch-'0')*pow(0.1,+cou nt); decimal=decimal+temp;AddToDec(); ch=progp+;sum=sum+decimal;if(ch='e'|ch='E')isExp=1;ch=progp+;if(ch='-')isNegative=1;ch=progp+;while(ch>='0')&&( ch<='9')/指数in dex= in dex*10+ch-'0'ch=p

22、rogp+;/10的幕123e3 代表 123*10(3)/sum=sum*pow(10,i ndex);是错误的if(isNegative) sum=sum*pow(0.1,i ndex); elsesum=sum*pow(10,i ndex); if(isSig nal=1)sum=-sum; isSig nal=O;P-;syn=11;else switch(ch)case '<':m=0;toke n m+=ch; ch=progp+;if(ch='>')syn=21; /<> 对应 21 toke n m+=ch;else if(ch='=')syn=22;toke n m+=ch;elsesyn=20;p-; break;case '>':m=0;toke n m+=ch; ch=progp+;if(ch='=')syn=24;to

温馨提示

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

评论

0/150

提交评论