词法分析器课程设计报告.docx

上传人:b****6 文档编号:8585271 上传时间:2023-01-31 格式:DOCX 页数:12 大小:101.01KB
下载 相关 举报
词法分析器课程设计报告.docx_第1页
第1页 / 共12页
词法分析器课程设计报告.docx_第2页
第2页 / 共12页
词法分析器课程设计报告.docx_第3页
第3页 / 共12页
词法分析器课程设计报告.docx_第4页
第4页 / 共12页
词法分析器课程设计报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

词法分析器课程设计报告.docx

《词法分析器课程设计报告.docx》由会员分享,可在线阅读,更多相关《词法分析器课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。

词法分析器课程设计报告.docx

词法分析器课程设计报告

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.总结1..0..

6.1.设计过程1..0.

6.2.困难与收获1..1.

参考文献1..1.

附录1..1..

1.课程设计的目的

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

通过课程设计,真正掌握设计和构造编译程序的基本原理和常用的编译技术,具备系统软件调试能力和开发能力,培养分析问题和解决问题的能力。

同时通过某种编程语言的应用,具备初步的Windows环境下的编程思想。

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

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

2.1.课程设计内容

设计内容:

完成下述文法所描述的单词符号的词法分析程序。

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

<无符号整数>--><数字>|<无符号整数><数字><分界符>-->+|-|*|/|;|(|)|{|}|<|<=|==|!

=|>=|>|=|<空格><字母>-->a|…|z|A|…|Z

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

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

本程序是在VisualStudio环境下,使用C语言作为开发工具。

基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。

逐步细化其功能,做到相应模块的具体化。

画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。

程序设计的具体内容:

在实际的设计中,预分析程序保存在文本文件sourcecode.txt中,该文件不能由执行程序自动创建,需要在程序执行前预先提供,程序拥有只读的权限。

程序逐个字符的分析源程序,能够识别标识符,整数,分界符,并分别把分析得到的字符写入相应文档:

keyword,words,digit,single,double;其它字符标示为无法识别,记录在error文档中。

程序结束后,将最总结果写入文件Dualistic_formula,该文件的内容包括统计结果(排除重复出现的字符)和二元式。

这七个文件会在程序执行时自动创建,程序结束时,关闭文件,但保留文件的内容,以供查看和检验,测试。

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

普通标识符由函数intword(charch)来识别,并进一步由函数intkeyword(charkey[])来分离普通标识符和关键字;

数字有函数intdigit(charch)来识别;分界符由函数识别;其他字符即为非法字符。

该程序中,全局变量共有两个intcharacters_exist=0

次数。

统计主函数在内,总共16个函数模块,除了前面说到得识别字符的函数外,还有对文件进行操作的函数,对数组操作的函数和实现显示功能的函数。

主函数中有六个文件指针,

一个字符数组,十个实现不同功能的变量。

在程序设计过程中及时注释,方便复读和检测。

2.2.课程设计要求

必须运用C语言设计词法分析器,由指定文件读入预分析的源程序,从左至右描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。

本程序规定输出用KeyWord代表关键字,Word代表普通标识符,Digit代表阿拉伯数字,SingleWord代表单分界符,DoubleWord代表双分界符,ERROR代表无法别的字符。

了解和掌握词法分析的方法;编程实现给定源语言程序的词法分析器;利用该分析器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其中的词法错误。

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

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

编程实现一个简单的词法分析器,可以对一个文件进行词法分析处理。

程序能够正确识别文法所规定的任何组织形式的字符组合。

例如在连续的分界符中,如何分离出单分界符和双分界符;字符中间的空格如何处理,源程序中往往出现大量连续的空格,若是全部记录下来,没用实际意义,且又浪费时间和空间,这样又如何处理;普通标识符和关键字如何分离出来;数字如何判断,形如123,a123,123a,123=,=123,123#,#123的字符串中,哪些才是整数,其它的又如何舍去。

这些功能都必须实现。

标识符是被分界符分开的,只有在遇到分界符时才能判断前面的字符串是否是标识符;假若非法字符和字母或数字混杂在一起,则这些字母或数字不能形成标识符或整数;这个问题并不复杂,当出现连续的分界符时,棘手的问题才出现。

形如!

<==-a,这个分界符字符串该如何分析呢?

第一个字符!

是单分界符,那么是不是当读到!

时就可以立即判断这是一个单分界符呢?

不能,因为还有形如字符串!

