级编译原理实验PL流程图.docx
- 文档编号:26107272
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:15
- 大小:17.36KB
级编译原理实验PL流程图.docx
《级编译原理实验PL流程图.docx》由会员分享,可在线阅读,更多相关《级编译原理实验PL流程图.docx(15页珍藏版)》请在冰豆网上搜索。
级编译原理实验PL流程图
PL/0编译程序流程图
2009年11月
主程序main()
输入pl/0源程序文件名
返回
打开源程序文件。
正确?
N
Y
用户回答:
是否列出虚拟机代码?
是否列出符号表?
打开输出文件fa1.tmp,并输出源程序文件名。
初始化
初始化目标代码指针cx为0,ch为‘’
读入一个单词
打开文件fa.tmp,fas.tmp
设置分程序后跟符号集nextlev:
·声明开始单词、语句开始单词
分程序处理
分程序处理出错?
关闭文件并返回
Y
N
解释执行虚拟机代码
关闭文件并返回
解释程序interpret()
置栈顶指针t为0;
置数据段起始地址b为0;
置当前指令指针p为0;
置栈s的前三个单元为0。
取当前指令到i,指令指针p指向下一条指令。
指令i的功能码
将常量值i.a入栈顶s[t]
lit
该运算指令的a域
opr
过程调用结束返回调用点:
释放被调用过程占用的栈空间;指令指针指向返回地址;恢复调用者数据段起始地址。
0
-栈顶=〉栈顶
1
次栈顶+栈顶=〉次栈顶
2
次栈顶-栈顶=〉次栈顶
3
次栈顶*栈顶=〉次栈顶
4
次栈顶/栈顶=〉次栈顶
5
栈顶为奇数?
=〉栈顶
6
次栈顶==栈顶=〉次栈顶
8
次栈顶!
=栈顶=〉次栈顶
9
次栈顶<栈顶=〉次栈顶
10
次栈顶>=栈顶=〉次栈顶
11
次栈顶>栈顶=〉次栈顶
12
次栈顶<=栈顶=〉次栈顶
13
向屏幕和文件输出栈顶值
14
向屏幕和文件输出换行
15
读入外设到栈顶和文件
16
将层差l、偏移量a的变量入栈
lod
将栈顶出栈到层差l、偏移量a的地方
sto
父过程的基地址入栈,本过程基地址入栈,当前指令指针入栈,基地址指针指向新过程基地址,指令指针指向新过程首指令
cal
分配a个内存单元
inte
指令指针指向a
jmp
若栈顶为0,指令指针指向a
jpc
指令指针p为0?
N
Y
结束
求外l层过程的基址base()
入口参数:
l----层差
s----运行栈
b----当前过程基址
保存当前过程的基址到b1
l>0?
N
Y
根据静态链,取外层过程的基址到b1
l=l-1
返回b1(即l外层基址)
<分程序>:
:
=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
分程序block():
本过程的初始化:
置本过程变量分配的相对地址dx为3,保存当前符号表表尾指针tx到tx0
即本层符号的开始位置)
登记首条目标代码JMP00的地址到符号表中该过程名的adr域,生成指令jmp00
当前单词是const?
Y常量说明部分处理
读入下一个单词
N
登记常量名到符号表
当前单词是,?
N
Y
读入下一个单词
登记常量名到符号表
当前单词是;?
NY
读入下一个单词
报错
当前单词是标识符?
NY
当前单词是var?
变量说明部分处理
Y
读入下一个单词
N
登记变量名到符号表
当前单词是,?
N
Y
读入下一个单词
登记变量名到符号表
当前单词是;?
NY
读入下一个单词
报错
当前单词是标识符?
NY
过程说明部分处理
读入下一个单词
当前单词是procedure?
Y
N
单词是标识符?
NY
在符号表登记过程名字
报错
读入下一个单词
当前单词是;?
NY
报错
读入下一个单词
生成下一级分程序后跟符号集:
本分程序后跟符号集及;
调用分程序block处理,层次加1。
返回,返回值-1
Block()返回-1?
Y
生成后跟符号集nextlev:
语句开始单词、标识符、·
N
当前单词为。
?
NY
读入下一个单词
报错
滤去非法后跟单词,只允许nextlev单词及声明开始单词。
生成后跟符号集nextlev:
语句开始单词、标识符、procedure
当前单词是声明开始符号?
滤去过程说明部分非法的后跟单词,只允许nextlev的单词及本分程序的后跟符号。
Y
N
语句处理
用当前目标指令地址cx对本过程的首条指令jmp00的目标地址回填
更正符号表本过程名的信息:
入口地址为当前目标指令地址,过程数据区大小为当前变量分配的相对地址。
保存过程入口地址到CX0
生成本过程的入口指令:
分配数据区空间的指令INT0a
要输出本过程符号表?
YN
从符号表tx0位置开始输出所有常量名、变量名、过程名
生成语句的后跟符号集nextlev:
本分程序后跟符号集;end
语句处理
生成调用过程结束指令OPR00
置nextlev为空
过滤非法后跟单词,只允许本分程序的后跟符号。
输出目标代码清单
返回,返回值0
初始化init()
设置单字符符号ssym:
+-*/()=,。
#;
设置保留字名字word:
begincallconstdoendifoddprocedurereadthenvarwhilewrite
设置保留字符号wsym:
放入保留字名字对应的编号
设置指令名称mnemonic:
litoprlodstocalintjmpjpc
设置声明开始符号集declbegsys:
constvarprocedure
设置语句开始符号集statbegsys:
begincallifwhile
设置因子开始符号集facbegsys:
标识符数字(
结束
语句处理statement()
当前单词是标识符?
Y赋值语句处理
N
在符号表中查该标识符。
查到?
报错
N
Y
该符号不是变量?
报错
Y
N
读入下一单词
当前单词是:
=?
N
Y
报错
读入下一单词
将当前语句的后跟符号集作为表达式的后跟符号集
处理赋值符号右边的表达式
生成保存栈顶结果的目标指令:
stola
当前单词是read?
读入语句处理
读入一个单词
Y
当前单词是(?
N
报错
N
Y
读入一个单词
单词是标识符?
N
Y
在符号表查找该单词。
找不到?
Y
报错
N
生成输入数据到栈顶的输入指令opr016
生成保存栈顶值到输入变量的指令:
stola
读入下一单词
当前单词是,?
Y
N
当前单词是)?
NY
读入一个单词
过滤输入单词直到出现后跟符号
当前单词是write?
输出语句处理
读入一个单词
Y
N
读入一个单词
生成表达式的后跟符号:
语句的后跟符号),
输出表达式处理
生成输出栈顶值的输出指令:
opr014
当前单词是,?
Y
N
当前单词是)?
NY
读入一个单词
报错
生成换行指令:
opr015
调用语句处理
读入一个单词
当前单词是call?
Y
N
当前单词是标识符?
报错
N
Y
在符号表查找该单词。
找到?
N
Y
单词是过程名?
N
Y
报错
生成调用指令:
oprlf
读入下一个单词
当前单词是if?
If-then语句处理
读入下一个单词
Y
生成条件的后跟符号集:
语句后跟符号集thendo
N
条件处理
当前单词是then?
NY
读入下一个单词
报错
保存当前目标指令地址到cx1以便回填
生成条件跳转指令jpc00
Then后面的语句处理
用当前目标指令地址回填前面的条件跳转指令,成为jpc0a
复合语句处理
当前单词是begin?
读入下一个单词
Y
N
生成语句处理的后跟符号集:
本层语句处理的后跟符号;end
语句处理
当前单词是语句开始单词或;?
N
Y
当前单词是;?
YN
报错
读入一个单词
语句处理
当前单词是end?
NY
读入下一个单词
报错
While语句处理
保留当前目标指令地址(循环条件判断指令地址)到cx1
当前单词是while?
Y
N
读入下一个单词
生成条件的后跟符号集:
本层语句的后跟符号集do
条件处理
保存当前指令目标指令地址(跳出循环的指令地址)以便回填
生成跳出循环的目标指令jpc00
当前单词是do?
YN
报错
读入下一个单词
循环体语句处理
生成跳回判断循环条件的跳转指令jmp0a
用当前指令地址(循环语句外指令)回填跳出循环的目标指令
滤去非语句后跟符号
返回0
表达式处理expression()表达式由项组成,例:
-项+项-项-项
当前单词是+或者-?
NY
保存第一个正负号
生成表达式的后跟符号集:
当前的后跟符号集+-
读入下一个单词
生成表达式的后跟符号集:
当前的后跟符号集+-
项处理
项处理
第一个正负号为负?
N
Y
生成取负指令:
opr0,1
当前单词是+或者-?
保存正负号
读入下一个单词
生成表达式的后跟符号集:
当前的后跟符号集+-
项处理
正负号是正号?
生成减法指令:
opr0,3
生成加法指令:
opr0,2
返回
已经完成的函数:
init()、main()、interpret()、base()、block()、statement()、、、、、、、、
未完成:
inset()、addset()、subset()、mulset()、error()、getch()、getsym()、gen()、test()、enter()、position()、constdeclaration()、vardeclaration()、listcode()、expression()、term()、factor()、condition()、、、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 PL 流程图