Module Generator
Generates intermediate codes from the given semantic graph
include Generator__.Instruction
type lhs_inst=|PeakAtom of reg_i * functor_アトムリストの先頭から随時,ファンクタが
functor_であるアトムへの参照を, レジスタreg_iに格納してゆく- failable and possibly rewind
|CheckFunctor of reg_i * functor_reg_iに格納したアトムのファンクタがfunctor_であることを確認する- failable and does not rewind
|DerefAtom of reg_i * reg_i * int * intDerefAtom dst_reg_i src_reg_i src_port_i dst_port_iは, レジスタsrc_reg_iが参照するアトムのsrc_port_i番目の引数の持つアトムへの参照を このリンクが相手先でdst_port_i番目の引数に接続されていることを確認して レジスタdst_reg_iに格納する- failable and does not rewind
- (通常のリンクではなかったときも失敗するようにしようと思っていたけど,そうしないことにする?)
- 基本的に局所リンクのマッチングに用いる
|CheckRefEq of reg_i * reg_iCheckRefEq reg_i reg_jは レジスタreg_iに格納されているアドレスと レジスタreg_jに格納されているアドレスが等しいことを確認する- failable and does not rewind
|CheckRefNeq of reg_i * reg_iCheckRefEq reg_i reg_jは レジスタreg_iに格納されているアドレスと レジスタreg_jに格納されているアドレスが異なることを確認する- failable and does not rewind
|BindData of string * reg_i * intBindData var src_reg_i src_port_iは レジスタsrc_reg_iが参照するアトムのポートsrc_port_i番目のデータアトムを 変数varに束縛する- 今は完全にインタプリタ方式だが,より低レベルな命令列に変更する必要がある.
|FailMatching of string仮想マシンを(途中で)強制終了する.デバッグのための命令
ルール左辺におけるマッチングのための中間命令
- failable は失敗する可能性があるということ
- rewind は後続の命令が失敗したときに巻き戻しの起点になるということ
- レジスタに格納するデータはアトムへの参照のみ
type register = atom ref
type lhs_insts= lhs_inst listtype rhs_inst=|PushAtom of reg_i * functor_PushAtom reg_i functor_は, ルール右辺で生成する,ファンクタfunctor_の(シンボル)アトムを生成し,レジスタreg_iに代入する- アトムリストへの追加も行う
- ただし,リンクの値は正しい値にセットされない
|FreeAtom of reg_iFreeAtom reg_iは, レジスタreg_iが参照する先のアトムをアトムリストから除去し,メモリを解放する|SetLink of reg_i * int * reg_i * intSetLink reg_i port_i reg_j port_jは, レジスタreg_iが参照するアトムのport_i番目のリンクと レジスタreg_jが参照するアトムのport_j番目のリンクを結ぶ- 基本的に局所リンクのための命令
|ReLink of reg_i * int * reg_i * intReLink reg_i port_i reg_j port_jは, レジスタreg_iが参照するルール右辺で生成したアトムのport_i番目のリンクと レジスタreg_jが参照するルール左辺でマッチしたアトムのport_j番目のリンクを繋ぐ- リンクオブジェクトは,基本的には,参照先のアトムと,参照先でのポート番号の組になっている
- 基本的に自由リンクのための命令
|Connect of reg_i * int * reg_i * intConnect reg_i reg_jは, レジスタreg_iが参照するルール左辺でマッチしたアトムのport_i番目のリンクと レジスタreg_jが参照するルール左辺でマッチしたアトムのport_j番目のリンクとを結ぶ- リンクオブジェクトは,基本的には,参照先のアトムと,参照先でのポート番号の組になっている
- 自由リンク同士を接続するために用いる
|SetData of reg_i * int * stringPushData reg_i port_i varは, ルール右辺で生成する,変数varに束縛されたデータアトムを生成し, レジスタreg_i番目のアトムの,ポートport_iにセットする- アトムリストへの追加は行わない
- 今は完全にインタプリタ方式だが,より低レベルな命令列に変更する必要がある.
|FailPushout of string仮想マシンを(途中で)強制終了する.デバッグのための命令
ルール右辺におけるマッチングのための中間命令. どれも失敗することはない.
type rhs_insts= rhs_inst list
val string_of_functor : (string * int) -> stringval string_of_lhs_inst : lhs_inst -> stringval string_of_rhs_inst : rhs_inst -> stringval string_of_lhs_insts : lhs_inst list -> stringval string_of_rhs_insts : rhs_inst list -> stringval string_of_rule : (string * (int * (lhs_inst list * Parse__.Syntax.arg list * rhs_inst list))) -> stringval break_line : string -> stringval string_of_prog : ((int * rhs_inst list) * (string * (int * (lhs_inst list * Parse__.Syntax.arg list * rhs_inst list))) list) -> string
val gen_ic_of_rule : Analyze.a_rule -> string * (int * (Generator__.Instruction.lhs_inst list * Parse.arg list * Generator__.Instruction.rhs_inst list))ルールから中間命令列を生成する
- 戻り値は,生成した中間命令列と必要になるレジスタの数
val gen_ic_of_rules : Analyze.a_rule list -> (string * (int * (Generator__.Instruction.lhs_inst list * Parse.arg list * Generator__.Instruction.rhs_inst list))) listルールセットから中間命令列とレジスタの数のタプルのリストを生成する
val gen_ic_of_init : (Analyze.local_port_map * (int * (string * Corelang.c_link list)) list) -> int * Generator__.Instruction.rhs_inst list初期状態を生成するための中間命令と必要なレジスタの数を返す
val gen_ic : ((Analyze.local_port_map * (int * (string * Corelang.c_link list)) list) * Analyze.a_rule list) -> (int * Generator__.Instruction.rhs_inst list) * (string * (int * (Generator__.Instruction.lhs_inst list * Parse.arg list * Generator__.Instruction.rhs_inst list))) list初期状態とルールを受け取って,中間命令やレジスタの本数を返す