没有合适的资源?快使用搜索试试~ 我知道了~
编译原理课程设计报告,PL/0的研究与功能扩展
需积分: 1 7 下载量 127 浏览量
2022-11-11
10:38:28
上传
评论 2
收藏 2.51MB DOCX 举报
温馨提示
试读
32页
在本次改进中,通过对PL/0程序的头文件,源文件的更新以及定义新的头文件,小组共实现15个功能,包括一维数组,++,--,+=,-=,*=,/=,%(取余),!(取反),repeat,for(to,downto),else,处理注释,错误提示,标识符或变量中可以有下划线。添加了12个保留字,添加了两条opr指令。在原有的语法基础上,更新了EBNF。错误处理上,新增了对数组,repeat语句等的错误处理。
资源推荐
资源详情
资源评论
摘 要:通过查阅书籍与上网查询资料,我们探讨学习了 PL/0 编译程序的总体结构、头文
件及用到的数据结构和变量、词法分析功能的实现原理、语法语义分析功能的实现原理和
技术、目标代码结构和代码生成的实现原理和技术、错误处理的原理和技术、目标代码解
释执行时的存储分配,目的是掌握编译程序的设计原理和方法、开发技术、编程规范以及
软件文档的撰写方法。结论是 PL/0 语言的编译程序能充分体现一个高级语言编译程序实现
的基本方法和技术。因此,PL 语言的编译程序是一个非常适合的小型编译程序的数学模
型。
1 项目可行性
编译实现了计算科学从实践到理论的提升,是计算机处理、解决问题的科学方法
和目标,是计算科学的科学理论基础。一个编译程序将我们的思路、逻辑以完全固定
的模式记录下来,并且由编译器翻译给机器进行执行,使得多数计算机用户不必考虑
与机器有关的繁琐细节,使程序员和程序设计专家独立于机器,这对于当今机器的数
量和种类持续不断增长的年代尤为重要。对于编译程序的改进,尤其是典型的 PL/0 编
译程序的研究与改进具有广阔的前景。
PL/0 编译程序将 PL/0 源程序翻译成类 P-code 目标程序,源语言为 PL/0,目标语言
为类 P-code。PL/0 编译程序可用 C、Pascal 或 Java 等各种语言书写,对于学生而言已
经掌握相关的书写语言知识。在编译原理课程上,学习并掌握进行对源程序进行各种
分析的原理及过程。具有理解 PL/0 编译程序的知识储备,以及改进 PL/0 编译程序的
基础。
对 PL/0 编译程序和类 P-code 虚拟机进行联编,就可以生成目标平台上可执行的
PL/0 语言编译系统。用高级语言实现的类 P-code 虚拟机是平台无关的,因此 PL/0 语言
编译系统可方便地移植到任何目标平台,平台兼容性优秀。
组员已完成对软件工程课程的学习和掌握,具有对于计算机软件开发领域问题的
分析、整理,解决的综合能力及素质,能够系统性的、规范化的、可定量的过程化方
法去开发和维护软件。已具备对于 PL/0 编译程序的研究与改进相关的软件工程知识储
备和能力,能够完成对本项目的系统性的思考和实现以及完善。
2 PL/0 总体结构
PL/0 编译程序采用单遍扫描方式的编译过程,由词法分析程序、语法语义分析程序
以及代码生成程序 3 个独立的过程组成。PL/0 编译程序以语法语义分析程序为核心,当
语法分析需要读单词时就调用词法分析程序,而当语法语义分析正确需生成相应语言
成分的目标代码时,就调用代码生成程序。PL/0 编译程序的组织结构如图 1.1 所示。
图 2-1 PL/0 编译程序组织结构
当源程序编译有错时,PL/0 编译程序用出错处理程序对词法和语法语义分析遇到
的错误给出在源程序中出错的位置和错误性质。当源程序编译正确时,编译程序正常
结束,可输出相应的类 P-code 目标程序。
图 2-2 PL/0 编译程序的整体结构图
3 头文件 pl0.h
主要定义了程序中用到的各数据结构,说明了程序中出现的函数。
3.1 数据结构
数据结构分析和综合时所用的主要数据结是符号表和虚拟机代码结构。符号表由
源程序中所用的标识符连同它们的属性组成,其中属性包括名称,种类(如变量、数
组、过程,常量等)、标识符的层次相对地址和数据区大小。虚拟机代码结构中包括
虚拟机代码指令,引用层与声明层的层次差,以及具体调用的指令操作。并据此构造
了一个数组,来存储目标代码。
3.2 变量
变量是简单整型变量。需在变量说明部分进行说明(var),但无须给出数据类型,
因为只有整型变量。
3.3 函数说明
表 3-1 函数功能表
函数名
功能简要说明
void error(int n, int line)
出错处理函数,打印出错信息,错误总数加 1。
int getch()
读取字符函数,返回字符。
int getsym()
读取下一单词符号
int position(char* idt, int tx);
字符在符号表中位置查询函数返回值:返回标识符在
符号表中的索引
int gen(enum fct x, int y,int z);
生成目标代码,并送入目标程序区
int test(bool* s1, bool* s2,int n);
测试当前符号是否合法,若不合法,打印出错信息并
进行跳读
void enter(enum object k, int* ptx,int lev,
int* pdx);
在符号表中登录分程序说明部分出现的名字
int constdeclaration(int* ptx,int lev,int*
pdx) ;
处理常量说明,并将常量名及相应信息填入符号表
int vardeclaration(int* ptx,int lev, int*
pdx);
处理变量说明,并将变量名及相应信息填入符号表
int statement(bool* fsys, int* ptx,int lev) ;
分析处理各种语句
int condition(bool* fsys,int* ptx,int lev);
分析处理条件式
void listcode(int cx0);
打印目标代码
int block(int lev, int tx, bool* fsys);
PL0 编译器对外的接口,分析处理程序
void interpret() ;
解释执行目标代码
int base(int l,int* s,int b) ;
通过静态链求出数据区的基地址
int expression(bool* fsys,int* ptx,int lev)
表达式处理,由参数返回结果类型
int term(bool* fsys,int* ptx,int lev);
项处理,由参数返回结果类型
int factor(bool* fsys,int* ptx,int lev) ;
因子处理,由参数返回结果类型
int inset(int e, bool* s);
int addset(bool* sr, bool* s1, bool*s2,int n);
int subset(bool* sr, bool* s1, bool*s2,int n);
int mulset(bool* sr, bool* s1, bool*s2,int n);
使用数组实现集合的集合运算
3.4 指令说明
表 3-2 指令功能表
指令名
功能
LIT
将常量值取到运行栈顶.
LOD
将变量放到运行栈顶.
STO
将栈顶的内容送入某变量单元中.
CAL
调用过程的指令.
INT
为被调用的过程(或主程序)在运行栈中开辟数据区.
JMP
无条件转移指令.
JPC
条件转移指令,当栈顶的布尔值为真时,顺序执行,否则转向域的地址.
OPR
系运算符和算术运算指令.将栈顶和次栈顶的内容进行运算,结果存放栈顶.
4 源文件 pl0.c
4.1 初始化
进行运行前初始化,对保留字表 (word)、保留字表中每一个保留字对应的 symbol
类型 ( wsym )、部分符号对应的 symbol 类型表 ( ssym )、类 PCODE 指令助记符表
( mnemonic )、开始以及后跟符号集合 ( declbegsys、statbegsys 等)以及一些全局变量
的初始化
4.2 主函数
函数在打开 pl0 源程序文件后,main 函数调用 block 进行分析,生成 fa1.tmp 等文
件,其中 fa.pcode 文件输出虚拟机代码,若无错误则会调用解释器进行解释。
4.3 词法分析
词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序
进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中
间程序。执行词法分析的程序称为词法分析程序或扫描器。
主要调用的函数有:
(1)getch()函数
主要功能为读取一个字符放在全局变量 ch 里面,同时输出源代码以及行号。该函
数读取 PL/0 文件中一行,存入 line 缓冲区,line 被 getsym 取空后再读一行。每次从 line
缓冲区读出一个字符放在全局变量 ch 里面,被函数 getsym 调用。
图 4-1 getch()函数的执行流程图
(2)getsym()函数
剩余31页未读,继续阅读
资源评论
不吃海豹的白熊
- 粉丝: 212
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功