您好,欢迎来到画鸵萌宠网。
搜索
您的当前位置:首页2009级编译原理实验PL0流程图

2009级编译原理实验PL0流程图

来源:画鸵萌宠网


2009图

级编译原理实验PL0流程

PL/0编译程序流程图

2009年11月

主程序main()

N

输入pl/0源程序文件名 打开源程序文件。正确? 返回 Y 用户回答:是否列出虚拟机代码?是否列出符号表? 打开输出文件fa1.tmp,并输出源程序文件名。 初始化 初始化目标代码指针cx为0,ch为‘’ 2

打开文件fa.tmp,fas.tmp 读入一个单词 Y

设置分程序后跟符号集nextlev:· 声明开始单词、语句开始单词 分程序处理 分程序处理出错? 关闭文件并返回 N 解释执行虚拟机代码 关闭文件并返回 3

4

过程调用结束返回调用点:释放被调用过程占用的栈空间;指令指针指向返回地址;恢复调用者数据段起始地址。 0

-栈顶 =1 〉栈顶 次栈顶+栈顶 =〉次栈顶 2 次栈顶 3 -栈顶 =〉次栈顶 次栈顶 *栈顶4 =〉次栈顶 次栈顶 /栈顶5 =〉次栈顶 栈顶为奇数? 6 =〉栈顶 5

栈顶 =〉次栈顶 次栈顶 ==8

次栈顶! 9 =栈顶 =〉次栈顶 次栈顶<栈顶 =〉次栈顶 10 次栈顶 >= 栈顶11 =〉次栈顶 次栈顶 >12 栈顶 =〉次栈顶 次栈顶 <=13 栈顶 = 〉次栈顶 6

向屏幕和文件输出栈顶值 14

向屏幕和文件输出换行 15

读入外设到栈顶和文件 16

lod 将层差l、偏移量a的变量入栈 将栈顶出栈到层差l、偏移量a的地 sto 父过程的基地址入栈,本过程基地 址入栈,当前指令指针入栈,基地址指针指向新过程基地址,指令指 cal 针指向新过程首指令

7

N

inte 分配a个内存单元 jmp 指令指针指向a 若栈顶为0,指令指针指向a jpc 指令指针p为0? Y

8

结束

9

求外l层过程的基址base() 入口参数:l----层差 s----运行栈 b----当前过程基址 保存当前 l>0? N

根据静态链,取外层过 程的基址到b1

Y 10

l=l-1 返回b1(即l外层基址) 11

<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句> 分程序block():

当前单词是const? 登记首条目标代码JMP 0 0的地址到符号表中该过程名的adr域,生成指令 jmp 0 0本过程的初始化:置本过程变量分配的相对地址dx为3,保存当前符号表表尾指针tx到tx0 Y 常量说明部分处理

12

读入下一个单词 N

Y Y

登记常量名到符号表 当前单词是, ? N 读入下一个单词 登记常量名到符号表 当前单词是; ? N 报读入下一个单词 13

Y

当前单词是标识符? N

当前单词是 var? 变量说明部分处理

Y N

当前单词是, ? 登记变量名到符号表 读入下一个单词 N

14

Y Y Y

读入下一个单词 登记变量名到符号表 当前单词是; ? N 报错 读入下一个单词 当前单词是标识符? N 15

过程说明部分处理 当前单词是 procedure? 读入下一个单词 Y

N Y

16

单词是标识符? N

Y Y

报错 在符号表登记过程名字 读入下一个单词 当前单词是; ? N

报错 读入下一个单词 生成下一级分程序后跟符号集:本分程序后跟符号集及; 调用分程序block处理,层次加1。 返回,Block()返回返回值 -1

nextlev: 语句开 生成后跟符号集 始单词、标识符、· 17

N

N Y

N

语句处理

用当前目标指令地址cx对本过程的首条指令jmp 0 0的目标地址回填 当前单词是声明开始符号? 滤去过程说明部分非法的后跟单词,只允许nextlev的单词及本分程序的后跟符号。 滤去非法后跟单词,只允许nextlev单词及声明开始单词。 生成后跟符号集nextlev:语句开始单词、标识符、procedure 报错 读入下一个单词 当前单词为 ; ?

Y

18

N

更正符号表本过程名的信息:入口地址为当前目标指令地址,过程数据区大小为当前变量分配的相对地址。 保存过程入口地址到CX0 生成本过程的入口指令:分配数据区空间的指令INT 0 a 要输出本过程符号表? Y 从符号表tx0位置开始输出所有常量名、变量名、过程名 生成语句的后跟符号集nextlev:本分程序后跟符号集; end 19

