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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

实验一词法分析.docx

1、实验一词法分析南京信息工程大学实验(实习)报告 一 实验目的1、 学会针对DFA转换图实现相应的高级语言源程序。2、 深刻领会状态转换图的含义,逐步理解有限自动机。3、 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。二 实验内容计算机程序设计语言的编译程序的词法分析部分实现。给出算法的流程图及有穷状态自动机的模型(可以用矩阵或者状态图表示)从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。为了简化程序的编写,有具体的要求如下:(1) 数仅仅是整数。(2) 空白符仅仅是空格、回车符、制表符。(3) 代码是自由格式。(4) 注释应放在花括

2、号之内,并且不允许嵌套三 实验要求要求实现编译器的以下功能:(1) 按规则拼单词,并转换成二元式形式(2) 删除注释行(3) 删除空白符 (空格、回车符、制表符)(4) 列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式(5) 发现并定位错误词法分析进行具体的要求:(1) 记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。(2) 词法分析程序当识别一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前识别出记号的属性值。(3) 标示符和保留字的

3、词法构成相同,为了更好的实现,把语言的保留字建立一个表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标示符对比该表格,如果存在该表格中则是保留字,否则是一般标示符。(选做)四 实验步骤(1)词法分析器的设计方法有如下四个步骤: 1.写出该语言的词法规则。 2.把词法规则转换为相应的状态转换图。 3.把各转换图的初态连在一起,构成识别该语言的自动机。 4.设计扫描器;把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。扫描器从初态出发,当识别一个单词后便进入终态,送出二元式。 词法分析需要一个单词时,扫描器取单词的程序流程图如下: (2)词法分析器的输出形式 词法分

4、析器输出的单词符号常常表示为二元式:(单词种别,单词符号的属性值) 单词种别通常用整数编码。 标识符一般统归为一种。常数按类型(整、实、布尔等)分种。关键字可视其全体为一种,也可以一字一种。采用一字一种的分法实际处理起来较为方便。运算符可采用一符一种的方法。至于界符一般也采用一符一种的分法。 (3)核心代码及其功能 #include ctype.h#include string.h#include stdio.h /*定义一个全局变量,一个全局指针*/FILE *fp; /*fp是一个指向FILE类型结构的指针变量,可以使fp指向某一个文件 的结构变量,从而通过该结构体变量中的文件信息访问该文

5、件*/int id; /*标志变量,用来标识各类型的ID*/*函数声明*/int search(char searchchar,int wordtype); char alphaprocess(char buffer);char digitprocess(char buffer);char otherprocess(char buffer);void error();/*主函数*/void main() /*自定义函数的声明*/ char cbuffer; if (fp=fopen(example.cpp,r)=NULL) /*以只读方式打开文件example.c,NULL在 stdio.h文

6、件中已被定义为0*/ printf(error); else cbuffer=fgetc(fp); /*文件不为空则从文件中取字符*/ while (cbuffer!=EOF) /*EOF文件结束标志*/ if(cbuffer= |cbuffer=n|cbuffer=t) /*掠过空格和回车符*/ cbuffer=fgetc(fp); /id=4; else if(isalpha(cbuffer) cbuffer=alphaprocess(cbuffer); /*检查cbuffer是否为字母,是则调用alphaprocess()函数*/ else if (isdigit(cbuffer) cb

7、uffer=digitprocess(cbuffer); /*检查cbuffer是否为数字09,是则调用digitprocess()函数*/ else cbuffer=otherprocess(cbuffer); /*非上述两者则调用otherprocess()函数*/ /*主函数结束*/*处理读取字符为字母的情况*/char alphaprocess(char buffer) int atype; int i=-1; char alphatp20; /*字符数组存储从文件中读取的字符*/ while(isalpha(buffer)|(isdigit(buffer)|buffer=_|buff

8、er=.) /*标识符的组成成分*/ alphatp+i=buffer; /*将当前读取的字符存如数组*/ buffer=fgetc(fp); /*读取下一个字符*/ alphatpi+1=0; /*字符串以0作为结束标志*/ atype=search(alphatp,1); /*调用函数,判断当前字符串是否为关键字*/ if(atype!=0) /*是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位子*/ printf(%s, (1,%d)n,alphatp,atype); id=1; /*关键字的ID为1*/ else printf(%s ,2)n,alphatp); /*为

9、标识符时,编号为2*/ id=2; /*标识符的ID为2*/ return(buffer); /*判断字符串是否为关键字*/int search(char searchchar,int wordtype) char *key32=auto,break,case,char,const,continue,default,do,double,else, enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,volatile,while,switch,typedef,union,

10、unsigned,void; /*设置数组指针存储c语言中的32个关键字*/ int i; int p; switch (wordtype) case 1:for (i=0;i1) error(); else printf(%s ,3)n,digittp); /*输出该数字,编号为3*/ id=3; /*设置ID为3*/ return(buffer);/*digitprocess()函数结束*/*处理读出字符为其他字符的情况*/char otherprocess(char buffer) int n=0; char ch20; ch0=buffer; ch1=0; if(ch0=%|ch0=)

11、 buffer=fgetc(fp); ch1=buffer; ch2=0; printf(%s ,4)n,ch); /*识别运算符% */ id=4; buffer=fgetc(fp); return(buffer); if(ch0=&) buffer=fgetc(fp); if(buffer!=&) printf(%s ,4)n,ch); /*识别引用运算符&*/ id=4; return(buffer); if(buffer=&) ch1=buffer; ch2=0; printf(%s ,4)n,ch); /*识别关系运算符&*/ id=4; buffer=fgetc(fp); retu

12、rn(buffer); if(ch0=,|ch0=;|ch0=|ch0=|ch0=(|ch0=) printf(%s ,5)n,ch); /*分界符,;()的id标记为5*/ buffer=fgetc(fp); id=5; return(buffer); if(ch0=*|ch0=/) /*运算符 */的id标记为4*/ printf(%s ,4)n,ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0=|ch0=!|ch0=) buffer=fgetc(fp); if(buffer=) /*防止=,!=,=符号的分离*/ ch1=buffer

13、; ch2=0; printf(%s ,4)n,ch); /*=,!=,=的标记为4 */ else printf(%s ,4)n,ch); /*=,!,的标记为4*/ id=4; return(buffer); buffer=fgetc(fp); id=4; return(buffer); if(ch0=+|ch0=-) if(id=4) /*如果+,-前ID为4的字符则可能为正负数或+,-,否则为加减号*/ for(int i=1;i+”,当前字符为,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢?又比如,+分析为正号还是加法符号,以及对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。这些在程序设计初期实现都比较困难,在前个问题中,我们用到了超前搜索方法,当当前待分析字符串出现“a+”,当前字符为时,分析器读入下一个字符+,这时可知应将解释为大于运算符。但此时,超前读了一个字符+,所以要回退一个字符,词法分析器才能正常运行。

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

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