论文百事通 设为主页 会员登录 |  免费注册
代写论文 代发表论文 定制论文 毕业设计定制 期刊目录 黄金会员  
加入收藏 设为首页 |  收藏本站
首页 | 计算机 | 建筑工程 | 医药学 | 经济类 | 文学 | 英语 | 职称评定 | 计算机毕业设计 | 课程设计 | 毕业设计作品 | 投稿中心 | 下载中心 | 作品订单
  查找论文

扩展PL0编译程序-编译原理课程设计

作者:刘大兵  来源:lwbst.com    【2006-09-19】    编辑:Admin
一.概述
1.源、目标语言
源语言是PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统。目标语言是类PCODE指令代码,这是一种假想栈式计算机的汇编语言,与具体计算机无关。
2.实现工具:Borland C++ Builder 6 。
3.运行平台:WindowsXP操作系统 。
本程序已在WindowsXP操作系统上用Borland C++ Builder 6调试通过并成功运行。

二.修改与添加的内容:
(1)完成了基本部分:


增加了单词:保留字 ELSE,FOR,TO, DOWN
运算符 +=,-=,++,--
修改了单词:不等号# 改为 <>
增加了条件语句的ELSE子句
(2)扩充了赋值运算 += 和 -=
(3)扩充了以下语句(Pascal的FOR语句):
①FOR <变量>:=<表达式> TO <表达式> DO <语句>
②FOR <变量>:=<表达式> DOWN<表达式> DO <语句>
其中,语句①的循环变量的步长为1,
语句②的循环变量的步长为-1。
另外,完成了选做功能的第一个:

  1. 增加了运算:++ 和 ?D?D。

三.结构设计说明
PL/0语言的编译过程采用一趟扫描的方式,以语法分析程序为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读单词就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。
此外,用表格管理程序建立变量、常量和过程标识符的说明与引用之间的信息联系;用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错误性质;当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序要求输入数据和输出运行结果。
本程序编译和解释执行的结构图如下所示:



四、程序功能模块描述
模块名:main(即:INAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int))
输 入:PL/0源程序
输 出:目标程序和运行结果
功 能:主程序初始化编译环境,建立关键字表,调用分程序Block对源文件进行编译,当源程序编译正确时,自动调用解释执行程序,对目标代码进行解释执行。
模块名:Error(即:void Error(int n))
输 入:出错位置CC和错误性质编号N
输 出:显示出错信息
功 能:出错处理,打印出错位置和错误性质编号。
模块名:GetSym(即:void GetSym())
输 入:源程序的字符流
输 出:单词符号
功 能:词法分析,读取一个单词
模块名:Gen(即:void GEN(FCT X, int Y, int Z))
输 入:伪操作码F;层次差L;立即数或位移量或功能号A
输 出:类PCODE指令
功 能:生成目标代码,并送入目标程序区。
模块名:Test(即:void TEST(SYMSET S1, SYMSET S2, int N))
输 入:进入或退出某一语法单元时当前单词应属合法的集合S1;在某一出错状态时,可恢复分析工作的补充单词符号集合S2;出错信息编号
输 出:调用Error显示出错信息
功 能:测试当前单词是否是合法
模块名:Block(即:void Block(int LEV, int TX, SYMSET FSYS))
输 入:分程序层次LEV;符号表索引TX;退出时当前符号应属的集合FSYS;
输 出:生成分程序的目标代码
功 能:分程序分析处理过程。
模块名:Enter(即:void ENTER(OBJECTS K, int LEV, int &TX, int &DX))
输 入:单词类别K;层次L;符号表索引TX;地址指针DX;
输 出:更新的符号表
功 能:登录过程说明对象包括变量、常量和过程名的属性信息到符号表。
模块名:Position(即:int POSITION(ALFA ID, int TX))
输 入:标识符ID;符号表索引TX
输 出:标识符在符号表中的位置
功 能:查找标识符在符号表中的位置。
模块名:Constdeclaration(即:void ConstDeclaration(int LEV,int &TX,int &DX))
输 入:层次L;符号表索引TX;地址指针DX;
输 出:更新的符号表
功 能:常量定义处理,收集常量信息并登录到符号表。
模块名:Vardeclaration(即:void VarDeclaration(int LEV,int &TX,int &DX))
输 入:层次L;符号表索引TX;地址指针DX;
输 出:更新的符号表
功 能:变量定义处理,收集变量信息并登录到符号表。
模块名:Listcode(即:void ListCode(int CX0))
输 入:当前分程序在目标代码区的起始索引CX
输 出:打印当前分程序的目标代码
功 能:列出目标代码清单。
模块名:Statement(即:void STATEMENT(SYMSET FSYS,int LEV,int &TX))
输 入:分程序层次LEV;符号表索引TX;退出时当前符号应属的集合FSYS;
输 出:相应语句编译结果;
功 能:语法分析,语句部分处理。
模块名:Expression(即:void EXPRESSION(SYMSET FSYS, int LEV, int &TX))
输 入:分程序层次LEV;符号表索引TX;退出时当前符号应属的集合FSYS;
输 出:表达式编译结果与表达式类型Etype;
功 能:表达式分析处理。
模块名:Term(即:void TERM(SYMSET FSYS, int LEV, int &TX))
输 入:分程序层次LEV;符号表索引TX;退出时当前符号应属的集合FSYS;
输 出:<项>编译结果与<项>类型Ttype;
功 能:项分析处理过程。
模块名:Factor(即:void FACTOR(SYMSET FSYS, int LEV, int &TX))
输 入:分程序层次LEV;符号表索引TX;退出时当前符号应属的集合FSYS;
输 出:<因子>编译结果与<因子>类型Ftype;
功 能:因子分析处理。
模块名:Condition(即:void CONDITION(SYMSET FSYS,int LEV,int &TX))
输 入:分程序层次LEV;符号表索引TX;退出时当前符号应属的集合FSYS;
输 出:<条件>编译结果与<条件>类型Ftype;
功 能:条件处理。
模块名:Interpret(即:void Interpret())
输 入:目标代码;
输 出:用户程序执行结果;
功 能:对目标代码进行解析执行。
模块名:Base(即:int BASE(int L,int B,int S[]))
输 入:层差L;基地址B;运行数据区S;
输 出:与当前数据区相差为L的数据区的首地址;
功 能:通过静态链求数据区首地址。

