词法分析器课程设计报告

  • 格式:doc
  • 大小:311.50 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)

4.2.解决方法 (8)

5.结果及测试分析 (8)

5.1.待分析程序的部分内容 (8)

5.2.运行结果 (9)

6.总结 (10)

6.1.设计过程 (10)

6.2.困难与收获 (11)

参考文献 (11)

附录 (11)

1.课程设计的目的

通过课程设计实践,树立正确的设计思想,巩固所学编程语言基本知识,增进C语言编辑基本功;综合运用所学的理论知识,进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解;掌握课程设计的一般方法与步骤,深入掌握课程设计的基本理论、方法和步骤,提高自己的编程能力,培养好的程序设计风格。

通过课程设计,真正掌握设计和构造编译程序的基本原理和常用的编译技术,具备系统软件调试能力和开发能力,培养分析问题和解决问题的能力。同时通过某种编程语言的应用,具备初步的Windows环境下的编程思想。

完成本课程设计的项目——词法分析器,理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。

2.课程设计的内容及要求

2.1.课程设计内容

设计内容:完成下述文法所描述的单词符号的词法分析程序。

<标识符>--><字母>|<标识符><字母>|<标识符><数字>

<无符号整数>--><数字>|<无符号整数><数字>

<分界符>-->+|-|*|/|;|(|)|{|}|<|<=|==|!=|>=|>|=|<空格>

<字母>-->a|…|z|A|…|Z

<数字>-->0|…|9

运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,

将结果写入指定文件。

本程序是在Visual Studio环境下,使用C语言作为开发工具。基于实验任务的内容

及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围

内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善

流程图。

程序设计的具体内容:

在实际的设计中,预分析程序保存在文本文件sourcecode.txt中,该文件不能由执

行程序自动创建,需要在程序执行前预先提供,程序拥有只读的权限。程序逐个字符的

分析源程序,能够识别标识符,整数,分界符,并分别把分析得到的字符写入相应文档:keyword,words,digit,single,double;其它字符标示为无法识别,记录在error

文档中。程序结束后,将最总结果写入文件Dualistic_formula,该文件的内容包括统

计结果(排除重复出现的字符)和二元式。这七个文件会在程序执行时自动创建,程序

结束时,关闭文件,但保留文件的内容,以供查看和检验,测试。

不同类别的字符通过相应的函数模块来分析识别。普通标识符由函数int word(char ch)来识别,并进一步由函数int keyword(char key[])来分离普通标识符和关键字;

数字有函数i nt digit(char ch)来识别;分界符由函数int delimiter(char ch)来

识别;其他字符即为非法字符。

该程序中,全局变量共有两个int characters_exist=0和int countoffinal=0。characters_exist用来判断是否是纯数字,countoffinal用来记录finalresult函数执行的次数。统计主函数在内,总共16个函数模块,除了前面说到得识别字符的函数外,还有对文件进行操作的函数,对数组操作的函数和实现显示功能的函数。主函数中有六个文件指针,十一个字符数组,十个实现不同功能的变量。在程序设计过程中及时注释,方便复读和检测。

2.2.课程设计要求

必须运用C语言设计词法分析器,由指定文件读入预分析的源程序,从左至右

描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换

成该单词相应的二元式(种别码、属性值)交给语法分析使用。

本程序规定输出用KeyWord代表关键字,Word代表普通标识符,Digit代表阿拉伯

数字,SingleWord代表单分界符,DoubleWord代表双分界符,ERROR代表无法别的字符。了解和掌握词法分析的方法;编程实现给定源语言程序的词法分析器;利用该分析

器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其

中的词法错误。不同类别的字符通过相应的函数模块来分析识别。

针对该程序设计的具体设计:

编程实现一个简单的词法分析器,可以对一个文件进行词法分析处理。程序能够正确识别文法所规定的任何组织形式的字符组合。例如在连续的分界符中,如何分离出单分界符和双分界符;字符中间的空格如何处理,源程序中往往出现大量连续的空格,若是全部记录下来,没用实际意义,且又浪费时间和空间,这样又如何处理;普通标识符和关键字如何分离出来;数字如何判断,形如123,a123,123a,123=,=123,123#,#123的字符串中,哪些才是整数,其它的又如何舍去。这些功能都必须实现。

标识符是被分界符分开的,只有在遇到分界符时才能判断前面的字符串是否是标识符;假若非法字符和字母或数字混杂在一起,则这些字母或数字不能形成标识符或整数;这个问题并不复杂,当出现连续的分界符时,棘手的问题才出现。形如!<==-a,这个分界符字符串该如何分析呢?第一个字符!是单分界符,那么是不是当读到!时就可以立即判断这是一个单分界符呢?不能,因为还有形如字符串!=的可能性,这样一来词法分析器必须拥有展望未来的能力;那么<是不能判断为单分界符的,因为,字符组合<=是双分界符;问题出现了,字符组合==是双分界符,还是单独的认为第二个=是单分界符,这就决定与规定了;既然在读到单分界时不能立即判断其具体归类,那么当读到字符–后,还需要进一步读字符 a ,然后才能判断字符–是否是单分界符,这样一来,就需要在遇到字母或数字时,进行对前面的分界符的判断,这时又需要退两步来分析,也就是需要分析字符 a前面的两个字符才能判断字符 a前面的一个字符是什么属性;这就是说,出现连续的分界符时,需要尾随的其他类的字符来辅助,以判断分界符的具体属性;可是,如果没有其他字符尾随呢,最好的一个分界符该如何处理?还有,如果标识符同样没有其他字符尾随,又该如何处理?

分析得到的字符,需要写入文件,保存以供后用。重复出现的字符不能都作为最后结果存储。这些多余的字符是在分析时舍去还是在整个源程序被分析完毕后才进一步处理舍的去问题?可以把读到的所有合法字符(出去连续出现的大量空格)暂时保存到相关文件,待分析源程序完毕后,在处理这些文件中的合法字符,舍去重复的,把正确合适的数据写入到另一个文件,形成二元式,该文件才是最后结果。

程序在实现基本功能的同时,以上提出的问题必须小心处理。在程序设计过程中需要及时注释。首先整体把握程序设计的架构和内涵,理清需求,得到雏形的流程图;完成程序编