コンパイラ演習:作成問題4 (補足)

(担当:佐々木晃)

 

コードテーブルの実装

 

コードテーブルの実装例とテストプログラムは、次のとおりである。

 

ファイル:CodeTable.java

public class CodeTable{

    Inst[] codeTable;// 命令語を配列に保持する。

    int index;  //最後に生成した命令語のインデックス

    int size;   //最大命令長

    CodeTable(int s){

       // コンストラクタ

       // 最大命令長を初期値sとして設定する。

       size = s;

       index = -1;        

       codeTable = new Inst[size];

    }

 

    int addCode(String opCode, int p, int q) throws RuntimeException {

       // 命令をテーブルに追加する。

       // その命令のindexの値を返す。

        // 命令を追加できない場合は例外を投げる。

       index++;

       codeTable[index] = new Inst(opCode, p, q);

       return index;

    }

 

    int getIndex(){

      return index;

    }

 

    void backPatch(int ind, int target){

       //codeTable[ind]のとび先をtargetとする。

       codeTable[ind].q = target;

    }

 

    public void listCode(){

       // 目的コードの表示

       for(int i=0; i <=index; i++)

           System.out.println(codeTable[i]);

          

    }

    public static void main(String args[]){

       // テスト用

       CodeTable ct = new CodeTable(512);

       ct.addCode("LDC", 0, 0);

       ct.addCode("LDC", 0, 1);

       ct.addCode("EQ", 0, 0);

       int row = ct.addCode("FJ", 0, 100000);

       System.out.println("row=" + row);

       ct.addCode("LDC", 0, 100);

       ct.addCode("WRI", 0, 0);

       ct.backPatch(row, ct.getIndex()+1);

       ct.addCode("HLT", 0, 0);

       ct.listCode();

       // LDC 0 0; LDC 0 1; EQ 0 0; FJ 0 6; LDC 0 100;

        // WRI 0 0; HLT 0 0

    }

}  // end of public class CodeTable

 

class Inst{

    String operation; // 命令名

    int p;           // 1引数(第1オペランド)

    int q;     // 2引数(第2オペランド)

    Inst(String op, int a1, int a2){

      // コンストラクタ

       operation = op;

       p = a1;

       q = a2;

    }

 

    public String toString(){

       return(operation+"\t" + p + "\t" + q);

    }

}

 

JavaCCのプログラムへのコードテーブルの埋め込み方

 

上記のコードテーブルを埋め込むやり方は、次のようになる。JavaCCのアクションの中で例えばct.addCode(“AD”, 0, 0)のようにすることで、コードテーブルへの操作ができる。

 

PARSER_BEGIN(dm06k1234)

import java.io.*;

 

public class dm06k1234 {

  static NameTable nt;

  static CodeTable ct;

  ....

  public static void main(String args[]) {

   ...

    try {

       dm06k1234 parser = new dm06k1234( new FileReader(arg));

       nt = new NameTable(512);

       ct = new CodeTable(2000);

       parser.main(); // コンパイラの呼び出し(main()出ない人は名前を変える)

    } catch ( Exception ex ) {

       System.err.println("Failed to parse : "+ex.getMessage());

       ex.printStackTrace();

    }

  }

}

 

class Name{ // エントリ

 ....

}

 

class NameTable{ // 名前表

 ...

}

 

class Inst{ // 命令

 ...

}

 

class CodeTable{ // コードテーブル、public classとはしないこと

 ....

}

...

PARSER_END(dm06k1234)

 

    .... /// コンパイラ本体