广东工业大学PL0扩充课程设计报告陈

上传人:cn****1 文档编号:565037043 上传时间:2023-11-02 格式:DOCX 页数:20 大小:253.55KB
返回 下载 相关 举报
广东工业大学PL0扩充课程设计报告陈_第1页
第1页 / 共20页
广东工业大学PL0扩充课程设计报告陈_第2页
第2页 / 共20页
广东工业大学PL0扩充课程设计报告陈_第3页
第3页 / 共20页
广东工业大学PL0扩充课程设计报告陈_第4页
第4页 / 共20页
广东工业大学PL0扩充课程设计报告陈_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《广东工业大学PL0扩充课程设计报告陈》由会员分享,可在线阅读,更多相关《广东工业大学PL0扩充课程设计报告陈(20页珍藏版)》请在金锄头文库上搜索。

1、课程设计课程名称编译原理题目名称PL/O编译器的扩充学生学院计算机学院专业班级计算机科学与技术(7)学 号 3110006131学生姓名陈日燊指导教师林志毅2011 年 1 月 8 日课程设计目的与要求1、课程设计目的:在分析理解一个教学型编译程序(如PL/O)的基础上,对其词法分析 程序、语法分析程序和语义处理程序进行部分修改扩充。达到进一步了解 程序编译过程的基本原理和基本实现方法的目的。2、课程设计要求:对 PL/0 作以下修改扩充:(1)增加单词:保留字 ELSE,FOR,TO,DOWNTO,RETURN运算符 +=,-=,+,-,(2)修改单词:不等号# 改为 (3)增加条件语句的E

2、LSE子句,要求:写出相关文法,语法图,语义规则。实验环境与工具( 1)计算机及操作系统: PC 机, WindowsXP(2) 程序设计语言:VC+ 6.0, C/C+语言(3)教学型编译程序:PL/0三. 结构设计方案1、结构设计说明:PL/0 的编译程序以语法分析程序为核心,词法分析程序和代码生成程序 都作为一个独立的过程,当语法分析需要读单词时就用词法分析程序,而当 语法分析正确需生成相应的目标代码时,则调用代码生成程序。此外,用表 格管理程序建立变量,常量和过程标识符的说明与引用之间的信息联系。用 出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错 误性质。2、各功能

3、模块图示:3.各功能模块作用表:1PL0主程序2Error出错处理,打印出错位置和错误编码3Get Ch漏掉空格,读取一个字符4GetSym词法分析,读取一个单词5Gen生成目标代码,并送入目标程序区6TEST测试当前单词符号是否合法7ENTER登录名字表8POSITION杳找标识符在名字表中的位置9ConstDeclaration常量定义处理10VarDeclaration变量说明处理11ListCode列出目标代码清单12FACTOR因子处理13TERM项处理14EXPRESSION表达式处理15CONDITION条件处理16STATEMENT语句部分处理17Block分程序分析处理过程1

4、8BASE通过静态链求出数据区的基地址19Interpret对目标代码的解释执行程序PUO源握序词法分析程序表格管理程序语法分析程序出错管理程序程序计0分程序bl代码生陇程序V甘标程序图1编译程序的结构图图2功能模块调用关系图亠struct tablestruct/*名字*/*类型:const, var, array or procedure*/*数值,仅 const 使用*/*所处层,仅 const 不使用*/*地址,仅 const 不使用*/*需要分配的数据区空间,仅 procedure 使用*/char nameal;enum object kind; int val;int level

5、;int adr;int size;4. 保留关键字枚举结构enum symbolnul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,varsym,procsym,elsesym,forsym,tosym,downtosym,returnsym,pluseql,

