编译原理课程设计.docx
- 文档编号:29508070
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:51
- 大小:279.94KB
编译原理课程设计.docx
《编译原理课程设计.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计.docx(51页珍藏版)》请在冰豆网上搜索。
编译原理课程设计
《编译原理课程设计》任务书
1、本课题的目的及意义
课程设计实践对学生巩固所学基础专业课程知识、进行编译系统基本技能训练、培养实践动手能力,从而掌握编译系统的基本工作原理、基本方法和基本开发技术,最终达到具有一定的编译系统的实际开发能力有重要意义。
通过课程设计,主要达到以下目的:
1.帮助学生深入理解编译原理的有关理论和巩固编译原理相关知识。
2.巩固学生学习的编译原理、程序设计语言、数据结构等课程的基础知识,训练学生分析和解决编译系统的相关问题的能力,提高学生的综合素质。
3.从软件工程的角度来看,《编译原理》课程设计是一个很好的实例,可以训练学生软件设计的能力以及编码调试能力。
2、本课题任务的主要内容
本课程设计主要内容包括以下几点:
1、根据选定的题目,查阅资料,熟悉相关理论、方法;
(1)掌握文献检索方法,以获得编译系统开发技术等相关资料;
(2)学习并熟练使用一种4GL开发平台(如VC++、Java、Dephi、PB、VB等);
2、分析问题,确定系统逻辑结构;
3、确定系统所需模块及模块结构,并用流程图描述各模块;
4、编码及调试程序;
5、撰写课程设计说明书。
3、提交的成果
1、一份符合课程设计说明书撰写规范的课程设计说明书。
2、一套系统原型。
3、所有的文档及代码存放在同一个文件夹同意提交。
前言
随着计算机科学的飞速发展,形式语言与自动机理论和方法的研究也越来越受到人们的重视,当前已成为计算机科学的理论基础。
本文主要研究自动机在编译方面的应用,并将讨论的重点放在算符优先算法分析上,并用此理论完成算术表达式的正确与否的判断。
根据算符优先分析算法,编写一个语法分析程序,程序具有通用性,即所有编制的语法分析程序能够适用于不同文法以及各种输入单词串,语法分析前首先要对输入的文法和句子进行词法分析,去除多余的字符,并将产生式和终结符、非终结符填入有关数组,为语法分析做前期的准备,算符优先分析法的核心算法书本已给出,因此所要做的事就是对其进一步分析细化并将其编程实现。
本课程设计的前面几章是对题目的介绍,理解,以及对组员的具体分工,后面的详细设计及其算法描述对自己的任务做了详细的描述,在整个设计中有很多不足的地方望老师细心指导,让我们在以后的学习中取得更大的进步。
算符优先分析器模拟构造器的设计摘要
算符优先分析是自底向上优先分析(移进-归约分析)思想基础上的一种重要的算法,算符优先分析法是一种简单直观、特别方便于表达式分析,易于手式实现的方法。
算符优先分析法是仿效算数四则运算而建立起来的。
做四则运算时,为了保证计算结果和过程的唯一性,规定了一个统一的四则运算法则,规定了运算符之间的优先关系。
算符优先分析法仿效四则运算过程,它预先规定了相邻终结符之间的优先关系,然后利用这种优先关系来确定句型的“句柄”,并进行归约。
关键字
自底向上分析法算符优先关系表句子移进-归约
PriorityStructureAnalyzerOperatorAnalogDesign
Abstract
Analysisofoperatorpriorityistheanalysisofbottom-uppriority(Movedinto-ReductionAnalysis)thinkingonthebasisofanimportantalgorithm,Operatorpriorityanalysisisasimpleandintuitive,especiallytofacilitateanalysisoftheexpression,easytohand-typemethodstoachieveanalysisofoperatorpriorityistofollowfourcountsandsetupoperations.Whendonefouroperations,inordertoensurethecalculatedresultsandtheuniquenessoftheprocess,Providesaunifiedalgorithm4,Operatorprovidestherelationshipbetweenthepriority.Priorityanalysisoperatorfollowthecourseoffouroperations,whichpre-establishedattheendoftheneighboringrelationsbetweenthepriorities,andthenusethisrelationshiptodeterminethepriorityofthesentence"handle",andreduction.
Keyword
Bottom-upanalysisTableoperatorprecedencerelations
SentenceMovedinto–reduction
第1章概述
算符优先分析文法是一类广为使用的自底而上分析的文法。
自底而上分析也称移进-归约分析,粗略的说它的实现思想是输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄或可规约串时,就用该产生式的左部非终结符代替相应的右部文法符号串,这称为一步归约。
重复这一过程直到归约到栈中只剩文法的开始符号时,则为分析成功。
采用自底而上分析技术要解决两个基本问题:
1)如何找出直接归约的简单短语?
2)把找出的简单段誉直接归约到哪一个非终结符号?
算符优先文法的基本思想是只考虑算符之间的优先关系,也就是只考虑终结符之间的优先关系,由于算符优先分析不考虑非终结符之间的关系,在归约过程中可归约的串就归约,并不考虑归约到那个非终结符名,因而算符优先归约不是规范归约。
算符优先分析文法虽然有不规范问题,但是他分析速度快,特别适用于表达式的分析,因此在实际应用中常常采取适当措施克服此缺点。
本课程设计通过对表达式FIRSTVT()和LASTVT()的构造,从而构造出表达式文法算符优先关系。
阐明语法的一个工具是文法,这是形式语言理论的基本概念之一。
本次课程设计将介绍算符优先文法及算符优先关系表构造的有关问题。
本次课程设计是通过输入一表达式可以判断它是否具有算符优先分析关系,若是继续进行下一步的设计或改造;产生算符优先关系表,通过课程设计可以了解表达式之间的关系情况,可以更好的把握程序设计开发语言的工作原理。
本次我的任务模块是对算符优先关系表中的FIRSTVT()和LASTVT()的构造模块的任务,在本次的课程设计中将会作详细的介绍。
第2章设计目的
一、通过本次课程设计,加深了我对编译原理这门课程的理解和掌握,是我明白了分析器的原理、构造及其实现方法。
基本掌握了算符优先关系分析的原理和使用方法。
本次课程设计主要任务是根据算符优先分析表,求句子的优先分析表过程,实现编译器的构造。
此次设计需使用电子文档的格式,为加深即将迎来的毕业设计做准备,使我们提前熟悉写毕业设计的基本格式、流程和方法。
二、课程设计实践的主要是为巩固我们所学基础专业课程知识、进行编译系统基本技能训练、培养实践动手能力,从而掌握编译系统的基本工作原理、基本方法和基本开发技术,最终达到具有一定的编译系统的实际开发能力有重要意义。
概括来说课程设计主要为实现一下目的:
1.帮助我们深入理解编译原理的有关理论和巩固编译原理相关知识。
全面系统的了解编译原理程序构造的一般原理和全面实现方法,尤其是对自底而上的优先分析法的认识和理解。
2.巩固我们学习的编译原理、程序设计语言、数据结构等课程的基础知识,训练学生分析和解决编译系统的相关问题的能力,提高学生的综合素质。
3.从软件工程的角度来看,《编译原理》课程设计是一个很好的实例,可以训练我们软件设计的能力以及编码调试能力。
4.提高对编译程序工作基本过程及其各阶段基本任务的分析技能。
三、本课程设计为“FIRSTVT集和LASTVT集生成算法模拟”,它是算符优先分析算法中判断三种优先关系的关键。
算符优先分析算法是自底向上分析方法的一种。
所谓自底向上分析,也称移近——规约分析,粗略地说它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出的栈中,边移进边分析,一旦栈顶符号串形成某个句型的句柄或可规约串,就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一部规约。
重复这一过程直到规约到栈中只剩文法的开始符号则为分析成功,也就确认输入串是该文法的句子。
而算符优先分析算法的基本思想只是规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。
本课程设计的要求只是构造FIRSTVT集和LASTVT集,在此基础上扩充建造算符优先关系表。
第3章设计的内容和要求
3.1设计内容
本课程设计主要内容包括以下几点:
1、根据选定的题目,查阅资料,熟悉相关理论、方法;
(1)掌握文献检索方法,以获得编译系统开发技术等相关资料;
(2)学习并熟练使用一种4GL开发平台(如VC++、Java、Dephi、PB、VB等);
2、分析问题,确定系统逻辑结构;
3、确定系统所需模块及模块结构,并用流程图描述各模块;
4、编码及调试程序;
5、撰写课程设计说明书。
3.2设计要求
1、提交一份课程设计电子文档;
2、通过该课程设计要学会用消除左递归的方法来使文法满足进行确定自顶向下分析的条件。
3、学会用C/C++高级程序设计语言来设计一个算符优先分析分析法的语法分析器;
4、通过该课程设计,加深对语法分析理论的理解,培养动手实践的能力。
3.3设计实现的功能
本次课程设计主要实现算符优先分析表的构造,该分析器能够分析产生式到语法树。
第4章需求分析
4.1编写目的
算符优先分析法是一种广为使用的自底而上分析的文法。
自底而上分析也称移进-归约分析,粗略的说它的实现思想是输入符号串自左向右进行扫描,并将输入符逐个一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄或可规约串时,就用该产生式的左部非终结符代替相应的右部文法符号串,这称为一步归约。
重复这一过程直到归约到栈中只剩文法的开始符号时,则为分析成功。
事实上,算符优先分析的分析是根据优先关系构造的,它反映了相应的终结符之间的关系,因此在算符优先分析分析器中,实际上是以优先关系分析表代替相应方法来进行分析的。
一旦判定一个文法是OPG文法,并且求的该文法的优先关系矩阵,便可使用算符优先分析法来进行自底向上的归约。
是一种简单直观、特别方便于表达式分析,易于手式实现的方法。
4.2运行环境
操作系统:
MicrosoftWindowsXP
支持环境:
IIS5.0
可视化环境:
MicrosoftVisualC++6.0
4.3编译环境简介
MicrosoftVisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
MicrosoftVisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
MicrosoftVisualC++6.0是Microsoft公司开发的基于C/C++的集成开发工具,它是MicrosoftVisualStudio中功能最为强大、代码效率最高的开发工具。
MicrosoftVisualC++6.0与以前的版本相比有了多方面的改进。
它的编译器、调试器、连接器、编辑器、资源编辑器都有所加强,在编辑器中还提供了自动语句生成功能,编辑器会像MicrosoftVisualBasic一样自动提示函数的参数、对象的成员。
另外,MicrosoftVisualC++6.0还提供了很多向导。
MFC提供了一些新的类,提供了更强大的数据访问功能。
4.4数据流图(DFD)
0层数据流图
文法判定:
句子分析:
一层数据流图
4.5数据字典
数据项
数据项名:
终结符
别名:
VT
数据类型:
CHAR
长度:
40
取值范围:
T001---T040
数据项名:
非终结符
别名:
VN
数据类型:
CHAR
长度:
30
取值范围:
T001---T030
数据项名:
句子
别名:
字符串
数据类型:
CHAR
长度:
60
取值范围:
T001---T030
数据结构
数据结构名:
文法产生式
说明:
用来生成项目集
组成:
{左部,右部}
数据结构名:
文法
说明:
用来提供文法的信息
组成:
{终结符,非终结符,开始符,{左部,右部}}
数据流
数据流名:
G[s]产生式
数据流来源:
文法G[s]
数据流去向:
OG文法判定与改造
数据结构:
{产生式的左部,产生式的右部}
数据流名:
改造后的文法G[s]
数据流来源:
OG文法判定与改造
数据流去向:
生成FIRSTVT集和LASTVT集
数据结构:
{产生式的左部,产生式的右部}
数据流名:
G[s]的Vt之间的优先关系
数据流来源:
生成算符优先关系表
数据流去向:
OPG文法判定
数据流名:
算符优先关系表
数据流来源:
OPG文法判定
数据流去向:
句子移进-归约
数据流名:
句子
数据流来源:
输入
数据流去向:
句子移进-归约
数据流名:
移进-归约过程表
数据流来源:
句子移进-归约
数据流去向:
输出
处理过程
处理过程名:
OG文法判定与改造
输入:
G[s]产生式;
输出:
改造后的文法G[s]
处理:
该处理过程主要是用来生成项目集规范族表,以及将文法产生式转化成项目产生式;
处理过程名:
生成FIRSTVT集和LASTVT集
输入:
改造后的文法G[s]
输出:
G[s]的FIRSTVT集和LASTVT集
处理:
该处理过程主要用来判断当前项目产生式的下个动作是移进还是归约
处理过程名:
生成算符优先关系表
输入:
G[s]的FIRSTVT集和LASTVT集
输出:
算符优先关系表
处理:
该处理过程用来查找移进的下个产生式的序号
处理过程名:
句子移进-归约
输入:
算符优先关系表,句子
输出:
移进-归约过程表
处理:
最终生成分析表
4.6E-R图
第5章总体设计
5.1总体功能模块图
5.2流程简介
输入一个文法,判断该文法是否为OG文法,如果是OG文法则不需要改造,若不是OG文法则改造它。
然后,生成FIRSTVT集与LASTVT集,其中FIRSTVT集与LASTVT集可通过布尔数组与关系图法计算求出。
利用一个不含e产生式的算符文法G,如果对任意两个终结符对a,b之间之多只有<,>和=这三种关系的一种成立,判断G是一个OPG文法。
从而构造出算符优先关系表,最后根据算符优先关系表构造出算符优先分析器,其中算符优先分析器的构造可利用基于算符优先关系表、基于优先函数表,构造句子语法树的方法得出。
5.3算符优先分析思想
算符优先文法的基本思想是只考虑算符之间的优先关系,也就是只考虑终结符之间的优先关系。
或者说,算符优先文法在归约过程中只考虑终结符之间的优先关系确定句柄,而与非终结符无关,只需要知道把当前句柄归约为某一非终结符,不必知道该非终结符的名字是什么,这样也就去掉了单非终结符的归约,因为若只有一个非终结符时无法与句型中该非终结符的左部及右部的串比较优先关系。
也就无法确定该非终结符为句柄。
5.4本模块功能模块图
本功能模块图
第6章详细设计
6.1本小组任务分配
在整个课程设计中,小组任务是构造FIRSTVT集和LASTVT集。
算符优先分析表的构造原理是通过检查文法G的每个产生式的每个候选式,可以首先找出满足a=b的终结符对;为了找出所有满足关系<和>的终结符对,我们首先需要对文法G的每个非终结符B构造二个集合FIRSTVT(B)和LASTVT(B)。
1.FirstVT集
定义:
FIRSTVT(B)={a|B+a...或B+Qa...,a∈VT而Q∈VN}
若有产生式:
B→a...或B→Qa...,则a∈FIRSTVT(B);
若a∈FIRSTVT(Q),且有产生式B→Q...,则a∈FIRSTVT(B)。
2.LastVT集
定义:
LASTVT(B)={a|B+...a或B+...aQ,a∈VT而Q∈VN}
若有产生式:
B→...a或B→...aV,则a∈LASTVT(B);
若a∈LASTVT(V),且有产生式B→...V,则a∈LASTVT(B)。
当我们有了这二个集合之后,就可以通过检查每个产生式的候选式确定满足关系的“<”、“>”和“=”的所有终结符对。
假定有产生式的一个侯选式形为A->...ab...或A->...aBb...则有a=b;
假定有产生式的一个侯选式形为A->...aB...,那么,对任何b∈FIRSTVT(B),a<b;
假定有产生式的一个候选形为A->...Bb...,那么,对任何a∈LASTVT(B),有a>b。
3.构造算符优先关系表
在我们有了每个非终结符B的FIRSTVT(B)和LASTVT(B)集合之后,就能够构造文法G的优先表。
6.2个人任务分配
在整个小组任务中,我的主要工作是负责LASTVT集的构造算法。
若表达示文法举例如下:
(1)E’->#E#
(2)E->E+T
(3)E->T
(4)T->T*F
(5)T->F
(6)F->P↑F|P
(7)P->(E)
(8)P->i
现对LASTVT集算法简单描述:
用于构建输入文法的LastVT集
①若有规则U:
:
=…a或U:
:
==…aV,则a属于LastVT(U)
②若有规则U:
:
=…V,且a属于LastVT(V)则a属于LastVT(U)
设一个栈STACK,和一个布尔数组B
Procedure
Insert(U,a)
IFNOTB[U,a]THEN
BEGIN
B[U,a]:
:
=TRUE;把(U,a)推进STACK栈;
END;
BEGIN
FOR每个非终结符号U和终结符号aDO
B[U,a]:
=FALSE;
FOR每个形如U:
:
=…a或U:
:
=…aV的规则DO
INSERT(U,a);
WHILESTACK栈非空DO
BEGIN
把STACK栈的栈顶弹出,记为(V,a);
FOR没条形如U:
:
=…V的规则DO
INSERT(U,a);
ENDOFWHILE;
END;
具体算法如下:
Begin
For每个终结符B和终结符aDoF[P,a]=FALSE;
For每个形如B->…a或P->…aQ的产生式,
Doinsert(B,a)
WhileStack非空Do
Begin
把Stack的顶端,记为(Q,a),上托出去;
For每条形如B->…Q的产生式
Insert(B,a)
Endofwhile;
END
针对上述算法可得到每个非终结符的LastVT集如下:
LASTVT(E')={#}
LASTVT(E)={+,*,↑,),i}
LASTVT(T)={*,↑,),i}
LASTVT(F)={↑,),i}
LASTVT(P)={),i}
6.3用关系图形法构造LASTVT集
LASTVT集可以由简单的关系图形求的,其图形的构造方法为:
1、图中的结点为某个非终结符的LASTVT集或终结符号。
2、对每一个形如A->…和A->Bb…的产生式,则构造由LASTVT(A)结点到终结符结点@用箭弧连接的图形。
3、对每一个形如A->B…的产生式,则应对图中由LASTVT(A)结点到LASTVT(B)结点用箭弧连接。
4、若某一非终结符A的LASTVT(A)经箭弧有路径能到达某终结符结点a,则有a∈LASTVT(A)。
例如在上述文法举例的LASTVT集合:
LASTVT(E')={#}
LASTVT(E)={+,*,↑,),i}
LASTVT(T)={*,↑,),i}
LASTVT(F)={↑,),i}
LASTVT(P)={),i}
可以用关系图形法计算如下图:
关系图形法计算FIRSTVT集合
6.4算符优先分析算法思想
1算符优先关系表算法描述
FOR每条规则U:
:
=x1x2…xnDO
FORi:
=1TOn-1DO
BEGIN
IFxi和xi+1均为终结符,THEN置xi=xi+1
IFi<=n-2.且xi和xi+2都为终结符号但xi+1为非终结符号THEN置xi=xi+2
IFxi为终结符号xi+1为非终结符号THEN
FORFIRSTVT(xi+1)中的每个bDO
置xi
IFxi为非终结符号xi+1为终结符号THEN
FORLASTVT(xi)中的每个aDO
置a>xi+1
END
针对上述文法举例,计算优先关系为:
a)=关系
由产生式(0)E’->#E#和(6)P->(E)
可得#=#,(=)成立,为了求<,>关系,首先计算每个非终结符的FIRSTVT集合LASTVT集合。
计算结果如下:
FIRSTVT(E')={#}
FIRSTVT(E)={+,*,↑,(,i}
FIRSTVT(T)={*,↑,(,i}
FIRSTVT(F)={↑,(,i}
FIRSTVT(P)={(,i}
LASTVT(E')={#}
LASTVT(E)={+,*,↑,),i}
LASTVT(T)={*,↑,),i}
LASTVT(F)={↑,),i}
LAVSTVT(P)={),i}
然后逐条扫描产生式寻找终结符在前非终结符在后的相邻符号对,及非终结符在前终结符在后的相邻符号对,即产生式有部有形如:
A→…aB… 和A→…Bb…的产生式
b)<关系:
对所给表达式中终结符在前非终结符在后的相邻符号对有
#E则有:
#<FIRSTVT(E)
+T则有:
+<FIRSTVT(T)
*F则有:
*<FIRSTVT(F)
↑F则有:
↑<FIRSTVT(F)
(E则有:
(<FIRSTVT(E)
c)>关系:
对表达式文法中非终结符在前终结符在后的相邻符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计