77范文网 - 专业文章范例文档资料分享平台

编译原理PL0报告(附源码教程)

来源:网络收集 时间:2020-04-16 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

编译原理课程设计

学 院 计算机学院

专 业 计算机科学与技术 班 级 学 号

姓 名 指导教师

20 年 月 日

一、课程设计要求

基本内容(成绩范围:“中”、“及格”或“不及格”) (1)扩充赋值运算:*= 和 /= 扩充语句(Pascal的FOR语句):

①FOR <变量>:=<表达式> TO <表达式> DO <语句> ②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句> 其中,语句①的循环变量的步长为2, 语句②的循环变量的步长为-2。 (3)增加运算:++ 和 --。

选做内容(成绩评定范围扩大到:“优”和“良”)

(1)增加类型:① 字符类型; ② 实数类型。 (2)扩充函数:① 有返回值和返回语句;② 有参数函数。 (3)增加一维数组类型(可增加指令)。 (4)其他典型语言设施。

二、概述

目标:实现PL0某些特定语句 实现语言:C语言 实现工具平台:VS201 运行平台:WIN7

三、结构设计说明与功能块描述 PL/0编译程序的结构图

PL/0编译程序的过程或函数的功能表 过程或函数名 pl0 error getsym 简要功能说明 主程序 出错处理,打印出错位置和错误编码 词法分析,读取一个单词 getch gen test block enter position(函数) constdeclaration vardeclaration listode statement expression term factor condition interpret base(函数)

PL/0编译程序的总体流程图

四、主要成分描述 1、 符号表

启动 置初值 漏掉空格,读取一个字符 生成目标代码,并送入目标程序区 测试当前单词符号是否合法 分程序分析处理过程 登录名字表 查找标识符在名字表中的位置 常量定义处理 变量说明处理 列出目标代码清单 语句处理 表达式处理 项处理 因子处理 条件处理 对目标代码的解释执行程序 通过静态链求出数据区的基地址 调用getsym取单词 调用block过程 N 是否为源程序结束符 出错 Y 源程序是否有错误 Y 打印错误 N 调用解释过程interpret解释执行目标执行目标程序 结束 编译程序里用了一个枚举类型enum symbol,然后定义了enum symbol sym来存放当前

的符号,前面讲过,主程序定义了一个以字符为元素的一维数组word,称保留字表,这个保留字表也存放在符号表里,为了识别当前的符号是属于哪些保留字;还有标识符,拼数,拼符合词等的符号名都存放在符号表里,当sym存放当前的符号时,我们可以判断它是属于哪类的符号,然后加以处理。

在运行的过程中,主程序中又定义了一个名字表,也就是符号表,来专门存放变量、常量和过程名的各个属性,里面的属性包括name,kind,val/level,adr,size,我们来举一个PL/0语言过程说明部分的片段:

Const a=35,b=49; Var c,d,e; Procedure p; Var g; name a b c d e p g ┋ Kind const const variable variable variable procedure variable ┋ Val/level 35 49 Lev Lev Lev lev lev+1 ┋ dx ┋ Adr dx dx+1 dx+2 size 4 当遇到标识符的引用时就调用position函数,根据当前sym的符号类型来查table表,看是否有过正确的定义,若已有,则从表中取相应的有关信息,供代码的生成用。若无定义则调用出错处理程序。

2、 运行时存储组织和管理

对于源程序的每一个过程(包括主程序),在被调用时,首先在数据段中开辟三个空间,存放静态链SL、动态链DL和返回地址RA。静态链记录了定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。动态链记录调用该过程前正在运行的过程的数据段基址。返回地址记录了调用该过程时程序运行的断点位置。对于主程序来说,SL、DL和RA的值均置为0。静态链的功能是在一个子过程要引用它的直接或间接父过程(这里的父过程是按定义过程时的嵌套情况来定的,而不是按执行时的调用顺序定的)的变量时,可以通过静态链,跳过个数为层差的数据段,找到包含要引用的变量所在的数据段基址,然后通过偏移地址访问它。

在过程返回时,解释程序通过返回地址恢复指令指针的值到调用前的地址,通过当前段基址恢复数据段分配指针,通过动态链恢复局部段基址指针。实现子过程的返回。对于主程序来说,解释程序会遇到返回地址为0的情况,这时就认为程序运行结束。

解释程序过程中的base函数的功能,就是用于沿着静态链,向前查找相差指定层数的局部数据段基址。这在使用sto、lod、stoArr、lodArr等访问局部变量的指令中会经常用。 类PCODE代码解释执行的部分通过循环和简单的case判断不同的指令,做出相应的动作。当遇到主程序中的返回指令时,指令指针会指到0位置,把这样一个条件作为终至循环的条件,保证程序运行可以正常的结束。

3、 语法分析方法

语法分析的任务是识别由词法分析给出的单词符号序列在结构上是否符合给定的文法规则.PL/0编译程序的语法分析采用了自顶向下的递归子程序法.粗略地说:就是对应每个非终结符语法单元,编一个独立的处理过程(或子程序).语法分析研究从读入第一个单词开始由非终结符程序即开始符出发,沿语法描述图箭头所指出的方向进行分析.当遇到非终结符时,则调用相应的处理过程,从语法描述图看也就进入了一个语法单元,再沿当前所进入的语法描述图的箭头方向进行分析,当遇到描述图中是终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,则执行相应的语义程序(就是翻译程序).再读取下一个单词继续分析.遇到分支点时将当前的单词与分支点上的多个终结符逐个相比较,若都不匹配时可能是进入下一非终结符语法单位或是出错.

如果一个PL/0语言程序的单词序列在整修语法分析中,都能逐个得到匹配,直到程序结

束’.’,这时就说所输入的程序是正确的.对于正确的语法分析做相应的语义翻译,最终得出目标程序.

4、 中间代码表示 中间代码表示格式如下: f L a 其中f代表功能码,l表示层次差,也就是变量或过程被引用的分程序与说明该变量或过程 的分程序之间的层次差.a的含意对不同的指令有所区别,见下面对每条指令解释说明.

1. 2. 3. 4. 5. 6. 7. 8.

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 过程调用结束后,返回调用点并退栈

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库编译原理PL0报告(附源码教程)在线全文阅读。

编译原理PL0报告(附源码教程).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/975999.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: