编译原理报告.docx
- 文档编号:9039462
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:12
- 大小:109.92KB
编译原理报告.docx
《编译原理报告.docx》由会员分享,可在线阅读,更多相关《编译原理报告.docx(12页珍藏版)》请在冰点文库上搜索。
编译原理报告
pl0编译器设计
编译原理课程设计
专业:
计算机09-1
学生姓名:
李昊
指导教师:
程晓锦
完成时间:
2012.9.10
实验题目:
pl0编译器设计
实验目的:
通过简单的c的编写,了解高级语言的编译过程,理解词法分析,语法分析及语义分析,理解符号表及符号表的作用以及出错在编译过程中的作用。
同时通过c语言的编写,进一步提升学生编程水平,锻炼独立编程的能力
实验内容:
分析:
编译器的编写涉及到程序设计语言,计算机体系结构,语言理论,算法和编译原理等学科。
一个编译程序从逻辑上分为词法分析,语法分析,语义分析,代码级代码优化等5部分,为编好编译程序还需要有出错处理及符号表管理两个辅助模块。
编译原理课程由原理上讨论了编译程序的设计。
而且按照编译程序的逻辑组成分块讨论,为了对编译程序的设计有一个总体认识,深入理解编译程序中使用的技术,理解编译程序的改造,学习《编译原理》
分析某个语言的编译器,由于程序设计语言的编译器是十分庞大的。
在有限的课时条件下无法完成。
为了理解编译器的结构,掌握构造中的各种技术设计一个以c语言为版本的简化了的简单程序设计语言,为了编译程序构造的简单,仅仅处理整数数据类型,无数组,结构体等数据类型。
我们知道,一个编译程序是将某一个高级语言编写的源程序翻译成机器语言目标程序或者翻译成汇编语言目标程序。
然而翻译成汇编语言目标程序或机器语言目标程序需要十分熟悉目标机的指令系统,为编译器的编写带来很多麻烦。
为了简化编译器的编写,我们仅仅完成编译器的前端设计,即实现解释执行简化后的c语言源程序。
简化c语言文法
简化c语言文法定义(LL
(1)文法)
C程序:
:
=voidmain(){函数体}
函数体:
:
=变量定义部分语句列
变量定义部分:
:
=变量定义变量定义部分|ɛ
变量定义:
:
=int变量表
变量表:
:
=标识符|标识符,变量表
语句列:
:
=语句语句列|ɛ
语句:
:
=条件语句|循环语句|读语句|写语句|复合语句|表达式语句|空语句
条件语句:
:
=if(表达式)语句
循环语句:
:
=while(表达式)语句
读语句:
:
=read(变量表);
写语句:
:
=write(表达式表);
复合语句:
:
={语句列};
表达式语句:
:
=表达式;
空语句:
:
=;
表达式定义(算符优先文法)
表达式:
:
=变量=表达式|变量+=表达式|变量-=表达式|变量*=表达式|变量/=表达式|变量%=表达式|表达式1
表达式1:
:
=表达式1||表达式2|表达式2
表达式2:
:
=表达式2&&表达式3|表达式3
表达式3:
:
=表达式3==表达式4|表达式3!
=表达式4|表达式3>=表达式4|表达式3>表达式4|表达式3<=表达式4|表达式3<表达式4|表达式4
一课程设计题目
PL0编译器设计
二课程设计目的
《编译原理》是计算机科学专业的一门重要的基础课,该课程的实践性要求较高,通过编译原理的训练不仅可以更好地掌握,理解编译程序的设计,而且可以进一步的训练学生的编程能力,进一步掌握《数据结构》中讨论的各种结构及算法,是对学生编程能力的一个综合训练,本课程设计要求学生利用c/c++编写一个以c为样本的简单程序设计语言解释器
三课程设计内容
输入一个满足pl0的语法要求的源程序,生成pl0汇编目标程序,并解释执行目标程序的运算结果
四课程设计步骤
Pl/0语言是pascal语言子集,他的编译程序是编译解释执行系统,pl0的目标程序为假想栈式计算机的汇编语言,与具体以计算机无关,pl/0的编译程序和目标程序的解释执行程序都是用pascal语言书写的,因此pl/0语言可在配备pascal语言的任何机器上实现,当源程序编译正确时,pl/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序要求输入数据和输出运行结果,其编译和解释执行的结构如图所示
编译器的工作流程
词法分析
Pl的语言的词法分析器将要完成以下工作
1跳过分隔符(空格回车制表符)
2识别像begin,endifwhile等保留字
3识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id
4识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;
5识别:
=,<=,>=之类的特殊符号,全局变量sym则分别被置为SYM_BECOMES
语法分析
我们采用递归下降的方法来设计pl编译器。
以下我们给出该语言的first集合follow集合
非终结符
First(s)
Follow(s)
程序体
Constvarprocedureidentcallifbeginwhile
;
语句
Identcallbeginifwhile
;end
条件
Odd+-(identnumber
Thendo
表达式
+-(identnumber
;)Rendthendo
项
Identnumber(
;)R+-endthendo
例子
Identnumber(
;)R+-*/endthendo
以下是我们给出如何结合语法图编写(递归下降)语法分析程序的一般方法。
假设图s所对应的程序段为T(s)
Sn
..........
S2
S1
对应:
case语句或者条件语句:
CasechofifchinL1thenT(S1)else
L1:
T(S1);ifchinL2thenT(S2)else
L2:
T(S2);或.......
......IfchinLnthenT(Sn)else
Ln:
T(Sn);error
其中Liϵfirst(Si),ch为当前输入符号
(5)循环
对应whilechinLdoT(S)
(6)表示另一个图A的图
A
对应:
过程调用A
(7)表示终结符的单元图
对应ifch==xthenread(ch)elseerror
相关过程有:
block()constdeclaration(),vardeclaration()statement()condition()expression()term()factor()
他们之间依赖关系如图
语法分析过程依赖关系
语义分析
Pl的语义分析主要进行一下检查
1是否存在标识符先引用未声明的情况
2是否存在已声明的标识符的错误引用
3是否存在一般标识符的多重声明
Pl0的文法定义
《程序》:
:
=《分程序》
《分程序》:
:
=《常量定义》;《常量后分程序》|《常后分程序》
《常后分程序》:
:
=《变量定义》;《变后分程序》|《变后分程序》
《变后分程序》:
:
=const《常量定义表》
《常量定义表》:
:
=id|id,《变量表》
《过程定义》:
:
=producedureid;《分程序》
《语句》:
:
=《赋值语句》|《条件语句》|《循环语句》|《读语句》|《写语句》|《复合语句》
《赋值语句》:
:
=id:
=《表达式》
《读语句》:
:
=read(《变量表》)
《写语句》:
:
=write(《表达式表》)
《表达式表》:
:
=《表达式》|《表达式》,《表达式表》
《条件语句》:
:
=if《条件表达式》then《语句》
《循环语句》:
:
=while《条件表达式》do《语句》
《复合语句》:
:
=begin《语句列》end
《过程语句调用》:
:
=《有参表》
《表达式》:
:
=+《表达式1》|-《表达式1》|《表达式1》
《表达式1》:
:
=《表达式1》+《表达式2》|《表达式1》-《表达式2》|《表达式2》
《表达式2》:
:
=《表达式2》*《表达式3》|《表达式2》/《表达式3》|《表达式2》mod《表达式3》|《表达式3》
《关系表达式》:
:
=《表达式》>《表达式》
《关系表达式》:
:
=《表达式》>=《表达式》
《关系表达式》:
:
=《表达式》<《表达式》
《关系表达式》:
:
=《表达式》<=《表达式》
《关系表达式》:
:
=《表达式》=《表达式》
《关系表达式》:
:
=《表达式》#《表达式》
符号表结构
Constchar*pName;//符号名称
Intkind;//符号类别
Intval;//符号表中的位置值
Intlevel;//符号表的层数
Intparent;//符号的作用域
Intsize;//过程长度
CharstrBuff[MAXLENDTR]//符号堆
符号表的结构
Structtable
{
Stringkind;
Stringname;
Intval;
Intlevel;
Intadr;
Intsize;}table[txmax]
};
目标代码结构
StructCodeStruc
{
Charcode[5];
Intlevel;
Intaddr;
};
PL0指令格式图
F
L
A
指令码F所在层数差L操作数A
词法分析(扫描器)结构图,符号表的查找与填写操作实现算法
词法分析子程序名为getsym,功能是从源程序中读取一个单词符号(taken),把他的信息放入全局变量symid和num中,词法分析器需要单词时,直接从这三个变量中获得。
Getsym过程通过反复调用getch子过程从源程序获取字符,并把它们拼成单词。
Getch过程使用了缓冲技术提高了运行效率
Pl0词法分析程序流程图
目标代码解释执行过程
这个过程模拟了一台可以运行类pcode指令的栈式计算机。
它拥有一个栈式数据段用于存放
运行周期数据。
拥有一个代码段用于存放pcode程序代码。
同时还拥有数据段分配指针,指令指针,指令寄存器,局部段基址指针等寄存器。
解释执行pcode代码时,数据段存储分配方式如下:
对于源程序的每一个过程,在被调用时,首先在数据段开辟第三个空间,存放
静态链SL,动态链DL和返回地址RA。
静态链记录了定义该过程的直接外过程运行时的最新数据段的基地址。
动态链记录调用该过程前正在运行的过程的数据段基址。
返回地址记录了调用该过程时程序运行的断点位置。
对于主程序来说,SLDLRA的值均为0.静态链的功能是在一个子过程要引用他的直接或间接父过程的变量时可以通过静态连,跳过个数为层差的数据段,找到包含要引用的变量所在的数据段基址,然后通过偏移地址访问它
在过程返回时,解释程序通过返回地址恢复指令指针的值到调用前的地址,通过当前段基址恢复数据段的分配指针,通过动态链接恢复局部段基址指针。
实现子过程的返回。
对于主程序来说,解释程序会遇到返回地址为0的情况,这时就认为程序运行结束
解释程序过程中的base函数的功能,就是用于沿着静态连,向前查找相差制定层数的局部数据段基址,这在是使用sto,lod等访问局部变量的指令中会经常用到。
总结:
为期两周的课程设计终于结束了,在这次的课程设计中不仅锻炼了我所学的知识,同时也培养了我的实际操作编程能力,在设计过程中,大家相互讨论相互学习。
课程设计是编译原理课程知识的综合应用与实践训练。
是我们迈向社会,从事工作之前一个必不可的少的过度。
通过这次的课程设计,深深的体会到自己的水平还不高,认真的进行课程设计,学会了脚踏实地迈开这一步,就是为明天能立足于社会打下坚实的基础。
通过这次的pl0设计,这次的锻炼使得我的各方面能力都得以提高,综合运用了所学的理论知识,并把它们运用到实际当中,锻炼了我们的独立动手工作能力,同时独立思考的能力也得以提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 报告