# PL/0 编译器的扩充--课程设计
## 一、实验目的与要求
基本内容(成绩范围:“中”、“及格”或“不及格”)
(1)扩充赋值运算:*= 和 /=
(2)扩充语句(Pascal的FOR语句):
FOR <变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>
选做内容(成绩评定范围扩大到:“优”和“良”)
(1)增加类型:① 字符类型; ② 实数类型。
(2)扩充运算:++ 和 --(要求作为表达式实现)
(3)扩充函数:① 有返回值和返回语句;② 有参数函数。
(4)增加一维数组类型(可增加指令)。
(5)其他典型语言设施。
## 二、实验环境与工具
1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统,后缀名为.PL0;
2、目标语言:生成文件后缀为*.COD的目标代码
3、实现平台:Borland C++ Builder 6
4、运行平台:Windows 7 64位
## 三、实现内容
由于本程序在课内实验的基础上进行修改,所以本身具有课程实验要求的全部功能。全部功能具体如下:
1. 增加了保留字 ELSE,FOR,STEP,UNTIL,RETURN; 运算符 *=,/=,&,||,! ;
2. 不等号 由 # 改为了 <> ;
3. 增加了条件语句的ELSE子句 ;
4. 扩充赋值运算:*= 和 /= ;
5. 扩充语句。FOR <变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句> ;
6. (选做)扩充运算符 +=,-= ;
7. (选做)扩充运算:++ 和 -- ;
8. (选做)多行注释功能 /**/ 实现 ;
9. (选做)单行注释功能 // 实现 ;
## 四、结构设计说明
### a) PL/0编译程序的结构图
PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。
![](jiegou.png)
### b) PL/0编译程序的过程或函数的功能表
| 过程或函数名 | 简要功能 |
| - | - |
| Error(int n) | 出错处理,打印出错位置和错误编码 |
| GetCh() | 漏掉空格,读取一个字符 |
| GetSym() | 词法分析, 读取一个单词 |
| GEN(FCT X, int Y, int Z) | 生成目标代码,并送入目标程序区 |
| TEST(SYMSET S1, SYMSET S2, int N) | 测试当前单词符号是否合法 |
| Enter(OBJECTS K, int LEV, int &TX, int &DX) | 登录名字表 |
| Position(ALFA ID, int TX) | 查找标识符在名字表中的位置 |
| ConstDeclaration(int LEV,int &TX,int &DX) | 常量定义处理 |
| VarDeclaration(int LEV,int &TX,int &DX) | 变量说明处理 |
| ListCode(int CX0) | 列出目标代码清单 |
| FACTOR(SYMSET FSYS, int LEV, int &TX) | 因子处理 |
| TERM(SYMSET FSYS, int LEV, int &TX) | 项处理 |
| EXPRESSION(SYMSET FSYS, int LEV, int &TX) | 表达式处理 |
| CONDITION(SYMSET FSYS, int LEV, int &TX) | 条件处理 |
| STATEMENT(SYMSET FSYS, int LEV, int &TX) | 语句处理 |
| Block(int LEV, int TX, SYMSET FSYS) | 分程序分析处理过程 |
| BASE(int L,int B,int S[]) | 通过静态链求出数据区的基地址 |
| Interpret() | 对目标代码的解析执行程序 |
### c) PL/0编译程序的总体流程图
![](PL0liucheng.png)
## 五、主要成分描述
### 1、指令表
PL/0 编译程序所产生的目标代码是一个假想栈式计算机的汇编语言,称之为 PCODE 指令代码,它不依赖任何实际计算机,其指令集很简单,指令格式如下:
![](PL0_fla.png)
其中 f 代表功能码,l 表示层次差,也就是变量或过程被引用的分程序与说明该变量或过程的分程序之间的层次差。a 的含义对不同的指令有所区别,对存取指令表示位移量,而对其他的指令则分别有不同的含义,具体如下表:
| 指令 | 说明 |
|:-:| - |
| CAL L A | 调用地址为 A 的过程(置指令地址寄存器为A);L 为调用过程与被调用过程的层差;设置被调用过程的3 个联系单元 |
| INT 0 A | 在栈顶开辟 A 个存储单元,服务于被调用的过程;A 等于该过程的局部变量数加 3;3 个特殊的联系单元 |
| JMP 0 A | 无条件转移至地址 A,即置指令地址寄存器为A |
| JPC 0 A | 条件转移指令;若栈顶为 0,则转移至地址 A,即置指令地址寄存器为A ;T 减1 |
| LIT 0 A | 立即数存入栈顶,即置T 所指存储单元的值为Al; T 加 1 |
| LOD L A | 将层差为L、偏移量为A的存储单元的值取到栈顶; T 加 1 |
| OPR 0 0 | 过程调用结束后,返回调用点并退栈; 重置基址寄存器和栈顶寄存器 |
| OPR 0 1 | 求栈顶元素的相反数,结果值留在栈顶 |
| OPR 0 2 | 次栈顶与栈顶的值相加,结果存入次栈顶; T 减 1 |
| OPR 0 3 | 次栈顶的值减去栈顶的值,结果存入次栈顶; T 减 1 |
| OPR 0 4 | 次栈顶的值乘以栈顶的值,结果存入次栈顶; T 减 1 |
| OPR 0 5 | 次栈顶的值除以栈顶的值,结果存入次栈顶; T 减 1 |
| OPR 0 6 | 栈顶元素的奇偶判断,若为奇数,结果为1;若为偶数,结果为0 ;结果值留在栈顶 |
| OPR 0 8 | 比较次栈顶与栈顶是否相等;若相等,结果为0;存结果至次栈顶;T 减1 |
| OPR 0 9 | 比较次栈顶与栈顶是否不相等;若不相等,结果为0;存结果至次栈顶;T 减1 |
| OPR 0 10 | 比较次栈顶是否小于栈顶; 若小于,结果为0;存结果至次栈顶;T 减1 |
| OPR 0 11 | 比较次栈顶是否大于等于栈顶; 若大于等于,结果为0;存结果至次栈顶;T 减1 |
| OPR 0 12 | 比较次栈顶是否大于栈顶; 若大于,结果为0;存结果至次栈顶;T 减1 |
| OPR 0 13 | 比较次栈顶是否小于等于栈顶; 若小于等于,结果为0;存结果至次栈顶;T 减1 |
| OPR 0 14 | 栈顶的值输出至控制台屏幕; T 减 1 |
| OPR 0 15 | 控制台屏幕输出一个换行 |
| OPR 0 16 | 从控制台读入一行输入,置入栈顶; T 加 1 |
| STO L A | T 减 1; 将栈顶的值存入层差为L、偏移量为A的存储单元 |
### 2、PL/0 出错信息表
| 出错编号 | 出错原因 |
|:-:| - |
| 1 | 常数说明中的 “=” 写成 “:=” |
| 2 | 常数说明中的 “=” 后应是数字 |
| 3 | 常数说明中的标识符后应是 “=” |
| 4 | const,var,procedure 后应是标识符 |
| 5 | 漏掉了 “.” 或 “;” |
| 6 | 过程说明后的符号不正确(应是语句开始符或过程定义符) |
| 7 | 应是语句开始符 |
| 8 | 程序体内语句部分的后跟符不正确 |
| 9 | 程序结尾丢了句号 “.” |
| 10 | 语句之间漏了 “;” |
| 11 | 标识符未说明 |
| 12 | 赋值语句中,赋值号左部标识符属性应是变量 |
| 13 | 赋值语句左部标识符应是赋值号 “:=” |
| 14 | call 后应为标识符 |
| 15 | call 后标识符属性应为过程 |
| 16 | 条件语句中丢了 “then” |
| 17 | 丢了 “end” 或 “;” |
| 18 | while 型循环语句中丢了 “do” |
| 19 | 语句后的符号不正确 |
| 20 | 应为关系运算符 |
| 21 | 表达式内标识符属性不能是过程 |
| 22 | 表达式中漏掉右括号 “)” |
| 23 | 因子后的非法符号 |
| 24 | 表达式的开始符不能是此符号 |
| 31 | 数越界 |
| 32 | read 语句括号中的标识符不是变量 |
## 3、PL/0 语言的文法规则
PL/0 文法描述的元语言(EBNF)符号说明
其中用到的 EBNF 元符号含义如下:
- <> :用尖括号括起来的中文字表示语法构造成分,或称语法单元;而用尖括号括起来的英文字表示一类词法单元。
- ::= :表示左部的语法单位由右部定义,可读作“定义为”。
- | :表示“或”,即多选项。
- {} :用花括号括起来的成分可以重复0次到任意多次。
- [] :用方括号括起来的成分为任选项,即出现一次或不出现。
<程序> ::= <分程序>
<分程序> ::= [<常量说明部分>;][<变量说�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
GDUT 编译原理课程的课内实验和课程设计(含报告).zip (131个子文件)
PL01.bpr 3KB
PL01.bpr 3KB
PL01.bpr 3KB
Parser.class 11KB
Scanner.class 5KB
Interpreter.class 4KB
PL0.class 3KB
Table.class 3KB
Symbol.class 2KB
Fct.class 1KB
Err.class 1KB
Objekt.class 991B
SymSet.class 669B
Table$Item.class 539B
Instruction.class 336B
.classpath 295B
answer.cpp 62KB
Unit1.cpp 31KB
Unit1.cpp 25KB
Unit1.cpp 20KB
PL01.cpp 624B
PL01.cpp 624B
PL01.cpp 624B
Unit1.ddp 51B
Unit1.ddp 51B
Unit1.ddp 51B
Unit1.dfm 2KB
Unit1.dfm 2KB
Unit1.dfm 2KB
PL01.dsk 4KB
PL01.dsk 4KB
PL01.dsk 4KB
PL01.exe 39KB
PL01.exe 39KB
PL01.exe 39KB
Unit1.h 2KB
Unit1.h 2KB
Unit1.h 2KB
Parser.java 18KB
Scanner.java 5KB
PL0.java 4KB
Interpreter.java 4KB
Table.java 3KB
SymSet.java 669B
Err.java 538B
Symbol.java 290B
README.md 30KB
README.md 23KB
README.md 4KB
README.md 2KB
Unit1.obj 75KB
Unit1.obj 75KB
Unit1.obj 75KB
PL01.obj 15KB
PL01.obj 15KB
PL01.obj 15KB
PL0.PAS 17KB
PL0.PAS 17KB
PL0.PAS 17KB
test1.pl0 775B
sample1.pl0 456B
P9104.PL0 429B
sample0.pl0 416B
sample3.pl0 373B
sample2.pl0 287B
T2.PL0 220B
T1.PL0 218B
DE04.PL0 190B
DE04.PL0 190B
P9101.PL0 187B
EX01.PL0 171B
DE01.PL0 151B
DE01.PL0 151B
DE03.PL0 137B
DE03.PL0 137B
DE02.PL0 131B
DE02.PL0 131B
E01.PL0 82B
P9102.PL0 80B
E0101.PL0 64B
cbc00.png 243KB
qt00.png 230KB
cbc.png 104KB
qtres004.png 60KB
qtres006.png 59KB
qtresult01.png 55KB
qtresult02.png 55KB
qtres003.png 55KB
qtres001.png 52KB
qtresult04.png 51KB
qtresult03.png 51KB
qtres005.png 50KB
qtres008.png 50KB
qtres007.png 48KB
qtres002.png 46KB
PL0liucheng.png 46KB
for.png 45KB
result01.png 37KB
jiegou.png 18KB
jiegou.png 18KB
共 131 条
- 1
- 2
资源评论
小码蚁.
- 粉丝: 2663
- 资源: 4467
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 安卓(Android)期末课程设计-新闻阅读客户端.zip
- 安卓(Android)期末课程设计-食谱.rar
- CentOS7 X86-64 mysql客户端安装包,附安装说明
- vue3-ts 编辑svg 合并svg
- 安卓(Android)期末课程设计-购物app.zip
- 安卓(Android)期末课程设计-个人相册.zip
- 在(Linux)ubuntu下通过GTK调用libvlc开发视频播放器.pdf
- SSF3637-VB一款2个P-Channel沟道SOP8的MOSFET晶体管参数介绍与应用说明
- mac mysql-5.7.25-macos10.14-x86-64.dmg
- SSF3402-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功