没有合适的资源?快使用搜索试试~ 我知道了~
首页PL/0编译程序的研究与改进
PL/0编译程序的研究与改进
4星 · 超过85%的资源 30 下载量 11 浏览量
更新于2023-05-29
评论 4
收藏 230KB DOCX 举报
本文档为YSU《编译原理》课程三级项目的总结报告,内容为pl0编译程序的研究与改进,内容详细,含源码和截图,共29页。
资源详情
资源评论
资源推荐
第 1 页
PL/0 编译程序的研究与改进
(燕山大学 信息科学与工程学院)
摘 要: 本小组围绕 PL/0 编译程序进行研究,通过查阅资料、小组讨论等方式,明确
了 PL/0 编译程序的系统构成、涉及到的语言、组织结构等基础知识,对 PL/0 编译程序的
词法分析、语法分析、语义分析、目标代码生成、错误处理等内容有了深入的了解。通
过对 PL/0 编译程序的功能扩充,提高了学以致用的水平,锻炼了实践能力。
1 前言
“PL/0 编译程序的研究与改进”项目是《编译原理》课程学习的一个重要组成部分。
通过课程研究项目的实施,使我们在掌握编译原理基本内容和基本技术的基础上,
结合一种比较简单的程序设计语言 PL/0 的编译程序的开发深入理解并掌握编译程序
的相关知识、设计与开发方法,更好地培养计算机专业学生的专业技术能力和综合
素质。
2 实训目的
1、掌握编译程序的设计原理和方法;
2、掌握编译程序的开发技术;
3、掌握编程规范;
4、掌握软件文档的撰写方法;
5、培养团队合作精神、项目组织与管理、交流表达能力;
6、培养文件管理、资料保存、备份能力及意识。
3 项目任务
3.1 PL/0 编译程序的研究
1、研究 PL/0 编译程序的总体结构、头文件及用到的数据结构和变量;
2、研究词法分析功能的实现原理;
3、研究语法语义分析功能的实现原理和技术;
4、研究目标代码结构和代码生成的实现原理和技术;
5、研究错误处理的原理和技术;
6、研究目标代码解释执行时的存储分配。
第 2 页
3.2 PL/0 编译程序的改进
扩充 PL/0 编译程序的功能。以语法分析部分为例,可以增加处理更多语法成分的
功能,如可处理一维数组、++、--、+=、-=、*=、/=、%(取余)、!(取
反)、repeat、for、else、开方、处理注释、错误提示、标示符或变量中可以有下
划线等。
4 项目主要内容
4.1 对 PL/0 编译程序的研究
4.1.1 PL/0 编译程序的总体结构、头文件及用到的数据结构和变量
1、总体结构:
PL/0 语言可看成是 PASCAL 语言的子集,它的编译程序是一个编译解释执行系
统。PL/0 的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。其编译过
程采用一趟扫描方式,以语法分析程序为核心,词法分析程序和代码生成程序都作
为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析
正确需生成相应的目标代码时,则调用代码生成程序。此外,用表格管理程序建立
变量、常量和过程标识符的说明与引用之间的信息联系;用出错处理程序对词法和
语法分析遇到的错误给出在源程序中出错的位置和错误性质。当源程序编译正确
时,PL/0 编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程
序要求输入数据和输出运行结果。
图一 PL/0 编译系统构成
第 3 页
2、头文件
/*PL/0 编译系统 C 版本头文件 pl0.h*/
# define norw 13 /*关键字个数*/
# define txmax 100 /*名字表容量*/
# define nmax 14 /*number 的最大位数*/
# define al 10 /*符号的最大长度*/
# define amax 2047 /*地址上界*/
# define levmax 3 /*最大允许过程嵌套声明层数[0,lexmax]*/
# define cxmax 200 /*最多的虚拟机代码数*/
/*符号*/
enum symbol{
nul, ident, number, plus, minus,
times, slash, oddsym, eql, neq,
lss, leq, gtr, geq, lparen,
rparen, comma, semicolon,period, becomes,
beginsym, endsym, ifsym, thensym, whilesym,
writesym, readsym, dosym, callsym, constsym,
varsym, procsym,
};
#define symnum 32
/*名字表中的类型*/
enum object{
constant,
variable,
procedur,
};
/*虚拟机代码*/
enum fct{
lit, opr, lod, sto, cal, inte, jmp, jpc,
};
#define fctnum 8
/*虚拟机代码结构*/
struct instruction
{
enum fct f; /*虚拟机指令代码*/
int l; /*引用层与声明层的层次差*/
int a; /*根据 f 的不同而不同*/
};
第 4 页
FILE * fas; /*输出名字表*/
FILE * fa; /*输出虚拟机代码*/
FILE * fa1; /*输出源文件及其各行对应的首地址*/
FILE * fa2; /*输出结果*/
bool tableswitch; /*显示虚拟机代码与否*/
bool listswitch; /*显示名字表与否*/
char ch; /*获取字符的缓冲区,getch 函数使用*
/
enum symbol sym; /*当前的符号*/
char id[al+1]; /*当前 ident,多出的一个字节用于存放 0*/
int num; /*当前 number*/
int cc,ll; /*getch 使用的计数器,cc 表示当前字符 ch 的位置*/
int cx; /*虚拟机代码指针,取值范围[0,cxmax-1]*/
char line[81]; /*读取行缓冲区*/
char a[al+1]; /*临时符号,多出的一个字节用于存放 0*/
struct instruction code[cxmax]; /*存放虚拟机代码的数组*/
char word[norw][al]; /*保留字*/
enum symbol wsym[norw]; /*保留字对应的符号值*/
enum symbol ssym[256]; /*单字符的符号值*/
char mnemonic[fctnum][5]; /*虚拟机代码指令名称*/
bool declbegsys[symnum]; /*表示声明开始的符号集合*/
bool statbegsys[symnum]; /*表示语句开始的符号集合*/
bool facbegsys[symnum]; /*表示因子开始的符号集合*/
/*------------------------------*/
/*名字表结构*/
struct tablestruct
{
char name[al]; /*名字*/
enum object kind; /*类型:const,var,array,procedure*/
int val; /*数值,仅 const 使用*/
int level; /*所处层,仅 const 不使用*/
int adr; /*地址,仅 const 不使用*/
int size; /*需要分配的数据区空间,仅 procedure 使用*/
};
struct tablestruct table[txmax]; /*名字表*/
第 5 页
FILE * fin;
FILE* fout;
char fname[al];
int err; /*错误计数器*/
/*当函数中会发生 fatal error 时,返回-1 告知调用它的函数,最终退出程序*/
#define getsymdo if(-1==getsym())return -1
#define getchdo if(-1==getch())return -1
#define testdo(a,b,c) if(-1==test(a,b,c))return -1
#define gendo(a,b,c) if(-1==gen(a,b,c))return -1
#define expressiondo(a,b,c) if(-1==expression(a,b,c))return -1
#define factordo(a,b,c) if(-1==factor(a,b,c))return -1
#define termdo(a,b,c) if(-1==term(a,b,c))return -1
#define conditiondo(a,b,c) if(-1==condition(a,b,c))return -1
#define statementdo(a,b,c) if(-1==statement(a,b,c))return -1
#define constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1
#define vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1
void error(int n);
int getsym();
int getch();
void init();
int gen(enum fct x,int y,int z);
int test(bool*s1,bool*s2,int n);
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);
int block(int lev,int tx,bool* fsys);
void interpret();
int factor(bool* fsys,int* ptx,int lev);
int term(bool*fsys,int*ptx,int lev);
int condition(bool*fsys,int*ptx,int lev);
int expression(bool*fsys,int*ptx,int lev);
int statement(bool*fsys,int*ptx,int lev);
void listcode(int cx0);
int vardeclaration(int* ptx,int lev, int* pdx);
int constdeclaration(int* ptx,int lev, int* pdx);
int position(char* idt,int tx);
剩余25页未读,继续阅读
super_tong
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1