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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

FOR循环语句的翻译程序设计LL1法输出四元式含代码和实验报告册毕业设计论文.docx

1、FOR循环语句的翻译程序设计LL1法输出四元式含代码和实验报告册毕业设计论文FOR循环语句的翻译程序设计 LL(1)法、输出四元式1.系统描述1.1问题描述用LL(1)法设计、编制、调试一个FOR(表达式1;表达式2;表达式3)赋值语句的语法及语义分析程序,输出四元式。1.2功能描述(1)能够识别出单词、单词类型、单词位置(2)能够用LL(1)方法识别单词序列是否符合FOR循环文法(3)能够完成对FOR循环中3个表达式的翻译(4)能够完成对FOR循环中赋值语句(含复杂表达式)的翻译(5)能够对FOR循环3个表达式中有表达式1或3缺少时翻译(6)能够用标准化的四元式进行翻译结果输出 (7)能够用

2、四元式清晰、正确地反映FOR循环的执行流程(8) 能够用文本输入FOR语句循环,再用txt文本输出分析结果 2 文法及属性文法的描述2.1文法的语言描述A-for(条件)赋值语句条件-语句1 语句2 语句3语句1-i = 表达式; /i表示标识符语句1-;语句2-i 表达式;语句2-i i = 表达式;语句3- 赋值语句-m = 表达式 /m表示标识符,作为左值出现赋值语句-表达式-表达式+表达式表达式-表达式-表达式表达式-表达式*表达式表达式-表达式/表达式表达式-(表达式)表达式-i /i 表示标识符、常数、字符、或字符串2.2属性文法描述2.2.1 FOR 语句FOR(C D G)n

