美文网首页
PL/0简单编译系统(五)

PL/0简单编译系统(五)

作者: Shiyi001 | 来源:发表于2017-01-17 15:38 被阅读0次

Pcode生成

P-code 语言是一种栈式机的语言。此类栈式机没有累加器和通用寄存器,有一个栈式存储器,有四个控制寄存器(指令寄存器 I,指令地址寄存器 P,栈顶寄存器 T和基址寄存器 B),算术逻辑运算都在栈顶进行。

Pcode的指令格式为:

F :操作码
L :层次差 (标识符引用层减去定义层)
A :不同的指令含义不同

对于不同的Pcode指令,各指令含义如下:

指令 具体含义
LIT 0, a 取常量a放到数据栈栈顶
OPR 0, a 执行运算,a表示执行何种运算(+ - * /)
LOD l, a 取变量放到数据栈栈顶(相对地址为a,层次差为l)
STO l, a 将数据栈栈顶内容存入变量(相对地址为a,层次差为l)
CAL l, a 调用过程(入口指令地址为a,层次差为l)
INT 0, a 数据栈栈顶指针增加a
JMP 0, a 无条件转移到指令地址a
JPC 0, a 条件转移到指令地址a
OPR 0 0 过程调用结束后,返回调用点并退栈
OPR 0 1 栈顶元素取反
OPR 0 2 次栈顶与栈顶相加,退两个栈元素,结果值进栈
OPR 0 3 次栈顶减去栈顶,退两个栈元素,结果值进栈
OPR 0 4 次栈顶乘以栈顶,退两个栈元素,结果值进栈
OPR 0 5 次栈顶除以栈顶,退两个栈元素,结果值进栈
OPR 0 6 栈顶元素的奇偶判断,结果值在栈顶
OPR 0 7
OPR 0 8 次栈顶与栈顶是否相等,退两个栈元素,结果值进栈
OPR 0 9 次栈顶与栈顶是否不等,退两个栈元素,结果值进栈
OPR 0 10 次栈顶是否小于栈顶,退两个栈元素,结果值进栈
OPR 0 11 次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈
OPR 0 12 次栈顶是否大于栈顶,退两个栈元素,结果值进栈
OPR 0 13 次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈
OPR 0 14 栈顶值输出至屏幕
OPR 0 15 屏幕输出换行
OPR 0 16 从命令行读入一个输入置于栈顶

根据Pcode指令的相关含义,在语法分析的同时填入Pcode。

地址回填

在Pcode生成中,地址回填是最难也是最重要的部分。对于不同的代码,我们采取不同的地址回填策略。

  • if-then语句的目标代码生成模式
if <condition> then <statement>
    [if]
    <condition>
    JPC addr1
    <statement>
addr1:  
  • If-then-else语句的目标代码生成模式:
if <condition> then <statement>[else]
    [if]
    <condition>
    JPC addr1
    <statement>
    JMP addr2
addr1:  [else]
    <statement>
addr2   
  • while-do语句的目标代码生成模式:
while <condition> do <statement>
    [while]
addr2:  <condition>
    JPC addr3
    <statement>
    JPC addr2
addr3:  
  • repeat-until语句的目标代码生成模式:
repeat <statement> until <condition>
    [repeat]
addr4:  <statement>
    [until]
    <condition>
    JPC addr4

词法分析
符号表管理
语法和语义分析
Pcode生成
出错管理

相关文章

  • PL/0简单编译系统(五)

    Pcode生成 P-code 语言是一种栈式机的语言。此类栈式机没有累加器和通用寄存器,有一个栈式存储器,有四个控...

  • PL/0简单编译系统(一)

    上文中我们介绍了PL/0的文法,接下来我们将介绍一个完整的编译系统各个部分~ 编译系统介绍 一个经典的编译程序一般...

  • PL/0简单编译系统(二)

    词法分析 词法分析又称词法分析器或者扫描器,是编译程序的基本子程序之一。本项目采用手工方式设计并实现词法分析程序。...

  • PL/0简单编译系统(三)

    符号表管理 符号表是编译过程中编译程序用来记录源程序中的各种名字(即标识符)的特性信息的表格,符号表的每一个登记项...

  • PL/0简单编译系统(四)

    语法分析和语义分析 由于本项目使用的是递归下降子程序法,对每一个PL/0中的语法成分都进行了分析,并单独编写为一个...

  • PL/0简单编译系统(零)

    本学期修了《编译原理》这门课。课程大作业是实现一个PL/0编译器。接下来将记录在实现过程中的心得、遇到的问题和解决...

  • PL/0简单编译系统(六)

    出错管理 在编译过程中,既可能出现语法错误,也可能出现语义错误(如变量未声明等)。本项目将错误分为24类,如下表所...

  • OLLVM in Android Studio

    0x01 Ollvm编译 系统: macos 10.15.6 在之前的macos系统上,编译ollvm还是比较流畅...

  • Pl0编译器源码阅读

    写在前面 其实这个是我的编译原理一次作业的草稿,也是第一次阅读编译器的源码,虽然比较简单,但是也是第一次,分享一下...

  • 递归算法:0/1背包问题

    1、环境配置: 系统:win10 编程语言:C++ 编译器:DevC++ 2、问题描述: 简单的0/1背包问题:设...

网友评论

      本文标题:PL/0简单编译系统(五)

      本文链接:https://www.haomeiwen.com/subject/wkimbttx.html