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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理词法分析课程设计报告Word格式文档下载.doc

1、LB“”LP“(”RB“”RP“)”PLUS“+”三、设计思想和实现方法(一)、Lex是一种生成扫描器的工具,(我是在操作系统下安装f,进行编程的)Lex程序编程分为以下四步:1. Lunix下用vi命令编写lex程序,我的文件是lex.l,编写好后 ,保存并退出。2. 使用命令flex lex.l,编译系统自动生成了lex.yy.c的C文件。3. 使用命令gcc lex.yy.c -ll,生成可执行的扫描器a.out文件。4. 使用命令a.out file1.c,其中file1.c为要进行此法扫描的C文件。我要做的就是 编写C语言词法的正则表达式,以及需要识别的各种词法记号和匹配后需要执行的

2、动作 即可,其他的操作都可以交给Lex来执行。(二)、词法分析器的作用如下:1. 词法分析器的主要任务是读入源程序的输入字符2. 过滤掉源程序中的注释、空白(空格、换行符、制表符以及输入中用于分割词法单元的其他字符)3. 对源程序进行预处理,如对源程序的宏展开4. 将编译器生成的错误消息与与源程序的位置对应起来;(三)、对于此题,我使用Lex编程来自动生成词法分析器。使用Lex编程的重点与难点是正则式的定义,对于容易产生二义性的正则表达式,我们要借助与辅助函数来解决。 以下为一个二义性的解决;plus (Int|Float|id)blank?+ /加号的正则定义plusinstall(yyte

3、xt,PLUS);/转换规则里的 模式 动作需要说明的是:当+左边为一个标示符(id)或数字(num)时,我们才认为它是加号;否则为正号。但匹配到 plus正则式时,我们调用int install() 辅助函数,int install()函数再把“+”前面的标示符(id)或数字(num)与“+”分离开来,其余三个容易产生歧义的符号,也采用同种处理方法,install()辅助函数的定义,将在本报告的第四部分 中给出。四、程序说明Lex是一种生成扫描器的工具,我们可以通过编写Lex文件来实现识别文本中的词汇模式的程序。一个Lex程序可具有如下形式:声明、定义部分%转换规则%辅助函数1、声明部分包括

4、变量和明示常量(被声明的表示一个常数标示符,如一个此法单元的名字)的声明,本程序声明部分包括:C语言的头文件,及为每个关键字定义一个宏常量,为避免与冲突,数值从开始。定义部分同时给出了正则表达式。第一段的部分如下,详细见附件二声明部分%# include#includectype.hint yywrap();# define LB 257# define LP 258 . .# define REAL_LITERAL 367# define STRING 368# define CHARACTER 369# define NUM370%正则表达式blank 0delim tnws delim+

5、Float E?digit+(.digit+)+(eE?digit+)?Ffid letter(letter|digit)*incom (/*+(/*+)*/)|(/(.)*) mul (Int|Float|id)blank?* /乘号的正则定义Bit (Int|Float|id)blank?&/按位与的正则定义sub (Int|Float|id)blank?- /减号的正则定义.程序的每个转换规则具有如下形式:模式动作其中,每个模式是一个正则表达式,我的程序的正则表达式的定义全部在声明部分给出。动作部分是代码片段。以下为转换规则部分subinstall(yytext,MINUS);mulin

6、stall(yytext,MULT);+=printf(n,yytext,PLUSA);-=,yytext,MINUSA);*=,yytext,MULA);/=,yytext,DIVA);Lex机器经过此法扫描。通过模式匹配产生一个动作,其形式为,其中词素为当前匹配到的最长字符串,属性值为该词素对应的属性值,这里我们通过lex程序的声明部分的宏声明,给出每个词素对应的属性值,每个词素的属性值是唯一的。.程序的第三个部分包括各个动作需要的所有辅助函数,其中()函数,这里作者定义了一个用于消除“+、*、&”二义性的辅助函数int install(const char*y,int b) int le

