编译原理课程设计--对PL0进行扩充和修改.doc

编译原理课程设计--对PL0进行扩充和修改.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课 程 设 计 课程名称__编译原理_ _______ 题目名称__对PL0进行扩充和修改 学生学院__计算机学院 ________ 专业班级__计算机科学与技术___ 学 号 3106006475 学生姓名___杨振风 __ _______ 指导教师__ 吴伟民____________ 2009 年 1 月 7 日 课程设计概述 PL0语言是Pascal语言的一个子集,它的编译程序是一个编译解释执行系统,PL0的目标程序为假想栈式计算机的汇编语言,与具体的计算机无关。编译程序采用一趟扫描方式,已语法语义分析程序为核心,词法分析程序和代码生成的程序都作为一个独立的过程,当语法分析需要读单词的时候就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时候 ,就调用代码生成程序。此外用表格管理程序建立变量,常量和过程标识符的说明与引用之间的信息联系,用出错处理程序对词法和语义分析遇到的错误给出在源程序中出错的位置和错误性质。 本课程设计通过对PL/0(C语言版)进行修改和添加功能完成设计,通过修改词法分析程序、语法分析、程序编译主体block和解释执行等各部分的修改扩充,完成基本内容和选做内容。扩充了赋值运算+=、-=,运算++、--,以及扩充语句 repeat语句序列dowhile条件。 操作平台 操作系统Windows XP SP3,硬件:AMD athlon 3600+ 1.9GHZ,1G内存 软件:Visual C++6.0创天中文版 主要成分的描述 符号表 根据符号变量的存储类别定义及他们除向的位置和次序来确定每一个变量应分配的存储区及在该区的具体位置。编译程序有两类的存储区,即静态的存储区和动态的存储区。由于本课程设计没有添加其他的数据类型暂时不需要在符号表里面处理。 运行时存储组织和管理 采用栈式存储分配,运行时每进入一个过程,就在栈顶为该过程分配所需的数据空间,当一个过程工作完毕返回时,它在栈顶的数据空间也即释放程序运行时的存储空间,栈中在某一个时刻可能会包含某个过程的几个活动记录,即某个过程递归调用的情况,另外同样一个存储的位置,可能会不同运行时刻分配给不同的数据对象。 词法分析的过程 PL0的词法分析程序GETSYM是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析为此PL0设置了3个全程变量 SYM 存放每个单词的类别,用内部编码表示 ID 存放用户所定义的标识符的值。 NUM 存放用户定义的数 语法分析方法 在PL/0中是采用递归子程序法进行语法分析的,具体实现方法是为每个非终结符写一个函数,如遇到变量声明时调用变量声明函数,遇到常量声明时调用常量声明函数等。 中间代码表示 编译程序所使用的中间代码有多种形式。常见的有逆波兰式,三元式,四元式和树形表示。 目标代码 PL0编译程序所产生的目标代码是一个假想的栈式计算机汇编语言,可称为类PCODE指令代码,它不依赖于任何的实际计算机指令的格式如下: 其中f代表功能码,l代表层次差,也就是引用变量或过程的分程序与说明该变量或过程的分程序之间的层次差。a的含义对不同的指令有所区别。这里我们需要用到的有关目标指令有:LIT LOD STO CAL INT JMP JPC OPR 详细设计 扩充赋值运算 ①首先在头文件的enum symbol中添加自己定义的+=,-=运算的关键字peq和meq。还有#defiine symnum以便词法分析时能够正确的识别这些关键字。 ②在词法分析程序中添加对+=和-=的识别,也就是在程序中找到getsym函数,添加如下: else if(ch==+) { getchdo; if(ch===) { sym=peq;这里是自己的定义的+=的标识符 getchdo; } else if(ch==+) { sym=ppl; getchdo; } else { sym=plus; } } 同理对于-=的标识符: else if(ch==-) { getchdo; if(ch===) { sym=meq;这里是自己的定义的+=的标识符 getchdo; } else if(ch==-) { sym=mmi; getchdo; } else { sym=minus; } } ③接着在语句处理函数statement添加如下的代码: if(sym==becomes||sym==peq||sym==meq) { peqop=sym;这是自己定义的标识符,识别运算符 gets

文档评论(0)

li455504605 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档