=的可能性,这样一来词法分析器必须拥有展望

未来的能力;那么<是不能判断为单分界符的,因为,字符组合<=是双分界符;问题出现了,字符组合==是双分界符,还是单独的认为第二个=是单分界符,这就决定与规定了;既然在读到单分界时不能立即判断其具体归类,那么当读到字符-后,还需要进一步读字符a,

然后才能判断字符-是否是单分界符,这样一来,就需要在遇到字母或数字时,进行对前

面的分界符的判断,这时又需要退两步来分析,也就是需要分析字符a前面的两个字符才

能判断字符a前面的一个字符是什么属性;这就是说,出现连续的分界符时,需要尾随的其他类的字符来辅助,以判断分界符的具体属性;可是,如果没有其他字符尾随呢,最好的一个分界符该如何处理?

还有,如果标识符同样没有其他字符尾随,又该如何处理?

分析得到的字符,需要写入文件,保存以供后用。

重复出现的字符不能都作为最后结果存储。

这些多余的字符是在分析时舍去还是在整个源程序被分析完毕后才进一步处理舍的去问题?

可以把读到的所有合法字符(出去连续出现的大量空格)暂时保存到相关文件,待分析源程序完毕后,在处理这些文件中的合法字符,舍去重复的,把正确合适的数据写入到另一个文件,形成二元式,该文件才是最后结果。

程序在实现基本功能的同时,以上提出的问题必须小心处理。

在程序设计过程中需要及时注释。

首先整体把握程序设计的架构和内涵,理清需求,得到雏形的流程图;完成程序编

程,满足前述功能,实现数据的输入和正确输出。

2.3.运行环境

此法分析器的设计和运行环境:

MicrosoftWindowsXPProfessional/MicrosoftVisualStudio2005/VisualC++控制台应用程序。

2.4.程序的不足

本程序只能分析小型的源程序,否则将会出现空间分配不足;能够分析的字符串的长度有限,否则,也会出现空间问题。

另外,变量反复使用,不利于阅读。

反复出现“fopen

被声明为否决的这样的警告信息。

程序冗长,未能充分利用C函数库的功能函数。

3.问题分析及相关原理介绍

3.1.编译程序介绍

本词法分析器,预分析程序保存在文本文件sourcecode.txt中,该文件不能由执行程序自动创建,需要在程序执行前预先提供,程序拥有只读的权限。

程序逐个字符的分析源程序,能够识别标识符,整数,分界符,并分别把分析得到的字符写入相应文档:

keyword,words,digit,single,double;其它字符标示为无法识别,记录在error文档中。

程序结束后,将最总结果写入文件Dualistic_formula,该文件的内容包括统计结果(排除重复出现的字符)和二元式。

这七个文件会在程序执行时自动创建,程序结束时,关闭文件,但保留文件的内容,以供查看和检验,测试。

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

普通标识符由函数intword(charch)来识别,并进一步由函数intkeyword(charkey[])来分离普通标识符和关键字;

数字有函数intdigit(charch)来识别;分界符由函数intdelimiter(charch)来识别;其他字符即为非法字符。

该程序中,全局变量共有两个intcharacters_exist=0和intountoffinal=0。

characters_exist用来判断是否是纯数字,countoffinal用来记录finalresult函数执行的次数。

统计主函数在内,总共16个函数模块,除了前面说到得识别字符的函数外,还有对文件进行操作的函数,对数组操作的函数和实现显示功能的函数。

主函数中有六个文件指针,十一个字符数组,十个实现不同功能的变量。

在程序设计过程中及时注释,方便复读和检测。

通过while循环和fgetc(FILE*fp)实现对字符的逐个读入。

3.2.各部分的功能介绍及分析

各函数及功能说明

/*判断是否为字母*/

/*判断是否为数字*/

/*判断是否是分界符*/

/*比较关键字*/

intword(charch)

intdigit(charch)

intdelimiter(charch)

intkeywordcompare(charkey[],charkeyword[])

intkeyword(charkey[])

voidwritetofile(charcha[])

voidkeywordtofile(charcha[])

voidwordstofile(charcha[])

voiddigittofile(charcha[])

voidsingletofile(charcha[])

voiddoubletofile(charcha[])

voiderrortofile(charcha[])

voiddisplayw(charch,charcha[])

/*判断是否是关键字*/

/*将数组cha[]写入文件Dualistic_formula*/

/*将关键字写入文件keyword*/