四、程序功能模块描述
模块名:main(即:INAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int))
输 入:PL/0源程序
输 出:目标程序和运行结果
功 能:主程序初始化编译环境,建立关键字表,调用分程序Block对源文件进行编译,当源程序编译正确时,自动调用解释执行程序,对目标代码进行解释执行。
模块名:Error(即:void Error(int n))
输 入:出错位置CC和错误性质编号N
输 出:显示出错信息
功 能:出错处理,打印出错位置和错误性质编号。
模块名:GetSym(即:void GetSym())
输 入:源程序的字符流
输 出:单词符号
功 能:词法分析,读取一个单词
模块名:Gen(即:void GEN(FCT X, int Y, int Z))
输 入:伪操作码F;层次差L;立即数或位移量或功能号A
输 出:类PCODE指令
功 能:生成目标代码,并送入目标程序区。
模块名:Test(即:void TEST(SYMSET S1, SYMSET S2, int N))
输 入:进入或退出某一语法单元时当前单词应属合法的集合S1;在某一出错状态时,可恢复分析工作的补充单词符号集合S2;出错信息编号
输 出:调用Error显示出错信息
功 能:测试当前单词是否是合法
模块名:Block(即:void Block(int LEV, int TX, SYMSET FSYS))
输 入:分程序层次LEV;符号表索引TX;退出时当前符号应属的集合FSYS;
输 出:生成分程序的目标代码
功 能:分程序分析处理过程。
模块名:Enter(即:void ENTER(OBJECTS K, int LEV, int &TX, int &DX))
输 入:单词类别K;层次L;符号表索引TX;地址指针DX;
输 出:更新的符号表
功 能:登录过程说明对象包括变量、常量和过程名的属性信息到符号表。
模块名:Position(即:int POSITION(ALFA ID, int TX))
输 入:标识符ID;符号表索引TX
输 出:标识符在符号表中的位置
功 能:查找标识符在符号表中的位置。
模块名:Constdeclaration(即:void ConstDeclaration(int LEV,int &TX,int &DX))
输 入:层次L;符号表索引TX;地址指针DX;
输 出:更新的符号表
功 能:常量定义处理,收集常量信息并登录到符号表。
模块名:Vardeclaration(即:void VarDeclaration(int LEV,int &TX,int &DX))
输 入:层次L;符号表索引TX;地址指针DX;
输 出:更新的符号表
功 能:变量定义处理,收集变量信息并登录到符号表。
模块名:Listcode(即:void ListCode(int CX0))
输 入:当前分程序在目标代码区的起始索引CX
输 出:打印当前分程序的目标代码
功 能:列出目标代码清单。
模块名:Statement(即:void STATEMENT(SYMSET FSYS,int LEV,int &TX))

  本课程设计包含完整源程序、可执行程序、设计文档。

 上一篇:简单的LISP算术表达式计算器-数据结构课程设计
 下一篇:单道批处理系统的作业调度(1)-操作系统课程设计
本文版权归本站所有,欢迎转载。转载该文章时,请注明“来源:论文百事通 Http://www.lwbst.com”。
 
Copyright (C) 2008 Lwbst.com, All Rights Reserved 版权所有 论文百事通