<PL0编译器-PCompiler>
软件需求说明书
作者:刁诗云、麻汉华、潘彦荃、周津、李程完成日期:2009年6月7日
签收人:
签收日期:
修改情况记录:
目录
软件需求说明书 (1)
1 引言 (1)
1.1 编写目的 (1)
1.2 项目背景 (1)
2 项目概述 (2)
2.1 产品描述 (2)
2.2 产品功能 (2)
2.3 用户特点 (2)
3 具体需求 (3)
3.1 EBNF定义的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。
则运行java PCompiler tet.pl0可将test.pl0编译成Java字节码文件。
如果输入的源程序正确,将生成类文件格式的Java字节码文件test.class。
2.3 用户特点
该软件的最终用户面向广大程序员以及编程爱好者。
由于作者的时间及能力有限,所以存在各种漏洞不足是不可避免的。
3 具体需求
3.1 EBNF定义的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 用例描述
3.3.3 词法分析
词法分析阶段是编译过程的第一个阶段,是编译的基础。
这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。
词法分析程序实现这个任务。
0层
1层
2层
3.3.4 语法分析
语法分析是编译过程的一个逻辑阶段。
语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确。
源程序的结构由上下文无关文法描述。
3.3.5 语义分析
语义分析程序以语法分析的结果——语法树为输入,产生与源程序功能等价的中间代码。
中间代码的形式可以是后缀式,三元式或四元式等。
语义分析的任务包括:
(1)静态语义检查,如类型、运算、数组维数、越界等的检查;
(2)语义的处理,如变量的存储分配、表达式的求值、语句的翻译(生成中间代码)。
语义分析程序可以是单独的一个程序,在语法分析程序运行之后再运行,以语法分析呈现于的输出为输入;也可以和语法分析程序合在一起,当分析出一个语法单位后就检查相应
的语义,生成中间代码。
语义分析可以采用多种分析技术,如语法制导的翻译。
语法制导的翻译实际上就是在语法分析的基础上,当分析完一个正确的语法单位后,添加相应的语义信息,直接生成相应的四元式表。
3.3.6 Pcode指令
Pcode代码是一个假想栈式计算机汇编语言,它不依赖于任何实际计算机。
其指令格式如下:
其中f为功能码;l表示层次差,即变量或过程被引用的分程序与说明该变量或过程的分程序之间的层次差;a的含义对不同的指令有所区别,可以是常数值、位移量、操作符代码等。
目标指令有8条:
3.4 系统概要设计。