FirstVT集和LastVT集生成算法模拟(编译原理课设).doc_第1页
FirstVT集和LastVT集生成算法模拟(编译原理课设).doc_第2页
FirstVT集和LastVT集生成算法模拟(编译原理课设).doc_第3页
FirstVT集和LastVT集生成算法模拟(编译原理课设).doc_第4页
FirstVT集和LastVT集生成算法模拟(编译原理课设).doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计(论文)任务书 软 件 学 院 学院 软件测试 专业 4 班 一、课程设计(论文)题目 FIRSTVT集和LASTVT集生成算法模拟 二、课程设计(论文)工作自 2014 年 6 月 16 日起至 2014 年 6 月 21 日止。三、课程设计(论文) 地点: 软 件 学 院 实 训 中 心 四、课程设计(论文)内容要求:1本课程设计的目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时,强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识, 熟悉使用开发工具VC /JAVA/C#/.NET 。2课程设计的任务及要求1)课程设计任务: 设计一个由正规文法生成FIRSTVT集和LASTVT集的算法动态模拟。(算法参见教材) 动态模拟算法的基本功能是:(1) 输入一个文法G;(2) 输出由文法G构造FIRSTVT集的算法;(3) 输出FIRSTVT集; (4) 输出由文法G构造LASTVT集的算法;(5) 输出LASTVT集。2)创新要求:用界面的形式来展现这个结果集,这样显得更加的美观。3)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路-工作原理、功能规划(3)详细设计-数据分析、算法思路、功能实现(含程序流程图、主要代码及注释)、界面等。(4)运行调试与分析讨论-给出运行屏幕截图,分析运行结果,有何改进想法等。(5)设计体会与小结-设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。(6)报告按规定排版打印,要求装订平整,否则要求返工;(7)课设报告的装订顺序如下:封面-任务书-中文摘要-目录-正文-附录(代码及相关图片)(8)严禁抄袭,如有发现,按不及格处理。4)课程设计评分标准: (1)学习态度:20分;(2)系统设计:20分;(3)编程调试:20分;(4)回答问题:20分;(5)论文撰写:20分。5)参考文献:(1)张素琴,吕映芝. 编译原理M., 清华大学出版社(2)蒋立源、康慕宁等,编译原理(第2版)M,西安:西北工业大学出版社6)课程设计进度安排1准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料2程序模块设计分析阶段(4学时):程序总体设计、详细设计3代码编写调试阶段(8学时):程序模块代码编写、调试、测试4撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名: 2014 年 6 月 21 日课程设计(论文)评审意见(1)学习态度(20分):优()、良()、中()、一般()、差(); (2)系统设计(20分):优( )、良()、中()、一般()、差(); (3)编程调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、一般()、差();(5)论文撰写(20分):优()、良()、中()、一般()、差(); 评阅人: 职称: 副教授 2014 年 6 月 26 日目录绪论4正文4设计实现10测试数据运行结果分析12课程设计总结13参考文献14绪论随着计算机科学的飞速发展,形式语言与自动机理论和方法的研究也越来越受到人们的重视,但前者已经成为计算机科学的理论基础。本课程设计主要研究自动机在编译方面的应用,并将讨论重点放在算符优先分析法上,并用此理论完成算数表达式的正确与否的判断。根据算符优先分析算法,编写一个语法程序,程序具有通用性,即编制的语法缝隙程序能够适用于不同文法以及各种输入的单词串。基本思想描述,语法分析前首先要对输入的文法和句子进行词法分析,去除多余的自负,并将产生式和终结符、非终结符填入有关数组,为语法分析做前期准备。算符优先分析算法的核心算法教材上已给出,因此所要做的事只是将其变成实现。正文设计目的本课程设计的题目为“FirstVT集和LastVT集生成算法模拟”,它是算符优先分析算法中判断三种优先关系的关键。算符优先分析算法是自底向上分析方法的一种。所谓自底向上分析,也称移近规约分析,粗略地说它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出的栈中,边移进边分析,一旦栈顶符号串形成某个句型的句柄或可规约串,就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一部规约。重复这一过程直到规约到栈中只剩文法的开始符号则为分析成功,也就确认输入串是该文法的句子。而算符优先分析算法的基本思想只是规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。本课程设计的要求只是构造FirstVT集和LastVT集,在此基础上扩充建造算符优先关系表。问题描述设计一个给定文法和对应的FIRSTVT和LASTVT集,能依据依据文法和FIRSTVT和LASTVT生成算符优先分析表。可以动态模拟算法的基本功能,通过输入一个给定文法,及FIRSTVT和LASTVT集,本题目以文法GE为测试数据: 文法GE:E-TEE-+TE|T-FTT-*FT|F-(E)|i该文法有对应的FIRSTVT(E)= +, * ,( ,i LASTVT(E)= +,*,),i FIRSTVT(E)= + LASTVT(E)= +,*,),i FIRSTVT(T)= * ,( ,i LASTVT(T)= *,),i FIRSTVT(T)= * LASTVT(T)= *,),i FIRSTVT(F)= ( ,i LASTVT(F)= ),i 通过算符优先关系表构造算法: 给定文法中任何二个终结符对(a,b)之间的优先关系有三种优先关系计算为:关系:可以直接查看产生式的右部,对如下形式的产生式:Aab或 AaBb则有a=b成立。 关系:求出每个非终结符B的FIRSTVT(B),观察如下形式的产生式:AaB对每一bFIRSTVT(B),有ab成立。 关系:计算每个非终结符B的LASTVT(B),观察如下形式的产生式: ABb对每一aLASTVT(B),有ab成立。 这样,对于给定的文法和对应的FIRSTVT和LASTVT集,通过二个终结符之间的优先关系表构造算法,可以得到算法优先分析表构造过程的过程和算符优先分析表生成算法。 所以,我们的重点应该放在算符优先分析表的生成算法上,解决了这一问题,也就可以得到我们想要的结果,算法优先分析表以及分析过程。其中,对于FIRSTVT集和LASTVT集的表示可以采取集合的方式,同样也可以采用关系图法进行表示。总体设计算符优先分析表的构造原理:通过检查文法G的每个产生式的每个候选式,可以首先找出满足ab的终结符对;为了找出所有满足关系和的终结符对,我们首先需要对文法G的每个非终结符P构造二个集合FIRSTVT(P)和LASTVT(P)。1. FirstVT集的构造FIRSTVT(P)=a|P=+a或P=+Qa,aVT而QVN 若有产生式:Pa或PQa,则aFIRSTVT(P);若aFIRSTVT(Q),且有产生式PQ,则aFIRSTVT(P)。2. LastVT集的构造LASTVT(P)= a|P=+a或P=+aQ,aVT而QVN 若有产生式:Ua或UaV, 则aLASTVT(U);若aLASTVT(V),且有产生式UV,则aLASTVT(U)。当我们有了这二个集合之后,就可以通过检查每个产生式的候选式确定满足关系的“”和“”的所有终结符对。我们假定有产生式的一个侯选式形为aP,那么,对任何bFIRSTVT(P),ab;假定有产生式的一个候选形为Pb,那么,对任何aLASTVT(P),有ab。3. 构造算符优先关系表在我们有了每个非终结符P的FIRSTVT(P)和LASTVT(P)集合之后,就能够构造文法G的优先表。详细设计首先介绍算符优先文法的几个重要性质:性质1:在算符文法中任何句型都不包含两个相邻的非终结符。性质2:如果Aa(或者bA)出现在算符文法的句型S中,其中A是非终结符,b是终结符,则S中任何含此b的短语必含有A。1. FirstVT集的构造,算法描述:若有产生式A-a或A-Ba,则a属于FirstVT(A),其中A、B为非终结符,a为终结符。 :若a属于FirstVT(B)且有产生式A-B则有a属于FirstVT(A)。为了计算方便,建立一个布尔数组Fm,n(m为非终结字符的个数,n为终结字符的个数)和一个后进先出栈STACK。将所有的非终结符排序,用iA表示非终结符A的序号,再将所有的终结符排序,用ia表示终结符a的序号。算法的目的是要使数组的一个元素最终取值满足:FiA,ja的值为真,当且仅当a属于FirstVT(A)。至此,显然所有的非终结符的FirstVT集已完全确定。步骤如下:首先按规则对每个数组元素附初值。观察这些初值,若FiA,ia的值是真,则将(A,a)推入栈中,直至对所有数组的初值都按此处理完。然后对栈做如下运算。将栈顶项弹出,则令其变为真,且将(A,a)推进栈,如此重复直到栈弹空为止。若表达式文法为:(0) E# E #(1) EE + T(2) ET(3) TT*F(4) TF(5) FPF | P(6) P(E)(7) Pi计算每个非终结符的FirstVT集和LastVT集得到如下结果:FIRSTVT(E) = # FIRSTVT(E) = +,*,(,iFIRSTVT(T) = *,(,iFIRSTVT(F) = ,(,iFIRSTVT(P)=(,i2. LastVT集的构造,算法描述:用于构建输入文法的LastVT集若有规则U:=a或U:=aV,则a属于LastVT(U)若有规则U:=V,且a属于LastVT(V)则a属于LastVT(U)设一个栈STACK,和一个布尔数组BProcedureInsert(U,a) IF NOT BU,a THEN BEGIN BU,a:=TRUE;把(U,a)推进STACK栈; END;BEGIN FOR 每个非终结符号U和终结符号a DO BU,a:=FALSE; FOR 每个形如U:=a或U:=aV的规则 DO INSERT(U,a); WHILE STACK栈非空 DO BEGIN 把STACK栈的栈顶弹出,记为(V,a); FOR 没条形如U:=V的规则 DO INSERT(U,a); END OF WHILE;END; 具体算法如下: Begin For每个终结符P和终结符 a Do FP,a=FALSE; For 每个形如P-a或P-aQ的产生式, Do insert (P,a) While Stack 非空 Do Begin 把Stack 的顶端,记为(Q,a),上托出去; For每条形如P-Q的产生式 Insert(P,a) End of while; END针对上述算法可得到每个非终结符的LastVT集如下:LASTVT(E) = # LASTVT(E) +,*,),iLASTVT(T) *,),iLASTVT(F) ,),iLAVSTVT(P)),i 算符优先分析流程图图1算符优先分析流程图设计实现.主要数据存储结构描述:本课程设计主要采用栈的数据结构,定义一个栈的类,类中主要成员函数实现栈的一些基本操作,如:push()为入栈操作,pop()为出栈操作,empty()判断栈中是否为空,clear()用于对栈进行清空处理,核心代码为: 建立FirstVT函数集和SetFirstVT(),用来得到相应文法中所对应的非终结符的FirstVT集void CMyDlg:SetFirstVt(int Ptnum) /建立FRISTVT集int i,j; char Q; char a; for(i=0;i100;i+) for(j=0;j100;j+) Fij=false; for(i=0;i=2)if(Vn.Find(Pti.pright0)!=-1 & Vt.Find(Pti.pright1)!=-1)InsertFirstOrLast(Pti.pleft,Pti.pright1,First); while(!stack.empty() stack.pop(Q,a); for(i=0;iPtnum;i+) if(Pti.pright0=Q) InsertFirstOrLast(Pti.pleft,a,First); 建立LastVT集函数和SetLastVT函数,用来得到相应文法中所有非终结符的LastVT集void CMyDlg:SetLastVt(int Ptnum) /建立LASTVT集 int i,j; char Q; char a; for(i=0;i100;i+) for(j=0;j100;j+) Lij=false; for(i=0;i=2) if(Vt.Find(Pti.pright.Right(2)0)!=-1&Vn.Find(Pti.pright.Right(2)1)!=-1)InsertFirstOrLast(Pti.pleft,Pti.pright.Right(2)0,Last

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论