语句处理 生成调用过程结束指令OPR 0 0 置nextlev为空 过滤非法后跟单词,只允许本分程序的后跟符号。 输出目标代码清单 返回,返回值0

初始化init()

20

设置单字符符号ssym: + - * / ()= , 。 设置保留字名字word: begin call const do end if odd procedure read then var while write 设置保留字符号wsym: 放入保留字名字对应的编号 设置指令名称mnemonic: lit opr lod sto cal int jmp jpc 设置声明开始符号集declbegsys:const var procedure 设置语句开始符号集statbegsys:begin call if while 设置因子开始符号集facbegsys:标识符 数字 ( 21

结束

语句处理statement()

22

当前单词是标识符? Y 赋值语句处理 N N

Y Y

N

在符号表中查该标 识符。查到? 报错 该符号不是变 量? 报错 读入下一单词 当前单词是:= ? 23

N

Y

读入下一单词 报错 将当前语句的后跟符号集作为表达式的后跟符号集 处理赋值符号右边的表达式 生成保存栈顶结果的目标指令:sto l a 24

当前单词是 read? 读入语句处理 读入一个单词 Y

N N

Y N

25

单词是标识符? 读入一个单词 当前单词是( ? 报错

Y 在符号表查找该单词。找不到?

Y N

报错 生成输入数据到栈顶的输入指令opr 0 16 生成保存栈顶值到输入变量的指令:sto l a 读入下一单词 当前单词是, ?

Y

26

N

N Y

当前单词是 write? 输出语句处理 读入一个单词 Y 过滤输入单词直到出现后跟符号 读入一个单词 当前单词是) ?

N

27

Y N

读入一个单词 生成表达式的后跟符号:语句的后跟符号 ) , 输出表达式处理 生成输出栈顶值的输出指令:opr 0 14 当前单词是,? 当前单词是)? 28

N Y

报错 读入一个单词 生成换行指令:opr 0 15 调用

29

语句处理

当 前 单 词 是 读入一个单词 Y

N N

Y N

Y

当前单词是标 识符? 报错 在符号表查找该 单词。找到? 单词是过程名? 30

N

Y 生成调用指令:opr l f 报错

读入下一个单词 31

当 前 单 词 是 If-then语句处理 读入下一个单词 Y N Y

32

报错 读入下一个单词 当前单词是条件处理 生成条件的后跟符号集:语句后跟符号集 then do

N

保存当前目标指令地址到cx1以便回填 生成条件跳转指令jpc 0 0 Then后面的语句处理 用当前目标指令地址回填前面的条件跳转指令,成为jpc 0 a 33

复合语句处理

N

当前单词是语句开始单词或; ? 语句处理 生成语句处理的后跟符号集:本层语句处理的后跟符号 ; end 当前单词是begin? 读入下一个单词 Y

34

N

Y

Y

N

当前单词是;? N 读入一个单词 报错 语句处理 当前单词是end? Y 35

报错 读入下一个单词 While语句处理

N

36

生成条件的后跟符号集:本层语句的后跟符号集 do 读入下一个单词 当前单词是while? 保留当前目标指令地址(循环条件判断指令地址)到cx1 Y

N

条件处理 保存当前指令目标指令地址(跳出循环的指令地址)以便回填 生成跳出循环的目标指令jpc 0 0 当前单词是do? Y 读入下一个单词 报错 循环体语句处理 生成跳回判断循环条件的跳转指令jmp 0 a 37

用当前指令地址(循环语句外指令)回填跳出循环的目标指令 滤去非语句后跟符号 返回0 表达式处理expression() 表达式由项组成,例:-项+项-项-项 Y

38

当前单词是+或者- ? N

生成表达式的后跟符号集:当前的后跟符号集 + - 项处理 N Y

保存第一个正负号 读入下一个单词 生成表达式的后跟符号集:当前的后跟符号集 + - 项处理 第一个正负号为 负? 生成取负指令:opr 0 ,1 39

当前单词是+或者-? 保存正负号

40

生成表达式的后跟符号集:当前读入下一个单词

的后跟符号集 + - 项处理 正负号是正号? 生成减法指令:opr 0,3

41

生成加法指令:opr 0,2 返回

42

43

44

45

已经完成的函数:init()、main()、interpret()、base()、block()、statement()、、、、、、、、 未完成:inset()、addset()、subset()、mulset()、error()、getch()、getsym()、gen()、test()、enter()、position()、constdeclaration()、vardeclaration()、listcode()、expression()、term()、factor()、condition()、、、

46

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务