tiny+指令流(中间代码)设计

来源:互联网 发布:数据噪声是什么意思 编辑:程序博客网 时间:2024/06/05 02:20

最近在做tiny+的大作业,写了个编译器(个人认为更像是解释器),发表下关于这个指令流设计的一些心得。纯属个人心得与设计,与课本无关。

 1 指令流的设计:

     中间代码,作为执行的最小单元,我们将中间代码作为指令存在,将每条指令输入到向量表中,形成指令流,遍历指令流,也可生成目标代码,最后生成可执行体。directList类就是代表指令流。

     结构为:

class directList{
public :
vector<directSet> set;

void add(directSet instruct);//在最后插入
void addAt(int i,directSet direct);//在i处插入
directSet select(int index);//返回第i个的引用
int getSize();//返回当前长度
void print();
directList(){}
~directList(){}
};

     操作数 à 指令à 指令流

directList指令流:

directList作为指令流的存储容器,使用了STL标准库中vector容器的数据结构来存储指令(directSet),方便随机访问指令流中的单个指令,可以快速在尾部插入指令。

结构如下:

 

   2 基于堆栈的指令设计原理:

     我们结合汇编程序在堆栈中运行的原理,定义了一套伪汇编的指令(中间代码),其原理以X>1为例说明:

指令结果为

            在语义分析的基础上,先将变量X对应变量表查找到在变量表中的索引,假如X是在int类型的变量表中,并且其位置为index,那么在direct类中的index成员则记录这个索引,并直接将X等同于INTTABLE[INDEX],这就实现了我们所设计的中间代码就是最小的执行单元,就是可直接生成可执行体的目标代码。

 PUSH INTTABLE[INDEX]      (X压入栈中)

            PUSH 1                  (将1压入栈中)

            POP T0                  (遇到操作符,将1弹出栈,并将其赋值为T0,进入堆中进行运算)

            POP T1                  (将X弹出栈,并将其赋值为T1,进入堆中进行运算)

            COMPL TO  TI             (这条指令表示比较T1是否大于T0)

            PUSH T0                  (将运算得到的结果压回栈中)

   伪汇编指令的操作码为:

   enum OP{ADD,SUB,MUL,DIV,COMPL,COMPLE,COMPS,COMPSE,AND,OR,EQUAL,PUSH,POP,SET_INT,SET_STR,READ,WRITE,MOV,JUMP};其中SET_INT,SET_STR表示建表

directSet中有定义,DirectSet是指令类,包含操作数,操作码,跳转标识,跳转偏移量等。

Direct是操作数类,在我们所定义的三地址码中,做多只有两个操作数,所以提供了两个接口来将操作数添加到指令中,addoneaddtwo

3 跳转指令设计

  将指令分为两种类型,一种是跳转指令,一种是顺序指令,在指令类中有一个枚举类型包含这两种。若为跳转指令,则将其标识为跳转,并计算其相对应的偏移量。以if为例,偏移量记录的则是从else开始到else结束的位置。

4 变量表的设计

  设计变量表,将变量存进遍历表,在指令中,所采取的操作就是去表中查找相对应的位置。enum INDEX{INTINDEX=0,STRINDEX=1};表示两种类型的表,int Index;表示表中的索引值。

5 常量的设计

  直接将常量引入指令中

  MOV X1  1赋予X

6操作数结构如下:

 class direct{ //操作数
public:
    T t;//用来计算后放进堆栈,或取出堆栈进行计算的值
 INDEX kind;//变量表类型
public :
 int Ivalue;//常量
 string Svalue;//常量
 string IDStr;//变量声明建表时使用
 int Index;//索引
 int JumAddress;//要跳转的地址
    direct();
   void  printD();
    void clear();
 
};

7指令结构如下:

class directSet{
OP op;//
public:
direct list;//操作数链表
direct next;//下移
TYPE type;
int address;//地址
void addOne(OP op,direct list,TYPE type,int & address);//list
void addTwo(OP op, direct list,direct next,TYPE type, int &address);
void printDS();
void clear();
int offset;
};

8 枚举类型如下:

        enum OP{ADD,SUB,MUL,DIV,COMPL,COMPLE,COMPS,COMPSE,AND,OR,EQUAL,PUSH,POP,SET_INT,SET_STR,READ,WRITE,MOV,JUMP};
enum INDEX{INTINDEX=0,STRINDEX=1};
enum TYPE{NUL,SEQ,JUM};
enum T{TN,T0,T1};

原创粉丝点击