




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理课程设计 课程名称 编译原理 题目名称 pl0编译器的功能扩充 学生学院 计算机学院 专业班级06级计算机科学与技术6班学 号 3106006669 2008 年 12 月 20日一、完成的实验内容及说明基本内容(1)扩充赋值运算:+= 和 -=(2)扩充语句 repeat dowhile 其中,是循环条件,即条件成立时,重复执行循环体的选做内容(1)增加运算:+ 和 -。(2)增加类型: 字符类型; 实数类型。(3)扩充函数: 有返回值和返回语句; 有参数函数。(4)增加一维数组类型二、实验环境与工具(1)计算机及操作系统:pc机,windowsxp(2)程序设计语言:c+builder5,vc 6.0(3)教学型编译程序:pl/0 三、设计方案(1) 概述:源、目标语言,实现工具(平台),运行平台源语言: pl/0;源程序文件以.pl0为后缀命名目标语言: 目标代码(生成的文件后缀为*.cod)实现平台: borland c+builder 6运行平台: windowsxp(2) 结构设计说明:各功能模块描述error()出错处理,打印出错位置和错误号getch()漏掉空格,读取一个字符getsym() 词法分析,读取一个单词 gen()目标代码生成过程,本过程用于把生成的目标代码写入目标代码数组,供后面的解释器解释执行test() 测试当前单词是否合法过程testenter() 登陆符号表过程enterposition() 在符号表中查找指定符号所在位置的函数position,如果找不到就返回0vardeclaration()变量声明listcode()列出目标代码清单;factor()33 因子处理过程factorterm() 项处理过程term; expression() 表达式处理过程condition() 条件处理过程statement() 语句处理过程block() 语法分析过程 base()通过静态链求出数据区基地址的函数,interpret ()对目标代码解释运行过程(3) 主要成分描述 符号表在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,符号表中所登记的信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。一张符号表的每一项(或称入口才包含两大栏(或称区段、字域),即名字栏(name),信息栏(information) 信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,由于查填符号表一般是通过匹配名字来寮现的,因此,名字栏也称主栏。主栏的内容称为关键字(key word)。 运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。源程序的标识符存放在table表中,目标代码存放在code中,s是由解释程序定义的一维整型数组,是程序运行时的数据存储空间。解释程序还定义了4个寄存器:1)p:程序地址寄存器:指向下一条要执行的目标程序的地址(相当目标程序code数组的下标)。2)i:指令寄存器:存放着当前正在解释的下一条目标指令。3)t:栈顶寄存器:由于每个过程当它被运行时,给它分配的数据空间(下边称数据段)包括静态部分和动态部分,对于动态部分,要注意的是,栈顶寄存器指出了当前栈中最新分配的单元。4)b:基址寄存器:指向每个过程被调用时,在数据区s中给它分配的数据段的起始地址,也称基地址。 语法分析方法自顶向下的语法分析: . var ; a begin end read ( ) a 中间代码表示对pl/0编译程序的目标代码的指令格式描述如下: f l a其中f代表功能码,l表示层次差,a的含意对不同的指令有所区别,见下面对每条指令的解释说明:lit 0 a将常数值取到栈顶,a为常数值lod l a将变量值取到栈顶,a为偏移量,l为层差sto l a将栈顶内容送入某变量单元中,a为偏移量,l为层差cal l a调用过程,a为过程地址,l为层差int 0 a在运行栈中为被调用的过程开辟a个单元的数据区jmp 0 a无条件跳转至a地址jpc 0 a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行opr 0 0过程调用结束后,返回调用点并退栈opr 0 1栈顶元素取反opr 0 2次栈顶与栈顶相加,退两个栈元素,结果值进栈opr 0 3次栈顶减去栈顶,退两个栈元素,结果值进栈opr 0 4次栈顶乘以栈顶,退两个栈元素,结果值进栈opr 0 5次栈顶除以栈顶,退两个栈元素,结果值进栈opr 0 6栈顶元素的奇偶判断,结果值在栈顶opr 0 7opr 0 8次栈顶与栈顶是否相等,退两个栈元素,结果值进栈opr 0 9次栈顶与栈顶是否不等,退两个栈元素,结果值进栈opr 0 10次栈顶是否小于栈顶,退两个栈元素,结果值进栈opr 0 11次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈opr 0 12次栈顶是否大于栈顶,退两个栈元素,结果值进栈opr 0 13次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈opr 0 14栈顶值输出至屏幕opr 0 15屏幕输出换行opr 0 16从命令行读入一个输入置于栈顶四、源程序 /* pl0 compiler with code generation */-#include #pragma hdrstop#include unit1.h/-#pragma package(smart_init)#pragma resource *.dfmtform1 *form1;/-const al = 10; /* length of identifiers */const norw = 26; /* # of reserved words */const txmax = 100; /* length of identifier table */const nmax = 15; /* max number of degits in numbers */const amax =2047; /* maximum address */const levmax= 3; /* max depth of block nesting */const cxmax = 200; /* size of code array */typedef enum nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq,addneq, jianneq, addadd,jianjian, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym,elsesym, thensym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym, progsym ,repeatsym,untilsym, forsym,tosym,downtosym ,intsym,charsym,realsym,colon,charnum, yinhao,arraysym ,ofsym ,lzparen ,rzparen ,fuction symbol;char *symout = nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, addneq ,jianneq,addadd, jianjian, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym,elsesym,thensym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym, progsym,repeatsym,colon untilsym,forsym,tosym,downtosym,intsym,charsym,realsym, charnum,yinhao,arraysym,ofsym,lzparen,rzparen,fuction;typedef int *symset; / set of symbol;typedef char alfa11;typedef enum constant, procedur ,fuctionc ,charc,int,real,array,notype objects ; /no-type表示不需进行类型检查typedef enum lit, opr, lod, sto, cal, ini, jmp, jpc fct;typedef struct objects return_type;/返回值类型 int passnum; /参数的个数 int cx10;/填充参数的code地址,用于回填 canshu ;typedef struct fct f; /*function code*/ int l; /*0.levmax level*/ int a; /*0.amax displacement addr增加类型从这里改*/ instruction; /* lit o a - load constant a */ /* opr 0 a - execute opr a */ /* lod l a - load variable l,a */ /* sto l a - store variable l,a */ /* cal l a - call procedure a at level l */ /* ini 0 a - incremet t-register by a */ /* jmp 0 a - jump to a */ /* jpc 0 a - jump conditional to a */char ch; /*last char read*/symbol sym; /*last symbol read*/alfa id; /*last identifier read*/objects kind;int num; /*last number read*/int num1;/辅助处理real类型int cc; /*character count*/int ll; /*line length*/int cx; /*code allocation index*/char line81;instruction codecxmax;alfa kwordnorw+1;symbol wsymnorw+1;symbol ssym+1;alfa mnemonic9;symset declbegsys, statbegsys, facbegsys;struct alfa name; objects kind; union int val; /*constant*/ struct int level,adr,size; canshu *fp;/函数或过程附加信息指针 vp; /*variable,procedur:*/ ; tabletxmax;file *fin,*fout;int err;void expression(symset fsys, int lev, int &tx,int type);void term(symset fsys, int lev, int &tx,int type);void fuctiondo(symset fsys,int lev,int &tx);/-int symin(symbol sym, symset s1) return s1sym;/-symset symsetunion(symset s1, symset s2) symset s=(symset)malloc(sizeof(int)*45); for (int i=0; i45; i+)if (s1i | s2i) si=1;else si=0; return s;/-symset symsetadd(symbol sy, symset s) symset s1; s1=(symset)malloc(sizeof(int)*45); for (int i=0; i45; i+) s1i=si; s1sy=1; return s1;/-symset symsetnew(symbol a) symset s; int i,k; s=(symset)malloc(sizeof(int)*45); for (i=0; i45; i+) si=0; sa=1; return s;/-symset symsetnew(symbol a, symbol b) symset s; int i,k; s=(symset)malloc(sizeof(int)*45); for (i=0; i45; i+) si=0; sa=1; sb=1; return s;/-symset symsetnew(symbol a, symbol b, symbol c) symset s; int i,k; s=(symset)malloc(sizeof(int)*45); for (i=0; i45; i+) si=0; sa=1; sb=1; sc=1; return s;/-symset symsetnew(symbol a, symbol b, symbol c, symbol d) symset s; int i,k; s=(symset)malloc(sizeof(int)*45); for (i=0; i45; i+) si=0; sa=1; sb=1; sc=1; sd=1; return s;/-symset symsetnew(symbol a, symbol b, symbol c, symbol d,symbol e) symset s; int i,k; s=(symset)malloc(sizeof(int)*45); for (i=0; i45; i+) si=0; sa=1; sb=1; sc=1; sd=1; se=1; return s;/-symset symsetnew(symbol a, symbol b, symbol c, symbol d,symbol e, symbol f) symset s; int i,k; s=(symset)malloc(sizeof(int)*45); for (i=0; i45; i+) si=0; sa=1; sb=1; sc=1; sd=1; se=1; sf=1; return s;/-symset symsetnull() symset s; int i,n,k; s=(symset)malloc(sizeof(int)*45); for (i=0; iprintls(s.c_str(),n); fprintf(fout,%s%dn, s.c_str(), n); err+; /*error*/-void getch() if (cc=ll) if (feof(fin) form1-printfs(program incomplete); fprintf(fout,program incompleten); fclose(fout); exit(0);ll=0; cc=0;ch= ;while (!feof(fin) & ch!=10) ch=fgetc(fin); linell+=ch; linell-1= ; linell=0; string s=inttostr(cx); while(s.length()printfs(s.c_str(); fprintf(fout,%sn,s); ch=linecc+; /*getch()*/-void getsym() int i,j,k; alfa a; while (ch=a & ch=z) /*id or reserved word*/ k=0;do if (k=a & ch=0 & ch=9);ak=0;strcpy(id,a); i=1; j=norw;do k=(i+j) / 2; if (strcmp(id,kwordk)=0) i=k+1;while(i j) sym=wsymk;else sym=ident; else if(ch=39) getch(); num=ch; sym=charnum; getch(); if(ch!=39)error(114); getch(); else if (ch=0 & ch=0 & chnmax) error(30); kind=int; else getch(); if(ch=0 & ch=0 & chnmax) error(30); else error(103); else if (ch=:) getch();if (ch=) sym=becomes; getch(); else sym=colon; else /* the following two check were added because ascii does not have a single character for = */ if (ch=) sym=neq; getch(); else sym=lss;else if (ch=) getch();if (ch=) sym=geq; getch(); else sym=gtr; else if(ch=+) getch(); if(ch=)sym=addneq; getch(); else if(ch=+) sym=addadd;getch(); else sym=plus; else if(ch=-) getch(); if(ch=)sym=jianneq; getch(); else if(ch=-) sym=jianjian;getch(); else sym=minus; else if(ch=)sym=yinhao;getch(); else sym=ssymch; getch(); /*getsym()*/-void gen(fct x, int y, int z) if (cxcxmax) form1-printfs(program too long);fprintf(fout,program too longn);fclose(fout); exit(0); codecx.f=x; codecx.l=y; codecx.a=z; cx+; /*gen*/-void test(symset s1, symset s2, int n) if (!symin(sym,s1) error(n);while (!symin(sym,symsetunion(s1,s2) getsym(); /*test*/-void enter(objects k, int lev, int &tx, int&dx) /*enter object into table*/ tx+; strcpy(tabletx.name,id); tabletx.kind=k; switch (k) case constant: if (numamax) error(31); num=0; tabletx.val=num; break; case fuctionc: tabletx.vp.level=lev; tabletx.vp.fp=null;/函数或过程附加信息指针置为null break; case procedur: tabletx.vp.level=lev; tabletx.vp.fp=null; break; /*enter*/-/重载 enter,对变量的entervoid enter( int lev, int &tx) /*enter object into table*/ tx+; strcpy(tabletx.name,id); tabletx.vp.level=lev; tabletx.vp.fp=null; /*enter*/-int position(alfa id, int tx) /*find identifier in table*/ int i=tx; strcpy(table0.name,id); while (strcmp(tablei.name,id)!=0) i-; return i; /*position*/-void constdeclaration(int lev,int &tx,int &dx) if (sym=ident) getsym(); if (sym=eql|sym=becomes) if (sym=becomes) error(1); getsym(); if (sym=number) enter(constant,lev,tx,dx); getsym(); else error(2); else error(3); else error(4); /*constdeclaration()*/-void vardeclaration(int lev,int &tx,int &dx) /不再用 这个处理变量声明 if (sym=ident) enter(int,lev,tx,dx); getsym(); else error(4); /*vardeclaration()*/-void listcode(int cx0) /*list code generated for this block*/ if (form1-listswitch-itemindex=0) for (int i=cx0; icx; i+) string s=inttostr(i); while(s.length()printfs(s.c_str(); fprintf(fout,%3d%5s%4d%4dn,i,mnemoniccodei.f,codei.l,codei.a); /*listcode()*/;/-int factor(symset fsys, int lev, int &tx,int type) int n,i=0; symbol temp; test(facbegsys,fsys,24); while (symin(sym,facbegsys) if (sym=ident) i=position(id,tx); if (i=0) error(11); else if(tablei.kind!=type&type!=notype&type!=array)error(104); if(tablei.kind=array) getsym(); if(sym!=lzparen)error(105); getsym(); if(sym=number&kind=int) gen(lod,lev-tablei.vp.level,tablei.vp.adr+num-1); /else if(sym=ident) / n=position(id,tx); / else error(105); getsym(); if(sym!=rzparen)error(105); elseswitch (tablei.kind) case constant: gen(lit,0,tablei.val); break; case int: case charc: case real: gen(lod,lev-tablei.vp.level,tablei.vp.adr); break; case procedur: case fuctionc:fuctiondo(symsetadd(lparen,fsys),lev,tx); break; getsym(); if(sym=addadd|sym=jianjian) return i; else /字符值 if (sym=charnum) if(type!=charc&type!=notype)error(104);if (num256|numamax) error(31); num=0; gen(lit,0,num); getsym(); else/real型值 if (sym=number&kind=real) if(type!=real&type!=notype)error(104);if (numamax) error(31); num=0; gen(lit,0,num); getsym(); elseif (sym=lparen) getsym(); expression(symsetadd(rparen,fsys),lev,tx,type); if (sym=rparen) getsym(); else error(22); else if(sym=addadd|sym=jianjian) temp=sym; getsym(); if(sym!=ident)error(95); else n=factor(symsetunion(fsys,symsetnew(times,slash),lev,tx,type); gen(lit,0,1); if(temp=addadd)gen(opr,0,2); else gen(opr,0,3); gen(sto,tablen.vp.level,tablen.vp.adr); gen(lod,lev-tablen.vp.level,tablen.vp.adr); test(fsys,facbegsys,23); return i;/*factor*/-void term(symset fsys, int lev, int &tx,int type) /*term*/ symbol mul
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 英语主题阅读-五年级英语
- 海外务工人员权益保护担保合同模板
- 车间安全生产事故调查与处理合同
- 野餐食物承包方案
- 应急广播拆除方案
- 特殊机构规划方案模板
- 成都市长租公寓租赁合同书含租客入住前检查
- 业务合作方案书
- 施工企业信贷支持方案
- 吴中数学面试题及答案
- 专利基础知识教学课件
- 2025美国急性冠脉综合征(ACS)患者管理指南解读课件
- 水泥厂现场巡检知识培训
- 2015海湾消防JB-QB-GST200 火灾报警控制器(联动型)安装使用说明书
- 中国各省区地图、基本资料
- 2025年上半年中国长江三峡集团限公司“脱贫家庭毕业生”招聘(173人)易考易错模拟试题(共500题)试卷后附参考答案
- 学校物业管理的重点及难点分析
- 大脑病理解剖
- 关于办公室安全的培训
- 办公用品价格清单
- 2025年高考物理复习之小题狂练600题(实验题):测量电压表或电流的内阻(10题)
评论
0/150
提交评论