3、C n+1 if D=true goto Y.start n+2 goto Y.end+3Y.start ./赋值语句的开始 . .Y.end ./赋值语句结束Y.end+1 GY.end+2 goto n+1Y.end+3 /跳出循环体后第一条语句2.2.2 赋值语句Y-m=E; m.value=E.Value E-E1 op E2 (op: +,-,*,/,或(E) N.value=E.value N-i N.value=i.value 3.语法分析方法描述及语法分析表设计3.1 对LL(1)分析的描述LL(1):第1个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将用最左

4、推导,1表明只需向右看一个符号便可决定如何推导即选择哪个产生式(规则)进行推导。从文法的开始符号出发企图推导出与输入的单词串完全相匹配的句子,若输入串是文法给定的句子,则必能推出,反之必然出错。LL(1)优点:实现方法简单、直观,便于手工构造或自动生成语法分析器 。文法很 容易写出。LL(1)缺点:对文法有一定得限制,要求推导过程中紧跟在飞终结符右边可能出现的终结符集不相交。另外在做语法制导翻译时中间代码的输出方案相对于LR法比较复杂。LR分析法的句柄即体现了算符的优先级,出现句柄即做相应的归约动作,中间代码很容易写出,实现很简单。LL(1)是做自顶向下推导,因此设计LL(1)的语法制导翻译输

5、出中间代码很需要技巧,涉及到了判断符号的优先级。3.2 语法分析表设计 文法(消除了左递归)及相应的选择符集NO.文法SELECT集0A-f(B)Y f 1B-CDG ;,i 2Y- 3Y-m=E m 4C-; ; 5C-i=E i 6D-iF; i 7F-E; E 9G- ) 10G-i=E i 11E-LM (,i 12M-+LM +13M-LM - 14M- ),; 15L-NP (,i 16P-*NP * 17P-/NP / 18P- +,-,),;19N-i i 20N-(E) ( 3.3 预测分析表设计 表达式文法的预测分析表fim;+-*/()=A0-1-1-1-1-1-1-1-

6、1-1-1-1-1-1-1B-11-1 1-1-1-1-1-1-1-1-1-1-1-1C-15-14-1-1-1-1-1-1-1-1-1-1-1D-16-1-1-1-1-1-1-1-1-1-1-1-1-1E-111-1-1-1-1-1-1-1-111-1-1-1-1F-1-1-1-178-1-1-1-1-1-1-1-1-1G-110-1-1-1-1-1-1-1-1-19-1-1-1L-115-1-1-1-1-1-1-1-115-1-1-1-1M-1-1-114-1-11213-1-1-114-1-1-1N-119-1-1-1-1-1-1-1-120-1-1-1-1P-1-1-118-1-118

7、181617-118-1-1-1Y-1-13-1-1-1-1-1-1-1-1-1-12-1说明:1. 第1列为终结符,第1行为非终结符2. 非终结符与终结符的交点出表示将要选择哪个产生式做预测分析进行推导3. -1表示出错,其余数字为产生式的序号NO,表示选择相应的产生式 4.间代码形式的描述及中间代码序列的结构设计4.1 四元式描述四元式是一种比较普遍采用的中间代码形式。四元式的四个组成部分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT,运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。例如a=b*c+b*d的四元式表示如下:(1)(* ,b

8、,c,t1)(2)(* ,b,d,t2)(3)(+ ,t1,t2,t3)(4)(= ,t3,-, a)四元式表示很类似于三地址指令,有时把这类中间表示称为“三地址代码”,因为这种表示可以看成一种虚拟三地址机的通用汇编码,即这种虚拟机的每条“指令”包含操作符和三个地址,两个是为运算对象的,一个为结果的。有时为了更直观,也把四元式写成简单赋值形式。(1)t1=b*c(2)t2=b*d(3)t3=t1+t2(4)a=t3 把(jump,L)写成goto L 把(jrop,B,C,L)写成if B rop C goto L 我采用的是更直观的形式。4.2 中间代码序列的结构设计以for(i=0;in;

9、i=i+1)m=(n-1)/5-3*2;为例:中间代码序列的结构应如下:1. i=02. if in goto 43. goto 114. t1=n-15. t2=t1/56. t3=3*27. t4=t2-t38. m=t49. i=i+110. goto 211.我的中间代码结构是这样设计的:第1条语句输出表达式1,表达式为空时输出空行;第2条输出条件判断;第3条输出goto temp+7;第4条至第4+temp条输出赋值语句的四元式;第5+temp条输出条件表达式3;第6+temp条输出goto 2第7+temp条输出空说明:其中temp表示最终生成的中间变量个数,例如上例中,生成了t1

10、,t2,t3,t4共4个中间变量,所以temp=4.由于临时变量的产生个数是未知的,在语法制导翻译中要先对语句进行保存,等临时变量temp产生完后在对相应中间代码语句进行回填,最后输出。以便达到输出的中间代码跳转出入口及顺序是正确的。5.编译系统的概要设计5.1 问题分析在该阶段严格按照设计指导书,分析要完成什么功能。词法分析提取单词,写出正确的文法,语法分析检查输入单词串是否符合文法,语义分析完成中间代码的输出,使用LL(1)法语法分析。5.2 LL(1)分析根据平时课程对LL(1)分析方法的学习,把握好分析方法的实质。即从左向右扫描输入串,自顶向下最左推导。推导时非终结符面临剩余输入串串头

11、采用相应的推导产生式,产生式右边进分析栈,栈顶为首符。若首符为非终结符,则继续推导;若首符为终结符,则匹配,匹配不成功报错,匹配成功栈顶下移,剩余串串头右移。重复该过程,直至结束。5.3 符合for循环的文法 过程非常重要,文法写不好,就会产生推导时面临相同选择符的推导冲突,并且文法往往决定了你能够分析的语句有哪些格式,哪些能够处理,哪些不能够处理。对于for循环语句,要考虑到表达1可以为空,表达式3也可以为空,这样根据是否有表达式1,3有4种情况。对于赋值语句,赋值语句,应该考虑到赋值语句为空的特殊情况,因为在采用for循环延时的时候,赋值语句就是空的。对于赋值语句,不能是简简单单的m=b;

12、还应该有m=b+c*d(e-f)/n这样的复杂的赋值语句。5.4 语义动作语义分析,其实关键还是在于赋值语句上。因为赋值语句是有优先级的,而语法分析时LL(1)只是自左向右扫描,推导,匹配,并没涉及到优先级。因此在写出文法后要给出恰当的语义动作。我在设计时使用了算符栈和操作数栈。当输入串串头为算符时,用算符栈栈顶算符与输入串串头算符进行比较。若大于,栈顶算符退栈,操作数栈退出两个操作数,执行运算,产生中间变量,再中间变量进栈;若小于,则串头算符进算符栈;若等于,表明是(和)匹配,将(退栈。6详细的算法描述6.1伪代码概述(1)扫描输入的字符char_input,将字符根据构词规则截取出一个个单

13、词 word_input。根据不同类型的单词有不同的构词规则进行单词类型分类word_tyep,并记录其出现的位置word_position。(2)#进分析栈,开始符A进分析栈(3)取符号栈顶元素a和剩余输入串队头元素b,若a为非终结符,那么以(a,b)在预测分析表找到对应的数字i,根据i找到产生式。若i为-1则出错,报出错误。找到产生式后,a退栈,产生式入栈,按照产生式从右向左对应分析栈从底向顶的对应顺序入栈。重复(3)若a为终结符,则根据(a=b),匹配成功,则a出栈,串头后移。若a不为#,重复(3)。a为#,执行(4)。匹配失败则报错。(4)输出“匹配成功!”6.2语义动作方案6.2.1

14、赋值语句动作while(c_get!=;|GetTop(OPTR,OPTR_i)!=;) if(!In(c_get,OP) PushND(OPND,c_get,OPND_i);l+;c_get=al; else switch(Precede(GetTop(OPTR,OPTR_i),c_get) /运算优先级的比较 case : optr=PopTR(OPTR,OPTR_i); opnd2=PopND(OPND,OPND_i); opnd1=PopND(OPND,OPND_i); PushND(OPND,Operate(opnd1,optr,opnd2,temp_i),OPND_i); brea

15、k; (1)如果c_get为是标识符,PushND(OPND,c_get,OPND_i);将C_get入操作数栈OPND(2)如果c_get是算符,Precede(GetTop(OPTR,OPTR_i),c_get),将OPTR这个运算符栈的栈顶运算符与c_get比较,出现,或=(3)若,则可以运算了:optr=PopTR(OPTR,OPTR_i) 运算符出栈 opnd2=PopND(OPND,OPND_i) 先出操作数栈的是第2操作数opnd1=PopND(OPND,OPND_i) 后出操作数栈的是第1操作数PushND(OPND,Operate(opnd1,optr,opnd2,temp_

16、i),OPND_i)计算结果作为临时变量压入操作数栈。temp_i记录临时变量的个数执行Operated()时,将运算四元式保存到expression中,作为将来输出标准的四元式使用。expressiontemp_i=temptemp_i+=+opnd1+optr+opnd2;temp_i+6.2.2 FOR句动作以FOR语句中的2个;和1个)为界,在语法分析时截取表达式:Quaternion1中存储语法分析截取的第1个表达式Quaternion2中存储语义分析截取的第2个表达式Quaternion3中存储语义分析截取的第3个表达式cout1. Quaternion1endl;cout2. i

17、f Quaternion2 goto 4endl;cout3. goto 3+4+temp_i endl;temp_i记录在语法分析制导中赋值表达式产生中间变量的个数,因此goto语句的地址入口要等赋值语句做完产生所有的临时变量后才能知道。.赋值语句动作.cout5+temp_i. Quaternion3endl;cout6+temp_i. goto 2endl;cout7+temp_iendl;7. 软件的测试方法和测试结果7.1测试方法根据自己当初的设计思想,设计了测试用例。包括没有for中第1个表达式的情况,没有第3个表达式的情况,没有赋值语句的情况,赋值语句比较复杂等情况。用文本输入f

18、or循环语句,用txt文本输出分析出的四元式。7.2测试用例在文本文件中输入源程序: for(i=0;in;i=i+1)m=(n-1)/5-3*2;输入测试文件:词法分析结果:其中第一列为位置序号;第二列为截取的单词;第三列为类型类型1:关键字 类型2:标识符 类型3:常数 类型4: 运算符 类型5:界符语法分析结果:语义分析结果:输出四元式,txt文档记录:8 研制报告8.1研制过程8.1.1分析过程本次课程设计在思考阶段花费了两天多的时间,开始时做过赋值语句的词法分析、语法分析和语义分析,不过使用LR方法做的。感觉LR方法比较简单一些。但是实验题目要求我要用LL(1)方法来做,开始时不知如

19、何下手,有一些担心自己做不出来的情绪。后来就从LL(1)的思想着手,从代表性的例题看起,按部就班的来。感觉LL(1)方法做语法分析比LR法要简单。但是LL(1)方法做语法制导翻译比LR法要复杂一些。我的观点是:LL(1)方法单纯的做语法分析很简单,从左向右,自顶向下,没有优先级可言,语法分析匹配了则成功,不匹配则失败,但是对于语义动作要通过优先级来考虑,例如如a-b*c+d,a匹配,-匹配,b匹配,总不能做a-b,而是要a入操作数栈,-入算符栈,b入操作数栈,-优先级小于*,所以不做a-b,而*优先级大于+,可以做b*c,在比较-和+优先级;LR法在做语法分析时,要画识别文法活前缀的DFA,这

20、点比较繁琐,但它把优先级的思想通过句柄来体现,句柄出现则进行归约,在把含*短语归约之前,绝不会把含-短语先归约,这样就很容易通过非常简单语义动作产生后缀式。虽然用LL(1)做语义动作困难一些,我想不妨先易后难,先把语法分析作出来,在做语义动作的时候因为是用语法制导,可以在写程序时加入语义动作。因为以前做LR法分析赋值语句的时候我就是这么做的。8.1.2写文法的过程写文法的时候,因为要考虑到for循环的3个表达式,一般来说第2个表达式条件控制是必须的,而第1个和第3个可以为空的。对于赋值语句,可以有,也可以是空的。因此在考虑时要有推出为空的情况。同时要保证所写文法不能含有左递归,相同非终结符所用

21、产生式的select集不能有交集。我的思想是尽量让右边的产生式以终结符作为开头。这样会减少交集情况,减少左递归。但是事实最后证明,这种方法有缺陷,进一步限制了文法。由于开始没有考虑循环嵌套,所以没有实现for循环的嵌套的语法语义分析。8.2本设计的评价特点、不足本设计的优点在于能够将词法分析结果、语法分析结果清晰的展现出来,词法分析输出了单词、类型,位置,语法分析过程的每一步都输出了分析栈和剩余串,可以对照文法验证推导的正确性。能够输出正确的四元式,找到正确的出口和入口。能够对for循环中缺少表达式1或表达式3的情况进行相应处理,能够处理赋值语句为空的情况,能够处理复杂的赋值语句。不足之处是,

22、没有考虑到循环的嵌套,不能对嵌套的for循环进行语义分析,没有进行赋值时的类型分析,如不同类型变量之间的赋值。8.3收获体会本次编译课程设计收获到很多东西,最大的收获在于认识到了自己的不足,对编译原理的基本方法有了初步了解。结合相关书籍以及互联网上的资料,实现了本次程序的研制。在确定了所要设计的for语句属性文法之后,对程序整体划分了几个部分进行分析。在这几天的课程设计里,暴露出了个人能力需要很大提高这个缺陷,在txt文档输出中,有时候会出现文件名弄错导致不能文档输出的现象,进过改进和不断地测试,最终完成了该课程设计,达到了基本的课设要求。在今后的学习中,我会多多向他人学习,多借鉴他人优秀的编

23、程方法和思想,并且多做练习,达到学以致用,有时间的话我会把这个程序做的更加完美。9.参考文献1 殷人昆.数据结构(用面向对象方法与C+语言).清华大学出版社.2003.022 闵联营,何克右.C+程序设计教程(第二版).武汉理工大学出版社.2005.073 张素琴,吕映芝,蒋维杜,戴桂兰.编译原理(第2版).清华大学出版社.2002.064 李文生.编译程序设计原理与技术.北京邮电大学出版社.2006.05/处理空格问题如 int a;int b;处理数值问题,整数,小数等;处理读入读出问题,文件/ ;处理报错、纠错问题;处理格式类问题;#include#include#include#inc

24、lude#includeusing namespace std;int predictor1215= /0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /f i m ; + - * / ( ) = /*00 A*/ 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*01 B*/ -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*02 C*/ -1, 5, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1,

25、-1, -1, -1, /*03 D*/ -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*04 E*/ -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, /*05 F*/ -1, -1, -1, -1, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*06 G*/ -1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, /*07 L*/ -1, 15,

26、 -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, /*08 M*/ -1, -1, -1, 14, -1, -1, 12, 13, -1, -1, -1, 14, -1, -1, -1, /*09 N*/ -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, /*10 P*/ -1, -1, -1, 18, -1, -1, 18, 18, 16, 17, -1, 18, -1, -1, -1, /*11 Y*/ -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1 ; string grammar21= /文法 /*00 A*/ Y)B(f, /A-f(B)Y /*01 B*/ GDC, /B-CDG /*02 Y*/ , /Y-0 /*03 Y*/ ;E=m, /Y-m=E; /*04 C*/ ;, /C-; /*05 C*/ ;E=i, /C-i=E; /*06 D*/ ;Fi, /D-iF; /*07 F*/ E, /F-E /*09 G*/ , /G

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

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