1、FirstVT集和LastVT集生成算法模拟课程设计(论文)任务书 软 件 学 院 学院 软件工程 专业 3 班 一、课程设计(论文)题目 FirstVT集和LastVT集生成算法模拟 二、课程设计(论文)工作自 2013 年 6 月 17 日起至 2013 年 6 月 21 日止。三、课程设计(论文) 地点: 软 件 学 院 实 训 中 心 四、课程设计(论文)内容要求:1本课程设计的目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时,强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原
2、理的知识, 熟悉使用开发工具VC /JAVA/C#/.NET 。2课程设计的任务及要求1)课程设计任务:设计一个由正规文法生成FirstVT集和LastVT集的算法动态模拟2)创新要求:3)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路-工作原理、功能规划(3)详细设计-数据分析、算法思路、功能实现(含程序流程图、主要代码及注释)、界面等。(4)运行调试与分析讨论-给出运行屏幕截图,分析运行结果,有何改进想法等。(5)设计体会与小结-设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。(6)报告按规定排版打印,要求装订平整,否则要求返工;(7)课设报告的
3、装订顺序如下:封面-任务书-中文摘要-目录-正文-附录(代码及相关图片)(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、论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名: 2013 年 6 月 21 日课程设计(论文)评审意见(1)学习态度(20分):优()、良()、中()、一般()、差(); (2)系统设计(20分):优( )、良()、中()、一般()、差(); (3)编程调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、一般()、差();(5)论文撰写(20分):优()、良()、中()、一般()、差(); 评阅人: 职称: 副教授 2013 年 6 月 日中文摘要随着计算机科学的飞速发展,形式语言与自动机理论和方法的研究也越来
5、越受到人们的重视,但前者已经成为计算机科学的理论基础。本课程设计主要研究自动机在编译方面的应用,并将讨论重点放在算符优先分析法上,并用此理论完成算数表达式的正确与否的判断。根据算符优先分析算法,编写一个语法程序,程序具有通用性,即编制的语法缝隙程序能够适用于不同文法以及各种输入的单词串。基本思想描述,语法分析前首先要对输入的文法和句子进行词法分析,去除多余的自负,并将产生式和终结符、非终结符填入有关数组,为语法分析做前期准备。算符优先分析算法的核心算法教材上已给出,因此所要做的事只是将其变成实现。计算非终结符的FIRSTVT集和LASTVT集是构造算符优先分析表的基础,而算符优先分析表的构造又
6、是算符优先分析算法的基础。因此,本程序的实现可以说是算符优先分析算法实现的基础。目录一、 课程设计任务及要求课设目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识,熟悉使用开发工具VC /JAVA/C#/.NET 。总体要求 1.思想的正确性,采用合适的数据存储结构等。2.程序实现的正确性,程序整体结构合理、编程风格规范等。3.程序功能的完善程度,包括功能的基本实现、基本完善、完全实现 4.工作认真、独立完成课设。 基本要求设计一
7、个由正规文法生成FirstVT集和LastVT集的算法动态模拟,实现以下功能输入一个文法G;1.输出由文法G构造FIRSTVT集的算法;2.输出FirstVT集; 3.输出由文法G构造LastVT集的算法;4.输出LastVT集。具体步骤1、问题理解和分析 充分地分析和理解问题本身,弄清要求做什么。2、确定解决问题的方法(设计)主要是找到解决问题的主要思路,是怎么做。在此阶段可考虑系统的功能和模块划分等。 3、详细设计和编码确定算法的主要流程,再进行编程。在此阶段应提醒学生程序可先在纸上写,尽量想清楚了再动手上机,在编程过程中注意程序结构的清晰性,避免出现很多明显的程序逻辑错误和语法错误,提高
8、后面程序调试效率。4、程序调试和运行使学生掌握程序调试和排错的基本方法,增加编程的感觉和解决问题的成就感。5、完成课程设计报告(使用华东交通大学课程设计报告,需学生自己购买)二、需求分析本课程设计的题目为“FirstVT集和LastVT集生成算法模拟”,它是算符优先分析算法中判断三种优先关系的关键。算符优先分析算法是自底向上分析方法的一种。所谓自底向上分析,也称移近规约分析,粗略地说它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出的栈中,边移进边分析,一旦栈顶符号串形成某个句型的句柄或可规约串,就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一部规约。重复这
9、一过程直到规约到栈中只剩文法的开始符号则为分析成功,也就确认输入串是该文法的句子。而算符优先分析算法的基本思想只是规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。本课程设计的要求只是构造FirstVT集和LastVT集,在此基础上扩充建造算符优先关系表。三、设计思路3.1基本算法构造集合FIRSTVT(P)的算法按FIRSTVT(P)的定义,可以用如下两条归则来构造:(1)若有产生式P a或 Qa,则aFIRSTVT(P)(2)若aFIRSTVT(Q),且有产生式P Q,则aFIRSTVT(P)构造算法:建立一个二维布尔数组FP,a,使得FP,a为真的条件适当且仅当aFIRSTVT(
10、P);构造算法再用一个栈STACK,把所有初值为真的数组元素FP,a的符号对(P,a)全都放到栈中;算法如下:(1)将布尔矩阵各元素置假;栈置空;(2)按照归则(1)查看产生式,对于P a或P Qa.,置相应FP,a为真,符号对(P,a)入栈;(3)按规则(2),对栈施加如下操作:弹出栈定符号对记作(Q,a),查看所有产生式是否有形如P Q产生式,若有,且aFIRSTVT(P),则将FP,a置为真,并把(P,a)入栈;(4)重复(3),直到栈空为止。用类似的方法来构造LASTVT(P)可根据LASTVT(P)的定义来构造,两条规则:(1)若有产生式P a或 aQ,则a LASTVT(P)(2)
11、若aLASTVT(P) ,且有产生式P Q,则aLASTVT(P) 构造算法同FIRSTVT(P)的构造算法3.2定义数据结构在程序中,用两个字符数组vnM和vtN分别用来存储所有的非终结字符集与终结字符集。为了记录非终结符的FIRSTVT集和LASTVT集,为此建立两个布尔数组FMN和LMN,分别记录非终结符的FIRSTVT集和LASTVT集。比如,Fij=true表示vtj属于FIRSTVT(vni),Lij =true表示vtj属于LASTVT(vni),值为false表示相应的终结符不属于非终结符的FIRSTVT集和LASTVT集。为了简便起见,程序中又构造了两个两维布尔数组first
12、MM+N和lastMM+N来表示推导关系。数组第一维的M个字符代表非终结符;数组第二维的前M个字符代表非终结符,后N个字符代表终结符。以first数组为例,fistiM+j代表非终结符vni=P与非终结符vtj=a有推导关系P a;fistij代表非终结符vni=P与非终结符vtj=Q有推导关系或P Qa.。相关的数据结构定义如下:char vnM,vtN; /非终结字符与终结字符数组bool firstMM+N,lastMM+N; /以布尔数组形式定义推导关系char vnM,vtN; /非终结字符与终结字符数组int stp; /堆栈栈顶指针符号栈的数据结构:struct relation
13、 /结构体用来说明终结符vt与非终结符vn之间的关系,若关系存在说明vt属于FIRSTVT(vn)或LASTVT(vn) int vn; int vt; 四、详细设计存储firstvt,4个case对FIRSTVT进行存储void setFIRSTVT(char X,int T) int i; int t=0; switch(T) case 0: for(i=0;iN;i+) if(X=FIRSTVT0i) break; else if(FIRSTVT0i=0) t=i; break; FIRSTVT0t=X; break; case 1: for(i=0;iN;i+) if(X=FIRSTV
14、T1i) break; else if(FIRSTVT1i=0) t=i; break; FIRSTVT1t=X; break; case 2: for(i=0;iN;i+) if(X=FIRSTVT2i) break; else if(FIRSTVT2i=0) t=i; break; FIRSTVT2t=X; break; case 3: for(i=0;iN;i+) if(X=FIRSTVT3i) break; else if(FIRSTVT3i=0) t=i; break; FIRSTVT3t=X; break; case 4: for(i=0;iN;i+) if(X=FIRSTVT4i
15、) break; else if(FIRSTVT4i=0) t=i; break; FIRSTVT4t=X; break; default :break; 判定firstvtvoid FIRSTVT(char X,int S) int i,j=0,k; int T=0;/X position int L=0;/X offspring length int t=1; char CN; / for(i=0;iN;i+) if(INPUTi0=X) T=i; break; for(i=4;iN;i+) if(INPUTTi=|INPUTTi=n) t=1; /printf(%c,C0); L=j;
16、j=0; for(k=0;k=97&Ck=65&C0=90&t=1) FIRSTVT(C0,S); else if(INPUTTi!=|&INPUTTi!=0) Cj=INPUTTi; j+; if(INPUTTi=n) break; 对于LASTVT也是类似的存储和判定五、运行调试与分析讨论测试数据采用编译原理P110,例6.3进行测试实验数据:S #E#E E+T|TT T*F|FF P!F|PP (E)|i上截图中FirstVT集或LastVT中的关系矩阵中的“1”表示相对应的终结字符属于对应的终结字符的FirstVT集或LastVT集,我们从上面两个步骤可得得到用程序运算的结果和我分析
17、得到的FirstVT集和LastVT集相符合。六、设计体会与小结经过一个星期的编译原理课程设计的实践,我重新复习了自底向上的分析方法,其中重点复习了算符优先分析算法,对词法、文法的判断有了较深刻的认识,对算符优先分析算法的FirstVT集和LastVT集的构造有了更加深刻的认识,对其中数据的流向和数据的输出操作有了很清晰的认识,对数据在该课程设计中的存储和运算有了深刻的理解。本程序还有很多缺陷,为了简化问题,本程序分析的是一个特定文法,限制了程序的推广。如果只是为了分析特定文法的算符优先算法构造程序非终结符的FIRSTVT集和LASTVT集,进而为构造优先关系表提供基础,这样的设计无可厚非。但
18、是为了使程序能过使用与更多的文法分析,程序当中应当增加一个语法的输入函数,以便求出任意的文法非终结符的FIRSTVT集和LASTVT集。要完成此项操作,首先定义一个结构体用来记录推导规则。其中st域记录推导规则的字符串,len与用来记录字符串的长度。struct rule char stSMAX; int len; ; struct rule rsSMAX; /定义语法规则输入的字符串此结构体组成的数组就可以用来记录不同的推导关系了。程序当中编写一个input()函数,将每一条规则输入到数组rule当中,有这些规则可以很容易的求出文法中有哪些终结符及非终结符,再根据这些推导规则确定出这些终结符及非终结符之间的推导关系,之后的计算部分和本程序一致。由于时间问题,这样的改进工作只能留到以后完成了。 七、参考文献1、 张素琴、吕映芝等.编译原理M(第2版).清华大学出版社.20052、 (美)Alfred V.Aho;Monica S.Lam;Ravi Sethi;Jeffrey D.Ullman. Compilers: Principles, Techniques, and Tools (2nd Edition)M.机械工业出版社. 2008年12月3、
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1