コンパイラ演習:作成問題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
//codeTable[ind]のとび先をtargetとする。
codeTable[
}
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)
.... /// コンパイラ本体