/*将标识符写入文件words*/

/*将数字写入文件digit*/

/*将单分界符写入文件single*/

/*将双分界符写入文件double*/

/*将非法字符写入文件error*/

/*立即显示遇到的字符*/

/*显示统计信息并将二元式写入文件Dualistic_formula*/voidfinalresult(intdf,charfilen[],FILE*fpp,FILE*fpt)

voidcleararray(intn,charcha[])/*清空数组*/

33算法实现及模拟

3.3.1总体流程图

 

流程图1

 

读入源文件有函数intfgetc(FILE*FILE)实现,文件是否结束及循环读入字符由

intkeyword(charkey[])存储或显示由八个函数实现:

voidwritetofile(charcha[])

voidkeywordtofile(charcha[])

voiddigittofile(charcha[])

voidsingletofile(charcha[])

voiddoubletofile(charcha[])

voiderrortofile(charcha[])

voiddisplayw(charch,charcha[])

voidfinalresult(intdf,charfilen[],FILE*fpp,FILE*fpt)

3.3.2详细的流程图如下:

流程图2,流程图3

di巴二亡二-r〔number』k..'pryw

=UBUzii-二

•Ell昨」oi---&ta鼻

RLParHI-r・T"K--.n*:

ur^-

馳TZLB沖士一內

 

rftsuhlPrnf12

