




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 编译原理课程设计 课程名称 编译原理 题目名称 pl0编译器的功能扩充 学生学院 计算机学院 专业班级06级计算机科学与技术6班学 号 3106006669 2008 年 12 月 20日一、完成的实验内容及说明基本内容(1)扩充赋值运算:+= 和 -=(2)扩充语句 repeat dowhile 其中,是循环条件,即条件成立时,重复执行循环体的选做内容(1)增加运算:+ 和 -。(2)增加类型: 字符类型; 实数类型。(3)扩充函数: 有返回值和返回语句; 有参数函数。(4)增加一维数组类型二、实验环境与工具(1)计算机及操作系统:pc机,windowsxp(2)程序设计语言:c+buil
2、der5,vc 6.0(3)教学型编译程序:pl/0 三、设计方案(1) 概述:源、目标语言,实现工具(平台),运行平台源语言: pl/0;源程序文件以.pl0为后缀命名目标语言: 目标代码(生成的文件后缀为*.cod)实现平台: borland c+builder 6运行平台: windowsxp(2) 结构设计说明:各功能模块描述error()出错处理,打印出错位置和错误号getch()漏掉空格,读取一个字符getsym() 词法分析,读取一个单词 gen()目标代码生成过程,本过程用于把生成的目标代码写入目标代码数组,供后面的解释器解释执行test() 测试当前单词是否合法过程teste
3、nter() 登陆符号表过程enterposition() 在符号表中查找指定符号所在位置的函数position,如果找不到就返回0vardeclaration()变量声明listcode()列出目标代码清单;factor() 因子处理过程factorterm() 项处理过程term; expression() 表达式处理过程condition() 条件处理过程statement() 语句处理过程block() 语法分析过程 base()通过静态链求出数据区基地址的函数,interpret ()对目标代码解释运行过程(3) 主要成分描述 符号表在编译程序中符号表用来存放语言程序中出现的有关标识
4、符的属性信息,符号表中所登记的信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。一张符号表的每一项(或称入口才包含两大栏(或称区段、字域),即名字栏(name),信息栏(information) 信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,由于查填符号表一般是通过匹配名字来寮现的,因此,名字栏也称主栏。主栏的内容称为关键字(key wo
5、rd)。 运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。源程序的标识符存放在table表中,目标代码存放在code中,s是由解释程序定义的一维整型数组,是程序运行时的数据存储空间。解释程序还定义了4个寄存器:1)p:程序地址寄存器:指向下一条要执行的目标程序的地址(相当目标程序code数组的下标)。2)i:指令寄存器:存放着当前正在解释的下一条目标指令。3)t:栈顶寄存器:由于每个过程当它被运行时,给它分配的数据空间(下边称数据段)包括静态部分和动态部分,对于动态部分,要注意的是,栈顶寄存器指出了当前栈中最新分配的单元。4)b:基址寄存器:指向每个
6、过程被调用时,在数据区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
7、无条件跳转至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次栈顶是否小于栈顶,退两个栈
8、元素,结果值进栈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 *f
9、orm1;/-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 = 20
10、0; /* 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, cons
11、tsym, 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, jianj
12、ian, 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,fucti
13、on;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地址,用
14、于回填 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 l
15、evel 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 l
16、l; /*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;/函数或过程附加信息指针
17、 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, symse
18、t 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=(symse
19、t)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)
20、*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) syms
21、et 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; s
22、f=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); exi
23、t(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
24、& 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) e
25、rror(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; e
26、lse 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
27、 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, in
28、t 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; ta
29、bletx.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
30、(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()
31、*/-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.leng
32、th()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.
33、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
34、 (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(
35、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
36、,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年教师招聘之《小学教师招聘》题库高频难、易错点100题模拟试题附答案详解(综合题)
- 2025年学历类自考国际公共关系-法学概论参考题库含答案解析(5卷)
- 2025年学历类自考国际公共关系-学前教育学参考题库含答案解析(5卷)
- 2025年教师招聘之《幼儿教师招聘》通关练习试题及一套答案详解
- 2025年学历类自考医学心理学-中国行政史参考题库含答案解析(5卷)
- 商丘市睢县招聘社区矫正专职社会工作者考试真题2024
- 郴州市安仁县城区学校选聘教师考试真题2024
- 2025江西吉安市青原区两山发展集团有限公司部分岗位任职要求调整笔试模拟有答案详解
- 2025年学历类自考公共关系策划-中国行政史参考题库含答案解析(5卷)
- GB/T 11376-1997金属的磷酸盐转化膜
- FZ/T 64012.2-2001水刺法非织造布第2部分:卫生用卷材
- SCI论文的写作与发表课件
- 印刷产品检验报告
- 2022年贵州省人民医院医护人员招聘笔试试题及答案解析
- “数学悖论”-辛普森悖论
- 医疗器械临床试验GCP三套考试题
- 烧结岗位安全操作培训-PPT课件
- 【课件】1.2 点线传情——造型元素之点线面 课件-2021-2022学年高中美术人美版(2019)选修绘画
- 运动处方(课堂PPT)
- 物资储备与物流方案
评论
0/150
提交评论