版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2009-2010学年第二学期编译原理课程设计报告学院(系):班 级: 学生姓名: 学 号 : 指导教师:时间: 2010 年 6 月目录1. 课程设计的目的 1.2课程设计的内容及要求 1.2.1. 课程设计内容 1.2.2. 课程设计要求 2.2.3. 运行环境 3.2.4. 程序的不足 3.3问题分析及相关原理介绍 3.3.1. 编译程序介绍 3.3.2各部分的功能介绍及分析 3.3.3. 算法实现及模拟 4.3.3.1总体流程图 4.3.3.2 详细的流程图 5.4设计思路及关键问题的解决方法 7.4.1. 设计思路及关键问题 7.4.1.1处理时机 7.4.1.2 一个棘手问题 8.
2、4.2. 解决方法 8.5结果及测试分析 8.5.1. 待分析程序的部分内容 8.5.2. 运行结果 9.6总结 1.0.6.1. 设计过程 1.0.6.2. 困难与收获 1.1.参考文献 1.1.附录 1.1.1.课程设计的目的通过课程设计实践,树立正确的设计思想 , 巩固所学编程语言基本知识,增进 C 语言 编辑基本功 ;综 合 运 用 所 学 的 理 论 知 识 ,进一步理解高级语言在计算机中的执行过程, 加深对编译原理中重点算法和编译技术的理解; 掌握课程设计的一般方法与步骤, 深入掌握 课程设计的基本理论、方法和步骤,提高自己的编程能力,培养好的程序设计风格。通过课程设计, 真正掌握
3、设计和构造编译程序的基本原理和常用的编译技术, 具备系统 软件调试能力和开发能力, 培养分析问题和解决问题的能力。 同时通过某种编程语言的应用, 具备初步的 Windows 环境下的编程思想。完成本课程设计的项目词法分析器, 理解词法分析在编译程序中的作用, 加深对有 穷自动机模型的理解, 掌握词法分析程序的实现方法和技术, 用 c 语言对一个简单语言的子 集编制一个一遍扫描的编译程序,以加深对编译原理的理解 , 掌握编译程序的实现方法和技 术。2课程设计的内容及要求2.1. 课程设计内容设计内容:完成下述文法所描述的单词符号的词法分析程序。-|-| -+|-|*|/|;|(|)|=|=| -
4、a| |z|A|Z-0| |9运用 C 语言设计词法分析器, 由指定文件读入预分析的源程序, 经过词法分析器的分析, 将结果写入指定文件。本程序是在 Visual Studio 环境下,使用 C 语言作为开发工具。基于实验任务的内容 及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功 能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围 内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善 流程图。程序设计的具体内容:在实际的设计中, 预分析程序保存在文本文件 sourcecode.txt 中,该文件不能由执 行程序自动
5、创建,需要在程序执行前预先提供,程序拥有只读的权限。程序逐个字符的 分析源程序,能够识别标识符,整数,分界符,并分别把分析得到的字符写入相应文档: keyword , words , digit , single , double ;其它字符标示为无法识别,记录在error文档中。程序结束后,将最总结果写入文件 Dualistic_formula ,该文件的内容包括统 计结果(排除重复出现的字符)和二元式。这七个文件会在程序执行时自动创建,程序 结束时,关闭文件,但保留文件的内容,以供查看和检验,测试。不同类别的字符通过相应的函数模块来分析识别。 普通标识符由函数 int word( char
6、 ch)来识别,并进一步由函数 int keyword (char key )来分离普通标识符和关键字;数字有函数 i nt digit (char ch )来识别;分界符由函数 识别;其他字符即为非法字符。int delimiter ( char ch )来和 int countoffinal=0。characters_exist 用来判断是否是纯数字,countoffinal 用来记录 finalresult 函数执行的该程序中,全局变量共有两个 int characters_exist=0次数。统计主函数在内, 总共 16个函数模块, 除了前面说到得识别字符的函数外, 还有对文 件进行操
7、作的函数,对数组操作的函数和实现显示功能的函数。主函数中有六个文件指针,一个字符数组, 十个实现不同功能的变量。 在程序设计过程中及时注释, 方便复读和检测。2.2. 课程设计要求必须运用 C 语言设计词法分析器,由指定文件读入预分析的源程序,从左至右 描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换 成该单词相应的二元式(种别码、属性值)交给语法分析使用。本程序规定输出用 KeyWord 代表关键字, Word 代表普通标识符, Digit 代表阿拉伯 数字, SingleWord 代表单分界符 , DoubleWord 代表双分界符, ERROR 代表无法别的字
8、 符。了解和掌握词法分析的方法;编程实现给定源语言程序的词法分析器;利用该分析 器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其 中的词法错误。不同类别的字符通过相应的函数模块来分析识别。针对该程序设计的具体设计: 编程实现一个简单的词法分析器, 可以对一个文件进行词法分析处理。 程序能够正确识 别文法所规定的任何组织形式的字符组合。 例如在连续的分界符中, 如何分离出单分界符和 双分界符; 字符中间的空格如何处理, 源程序中往往出现大量连续的空格, 若是全部记录下 来,没用实际意义, 且又浪费时间和空间,这样又如何处理; 普通标识符和关键字如何分离 出来;数字如何
9、判断,形如 123,a123,123a,123=,=123,123#,#123 的字符串中,哪些 才是整数,其它的又如何舍去。这些功能都必须实现。标识符是被分界符分开的,只有在遇到分界符时才能判断前面的字符串是否是标识符; 假若非法字符和字母或数字混杂在一起, 则这些字母或数字不能形成标识符或整数; 这个问 题并不复杂,当出现连续的分界符时,棘手的问题才出现。形如 !=-a, 这个分界符字符串 该如何分析呢?第一个字符! 是单分界符, 那么是不是当读到! 时就可以立即判断这是一个 单分界符呢?不能,因为还有形如字符串!=的可能性,这样一来词法分析器必须拥有展望未来的能力;那么 是不能判断为单分
10、界符的, 因为,字符组合 =是双分界符;问题出现了, 字符组合 =是双分界符,还是单独的认为第二个 =是单分界符,这就决定与规定了;既然在 读到单分界时不能立即判断其具体归类, 那么当读到字符 后,还需要进一步读字符 a , 然后才能判断字符 是否是单分界符, 这样一来, 就需要在遇到字母或数字时, 进行对前 面的分界符的判断,这时又需要退两步来分析,也就是需要分析字符 a 前面的两个字符才 能判断字符 a 前面的一个字符是什么属性;这就是说,出现连续的分界符时,需要尾随的 其他类的字符来辅助,以判断分界符的具体属性; 可是, 如果没有其他字符尾随呢,最好的 一个分界符该如何处理?还有,如果标
11、识符同样没有其他字符尾随,又该如何处理? 分析得到的字符, 需要写入文件, 保存以供后用。 重复出现的字符不能都作为最后结果 存储。这些多余的字符是在分析时舍去还是在整个源程序被分析完毕后才进一步处理舍的去 问题?可以把读到的所有合法字符 (出去连续出现的大量空格) 暂时保存到相关文件, 待分 析源程序完毕后, 在处理这些文件中的合法字符, 舍去重复的, 把正确合适的数据写入到另 一个文件,形成二元式,该文件才是最后结果。程序在实现基本功能的同时, 以上提出的问题必须小心处理。 在程序设计过程中需要及 时注释。首先整体把握程序设计的架构和内涵,理清需求,得到雏形的流程图;完成程序编程,满足前述
12、功能,实现数据的输入和正确输出。2.3. 运行环境此法分析器的设计和运行环境: Microsoft Windows XP Professional /Microsoft Visual Studio 2005/Visual C+控制台应用程序。2.4. 程序的不足本程序只能分析小型的源程序, 否则将会出现空间分配不足; 能够分析的字符串的长度 有限,否则,也会出现空间问题。另外,变量反复使用,不利于阅读。反复出现“ fopen被声明为否决的 这样的警告信息。程序冗长,未能充分利用C 函数库的功能函数。3问题分析及相关原理介绍3.1. 编译程序介绍本词法分析器, 预分析程序保存在文本文件 sour
13、cecode.txt 中,该文件不能由执行 程序自动创建,需要在程序执行前预先提供,程序拥有只读的权限。程序逐个字符的分 析源程序,能够识别标识符,整数,分界符,并分别把分析得到的字符写入相应文档: keyword , words , digit , single , double ;其它字符标示为无法识别,记录在error文档中。程序结束后,将最总结果写入文件 Dualistic_formula ,该文件的内容包括统 计结果(排除重复出现的字符)和二元式。这七个文件会在程序执行时自动创建,程序 结束时,关闭文件,但保留文件的内容,以供查看和检验,测试。不同类别的字符通过相应的函数模块来分析识
14、别。 普通标识符由函数 int word( char ch)来识别,并进一步由函数 int keyword (char key )来分离普通标识符和关键字; 数字有函数 i nt digit ( char ch ) 来识别;分界符由函数 int delimiter ( char ch )来 识别;其他字符即为非法字符。该程序中,全局变量共有两个 int characters_exist=0 和 int ountoffinal=0。characters_exist 用来判断是否是纯数字, countoffinal 用来记录 finalresult 函数执行 的次数。统计主函数在内,总共 16 个
15、函数模块,除了前面说到得识别字符的函数外,还有 对文件进行操作的函数, 对数组操作的函数和实现显示功能的函数。 主函数中有六个文件指 针,十一个字符数组,十个实现不同功能的变量。 在程序设计过程中及时注释,方便复读和 检测。通过 while 循环和 fgetc (FILE *fp )实现对字符的逐个读入。3.2各部分的功能介绍及分析/* 判断是否为字母 */* 判断是否为数字 */* 判断是否是分界符 */* 比较关键字 */各函数及功能说明int word( char ch)int digit( char ch)int delimiter( char ch)int keywordcompar
16、e( char key, char keyword)int keyword( char key)void writetofile( char cha) void keywordtofile( char cha) void wordstofile( char cha) void digittofile( char cha) void singletofile(char cha)void doubletofile(char cha)/* 判断是否是关键字 */* 将数组 cha 写入文件 Dualistic_formula*/* 将关键字写入文件 keyword*/* 将标识符写入文件 words
17、*/* 将数字写入文件 digit*/* 将单分界符写入文件 single*/* 将双分界符写入文件 double*/* 将非法字符写入文件 error*/* 立即显示遇到的字符 */void errortofile( char cha) void displayw( char ch, char cha) /* 显示统计信息并将二元式写入文件 Dualistic_formula*/ void finalresult( int df, char filen,FILE *fpp,FILE *fpt)void cleararray( int n, char cha) /* 清空数组 */3.3. 算
18、法实现及模拟3.3.1 总体流程图7流程图 1while循环实现, while (!feof(fpr) 为存放源程序的文本文件。 判断字符类别由五个函数实现: int word( char ch),其中 fpr=fopen(sourcecode.txt,r),sourcecode.txt/* 判断是否为字母 */intdigit( char ch)/* 判断是否为数字 */intdelimiter( char ch)/* 判断是否是分界符 */intkeywordcompare( char key, char keyword)/* 比较关键字 */读入源文件有函数 int fgetc(FILE
19、 *FILE) 实现,文件是否结束及循环读入字符由int/* 判断是否是关键字 */int keyword( char key)存储或显示由八个函数实现:void writetofile(char cha)void keywordtofile(char cha)void digittofile(char cha)void singletofile(char cha)void doubletofile(char cha)void errortofile(char cha)void displayw(char ch,char cha)void finalresult(int df,char fil
20、en,FILE *fpp,FILE *fpt)3.3.2 详细的流程图 如下:流程图 2,流程图 3di巴二亡二-r numberk.pryw=UBUzii-二Ell昨o i-&ta鼻RLParHI-r T K-.n*:ur-馳 TZLB 沖士 一內12流程图 34设计思路及关键问题的解决方法4.1. 设计思路及关键问题4.1.1 处理时机确定算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号, 其基 本思想是根据扫描到单词符号的种类, 分别存储或显示。 数字和标识符被分界符或非法字符 分开,分界符同样被数字或标识符或非法字符分开, 当非法字符与数字或标识符邻接或混杂 时,数字
21、或标识符则不能成为数字或标识符,而成为非法字符,这是非法字符的感染特性。 但这个效果在遇到分界符时不起作用, 既分界符遇到非法字符或者和非法字符混杂, 分界符 仍然为分界符。 这就要求, 如果要处理标识符, 就必须在遇到后面的分界符时才能有所操作。4.1.2 一个棘手问题数字同样如此。 遇到数字或标识符同样需要处理前面的分界符, 但并不是所有的分解都 必须在遇到数字或标识符后才能处理的。例如出现连续的分界符时。当出现连续的分界符时,棘手的问题才出现。形如 !=-a, 这个分界符字符串该如何分 析呢?第一个字符! 是单分界符, 那么是不是当读到! 时就可以立即判断这是一个单分界符 呢?不能,因为
22、还有形如字符串! =的可能性,这样一来词法分析器必须拥有展望未来的能 力;那么 是不能判断为单分界符的,因为,字符组合=是双分界符;问题出现了,字符组合=是双分界符,还是单独的认为第二个=是单分界符,这就决定与规定了;既然在读到单分界时不能立即判断其具体归类,那么当读到字符 后,还需要进一步读字符 a ,然后 才能判断字符 是否是单分界符, 这样一来, 就需要在遇到字母或数字时, 进行对前面的 分界符的判断,这时又需要退两步来分析,也就是需要分析字符 a 前面的两个字符才能判 断字符 a 前面的一个字符是什么属性;这就是说,出现连续的分界符时,需要尾随的其他 类的字符来辅助,以判断分界符的具体
23、属性; 可是,如果没有其他字符尾随呢,最好的一个 分界符该如何处理?还有,如果标识符同样没有其他字符尾随,又该如何处理?4.2. 解决方法可以用一个变量来标示前面是否出现双分界符。同样,用不同的变量实现不同的功能。下面是本程序的一些功能变量。char ch;int unknown=0;int numofword=0;int numofdigit=0;int numofsingle=0;int catchdoubleword=0;int enddelimit=10;int numofspace=0;/* 接受从文件中读出的单个字符 */ /* 判断是否出现无法识别的字符 */ /* 字母数组中的
24、字母个数 */* 数字数组中的数字个数 */* 连续出现的单分界符个数 */* 是否出现双分界符 */* 末尾是否存在分界符 */* 限制遇到过多的空格 */5结果及测试分析5.1.待分析程序的部分内容如图 4. 该待分析源程序非任何编程语言,但完全满足测试需要。图45.2.运行结果如图 5.图5由此可见,程序运行及结果输出是完全正确的!6总结通过课程设计,树立了正确的设计思想 ,巩固了所学编程语言基本知识,增进 C 语言编 程基本功 ;学习到如何 综 合 运 用 所 学 的 理 论 知 识 , 进一步理解到高级语言在计算机 中的执行过程, 加深了对编译原理中重点算法和编译技术的理解, 理解词
25、法分析在编译程序 中的作用; 掌握了课程设计的一般方法与步骤, 设计和构造编译程序的基本原理和常用的编 译技术,以及编译程序的实现方法和技,提高了自己的编程能力。6.1.设计过程首先,根据课程设计的任务:使用 c 语言编程,实现词法分析器的基本功能,来确定本 次程序设计的总体目标及路线。详细阅读课程设计的内容及要求,明确接下来的大致作业。 进一步,规划算法,描绘出初步的,总体的流程图。然后,结合编译原理相关书籍,理解程序系统的基本原理。结合 c 语言相关书籍,具体 细化程序设计的思路, 粗略确定程序的模块划分, 功能划分, 并确定这些模块和功能应该有 c 语言的哪些函数来实现。接下来,着手程序编写。依次完成源文件的读入,字符的判断,文件的读写,结果的输 出,并在编程过程中反复完善,多多的测试,及时检测问题是否存在,若存在,立即改善。 直到程序足够强壮,功能完善,结果正确为止。最后,选择考虑到所有可能的测试数据,总体测试词法分析器的性能。更改输出数据 的格式, 使之布局合理。 在需要的地方增添注释信息, 删除设计过程中的测试代码或其他冗 余代码,美化程序布局,调整整体的程序代码间隔。6.2. 困难与收获首先遇到的困难是对 c 语言的陌生。 虽然花了一个学期的时间学习过 c 语言, 但
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 线上教育培训免责合同书
- 人力资源行业员工招聘服务合同
- 电子元器件定制加工合同
- 2025年度农用机耕作业碳排放管理合同
- 2025年东莞购房合同协议(三篇)
- 2025版内衣品牌OEM代工与经销商分销合同样本3篇
- 2025年苗圃技术员职务聘用合同范本
- 电气装备用电线电缆项目可行性研究报告
- 2025年个人买卖家具合同(2篇)
- 2025年业务合伙合同常用版(2篇)
- 《疥疮的防治及治疗》课件
- Unit4 What can you do Part B read and write (说课稿)-2024-2025学年人教PEP版英语五年级上册
- 2025年MEMS传感器行业深度分析报告
- 《线控底盘技术》2024年课程标准(含课程思政设计)
- 学校对口帮扶计划
- 仓库仓储安全管理培训课件模板
- 风力发电场运行维护手册
- 《3-6岁儿童学习与发展指南》专题培训
- 河道旅游开发合同
- 情人合同范例
- 建筑公司劳务合作协议书范本
评论
0/150
提交评论