6、minuseqlplusplus,minusminus,;5.名字表中标识符枚举类型:enum objectconstant,variable,procedur,;6.虚拟机enum fctlit,opr,lod,sto,cal,inte,jmp, jpc,;struct instructionenum fct f;int l;int a;/*常量*/*变量*/*过程*/* 虚拟机代码*/* 虚拟机代码结构*/* 虚拟机代码指令*/* 引用层与声明层的层次表*/* 根据 f 的不同而不同*/+=IfElseToToIdent表达式表达式Downto语句ForIdent语句*语句+ 条件(The

7、k语句语句+L-1+ +L-JNumber+表达式Ident表达式表达式 Ident因子8. 运行时存储组织和管理对于源程序的每一个过程(包括主程序),在被调用时,首先在数据段中开 辟三个空间,存放静态链SL、动态链DL和返回地址RA。静态链记录了定义该过 程的直接外过程(或主程序)运行时最新数据段的基地址。动态链记录调用该过 程前正在运行的过程的数据段基址。返回地址记录了调用该过程时程序运行的断 点位置。对于主程序来说,SL、DL和RA的值均置为0。静态链的功能是在一个 子过程要引用它的直接或间接父过程(这里的父过程是按定义过程时的嵌套情况 来定的,而不是按执行时的调用顺序定的)的变量时,可

8、以通过静态链,跳过个 数为层差的数据段,找到包含要引用的变量所在的数据段基址,然后通过偏移地 址访问它。在过程返回时,解释程序通过返回地址恢复指令指针的值到调用前的地址, 通过当前段基址恢复数据段分配指针,通过动态链恢复局部段基址指针。实现子 过程的返回。对于主程序来说,解释程序会遇到返回地址为0的情况,这时就认 为程序运行结束。解释程序过程中的base函数的功能,就是用于沿着静态链,向前查找相差指 定层数的局部数据段基址。这在使用sto、lod、stoArr、lodArr等访问局部变量的 指令中会经常用到。类PCODE代码解释执行的部分通过循环和简单的case判断不同的指令,做出 相应的动作

9、。当遇到主程序中的返回指令时,指令指针会指到0位置,把这样一 个条件作为终至循环的条件,保证程序运行可以正常的结束。9. 扩充赋值运算:+= 和 -= 设计:对于+=、 -=、 *=和/=赋值运算符,在程序中出现的情况只有如下一种,文法 的 EBNF 表示为:赋值语句:= 标识符 += | -= 表达式(1)扩充的语法描述见结构设计中的 PL/0 分程序和主要语句的语法描述 中的描述图;(2)分析区别赋值运算符采用:读标识符后再读一个字符,后根据读到的 字符转去不同的赋值语句执行。(3)中间代码生成情况:+=运算符,其他赋值运算符架构是一样的,只是 执行加法改为相应的算数运算。读到+=运算符单

10、词else if(sym=pluseql)i=position(id,*ptx);gendo(lod,lev-tablei.level,tablei.adr); getsymdo;if(sym=semicolon)getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);gendo(opr,0,2);if(i!=0)gendo(sto,lev-tablei.level,tablei.adr);else if(sym=minuseql)i=position(id,*ptx);gendo(lod,l

11、ev-tablei.level,tablei.adr);/检测到+=符号/把类x+=3的x的地址取出来/*找到变量地址并将其值入栈*/检测到-=符号/把类x-=3的x的地址取出来/*找到变量地址并将其值入栈*/getsymdo;if(sym=semicolon)getsymdo; memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);gendo(opr,0,3);if(i!=0)gendo(sto,lev-tablei.level,tablei.adr);10.扩充语句(Pascal的FOR语句): FOR

12、V变量:= 表达式TO 表达式DO 语句 FOR V变量:=v表达式DOWNTO V表达式 DO V语句其中,语句的循环变量的步长为1,语句的循环变量的步长为-1For i:= E1 to E2 do S1 循环语句 ALGOL 等价于:i:= E1;goto OVER;AGAIN :i:= i+1OVER : if iE2 thenBegin S1;goto again end;注意程序中基础用到循环控制变量i,因此entry (i)必须被保存下来,而Pascal 这样的语言中,循环变量在循环外也是可见的,本次扩充约定循环步长为 1 或者-1。具体 需要在程序staement ()添加for

13、的句法判断:else if(sym=forsym)/检测到for语句getsymdo;if(sym=ident)i=position(id,*ptx);if(i=0) error(11);elseif(tablei.kind!=variable) /赋值语句中,赋值号左部标识符属性应是变量error(12);i=0;elsegetsymdo;if (sym!=becomes) error (13) ;/赋值语句左部标识符后应是赋值号:=else getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlevtosym=true;/后跟符 to 和 downtonxtlevdowntosym=true;expressiondo(nxtlev,ptx,lev);/处理赋值语句右部的表达式Elgendo(sto,lev-tablei.level,tablei.adr); /保存初值switch(sym)case tosym:/步长为的向上增加getsymdo;c

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号