版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理实验题目实验题目题目一:多行表达式的计算(题目一:多行表达式的计算(4 4周周+1+1周)周)有表示多行表达式的有表示多行表达式的 文法如下:文法如下: - - - - = += +-(+ +- -) - - (* * | / | /) - - ( ( ) ) - - - - - i - i - f - f 其中的变量无需定义且其作用域为第一次赋值处至最后,整型量占其中的变量无需定义且其作用域为第一次赋值处至最后,整型量占2 2个字节个字节, ,浮点型量占浮点型量占4 4个字节。假设数据类型转换规则与个字节。假设数据类型转换规则与C C语言相一致。语言相一致。 按递归下降分析法设计并实
2、现该文法定义的语言的编译程序。按递归下降分析法设计并实现该文法定义的语言的编译程序。编译原理题目二:预测分析法的实现(题目二:预测分析法的实现(3 3周周+1+1周)周)按预测分析法(即按预测分析法(即LL(1)LL(1)分析法)构造语法分析器,并对输入串进行分析法)构造语法分析器,并对输入串进行预测分析预测分析要求及步骤要求及步骤(1 1)输入任一给定文法;)输入任一给定文法;(2 2)消除左公共因子和左递归;)消除左公共因子和左递归;(3 3)构造该文法非终结符的)构造该文法非终结符的FIRSTFIRST集和集和FOLLOWFOLLOW集;集;(4 4)判断该文法是否为)判断该文法是否为L
3、L(1)LL(1)文法;文法; (5 5)若是)若是LL(1)LL(1)文法,构造该文法的预测分析表;文法,构造该文法的预测分析表;(6 6)按预测分析法,构造该文法的语法分析器;)按预测分析法,构造该文法的语法分析器;(7 7)若是)若是LL(1)LL(1)文法,输入任一符号串,给出输入串的分析过程和结文法,输入任一符号串,给出输入串的分析过程和结果。果。实验题目实验题目编译原理实验共两个题目,占本课程总成绩的实验共两个题目,占本课程总成绩的15%15%,其中第一个占,其中第一个占8%8%,第二个,第二个占占7%7%。各题给分标准:各题给分标准:(1 1)有完善的设计和实现文档,程序可读性好
4、,在要求时间内完成)有完善的设计和实现文档,程序可读性好,在要求时间内完成并提交实验报告,满分;并提交实验报告,满分;(2 2)实现正确,程序可读性好,在要求时间内完成,但设计文档和)实现正确,程序可读性好,在要求时间内完成,但设计文档和实验报告存在明显不足,按实验报告存在明显不足,按2/32/3左右计分;左右计分;(3 3)实现正确,程序可读性差,在要求时间内完成,但设计文档和)实现正确,程序可读性差,在要求时间内完成,但设计文档和实验报告存在严重不足,按实验报告存在严重不足,按1/31/3左右计分;左右计分;(4 4)不能完成(包括未接受作业检查的、有抄袭行为的、不能提供)不能完成(包括未
5、接受作业检查的、有抄袭行为的、不能提供源程序的、无实验报告的),计源程序的、无实验报告的),计0 0分。分。考察规范考察规范编译原理?级?级- -?班?班- -?组?组- -?题?题.rar.rar:成员(学号成员(学号- -姓名):姓名):一、题目一、题目二、分析与设计二、分析与设计三、测试设计三、测试设计四、问题解答四、问题解答五、各自的贡献五、各自的贡献 六、心得六、心得 实验报告形式实验报告形式编译原理第二章第二章 PL/0 编译程序编译程序编译原理 PL/0 编译程序总体结构编译程序总体结构 PL/0 语言简介语言简介 PL/0 编译程序的词法分析编译程序的词法分析 类类 P-cod
6、e 虚拟机虚拟机PL/0编译程序编译程序 PL/0 编译程序的语法分析编译程序的语法分析 PL/0 编译程序的语义分析编译程序的语义分析 PL/0 编译程序的错误处理编译程序的错误处理 PL/0 编译程序的目标代码生成编译程序的目标代码生成编译原理PL/0编译程序总体结构编译程序总体结构 T-型图型图PL/0类P-codeC/Pascal编译原理PL/0编译程序总体结构编译程序总体结构 PL/0编译程序的组织:编译程序的组织:一个以语法、语义一个以语法、语义 分析程序为中心的分析程序为中心的单遍编译程序单遍编译程序PL/0 程序程序类类P-code程序程序语法、语义语法、语义分析程序分析程序词
7、法分词法分析程序析程序代码生代码生成程序成程序编译原理PL/0 语言简介语言简介 PL/0 语言语言为一种简化的类为一种简化的类Pascal 语言语言 PL/0 程序示例程序示例 PL/0 语言的语法描述图语言的语法描述图 PL/0 语言的语言的EBNF表示表示 PL/0 语言的语义规则语言的语义规则编译原理PL/0 程序示例程序示例CONST A=10; /*主程序常量说明部分主程序常量说明部分*/VAR B,C; /*主程序变量说明部分主程序变量说明部分*/PROCEDURE P; /*主程序过程说明部分主程序过程说明部分*/ VAR D; /*过程过程P的局部变量说明部分的局部变量说明部
8、分*/ PROCEDURE Q; /*过程过程P的局部过程说明部分的局部过程说明部分*/ VAR X; /*过程过程Q的局部变量说明部分的局部变量说明部分*/ BEGIN READ(X); D:=X; WHILE X#0 DO CALL P; END; BEGIN WRITE(D); CALL Q; ENDBEGIN CALL P;END.P 的过程体的过程体Q 的过程体的过程体主程序的过程体主程序的过程体编译原理PL/0 语言的语法描述图语言的语法描述图内的文字表示所用到的其他内的文字表示所用到的其他语法单位语法单位或或内的文字表示内的文字表示单词符号单词符号 每个每个语法单位语法单位对应一
9、个对应一个语法描述图语法描述图 一个入口和一个出口的有向图一个入口和一个出口的有向图 从入口可到达任何节点从入口可到达任何节点 每个节点都可以到达出口每个节点都可以到达出口 从入口到出口的路径表示该语法单位的从入口到出口的路径表示该语法单位的 一种合法中间形式(短语)一种合法中间形式(短语) 有两种类型的节点有两种类型的节点编译原理PL/0 语言的语法描述图语言的语法描述图程序程序分程序分程序. . 例:程序例:程序和和分程序分程序语法单位的语法描述图语法单位的语法描述图分程序分程序constidentnumber=,;varident,;procedureident;分程序分程序语句语句编译
10、原理PL/0 语言语言的的EBNF表示表示 EBNF 的元符号的元符号- 是用左右尖括号括起来的中文字表示语法构是用左右尖括号括起来的中文字表示语法构造造 成分,或称成分,或称语法单位语法单位,为非终结符,为非终结符。- := 该符号的左部由右部定义,可读作该符号的左部由右部定义,可读作定义为定义为 - | 表示表示或或,即左部可由多个右部定义,即左部可由多个右部定义- 表示花括号内的语法成分可以表示花括号内的语法成分可以重复重复;在不加上;在不加上 下界时可重复下界时可重复0到任意次数,有上下界时为可重复次到任意次数,有上下界时为可重复次 数的限制数的限制- 表示方括号内的成分为表示方括号内
11、的成分为任选任选项项- ( ) 表示圆括号内的成分表示圆括号内的成分优先优先编译原理 例:例:PL/0 语言的语言的EBNF表示片断表示片断PL/0 语言语言的的EBNF表示表示 := . := := CONST , ; := = := := VAR , ; := | := ; ; := PROCEDURE ;编译原理PL/0 语言的语义规则语言的语义规则 类型、上下文约束与作用域规则类型、上下文约束与作用域规则- 数据类型只有数据类型只有整数类型整数类型- 数据结构只支持数据结构只支持简单变量简单变量和和常数常数 - 所支持的数字为最长所支持的数字为最长 9 位的十进制数位的十进制数- 标识
12、符的有效长度为标识符的有效长度为10- 标识符引用前先要声明标识符引用前先要声明- 过程无参数过程无参数- 过程可嵌套,最多嵌套过程可嵌套,最多嵌套 3 层层- 过程可递归调用过程可递归调用- 内层过程可以引用包围它的外层过程的标识符内层过程可以引用包围它的外层过程的标识符编译原理类类P-code虚拟机虚拟机输入数据输入数据输出数据输出数据PL/0 程序程序类类P-code程序程序PL/0 编译程序编译程序类类 P-code 解释程序解释程序类类P-code 虚拟机虚拟机编译原理类类P-code虚拟机虚拟机 类类 P-code 语言语言- 一种一种栈式机栈式机的的语言语言 此类栈式机没有累加器
13、和通用寄存器,此类栈式机没有累加器和通用寄存器,有一有一 个个栈式存储器栈式存储器,有四个控制寄存器(,有四个控制寄存器(指令寄指令寄 存器存器 I,指令地址寄存器指令地址寄存器 P,栈顶寄存器栈顶寄存器 T 和和基址寄存器基址寄存器 B),算逻运算都在栈顶进行),算逻运算都在栈顶进行 指令格式指令格式f f l l a af : 操作码操作码l : 层次差层次差 (标识符引用层减去定义层)(标识符引用层减去定义层)a : 不同的指令含义不同不同的指令含义不同编译原理类类P-code虚拟机虚拟机 指令指令 “INT 0 A”- 在栈顶开辟在栈顶开辟 A 个存储单元,服务于被调用的过程个存储单元
14、,服务于被调用的过程- A 等于该过程的等于该过程的局部变量数加局部变量数加 3- 3 个个特殊的特殊的联系单元联系单元编译原理类类P-code虚拟机虚拟机 指令指令 “OPR 0 0”- 过程调用结束后过程调用结束后, ,返回调用点并退栈返回调用点并退栈- 重置基址寄存器和栈顶寄存器重置基址寄存器和栈顶寄存器编译原理类类P-code虚拟机虚拟机 指令指令 “CAL L A”- 调用地址为调用地址为 A 的过程(置指令地址寄存器为的过程(置指令地址寄存器为A)- L 为调用过程与被调用过程的为调用过程与被调用过程的层差层差- 设置被调用过程的设置被调用过程的3 个联系单元个联系单元编译原理类类
15、P-code虚拟机虚拟机 指令指令 “LIT 0 A”- 立即数存入栈顶,即置立即数存入栈顶,即置T 所指存储单元的值为所指存储单元的值为A- T 加加 1 指令指令 “LOD L A”- 将层差为将层差为L、偏移量为偏移量为A的存储单元的值取到栈顶的存储单元的值取到栈顶- T 加加 1 指令指令 “STO L A”- T 减减 1- 将栈顶的值存入层差为将栈顶的值存入层差为L、偏移量为偏移量为A的存储单元的存储单元 注:注:层差为层差为L、偏移量为偏移量为A的存储单元,即沿当前层静的存储单元,即沿当前层静 态链态链SL开始向前第开始向前第L层的层的SL作为基址,加上作为基址,加上A,即为该,
16、即为该 单元的地址单元的地址编译原理类类P-code虚拟机虚拟机 指令指令 “OPR 0 1”- 求栈顶元素的相反数,结果值留在栈顶求栈顶元素的相反数,结果值留在栈顶 指令指令 “OPR 0 6”- 栈顶元素的奇偶判断,若为奇数,结果为栈顶元素的奇偶判断,若为奇数,结果为1;若为偶;若为偶 数,结果为数,结果为0 ;结果值留在栈顶;结果值留在栈顶编译原理类类P-code虚拟机虚拟机 指令指令 “OPR 0 2”- 次栈顶与栈顶的值相加,结果存入次栈顶次栈顶与栈顶的值相加,结果存入次栈顶- T 减减 1 指令指令 “OPR 0 3”- 次栈顶的值减去栈顶的值,结果存入次栈顶次栈顶的值减去栈顶的值
17、,结果存入次栈顶- T 减减 1 指令指令 “OPR 0 4”- 次栈顶的值乘以栈顶的值,结果存入次栈顶次栈顶的值乘以栈顶的值,结果存入次栈顶- T 减减 1 指令指令 “OPR 0 5”- 次栈顶的值除以栈顶的值,结果存入次栈顶次栈顶的值除以栈顶的值,结果存入次栈顶- T 减减 1编译原理类类P-code虚拟机虚拟机 指令指令 “OPR 0 8” 比较次栈顶与栈顶是否相等比较次栈顶与栈顶是否相等- 若相等,结果为若相等,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 9” 比较次栈顶与栈顶是否不相等比较次栈顶与栈顶是否不相等- 若不相等,结果为若不相等,结果
18、为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 10” 比较次栈顶是否小于栈顶比较次栈顶是否小于栈顶- 若小于,结果为若小于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 11” 比较次栈顶是否大于等于栈顶比较次栈顶是否大于等于栈顶- 若大于等于,结果为若大于等于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 12” 比较次栈顶是否大于栈顶比较次栈顶是否大于栈顶- 若大于,结果为若大于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 13” 比较次栈顶是否小于
19、等于栈顶比较次栈顶是否小于等于栈顶- 若小于等于,结果为若小于等于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1编译原理类类P-code虚拟机虚拟机 指令指令 “JMP 0 A”- 无条件转移至地址无条件转移至地址 A,即置,即置指令地址寄存器为指令地址寄存器为A 指令指令 “JPC 0 A”- 条件转移指令条件转移指令- 若栈顶为若栈顶为 0,则转移至地址,则转移至地址 A,即置指令地址寄存,即置指令地址寄存 器为器为A编译原理类类P-code虚拟机虚拟机 指令指令 “OPR 0 14”- 栈顶的值输出至控制台屏幕栈顶的值输出至控制台屏幕- T 减减 1 1 指令指令 “OPR
20、0 15”- 控制台屏幕输出一个换行控制台屏幕输出一个换行 指令指令 “OPR 0 16”- 从控制台读入一行输入,置入栈顶从控制台读入一行输入,置入栈顶- T 加加 1 1编译原理类类P-code虚拟机虚拟机 类类P-code 解释程序解释程序- 数据结构数据结构 运行栈运行栈 int sstacksize 指令寄存器指令寄存器 struct instruction enum fct f; /*操作码操作码*/ int l; /*引用层与声明层的层差引用层与声明层的层差*/ int a; /*因不同的因不同的f各异各异*/ i 指令地址寄存器指令地址寄存器 int p; 基址寄存器基址寄存器
21、 int b; 栈顶寄存器栈顶寄存器 int t; 虚拟机代码段虚拟机代码段 struct instruction codecxmax;编译原理类类P-code虚拟机虚拟机 类类P-code 解释程序解释程序- 处理流程处理流程 (1)初始化初始化 p=b=t=0; s0=s1=s2=0; (2)取指令到指令寄存器取指令到指令寄存器 i=codep; p+; (3)分析并解释执行指令分析并解释执行指令 i (4)若程序未结束(若程序未结束(p != 0),转),转(2) (5)返回返回 编译原理 例例const a=10;var b,c;procedure p; begin c:=b+a; e
22、nd;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点
23、退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17)
24、lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机btp编译原理 例例const a=10;var b,c;procedure p; begin c:=b+a; en
25、d;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退
26、栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) l
27、od 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt编译原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end
28、;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈
29、并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lo
30、d 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt000编译原理 例例const a=10;var b,c;procedure p; begin c:=b+a; e
31、nd;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点
32、退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17)
33、lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt0005编译原理 例例const a=10;var b,c;procedure p; begin c:=b+a
34、; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回
35、调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(1
36、7) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt0005编译原理 例例const a=10;var b,c;procedure p; begin c:=
37、b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈
38、并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进
39、栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt00055编译原理 例例const a=10;var b,c;procedure p; begin
40、 c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0
41、0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值
42、2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt000550编译原理 例例const a=10;var b,c;procedure p;
43、begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) o
44、pr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常
45、数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt00051编译原理 例例const a=10;var b,c;procedure
46、 p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中(
47、7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0
48、 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt0005编译原理 例例const a=10;var b,c;proced
49、ure p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中
50、中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) li
51、t 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt00050016编译原理 例例const a=10;var b,c
52、;procedure p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈
53、顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p
54、(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt00050016编译原理 例例const a=10;
55、var b,c;procedure p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4
56、栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用
57、过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt000500165编译原理 例例con
58、st a=10;var b,c;procedure p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6)
59、sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) ca
60、l 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2*c)(19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 换行换行(21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto 0 3 栈顶值送变量栈顶值送变量b中中(23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类P-code虚拟机虚拟机pbt00050016510
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年白城职业技术学院单招职业适应性考试备考题库及答案解析
- 2026年广西科技师范学院单招职业适应性测试模拟试题及答案解析
- 2026年河南机电职业学院单招职业适应性测试备考题库及答案解析
- 2026年江苏商贸职业学院单招职业适应性考试备考试题及答案解析
- 2026年郑州铁路职业技术学院单招职业适应性测试备考试题及答案解析
- 2026年云南能源职业技术学院单招职业适应性考试参考题库及答案解析
- 2026年临夏现代职业学院单招职业适应性考试参考题库及答案解析
- 2026年龙岩学院单招职业适应性考试备考题库及答案解析
- 2026年聊城职业技术学院单招职业适应性测试模拟试题及答案解析
- 2026年遵义职业技术学院单招职业适应性测试模拟试题及答案解析
- 2025云南省人民检察院招聘22人笔试考试备考题库及答案解析
- 2026年安全生产管理培训课件与事故预防与应急处理方案
- 2026年长沙民政职业技术学院单招职业技能考试题库及答案详解一套
- 医学检验质控课件
- 湘教版八年级地理上册 第三章《中国的自然资源》单元测试卷及答案
- 腭裂喂养护理:新生儿与婴儿喂养技巧
- 2025湘教版八年级地理上册期末复习全册知识点提纲
- DB63∕T 1917-2021 森林防火隔离带建设技术规程
- 浙江省强基联盟2025-2026学年高三上学期12月考试物理试卷
- 2025年秋冀教版(新教材)小学信息科技三年级上册期末综合测试卷及答案
- 2025年度选人用人工作专题报告
评论
0/150
提交评论