编译原理课程设计.docx
- 文档编号:11684964
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:18
- 大小:260.11KB
编译原理课程设计.docx
《编译原理课程设计.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计.docx(18页珍藏版)》请在冰点文库上搜索。
编译原理课程设计
案卷号
日期
<PL0编译器-PCompiler>
软件需求说明书
作者:
刁诗云、麻汉华、潘彦荃、周津、李程
完成日期:
2009年6月7日
签收人:
签收日期:
修改情况记录:
版本号
修改批准人
修改人
安装日期
签收人
V1.0
刁诗云
刁诗云
2009-5-17
刁诗云
V2.0
刁诗云
麻汉华
2009-5-19
刁诗云
V2.0
刁诗云
潘彦荃
2009-6-1
刁诗云
V2.0
刁诗云
李程
2009-6-3
刁诗云
V2.0
刁诗云
周津
2009-6-5
刁诗云
目录
软件需求说明书1
1引言1
1.1编写目的1
1.2项目背景1
2项目概述2
2.1产品描述2
2.2产品功能2
2.3用户特点2
3具体需求3
3.1EBNF定义的PL/0文法3
3.2语法图4
3.3功能需求6
3.4系统概要设计15
1引言
1.1编写目的
为了清楚表达客户提出的需求,便于用户理解和确认项目所包含的具体功能需求、性能需求以及非公能性需求,因此以文件化的形式,把系统整体及其部分的业务流程、系统功能进行了详细的说明。
同时,此文也对开发人员起到引导的作用,请认真阅读。
1.2项目背景
PL/0是由世界著名计算机科学家、PASCAL语言的创始人N.Wirth教授选择提供的。
在选择PL/0语言的过程中,Wirth很费了一番脑筋。
一方面他希望借助这个语言,能尽可能把程序设计语言和编译技术一些最重要的内容都讲到;但另一方面又不希望内容太多,太杂,而希望尽可能简单一些,以便与有限的课时和课程范围相适应。
于是他精心选择提供了这个PL/0语言。
事实证明,它非常适合于编译技术的教学,目前已被国内越来越多的编译教材所采用。
PL/0语言的语句类型比较丰富,能适应各种可能的程序结构。
最进本的是赋值语句。
组合结构语句有语句串、条件语句和循环语句。
还有重要的子程序概念,是通过过程说明和过程调用两部分实现的。
至于数据类型和数据结构,PL/0则特别简单,只有整数类型一种,没有数据结构,因此只允许有整常数和整数变量的说明以及相应的算术运算表达式。
PL/0允许在一个过程范围内说明常数、变量和过程。
这些常数、变量和过程只在它们被说明的过程范围内有效。
PL/0语言也允许递归调用,既可以间接递归,也可以直接递归。
2项目概述
2.1产品描述
2.2产品功能
使用Java语言作为实现语言,实现一个经过简单扩充的PL/0语言的编译器。
手工编码实现编译器的所有组成部分,不借助自动生成工具生成语法分析器和词法分析器。
编译器的目标平台是Java虚拟机,生成直接可以再java虚拟机上运行的类文件格式字节码文件。
例如:
有PL/0语言的源程序test.pl0。
本编译器为PCompiler。
则运行javaPCompilertet.pl0可将test.pl0编译成Java字节码文件。
如果输入的源程序正确,将生成类文件格式的Java字节码文件test.class。
2.3用户特点
该软件的最终用户面向广大程序员以及编程爱好者。
由于作者的时间及能力有限,所以存在各种漏洞不足是不可避免的。
3具体需求
3.1EBNF定义的PL/0文法
<程序>:
:
=<分程序>.
<分程序>:
:
=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
<常量说明部分>:
:
=const<常量定义>{,<常量定义>};
<常量定义>:
:
=<标识符>=<无符号整数>
<无符号整数>:
:
=<数字>{<数字>}
<标识符>:
:
=<字母>{<字母>|<数字>}
<变量说明部分>:
:
=var<标识符>{,<标识符>};
<过程说明部分>:
:
=<过程首部><分程序>{;<过程说明部分>}
<过程首部>:
:
=procedure<标识符>;
<语句>:
:
=<赋值语句>|<条件语句>|<当循环语句>|<过程调用语句>|<复合语句>|<读语句>|<写语句>|<空>
<赋值语句>:
:
=<标识符>:
=<表达式>
<表达式>:
:
=[+|-]<项>{<加法运算符><项>}
<项>:
:
=<因子>{<乘法运算符><因子>}
<因子>:
:
=<标识符>|<无符号整数>|‘(’<表达式>‘)’
<加法运算符>:
:
=+|-
<乘法运算符>:
:
=*|/
<条件>:
:
=<表达式><关系运算符><表达式>|odd<表达式>
<关系运算符>:
:
==|<>|<|<=|>|>=
<条件语句>:
:
=if<条件>then<语句>
<当循环语句>:
:
=while<条件>do<语句>
<过程调用语句>:
:
=call<标识符>
<复合语句>:
:
=begin<语句>{;<语句>}end
<读语句>:
:
=read‘(’<标识符>{,<标识符>}‘)’
<写语句>:
:
=write‘(’<表达式>{,<表达式>}‘)’
<字母>:
:
=a|b|c|d…..x|y|z
<数字>:
:
=0|1|2|3…...8|9
3.2语法图
程序语法描述图
分程序语法描述图
语句语法描述
条件语句描述图
表达式语法描述
项语法描述
因子语法描述
3.3功能需求
3.31用例图
3.32用例描述
名称
编译源码
标识符
UC-1
说明
把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言的目标程序的翻译程序。
编译程序属于采用生成性实现途径实现的翻译程序。
参与者
用户
使用频率
高
前置条件
无
后置条件
编译完一段代码
被扩展用例
无
被包含用例
分析词法,分析语法,分析语义,生成中间代码,优化代码,生成目标代码
基本操作流程
编译程序必须分析源程序,然后综合成目标程序。
首先,检查源程序的正确性,并把它分解成若干基本成分;其次,再根据这些基本成分建立相应等价的目标程序部分。
为了完成这些工作,编译程序要在分析阶段建立一些表格,改造源程序为中间语言形式,以便在分析和综合时易于引用和加工。
名称
分析词法
标识符
UC-2
说明
词法分析阶段是编译过程的第一个阶段,是编译的基础。
与此同时,在词法分析的过程中,同时也做了词法检查。
参与者
用户
使用频率
低
前置条件
编译源码
后置条件
无
被扩展用例
无
被包含用例
无
基本操作流程
从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描,然后根据语言的词法规则,分解和识别出每个单词(也称单词符号或符号),并把单词翻译成相应的机内表示。
名称
分析语法
标识符
UC-3
说明
语法分析是编译过程的一个逻辑阶段。
是在词法分析的基础上进行的。
通过语法分析,可以确定整个输入符号串是否构成一个语法正确的程序。
参与者
用户
使用频率
低
前置条件
分析词法
后置条件
无
被扩展用例
无
被包含用例
无
基本操作流程
根据语言的语法规则,在语法分析的基础上,把单词符号串分解成各类语法单位,如程序、表达式、语句等。
对含有语法错误的程序,要进行相应的出错处理,如显示出错误性质、出错部位等,以便程序员修改。
名称
分析语义
标识符
UC-4
说明
语义分析是编译过程的一个逻辑阶段。
目的是保证标示符和常数的正确使用。
参与者
用户
使用频率
低
前置条件
分析语法
后置条件
无
被扩展用例
无
被包含用例
无
基本操作流程
对源程序进行语义检查,把必要的信息收集、保存到符号表或中间代码程序中,并进行相应的处理。
名称
生成中间代码
标识符
UC-5
说明
中间代码生成对于编译程序来说并不是不可少的阶段。
编译程序采用中间代码,并随后对中间代码进行优化,其目的是为了最终能得到高效的目标代码。
这种中间代码结构简单,接近于计算机的指令形式,或者能容易地翻译成计算机的指令。
参与者
用户
使用频率
低
前置条件
无
后置条件
优化代码
被扩展用例
无
被包含用例
无
基本操作流程
在语法分析和语义分析的基础上,根据语法成分的语义对其进行翻译,这种翻译的结果即某种中间代码形式。
所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。
另外,还可以在中间代码一级进行与机器无关的优化。
产生中间代码的过程叫中间代码生成。
名称
优化代码
标识符
UC-6
说明
所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换。
程序代码可以是中间代码(如四元式代码),也可以是目标代码。
优化的含义是最终生成的目标代码短(运行时间更短、占用空间更小),时空效率优化。
参与者
用户
使用频率
低
前置条件
生成中间代码
后置条件
无
被扩展用例
无
被包含用例
无
基本操作流程
进行优化所需要的基础是对代码进行数据流分析和控制流分析。
利用删除多余运算、变换循环控制条件、以及删除无用赋值等等进行代码优化。
名称
生成目标代码
标识符
UC-7
说明
目标代码生成是编译程序的最后阶段。
如果编译程序采用了中间代码,那么,目标代码生成阶段的任务则是将中间代码或优化之后的中间代码转换为等价的目标代码,即机器指令或汇编指令。
参与者
用户
使用频率
低
前置条件
编译代码
后置条件
无
被扩展用例
无
被包含用例
无
基本操作流程
从前几个阶段得到的信息包括中间代码或优化后的中间代码,以及带有存储信息的符号表.这一阶段的主要任务是把源程序的中间代码变换成依赖于具体机器的等价的目标代码.。
3.3.3词法分析
词法分析阶段是编译过程的第一个阶段,是编译的基础。
这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。
词法分析程序实现这个任务。
0层
1层
2层
3.3.4语法分析
语法分析是编译过程的一个逻辑阶段。
语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确。
源程序的结构由上下文无关文法描述。
3.3.5语义分析
语义分析程序以语法分析的结果——语法树为输入,产生与源程序功能等价的中间代码。
中间代码的形式可以是后缀式,三元式或四元式等。
语义分析的任务包括:
(1)静态语义检查,如类型、运算、数组维数、越界等的检查;
(2)语义的处理,如变量的存储分配、表达式的求值、语句的翻译(生成中间代码)。
语义分析程序可以是单独的一个程序,在语法分析程序运行之后再运行,以语法分析呈现于的输出为输入;也可以和语法分析程序合在一起,当分析出一个语法单位后就检查相应的语义,生成中间代码。
语义分析可以采用多种分析技术,如语法制导的翻译。
语法制导的翻译实际上就是在语法分析的基础上,当分析完一个正确的语法单位后,添加相应的语义信息,直接生成相应的四元式表。
3.3.6Pcode指令
Pcode代码是一个假想栈式计算机汇编语言,它不依赖于任何实际计算机。
其指令格式如下:
f
l
a
其中f为功能码;l表示层次差,即变量或过程被引用的分程序与说明该变量或过程的分程序之间的层次差;a的含义对不同的指令有所区别,可以是常数值、位移量、操作符代码等。
目标指令有8条:
1
LIT
0
a
---------------
a为常数
a进栈
2
LOD
l
a
l为调用层与说明层的层差
a为变量在所说明层中的相对位置
变量进栈
3
STO
l
a
l为调用层与说明层的层差
a为变量在所说明层中的相对位置
栈顶的内容给变量
4
CAL
l
a
l为层差
a为被调用过程的目标程序入口地址
调用过程
5
INT
0
a
-------------------
a为开辟的单元个数
为被调用的过程在栈中开辟数据区
6
JMP
0
a
-------------------
a为转向地址
无条件转移
7
JPC
0
a
-------------------
a为转向地址
栈顶布尔值非零时转移
8
OPR
l
a
l为层差
a为操作符编码(见附录A中interpret)
栈顶与次栈顶的内容进行运算,结果放次栈顶
3.4系统概要设计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)