■{dftuhb-f:

doubleturd

命tijhl^njf1H忖miblroMii

•j<丄n

 

流程图3

4.设计思路及关键问题的解决方法

4.1.设计思路及关键问题

4.1.1处理时机

确定算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基

本思想是根据扫描到单词符号的种类,分别存储或显示。

数字和标识符被分界符或非法字符

分开,分界符同样被数字或标识符或非法字符分开,当非法字符与数字或标识符邻接或混杂

时,数字或标识符则不能成为数字或标识符,而成为非法字符,这是非法字符的感染特性。

但这个效果在遇到分界符时不起作用,既分界符遇到非法字符或者和非法字符混杂,分界符

仍然为分界符。

这就要求,如果要处理标识符,就必须在遇到后面的分界符时才能有所操作。

4.1.2一个棘手问题

数字同样如此。

遇到数字或标识符同样需要处理前面的分界符,但并不是所有的分解都必须在遇到数字或标识符后才能处理的。

例如出现连续的分界符时。

当出现连续的分界符时,棘手的问题才出现。

形如!

<==-a,这个分界符字符串该如何分析呢?

第一个字符!

是单分界符,那么是不是当读到!

时就可以立即判断这是一个单分界符呢?

不能,因为还有形如字符串!

=的可能性,这样一来词法分析器必须拥有展望未来的能

力;那么<是不能判断为单分界符的,因为,字符组合<=是双分界符;问题出现了,字符组

合==是双分界符,还是单独的认为第二个=是单分界符,这就决定与规定了;既然在读到单

分界时不能立即判断其具体归类,那么当读到字符-后,还需要进一步读字符a,然后

才能判断字符-是否是单分界符,这样一来,就需要在遇到字母或数字时,进行对前面的

分界符的判断,这时又需要退两步来分析,也就是需要分析字符a前面的两个字符才能判

断字符a前面的一个字符是什么属性;这就是说,出现连续的分界符时,需要尾随的其他类的字符来辅助,以判断分界符的具体属性;可是,如果没有其他字符尾随呢,最好的一个分界符该如何处理?

还有,如果标识符同样没有其他字符尾随,又该如何处理?

4.2.解决方法

可以用一个变量来标示前面是否出现双分界符。

同样,用不同的变量实现不同的功能。

5.结果及测试分析

5.1.待分析程序的部分内容

如图4.该待分析源程序非任何编程语言,但完全满足测试需要。

|1tincLud9<.Situation.oF.the_Uorld>ttincluci9<.Situation.of.our-Ctiina>^oid.Inage(^

u>hen(.y9ar==2920||.year==2030)

<

.int.yourag^=?

;

.Int.curt*&ntyear-2018;.int.lon^i^Fti|ear;

■int.shortleFtyear;

.int.shortl&^tdai^s;

.£nt.LongleFtdays;

.shortleFt^ear=2020-currentyear;.shortleFtdays-afi&wsh叶t]■色FtyeM;.LongleFt^ear=203O-currentyear;

・longleFt(lay5=365*lcmgLeFtyear;iF(.year==202fl>

{

・^ourage=・*011广a号e#■宁hoF*七巳白「:

orp^ou・had.died;(・$0「ryfor・this)}

・diFFerence;

・difference;

the-n・you・wLll・knot?

・uhdt・will・happen;and・whatever・you.do・willnot・makea

iff.year==2O30)

<

・yon广已*

or.pou.had-dL?

d;(_5orryFor-this)

>

then.you.will.Knou-uhat-will.happen;and^Jhateuer・jjcbudo.willnot.make-a

no.nattpr.houold.are.i>ou

(<80,C=8ai>8B1>=8BT==80,f=80)

The.result・i暮a.slave;

>

far.th?

.r*pa?

on(.Fact)

<

char.Anerica;

ctur.Chinj;

-Others;

图4

52运行结果

如图5.

图5

由此可见,程序运行及结果输出是完全正确的!

6.总结

通过课程设计,树立了正确的设计思想,巩固了所学编程语言基本知识,增进c语言编

程基本功;学习到如何综合运用所学的理论知识,进一步理解到高级语言在计算机中的执行过程,加深了对编译原理中重点算法和编译技术的理解,理解词法分析在编译程序

中的作用;掌握了课程设计的一般方法与步骤,设计和构造编译程序的基本原理和常用的编

译技术,以及编译程序的实现方法和技,提高了自己的编程能力。

6.1.设计过程

首先,根据课程设计的任务:

使用c语言编程,实现词法分析器的基本功能,来确定本

次程序设计的总体目标及路线。

详细阅读课程设计的内容及要求,明确接下来的大致作业。

进一步,规划算法,描绘出初步的,总体的流程图。

然后,结合编译原理相关书籍,理解程序系统的基本原理。

结合c语言相关书籍,具体

细化程序设计的思路,粗略确定程序的模块划分,功能划分,并确定这些模块和功能应该有

c语言的哪些函数来实现。

接下来,着手程序编写。

依次完成源文件的读入,字符的判断,文件的读写,结果的输出,并在编程过程中反复完善,多多的测试,及时检测问题是否存在,若存在,立即改善。

直到程序足够强壮,功能完善,结果正确为止。

最后,选择考虑到所有可能的测试数据,总体测试词法分析器的性能。

更改输出数据的格式,使之布局合理。

在需要的地方增添注释信息,删除设计过程中的测试代码或其他冗余代码,美化程序布局,调整整体的程序代码间隔。

6.2.困难与收获

首先遇到的困难是对c语言的陌生。

虽然花了一个学期的时间学习过c语言,但现在基本上生疏了。

所以,本人又用了大概一天的时间来温习c语言。

重点回顾了函数部分和文件操作不部分。

总体的算法及流程图不是困难的问题,这些问题可以在纸上很快的解决。

本以为这些解决了,课程设计的其他问题,如程序的具体编写,应该不是难事了。

当着手于实际编程时,问题接连出现。

使用什么样的函数,几个函数,是不是必须设置返回值,函数返回值是什么类型,函数应该具备几个参数,例如程序中的voidfinalresult()函数,用来实现结果的保存和显示,开始只有两个参数,后来增加到四个。

由此可见,程序是需要不断的更改和完善的。

程序的变量起到很大的作用,但是反复的使用变量,严重降低了程序的安全性和可阅读性,加上选择和循环语句的嵌套,判定变量应该出现在具体的那个位置是件很困难的问题,放置不正确,不但结果出现错误,而且不容易找到出错的原因。

再者,就是课程设计报告的书写。

这也需要很大的精力。

尤其是word的排版,有很多的细节问题需要认真注意。

虽然如此,付出换回的收获也是可观的。

自己独立完成课程设计,熟悉程序设计中出现的所有问题以及解决方案,这无疑加深了程序设计人员对设计的项目的印象,增进了C语言编程能力,熟悉了程序设计的具体流程。

为以后的相关作业打下了基础。

参考文献

[1]陈意云,张昱。

编译原理。

北京:

高等教育出版社,2009

[2]王晓东。

计算机算法分析与设计。

北京:

电子工业出版社,2008.

[3]谭浩强。

C程序设计。

北京:

清华大学出版社,2007.

[4]APPELAW.MODERNcomplierimplementationinC[M].CambridgeEnf.:

CambridgeUniversityPress,1998.

[5]MUCHNICKS.Advancedcompilerdesignandimplementation[M].HongKong:

MorganKaufmannPublishers,1997

附录

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

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

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