7、n=strlen(y);char idlen;int i;for(i=0;i,id,IDENTIFIER);else printf(,id,NUM);printf( %c,%d, ylen-1,b);return 0;五、程序运行结果在lunix中用vi编辑器,编辑一个名叫lex.l的lex程序文件;lex编译器产生lex.yy.c文件:(如下图)用gcc lex.yy.c ll命令产生a.out文件:执行a.out文件,其中goods.c为要进行词法分析的C程序源文件,使用:./a.out goods.c goods.tok 通过命令行传递文件,并把分析器产生的词素通过重定向符输入 good

8、s.tok文件中(操作如下图)通过分屏操作符more 打开goods.tok文件(如下图)其中good.c文件的部分如下图:六、测试报告1、现在用写好的lex程序,用来扫描一个li.c文件,程序的重点在于二义性的处理,简单起见,我的li.c文件的内容不会太多,具体如下图:图(一)2、我们用命令 ./a.out li.c li.tok 对li.c文件进行词法分析,得到的结果输入到li.tok文件中,我们打开li.tok文件,其结果如下图: 图(二)在lex程序的声明部分我们定义了如下宏:# define PLUS 261 /“+”为加号# define MINUS262/“-”为减号# defi

9、ne MULT 263/“*”为乘号# define BITAND 276/“&”为按位与操作# define UNARYMINUS 297/“-”为正号# define UNARYPLUS 298 /“+”为负号# define DEREFERECE 299/“*”为指针号# define ADDRESS 300/“&”为引用符号# define IDENTIFIER 303我们由第一部可知 a、b、c都为标示符(id),所以a、b、c其属性指都是303,第一个表达式a+b,扫描结果理论为表示其为加号,由图二可知此法扫描实际结果与理论匹配;第二表达式+a中的“+”理论上是正号,对应的是,图二

10、中的实际结果也是,其他表达式,同理也可分析出。七、存在问题及分析词法分析的正则表达式编写有些不是很全面简洁,比如说char 和income的正则式。宏定义部分显得冗余,没有把握住词法分析的程序关键要处理的词素,识别某些词法记号的正则表达式编写的不是很严谨,比如说在识别C语言预处理定义语句的正则表达式仅仅只能识别出预处理语句,而无法进行预处理包含的头文件的词法分析。程序存在一个瑕疵,在处理”+、*、&”时,扫描 id+id、id *id、id-id、id&id,时,把这四个符号当成加、减、乘、与符号,但当扫描遇到num+、num*、num&、num-时,分不出mun是int 还是float类型,

11、只是笼统的把它归为数字。这个问题是在设计辅助函数,及在正则式定义是出现的最大漏洞。对Lex编程还不是很了解,对词法分析器的作用以及工作原理的理解还有待提高八、总结及体会在拿到本次课程设计题目后,对是用C/C+还是lex进行了分析,用C/C+语言直接编写词法分析程序从思路上来说会比较容易些,但在写代码的过程中,慢慢地就暴露出直接编写词法分析程序的一些问题,比如说代码里充斥着大量的ifswitch语句,也频繁些读写语句,极大地增加了代码的复杂度,从而促使我选择使用unix下的Lex编程来自动生成词法分析器的方案。使用Lex编程就简化了代码的编写,但是Lex编程的重点是正则表达式的定义。本次课程设计

12、也暴露了我在编译原理学习中的一些不足,比如对正规式的含义和编写还有一些疑问,对辅助函数的编写显得不严谨,对词法分析器的作用和工作原理理解的不是很清等等,通过课程设计很好的复习了编译原理课程中的词法分析部分,对自己理解词法分析有很大的帮助参考文献 Alfred V.Aho Monica S.Lam Ravi Sethi Jeffrey D.Ullman 编译原理,机械工程出版社附录:附录一C语言词法记号及其含义表MINUS“-”MULT“*”DIV“/”MOD“%”PLUSA“+=”MINUSA“-=”MULA“*=”DIVA“/=”MODA“%=”LS“LSA=”RSANOT“!BITAND&BITOR|XORCOMPLAND“&OR“|”LTLEGTGEEQ“=”NE“

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1