编译器的代码生成.

上传人:我** 文档编号:113788336 上传时间:2019-11-09 格式:DOC 页数:52 大小:296KB
返回 下载 相关 举报
编译器的代码生成._第1页
第1页 / 共52页
编译器的代码生成._第2页
第2页 / 共52页
编译器的代码生成._第3页
第3页 / 共52页
编译器的代码生成._第4页
第4页 / 共52页
编译器的代码生成._第5页
第5页 / 共52页
点击查看更多>>
资源描述

《编译器的代码生成.》由会员分享,可在线阅读,更多相关《编译器的代码生成.(52页珍藏版)》请在金锄头文库上搜索。

1、佛山科学技术学院 实 验 报 告课程名称 编译原理 实验项目 编译器的代码生成 专业班级 计算机1班 姓 名 学 号 指导教师 黄营 成 绩 日 期 2014/6/7 一、实验目的; 掌握PL语言编译器的中间代码生成的程序分析与实现方法,并能对错误进行分析与处理二、实验内容; 为了使我们的编译程序保持适当简单的水平,不致陷入与本课程无关的实际机器的特有性质的考虑中去,我们假想有台适合PL程序运行的计算机,我们称之为PL处理机。PL处理机顺序解释生成的目标代码。三、实验原理;PL处理机的指令集根据PL语言的要求而设计,它包括以下的指令:(1)LIT /* 将常数置于栈顶 */(2)LOD /*

2、将变量值置于栈顶 */(3)STO /* 将栈顶的值赋与某变量 */(4)CAL /* 用于过程调用的指令 */(5)INT /* 在数据栈中分配存贮空间 */(6)JMP, JPC /* 用于if, while语句的条件或无条件控制转移指令 */(7)OPR /* 一组算术或逻辑运算指令 */上述指令的格式由三部分组成:FLA其中,f, l, a的含义见下表:FLaINT常 量LIT常 量LOD层次差数据地址STO层次差数据地址CAL层次差程序地址JMP程序地址JPC程序地址OPR运算类别表1 PL 处理机指令四、实验步骤; PL的编译程序为每一条PL源程序的可执行语句生成后缀式目标代码。另

3、一方面,发现错误,并给出合适的诊断信息且继续编译下去从而发现更多的错误,对于编译程序而言是完全必要的。结合关键字规则、镇定规则,采用策略:先用一些明显的关键符号给它赋初值,然后随着分析子目标的层次深入,逐步补充别的合法符号。5、 程序代码PL0.h:/*PL/0 编译系统C版本头文件 pl0.h*/*typedef enumfalse,true,bool;*/# define norw 20 /*关键字个数*/# define txmax 100 /*名字表容量*/# define nmax 14 /*number的最大位数*/# define al 10 /*符号的最大长度*/# defin

4、e amax 2047 /*地址上界*/# define levmax 3 /*最大允许过程嵌套声明层数0,lexmax*/# define cxmax 200 /*最多的虚拟机代码数*/*符号*/enum symbolnul, 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

5、, dosym, callsym, constsym,varsym, procsym, elsesym, forsym, tosym,downtosym,returnsym,pluseql, minuseql,plusplus,minusminus,repeatsym,dowhilesym,;#define symnum 43/*-*/enum object constant, variable, procedur,;/*-*/enum fctlit, opr, lod, sto, cal, inte, jmp, jpc,;#define fctnum 8/*-*/struct instruc

6、tion enum fct f; int l; int a;FILE * fas;FILE * fa;FILE * fa1;FILE * fa2;bool tableswitch;bool listswitch;char ch;enum symbol sym;char idal+1;int num;int cc,ll;int cx;char line81;char aal+1;struct instruction codecxmax;char wordnorwal;enum symbol wsymnorw;enum symbol ssym256;char mnemonicfctnum5;boo

7、l declbegsyssymnum;bool statbegsyssymnum;bool facbegsyssymnum;/*-*/struct tablestruct char nameal; /*名字*/ enum object kind; /*类型:const,var,array or procedure*/ int val; /*数值,仅const使用*/ int level; /*所处层,仅const不使用*/ int adr; /*地址,仅const不使用*/ int size; /*需要分配的数据区空间,仅procedure使用*/;struct tablestruct tab

8、letxmax; /*名字表*/FILE * fin;FILE* fout;char fnameal;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 expression

9、do(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=co

10、nstdeclaration(a,b,c)return -1#define vardeclarationdo(a,b,c) if(-1=vardeclaration(a,b,c)return -1void 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*s

11、r,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);void enter(enum

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号