资源描述:
《计算机科学与技术课程设计:pl0编译器的扩充》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、课程设计课程名称编译原理题目名称PL/0编译器的扩充学生学院计算机学院专业班级计算机科学与技术(7)学号3110006131学生姓名陈日燊指导教师林志毅2011年1月8日一.课程设计目的与要求1、课程设计目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。达到进一步了解程序编译过程的基本原理和基本实现方法的目的。2、课程设计要求:对PL/0作以下修改扩充:(1)增加单词:保留字ELSE,FOR,TO,DOWNTO,RETURN运算符+=,-=,++,--,(2)修改单词:不
2、等号#改为<>(3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。二.实验环境与工具(1)计算机及操作系统:PC机,WindowsXP(2)程序设计语言:VC++6.0,C/C++语言(3)教学型编译程序:PL/0三.结构设计方案1、结构设计说明:PL/0的编译程序以语法分析程序为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。此外,用表格管理程序建立变量,常量和过程标识符的说明与引用之间的信息联系。用出错处理程序对
3、词法和语法分析遇到的错误给出在源程序中出错的位置和错误性质。2、各功能模块图示:3.各功能模块作用表:1PL0主程序2Error出错处理,打印出错位置和错误编码3GetCh漏掉空格,读取一个字符4GetSym词法分析,读取一个单词5Gen生成目标代码,并送入目标程序区6TEST测试当前单词符号是否合法7ENTER登录名字表8POSITION查找标识符在名字表中的位置9ConstDeclaration常量定义处理10VarDeclaration变量说明处理11ListCode列出目标代码清单12FACTOR因子处理13TERM项处理14EXP
4、RESSION表达式处理15CONDITION条件处理16STATEMENT语句部分处理17Block分程序分析处理过程18BASE通过静态链求出数据区的基地址19Interpret对目标代码的解释执行程序3.符号名字表结构:structtablestruct{charname[al];/*名字*/enumobjectkind;/*类型:const,var,arrayorprocedure*/intval;/*数值,仅const使用*/intlevel;/*所处层,仅const不使用*/intadr;/*地址,仅const不使用*/ints
5、ize;/*需要分配的数据区空间,仅procedure使用*/};4.保留关键字枚举结构:enumsymbol{nul,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
6、,forsym,tosym,downtosym,returnsym,pluseql,minuseql,plusplus,minusminus,};5.名字表中标识符枚举类型:enumobject{constant,/*常量*/variable,/*变量*/procedur,/*过程*/};6.虚拟机enumfct{/*虚拟机代码*/lit,opr,lod,sto,cal,inte,jmp,jpc,};structinstruction/*虚拟机代码结构*/{enumfctf;/*虚拟机代码指令*/intl;/*引用层与声明层的层次表*/in
7、ta;/*根据f的不同而不同*/};7.扩充部分语法描述图::=+=表达式语句Ident-=To++--++--IdentIf条件Then语句语句Else语句To表达式语句ForDownto因子Number++Ident--表达式)(++Ident--表达式)(表达式)(8.运行时存储组织和管理对于源程序的每一个过程(包括主程序),在被调用时,首先在数据段中开辟三个空间,存放静态链SL、动态链DL和返回地址RA。静态链记录了定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。动态链记录调用该过程前正在运行的过程的数据段基址。返回地址
8、记录了调用该过程时程序运行的断点位置。对于主程序来说,SL、DL和RA的值均置为0。静态链的功能是在一个子过程要引用它的直接或间接父过程(这里的父过程是按定义过程时的嵌套情况来定