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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

词法分析器Word下载.docx

1、具体任务有:(1)组织源程序的输入(2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件(3)删除注释、空格和无用符号(4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。(5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。常量表结构:常量名,常量值2编写DFA模拟程序算法如下:DFA

2、(S=S0,MOVE,F,ALPHABET)/*S为状态,初值为DFA的初态,MOVE为状态转换矩阵,F 为终态集,ALPHABET 为字母表,其中的字母顺序与MOVE 中列标题的字母顺序一致。*/Char Wordbuffer10=“”/单词缓冲区置空Nextchar=getchar();/读i=0;while(nextchar!=NULL)/NULL代表此类单词 if (nextchar!ALPHABET) ERROR(“非法字符”),return(“非法字符”); S=MOVESnextchar /下一状态 if(S=NULL)return(“不接受”);/下一状态为空,不能识别,单词错

3、误 wordbufferi=nextchar ; /保存单词符号 i+; nextchar=getchar();Wordbufferi=0;If(SF)return(wordbuffer); /接受 Else return(“不接受”);该算法要求:实现DFA算法,给定一个DFA(初态、状态转换矩阵、终态集、字母表),调用DFA(),识别给定源程序中的单词,查看结果是否正确。1能对任何S语言源程序进行分析在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。2能检查并处理某些词法分析错误词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在

4、的行号,错误的编号及错误信息。本实验要求处理以下两种错误(编号分别为1,2):1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。2:源程序文件结束而注释未结束。注释格式为:/* */三、 设计说明(一)、需求分析1、设计要求:(1)、对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词类型,单词符号)显示;(2)、可以将要分析的程序保存到文件中进行读取;(3)、删除无用的空白字符、回车符、及其它非实质性符号。2、词法分析的任务从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,把作为字符串的源程序改造成为单词符号串的中间程

5、序。因此,词法分析是编译的基础。执行词法分析的程序称为词法分析器或称扫描器 。3、词法分析程序功能:(1)读入源程序字符串,识别开具有独立含义的最小语法单位单词(符号);(2)把单词变换成长度统一的且为定长的属性字;(3)滤掉空格,跳过注释、换行符(4)某些预加工处理4、单词的分类(1) 基本字,也称关键词。如PASCAL语言中的begin,end,if,while和var等。(2)标识符。用来表示各种名字,如常量名、变量名、过程名和函数名等。(3)常数。各种类型的常数,如25,2.71828,a,hello和TRUE等。(4)算符。如+,-,*,)(7)Error函数:输出错误信息到屏幕(8

6、)Flag_Num函数:查填常量表(9)Flag_Sign函数:查填符号表4、程序流程图下图为程序执行的主要流程,具体内容如下:图3-4 程序执行的主要流程源代码:#includestring.hstdlib.h#define LENGTH 46#define N 100typedef struct token char name30; int code; int addr;token;typedef struct KeyWord/关键字/关键字名字KeyWord;typedef struct symble/字符/字符名字 int number;/字符编码 int type;/字符类型symb

7、le;char ch;int error_count; /错误出现的个数int var_count; /字符个数int num_count; /数字个数int label_count;int code_count; /代码数量int addr_count; /内码编址int LineOfPro; /错误出现的行号char filename30;FILE *Source; /源文件token CurrentToken;token zancun;symble CurrentSimble;symble SymbleListN;symble NumListN;/错误类型void Error(int a

8、) error_count+; switch(a) case 1: printf(error %2d 非法字符 %3d行.n,error_count,LineOfPro+1);break; case 2:error %2d 没有匹配的注释符 %3d行.n return;/输出void OutPut() int i=0; if(CurrentToken.code=17) / 标志符输出 CurrentSimble.number=CurrentToken.addr; CurrentSimble.type=CurrentToken.code; strcpy(CurrentSimble.name,Cu

9、rrentToken.name); Flag_Sign(); printf(,addr_count); else if(CurrentToken.code=18) / 数字输出 Flag_Num(); printf(num , %d,num_count); if(CurrentToken.code=1)&(CurrentToken.code,zancun.name); else/符号的输出,CurrentToken.name);/判断是否是数字void IsNum() int k=0; while(ch=0)&(chAZ)|ch=_)/将完整的单词放入单词缓冲区 CurrentToken.na

10、mei+=ch; zancun=CurrentToken; for(i=0;i14;i+)/将单词缓冲区中的词和关键字数组中的词比较,看是不是关键字 for(j=0;j30;j+) if(CurrentToken.namej=keyi.namej) h=0; else h=1; if(h=0) break; if(h=0) CurrentToken.code=keyi.code;/将第i个关键字的机内码给单词缓冲区中现有单词的机内码 CurrentToken.addr=-1;/关键字地址为-1 OutPut(); CurrentToken.code=17; CurrentToken.addr=

11、addr_count+; /如果不是关键字就是普通标识符,地址加/判断是否是注释void IsAno() char ch1; ch1=ch; ch=fgetc(Source); if(ch=*) for(; if(ch=EOF) Error(2);/到最后没有*说明注释不完全,有错误 if(ch= ch1=ch; ch=fgetc(Source); if(ch=/)/如果最后有*/说明注释完整 ch=fgetc(Source); error_count+; Error(2); CurrentToken.name0=/如果注释不完整,将第一个字母看成/ CurrentToken.code=22;

12、/符号的地址是-1/判断是否是其它void IsOther() int i;i+) CurrentToken.namei=0/将缓冲区初始化 switch(ch) case+ ch1=fgetc(Source); if(ch1= CurrentToken.name0= CurrentToken.name1= CurrentToken.code=38; CurrentToken.addr=-1; OutPut(); ch=fgetc(Source); break; CurrentToken.code=19;- CurrentToken.code=39; CurrentToken.code=20; CurrentToken.code=40; CurrentToken.code=21;% CurrentToken.code=41; CurrentToken.code=23;( CurrentToken.code=24;) CurrentToken.code=25; CurrentToken.code=26; CurrentToken.code=27; CurrentToken.name

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

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