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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译课设LR方法输出四元式.docx

1、编译课设LR方法输出四元式学 号: 课 程 设 计题 目FOR循环语句的翻译程序设计(LR方法、输出四元式)学 院计算机科学与技术学院专 业计算机科学与技术专业班 级姓 名指导教师陈天煌2012年1月6日课程设计任务书学生姓名: 专业班级: 指导教师: 陈天煌 工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(LR方法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1) 写出符合给定的语法分

2、析方法的文法及属性文法。(2) 完成题目要求的中间代码四元式的描述。(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。(5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考

3、文献(按公开发表的规范书写)。时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试及测试。周5:撰写课程设计报告。设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。设计报告书收取时间:设计周的次周星期一上午10点。指导教师签名: 2011年 11 月18日系主任(或责任教师)签名: 2011年 11月18 日FOR循环语句的翻译程序设计 LR方法 、输出四元式1 系统描述1.1 目的通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析

4、以及中间代码生成。1.2设计内容本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。对下列正确的程序输入: for(i=0;i10;i+) m=m+i; 结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。对于错误的程序输入,如:for(i=0;i8) m=m+i;结果程序要指出程序出错。1.3 翻译过程词法分析:词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码

5、及单词符号自身值。程序语言的单词符号一般分为五种:关键字(保留字/基本字)if、while、begin;标识符:常量名、变量名;常数:34、56.78、true、a、;运算符:+、-、*、/、and、or、.、;界限符:, ; ( ) /*。语法分析:语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。此次设计中语法分析中主要通过LR分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。中间代码生成:为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工

6、作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。常用的几种中间语言有: 逆波兰式、四元式、三元式、树表示。本课程设计主要实现四元式的生成。1.4初始条件理论:掌握一种计算机高级语言的使用。学完编译课程,掌握词法分析程序设计方法,LR语法分析方法,以及语法制导的翻译和中间代码生成技术。实践工具和环境:计算机实验室提供计算机及软件环境。1.5 开发平台所使用的系统:Windows 7程序开发工具:Visual C+ 6.0程序设计语言:C+语言2 文法及属性文法的描述按照设计要求,设计出的For语句的符合简单优先定义的文法规则及相关的语义规则如下: 产生式

7、语义规则S f ( E ; F ; G ) H ; goto S f ( E ; X ; Y ) H ; goto E id = c id.value=c.value; F id =c.value goto over ; G id + + id.value=id.value+1 ; X id c If id.value=c.value goto over ; Y id id.value=id.value-1; Hid 1 = id 2 + id 3 id 1.value= id 2 .value + id 3 .value H id 1 = id 2 + c id 1.value= id 2

8、.value + c .value H id 1 = c+ id 2 id 1 .value= c.value + id 2 .value 其中产生式规则中的符号: c 表示常数const , f表示关键字for , i表示一般标识符id3 语法分析表设计3.1有穷自动机和根据有穷自动机构造的LR(0)分析表3.1.1有穷自动机:3.1.2 LR(0)分析表: ACTION GOTOf(;)id=c-#SEFGXYH0S211acc2S33S544S65S76S10897S118S129S1310S14S1511R3R3R3R3R3R3R3R3R3R3R3R3R3R312S171613S191

9、814S2015S2116S2217S2318S2419S2520R4R4R4R4R4R4R4R4R4R4R4R4R4R421R6R6R6R6R6R6R6R6R6R6R6R6R6R622S2623S2724S2825S2926S313027R5R5R5R5R5R5R5R5R5R5R5R5R5R528S313229R7R7R7R7R7R7R7R7R7R7R7R7R7R730S3331S3432S3533S3634S37S3835S3936R1R1R1R1R1R1R1R1R1R1R1R1R1R137S4038S4139R2R2R2R2R2R2R2R2R2R2R2R2R2R240S4241S4442

10、R8R8R8R8R8R8R8R8R8R8R8R8R8R843R9R9R9R9R9R9R9R9R9R9R9R9R9R944R10R10R10R10R10R10R10R10R10R10R10R10R10R10 其中,S表示移进且下一状态为S的下标;R表示归约,归约所用的产生式为R的下标相对应的产生式;空白表示没有相应的关系即出错。3.2 LR语法分析过程的设计思想及算法3.3 翻译方法 设计中,使用语法制导翻译方法。所谓语法制导的翻译方法是指:按照给定的语法,对单词符号串进行语法分析,并构造出语法分析树,语法分析过程中根据需要构造属性依赖图,然后遍历语法树并在语法树的各个节点处,按语义规则进行计算

11、,并生成中间代码。所谓属性依赖图是一个有向图,用于描述分析树中的属性和属性间的相互依赖关系。4 中间代码形式的描述及中间代码序列的结构设计本次设计,使用的中间代码为四元式(即三地址码)。四元式的四个组成成分:算符op,第一和第二运算对象ARG1和ARG2,及运算结果RESULT。例如对语句:for(i=0;i=20 goto over(3)(+,temp,i,t)(4)(=,t,temp)(5)(+,i,1,i)(6)goto (2)(7)over 设计并生成的结果程序,最终需要将用户输入的程序经过词法分析和语法分析,生成如上所述的四元式表示的中间代码形式。5 编译系统的概要设计程序由词法分析

12、和语法分析两部分构成:词法分析程序,以用户输入的字符串为输入,判断输入是否包含非法字符,若字符完全合法,分析结果是,将标识符、常量、其他合法单词的类别和值保存在输入流中,做为语法分析的输入。为了有效地编写词法分析程序,首先应构造出程序流程图,然后根据流程图编写程序。语法分析,以词法分析结果作为输入,验证,输入流中各种符号是否符合语法规则。若不符合,显示出错信息,否则,在分析过后显示与输入程序等价的中间代码。同样需要构造语法分析的程序流程图。6 详细的算法描述程序包括三个文件:词法分析.cpp和for循环翻译.cpp。其中for循环语句翻译.cpp中含有main函数,作为程序的入口,在main函

13、数中接受用户输入的程序流,并保存在一个string对象中,然后调用词法分析.cpp中的void getSym(string &s,int &i)对程序流进行词法分析分离出单词符号,再调用语法分析.cpp文件中的void gramCheck()函数对单词符号输入流进行语法分析和语义分析,并生成四元式形式的中间代码。函数void getSym(string &s,int &i)调用getchar函数获得输入流中的符号进行分析,如得到的是标识符,则调用outsym函数分别普通标识符和关键字。函数gramCheck()调用函数priCmp比较符号栈和输入流中的两个符号的优先级关系。程序中的函数调用关系

14、如下图: 6.1词法分析 在文件“词法分析.cpp”中编写词法分析程序,文件中主要包含一个结构体struct symNode,一个结构体数组symNode node100,取字符函数void getChar(string &s,int &i)ch=si;i+;,取单词函数void getSym(string &s,int &i),程序中数据结构和各函数具体功能如下:(1)定义结构体:struct symNode int type; string sValue; int eValue;此结构体用来保存词法分析后,各种单词的信息。Type表示单词的类别,各符号对应的类别值见表1,如果单词是常量,e

15、Value 则保存该常量的值,如果单词是标识符,sValue则保存该标识符的值。(2)数组symNode node100,用来保存单词输入流作为语法分析的输入流;int position=0; position保存数组node中将要输入的单词的位置,初值为0。(3)函数void getSym(string &s,int &i);用来作词法分析,s存储用户的输入程序,i 用来保存当前应该取字符的位置。(4)函数 void getChar(string &s,int &i)ch=si;i+;用来取字符串s 中第i个字符。 (5)函数 void outSym(string s); 区分s是关键字还是

16、普通标识符。词法分析程序的具体算法描述:getChar()函数从串s里面取字符,直到遇到非空字符,如果已到达串尾,词法分析结束。getSym()判断所取的字符是字母开头,还是以数字开头,还是其他合法字符;如果以字母开头,则开始保存为标识符,继续取字符直到遇到非字母非数字字符;如果以数字开头则保存为整数常量,继续取字符直到遇到非数字字符;其他字符则保存为相应类别。所有的单词分离后保存到数组symNode node100中。 词法分析程序所输出的单词符号常常采用以下二元式表示:(单词种别,单词自身的值)。单词的种别是语法分析需要的信息,而单词自身的值则是编译其他阶段所需要的信息。词法分析的流程图,

17、如下图:6.2 语法分析在文件“for循环翻译.cpp”中编写语法分析程序。程序中各函数具体功能解释如下:int Initstack(stack &s):初始化栈;int push(stack &s,char e) :将要入栈的元素压入栈中;char pop(stack &s,char *e) :将要出栈的元素弹出栈;int action(int m,int n,char a) :对照LR分析表,判断输入的字符需要移进还是归约;int go(int m,int n,char a) :对照LR分析表,判断需要归约的字符串所对应的产生式; 在main函数中利用switch()语句来实现归约。7测试

18、方法和测试结果7.1测试过程针对所设计的关于for循环语句的翻译程序,分别用正确的程序和有错误的程序进行测试,测试出结果程序的可用性和健壮性。测试中分别使用了合法程序和非法程序,对结果程序进行测试,具体的测试程序、测试过程和测试结果如下:for循环语句语法分析过程:合法程序:文件f1.txt如下图输出结果保存在f2.txt中非法程序:文件f3.txt如下图:输出结果保存在f2.txt中:7.2 测试结论经过测试,可以得知,结果程序能达到预计的要求:对合法程序进行词法分析和简单优先的语法分析,并生成四元式表示的中间代码;对于错误的程序输入,结果程序能够判断其出错。存在问题:对于错误的程序输入,结

19、果程序不能给出错误的位置。对于含有非法输入符号的程序,结果程序没有很好地处理,程序健壮性不强。8 研制报告8.1研制过程 在课程设计期间,通过阅读大量相关书籍,利用网络查找各种资料,根据相关知识,写出了符合简单优先语法规则的关于for语句的属性文法。 获得语法规则的属性文法后,对程序进行了概要设计,将程序大致分为词法分析和语法分析两个模块,并且设计出文法对应的符号优先关系表。词法分析负责对输入串进行单词识别,并保存单词各信息,作为语法分析和翻译的输入。语法分析负责对输入流中的单词进行分析,检验是否符合所写的语法规则,并对其进行初步翻译。概要设计后,对两个模块分别进行了详细设计,并利用词法分析流

20、程图和语法分析流程图,设计程序的大致流程,并具体到各函数的设计。通过对程序进行了详细设计,得到了程序大致流程,并根据流程进行编码,编码过程中,出现了一些语法和语义上错误,通过调试和修改,使得程序成功运行。设计测试方法和测试用程序,并对程序进行了测试。8.2本设计的评价 此次设计对for语句进行了全面词法分析和语法分析,并得到了用于分析for 语句的结果程序。结果程序能对用户输入的程序代码进行分析,判断是否存在词法错误和语法错误,如果出现错误,向用户给出提示,如果没有错误,则生成于输入程序等价的中间代码,方便后续编译过程工作。 但是结果程序也存在很多不足:对于非法的输入,无法给出错误的位置。对非

21、法输入考虑不全面,对某些非法输入无法给出错误信息,另外属性文法不完善,程序中的使用的某些判断方法,只适合于本次设计使用的文法,实用性不强。8.3个人心得体会本课程设计是for循环语句的翻译程序,包括词法分析部分、语法分析部分和中间代码生成部分。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。语法分析部分采用LR分析方法进行语法分析,判断给出的符号串是否为该文法识别的句子。中间代码生成器部分主要实现四元式的生成,将用中缀式表示的算术表达式转换为用四元式表示的算术表

22、达式。在语法分析的设计过程中,程序相当复杂,需要利用到大量的编译原理,其中在分析表的构造时遇到了非常大的困难,对输入字符串的移进和归约冲突得不到很好的处理,造成了调试的困难。通过多次调试,最终构造出来分析表并调试成功。 通过本次课程设计,将编译的理论知识应用于实践,加深了对课本理论知识的理解,更好的掌握了编译技术的基本方法,了解了编译程序的一般分析过程,并且通过对for语句编译程序的设计和实现,对for语句也加深了认识和理解。另外,编译程序的实现方法也适合于一般程序的编写,因此,此次课程设计对自己的编程能力的提升有很大帮助。9 参考文献1张素琴、吕映芝、蒋维杜、戴桂兰等编译原理(第二版)清华大

23、学出版社2005年2月2胡伦骏编译原理(第2版)电子工业出版社2005年2月3陈火旺等程序设计语言编译原理(第3版)国防工业出版社2003年2月4何炎祥编译原理(第二版)武汉:华中科技大学出版社2005年8月5陈意云编译原理与技术(第二版)中国科学技术大学出版社2002年1月本科生课程设计成绩评定表班级: 姓名:学号:序号评分项目满分实得分1学习态度认真、遵守纪律102设计分析合理性103设计方案正确性、可行性、创造性204设计结果正确性405设计报告的规范性106设计验收10总得分/等级评语:注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格指导教师签名:20 年月日

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

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