编译原理论文-词法分析器的设计与实现.doc_第1页
编译原理论文-词法分析器的设计与实现.doc_第2页
编译原理论文-词法分析器的设计与实现.doc_第3页
编译原理论文-词法分析器的设计与实现.doc_第4页
编译原理论文-词法分析器的设计与实现.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

编译原理论文题 目 词法分析器的设计与实现 姓 名 学 号 专业班级 指导老师 2015年6月15一、引言3二、词法分析器的设计42.1词的内部定义42.2词法分析器的任务及功能52.2.1任务52.2.2 功能:52.3单词符号对应的种别码:6三、词法分析器的实现63.1主程序示意图:73.2函数定义说明73.3程序设计实现及功能说明83.3.1关键字83.3.2关键字的定义83.3.3符合的关键字的查找8四、词法分析程序的C语言源代码:8五、 结果分析:11摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,IRLAS是一个高精度、高质量的、高可靠性的词法分析系统。 众所周知,切分歧义和未登录词识别是中文分词中的两大难点。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。关键词:词法分析器扫描器单词符号预处理一、引言运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在VisualStudio环境下,使用C语言作为开发工具。基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。完成计算机翻译过程的关键阶段,它为后面的语法分析、语义分析做好准备,打好基础,以便快速地、高质量地生成目标语言程序。二、词法分析器的设计由于我们规定的程序语句中涉及单词较少故在词法分析 阶段忽略了单词输入错误的检查而将编译程序的重点放在中 间代码生成阶段$词法分析器的功能是输入源程序输出单词 符号$规定输出的单词符号格式为如下的二元式%!单词种别 单词自身的值#2.1词的内部定义 对常量,变量,临时变量,保留关键字(if,while,begin,else,do等)、关系运算符、逻辑运算符、分号、括号等,规定其内部定义如附表所示2.2词法分析器的任务及功能 2.2.1任务就编译器基本结构而言,词法分析(lexical analysis)是编译过程的第一阶段。实际上,在词法分析之前,有些编译器模型存在编译预处理阶段,C语言就是一个典型的例子。不过,大多数Pascal编译器都不存在预处理器。本书对编译预处理不作讨论。词法分析的任务是从左到右扫描与分析构成源程序的字符流(字符串),把字符流分解为多个单词(token)。每个单词都是具有独立含义且不可再分割的字符序列。在编译器框架中,完成词法分析任务的模块称为词法分析器。 2.2.2 功能:词法分析器的基本功能是,按照语言的定义规则,逐个地读入源程序的符号,识别出对语言有意义的符号串,即单词符号;然后分析单词符号的属性,并把单词符号及其属性填写在表中; 同时把源程序改造成等价的计算机内部表示单词记号, 以便编译的后续阶段使用。 (1) 识别出源程序中的各个单词符号,并将其转换成内部编码形式; (2) 删除无用的空白字符、回车字符以及其他非实质性字符; (3) 删除注释(4) 进行词法检查,报告所发现的错误。2.3单词符号对应的种别码:单词符号对应的种别码单词符号种别码 单词符号种别码bgin1:17If2:=18Then320wile421do523lettet(letter|digit)*10=24dight dight*11=25+13;2614(27*15)28/16#0三、词法分析器的实现编写词法分析器,词法分析器能够识别关系算符,词法分析器能够识别标识符和关键字,词法分析器能够识别无符号数。编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析器。词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的二元式(单词种别码,单词符号的属性值)表示。对给定的程序通过词法分析器识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示,设计一个词法分析程序,理解词法分析器实现的原理,掌握程序设计语言中的各类单词的词法分析方法,加深对词法分析原理的理解。3.1主程序示意图: 关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,; 置初值 调用扫描子程序结束输出串结束?输出单词二元组 是(2)程序中需要用到的主要变量为syn,token和sum。3.2函数定义说明(1) search() 查找并识别当前单词类别,并给定单词类别二元式码,决定给定字符串类别码(即单词种别)和记录次序码。(2) alphaprocess() 识别当前是数组、保留字、标识符。(3) point() 识别当前字符串是指针。(4) digitprocess() 识别当前是常整数、小数、负小数。(5) otherprocess() 识别当前是其它(标点符号等)。(6) fopen() 在默认路径下打开分析程序并读入字符串。3.3程序设计实现及功能说明3.3.1关键字关键字:beginifendwhlieelsewritereaddocallconstcharUntilproduce repeat运算符:+*/界符:(),.;:3.3.2关键字的定义void init() for( int j=0; j18; j+) strcpy(symtablej.lexptr,strj); symtablej.token=j+3; 3.3.3符合的关键字的查找int search(char *temp)for(unsigned int i=0;i 18;i+) if(!strcmp(symtablei.lexptr ,temp)return symtablei.token; return 0; 四、词法分析程序的C语言源代码:#include #includeusing namespace std;#define MAX 22 char ch = ;string key15=begin,end,if,then,else,while,write,read,do, call,const,char,until,procedure,repeat;/字符串键 15 = “开始”,“结束”,“如果”,“当时”,“其他”,“当”,“写”,“读”,“做”,“访问”,“常量”,“字符”,“直到”,“程序”,“重复”;int Iskey(string c) /关键字判断 int i; for(i=0;iMAX;i+) if(pare(c)=0) return 1; /将i作比较,返回1 return 0;int IsLetter(char c) /判断是否为字母 if(c=a)|(c=A) return 1; else return 0;int IsDigit(char c) /判断是否为数字 if(c=0&c=9) return 1; else return 0;void analyse(FILE *fpin) /无效的分析(文件及外地个人识别号) string arr=; while(ch=fgetc(fpin)!=EOF) /赋值 arr=; if(ch= |ch=t|ch=n) else if(IsLetter(ch) while(IsLetter(ch)|IsDigit(ch) if(ch=A) ch=ch+32; arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)coutarrt$关键字endl; else coutarrt$普通标识符endl; else if(IsDigit(ch) while(IsDigit(ch)|ch=.&IsDigit(fgetc(fpin) arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); coutarrt$无符号实数endl; else switch(ch) /标识符分类识别 case+: case- : case* : case/ :coutcht$运算符endl;break;case= : case( : case) : case : case : case :case :coutcht$界符endl;break;case; : case, :case: :ch=fgetc(fpin); if(ch=) cout:=t$运算符endl; else cout=t$运算符endl; fseek(fpin,-1L,SEEK_CUR); break;case. : case :ch=fgetc(fpin); if(ch=)cout=t$运算符endl; else if(ch=)coutt$输出控制符) coutt$运算符endl; elsecoutt$运算符 :ch=fgetc(fpin); if(ch=) cout=t$运算符)coutt$输入控制符endl; else coutt$运算符endl; fseek(fpin,-1L,SEEK_CUR); break;default : coutcht$无法识别字符endl; void main() char in_fn30; FILE * fpin; coutin_fn; if(fpin=fopen(in_fn,r)!=NULL) break; else cout该文件路径错误!请输入要查询的源文件名(包括路径和后缀名):; coutn*查询结果分析如下*endl; analyse(fpin); fclose(fpin); coutendl; cout按任意键结束a;5、 结果分析:在电脑D盘有一个名为源程序的文本文档,以此为例,运行结果如下:输入:输出:6 总结:在实验过程中遇到了很多的问题,经过查找资料和求助于同学再结合课堂上老师所讲解的内容,逐渐的把所遇到的问题解决。实验的时候会出现各种BUG,而且比较注意细节问题,一点点问题出错就与自己所预想的结果有较大差距。实验过程中我了解到c

温馨提示

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

评论

0/150

提交评论