正规文法的First集合Follow集求解过程动态模拟-实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华东交通大学
课程设计(论文)任务书
软件学院专业项目管理班级2005-4一、课程设计(论文)题目正规文法的First集合Follow集求解过程动态模拟
二、课程设计(论文)工作:自2008年6月23 日起至2008年 6 月27 日止。
三、课程设计(论文)的内容要求:
1、基本要求:
进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识,熟悉使用开发工具VC 6.0 或其它软件编程工具。
为了使学生从课程设计中尽可能取得比较大的收获,对课程设计题目可根据自己的兴趣选题(须经老师审核),或从老师给定题目中选择完成(具体见编译原理课程设计题目要求)。
通过程序实现、总结报告和学习态度综合考评,并结合学生的动手能力,独立分析解决问题的能力和创新精神。成绩分优、良、中、及格和不及格五等。
2、具体要求
设计一个由正规文法生成Fisrt集Follow集的动态过程模拟
动态模拟算法的基本功能是:
●输入一个正规文法;
●输出由文法构造的First集的算法;
●输出First集;
●输出由文法构造的Follow集的算法;
●输出Follow集;
学生签名:
2008 年 6 月 27 日
课程设计(论文)评阅意见
评阅人职称副教授
2008 年 6 月 27 日
目录
一、需求分析 (3)
二、总体设计 (4)
三、详细设计 (9)
四、课设小结 (12)
五、谢辞 (13)
六、参考文献 (14)
一、 需求分析
问题描述
设计一个由正规文法生成First 集和Follow 集并进行简化的算法动态模拟。(算法参见教材) 【基本要求】
动态模拟算法的基本功能是: (1) 输入一个文法G ;
(2) 输出由文法G 构造FIRST 集的算法; (3) 输出First 集;
(4) 输出由文法G 构造FOLLOW 集的算法; (5) 输出FOLLOW 集。
【测试数据】
输入文法:
E->TE ’
E ’->+TE ’|ε T->FT ’
T ’->*FT ’|εF->(E)|i 【实现提示】 用数据库存储多行文法,用LIST 控件显示算法,用GRID 类依据算法进行作图。并实现算法与生成过程的关联。
首先文法G 的获取可以通过两种形式来完成,一种是将其定义在文件里,然后从文件读取,另一种是用户自行输入,动态获取并运行。 程序用UI 界面风格显示。实现与实际软件的无差别性。
并且,为了方便做好的程序在任意地方运行。可以将其做成exe 安装程序,而不再依赖于编程环境。
程序能够对读取到的任意符合要求的文法进行识别(注:本程序能够处理文法的能力为2型文法),并能够计算出每一个非终结符的First 集Follow 集,并且能够将计算过程动态的显示给用户查看。然后用表格的形式将得到的First 集Follow 集显示出来。
i )
(
*
+ F 的f i r s t 集
T 的f i r s t 集 E 的f i r s t 集 1
1
1
1 1
1
1 1 1
二、总体设计
1.程序功能分解图
2.各功能模块程序流程图
1).UI用户操作界面控制流图
2).识别非终结符集和终结符集
3).计算各个非终结符的First集
说明:在求First集合时,主要用的思想是递归求解。
4. 计算各个非终结符的Follow集
三、详细设计
核心类:WenFaConvert和CompileSystem
WenFaConvert类:主要用于处理获得的文法,分析出文法中的
终结符,非终结符,计算出每给非终结符的First,Follow集。
两个核心算法函数如下:
First(String Vn, TextArea textArea, boolean bl)
Follow(String Vn, boolean bl, TextArea textArea)
其中textArea是用于动态显示算法求解过程的控件。
CompileSystem类:用于处理显示WenFaConvert类计算得到的结果。1.程序启动运行
2.从文件读取文法
3.显示相应文法的FIRST集求解结果
4.显示相应文法的Follow集求解结果
注:求解过程在下面的文本框中输出,并且,显示结果都是根据读取到的文法动态的生成。并且动态更新显示在界面上。
四、课设小结
课程设计,一个创造性的工作。
我喜欢这种从无到有的过程。喜欢分析问题时,一个人静静思考的惬意。虽然这次课设工作量并不是很大,但是遇到的问题却并不少。尤其是这种处理算法的程序。逻辑思路要非常缜密。程序的分支比较多,稍不注意就思维混乱了。这次做算法的系统,难度比起以前做的那些XX管理系统要复杂的多。
我总结下这个课程设计中最棘手的问题:
1.终结符V和V’,多了个带’的终结符,但是它在处理的时候只能当一个符号来识别,而用程序设计语言表示时它能表示成两个字符,如果处理不当的话,V’就可能被认为是终结符号V和非终结符‘。这无疑给处理过程添加了难度。
2.还有一些自认为理所当然能实现的,却实际并不可取的方法。
如:本来JA V A API有个方法String.split(String s);用于以s 为分割字符,将指定的字符分成字符数组。但是s 为括号时(无论左右括号,大小括号,方框括号),都不能分割,并且抛异常。这是个很难理解的问题。迫不得已,我不得不想其他的方法来实现分割算法。
3.再有就是对编译原理中First Follow算法设计时,采取何种策略效率最高的问题。最后我想到了用递归方式。
下面总结此次课程设计的一些收获:
1.对程序设计理解,算法的设计,有了进一不的提高。
2.对程序调试的技巧收获不小。因为该程序主要是算法研究,所以程序分支较复杂。断点调试是必不可缺并且很实用的工作。
3.对程序到软件过程的理解。这次也是我第一次将自己做的程序制作成一个可自定义安装过程的小软件。从而将程序的运行与IDE脱离开来。
4.毫无疑问,就是对编译原理的理解。能够很好地理解程序设计与编译原理的关系。