ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:19.78KB ,
资源ID:12714285      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-12714285.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理课程设计词法分析.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

编译原理课程设计词法分析.docx

1、编译原理课程设计词法分析一、 实验题目设计、编制、调试一个识别一简单语言单词的词法分析程序。程序能够识别基本字、标识符、无符号整数、浮点数、运算符和界符)。单词符号及种别表如下:单词符号种别编码begin1if2then3while4do5end6l(l|d)*10dd*11+13-14*15/16:17:=18202123=24=25;26(27)28#0二、 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。三、 实验要求词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。(字符串以“#”号结束)输出:二元组(syn,token或sum)构成的序列。其中:sy

2、n为单词种别码; token为存放的单词自身字符串; sum为整型常数。例如:对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)四、 实验步骤基本设计思路 基本字作为一类特殊的标识符来处理:识别出标识符,差基本字表,给出相应种别码。基本字表置初值:char *rwtab6=begin,if,then,while,do,end;(字符指针的数组) 识别无符号整数是将数字串转换为无符号整数。我们在getchar()的时候是把数字当做字符从外部输

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

4、) isDecimal整数,是否为浮点数。isDecimal为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(c

5、har *str1,char #str2),字符串比较。函数相关说明1. 接收用户输入:getchar()和dowhile循环的组合 do ch=getchar(); progp+=ch; while(ch!=#); /输入以号键结束2. 输出到控制台:dowhile循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。 do scanner(); /扫描,单词 switch(syn) case 11: if(isDecimal=0) printf(%2d,%8d)n,syn,(int)sum); break; else if(isExp=1) printf(%2d,%10.5e)n,sy

6、n,sum); isExp=0; isDecimal=0; break; else if(isDecimal=1) printf(%2d,%8.4f)n,syn,sum); isDecimal=0; break; case -1: printf(input errorn); break; default: printf(%2d,%8s)n,syn,token); while(syn!=0);3. 浮点数的识别,先识别数字,再识别 . ,再识别数字,再识别E或e,再识别 - ,再识别数字。else if(ch=0)&(ch=0)&(ch=0)&(ch=0)&(ch=9) /指数 index=in

7、dex*10+ch-0; ch=progp+; if(isNegative) sum=sum*pow(0.1,index); else sum=sum*pow(10,index); p-; syn=11; 输入与输出词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。(字符串以“#”号结束)输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。程序运行结果五、 实验方案设计实现用C语言实现。六、 实验程序亮点描述浮点数处理部分:巧妙利用double pow(double x,double y)函数,简

8、化了浮点数处理部分。如果是简单浮点数,如1.23,出现“.”符号,置isDeminal为1,用%f输出。如果稍微复杂一点,指数形式,但是正数幂,如1.23E2,出现“E”符号,置isExp为1,用%e输出。如果更复杂一点,指数形式,但是负数幂,如1.23E-2,出现“-”号,置isNegative为1,仍然用%e输出。如果是有符号数(有符号整数或者有符号浮点数),在识别出“+”或者“-”之后,再读后边一个字符,如果是数字,那么转至识别数字的代码段,并在末尾将sum进行相应处理。如果后边字符不是数字,证明“+”或者“-”是加减号,而非正负号。七、 实验程序使用说明用户输入待识别字符串(并以“#”

9、结尾,表示字符串输入结束),回车后程序自动输出词法分析结果。八、 实验心得体会词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。 最初是按照老师课堂上的C语言实现这个思路进行的,但是后来老师要求将识别数字拓展到浮点数(即实数)。由于本人C语言功底不够扎实,最后只得再回过头去看了一下C语言的语法,不过最后还是通过自己的力量把东西给做出来了。很有成就感!参考文献1 张素琴,吕映芝等.编译原理M.第2版.北京:清华大学出版社,2005.22 王雷,刘志成等.编

10、译原理课程设计M.北京:电子工业出版社,20023 何炎祥等.编译程序构造M.武汉:武汉大学出版社,19884 Holub A.Compiler Design in CM.Prentice-Hall,1990源程序代码#include#include#includechar prog80; /存放所有输入字符char token8; /存放词组char ch; /单个字符int syn,p,m,n; /syn:种别编码double sum; int count;int isSignal; /是否带正负号(0不带,1负号,2正号)int isDecimal; /是否是小数double decim

11、al; /小数int isExp; /是否是指数int index; /指数幂int isNegative; /是否带负号double temp;int temp2;void scanner();char *rwtab6=begin,if,then,while,do,end;void main() p=0; count=0; isDecimal=0; index=0; printf(n Please input string:n); do ch=getchar(); progp+=ch; while(ch!=#); /输入以号键结束 p=0; do scanner(); /扫描,单词 swit

12、ch(syn) case 11: if(isDecimal=0) /加了1个强制类型转换 printf(%2d,%8d)n,syn,(int)sum); break; else if(isExp=1) printf(%2d,%10.5e)n,syn,sum); isExp=0; isDecimal=0; break; else if(isDecimal=1) printf(%2d,%8.4f)n,syn,sum); isDecimal=0; break; case -1: printf(input errorn); break; default: printf(%2d,%8s)n,syn,to

13、ken); while(syn!=0);void scanner() sum=0; decimal=0; m=0; for(n=0;n=a)&(ch=A)&(ch=a)&(ch=A)&(ch=0)&(chtoken ch=progp+; /读下一个字符 tokenm+=0; p-; /回退一格 syn=10; /标识符 /如果是begin,if,then,while,do,end标识符中的一个 for(n=0;n=0)&(ch=0)&(ch=0)&(ch=0)&(ch=9) /指数 index=index*10+ch-0; ch=progp+; /10的幂 /123e3代表123*10(3)

14、/sum=sum*pow(10,index);是错误的 if(isNegative) sum=sum*pow(0.1,index); else sum=sum*pow(10,index); if(isSignal=1) sum=-sum; isSignal=0; p-; syn=11; else switch(ch) case ) syn=21; /对应21 tokenm+=ch; else if(ch=) syn=22; tokenm+=ch; else syn=20; p-; break; case : m=0; tokenm+=ch; ch=progp+; if(ch=) syn=24;

15、 tokenm+=ch; else syn=23; p-; break; case : m=0; tokenm+=ch; ch=progp+; if(ch=) syn=18; tokenm+=ch; else syn=17; p-; break; case +: temp2=progp; if(temp2=0)&(temp2=0)&(temp2=9) isSignal=1; ch=progp+; goto IsNum; /转到数字的识别 syn=14; tokenm+=ch; break; case *: syn=15; tokenm+=ch; break; case /: syn=16; tokenm+=ch; break; case =: syn=25; tokenm+=ch; break; case ;: syn=26; tokenm+=ch; break; case (: syn=27; tokenm+=ch; break; case ): syn=28; tokenm+=ch; break; case#: syn=0; tokenm+=ch; break; default: syn=-1;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2