#include #include #define IPRG_LEN 8000 /* 中間言語のプログラムの最大の長さ */ #define IPRG_STACK_LEN 8000 /* 実行時スタックの長さ */ #define VAR_LEN 8000 /* 使える変数の数 */ #define TREE_HEAP_LEN 8000 /* 構文木の node に使用するメモリーの大きさ */ #define STR_HEAP_LEN 10000 /* 文字列のヒープの大きさ */ /* インタプレータの instruction set */ #define UNARY 1 /* iprg_stack の一番上につまれた double 型の 値をとってきてこれに一項演算をほどこしこれを 同じ場所に入れる stack_ptr は同じ場所にとどまる */ #define BINARY 2 /* スタックポインタを一つ下げて,ここと前に スタックポインタの指していた場所に 格納された実数に二項演算をほどこす. 演算結果は新しくスタックポインタの指している 場所になる */ #define PUTCONST 3 /* スタックポインタを一つ上げ,定数を それの指す場所に格納する */ #define PUTADDR 4 /* スタックポインタを一つあげ, プログラムカウンタの値 +1 をスタックに格納する */ #define SET 5 /* スタックポインタを一つ上げ,変数 x[...] の値をこれの指す場所に格納 */ #define LET 6 /* スタックポインタの指す場所に格納された実数を, 変数 x[...] に格納する.スタックポインタを 一つ下げる */ #define GOTO 10 #define XWHILE 11 /* スタックポインタの指す場所に格納された 値が正の実数 ( > 0 ) なら, スタックポインタを一つさげて次に進む. そうでなければ,XWHILE -- LABEL の ネスティングを一つ下がるところまで プログラムカウンタを進め, スタックポインタを二つ下げる */ #define LABEL 12 /* スッタクポインタの指している場所に格納されている アドレスに飛ぶ */ #define XPRINTSTR 20 /* プログラムに格納された記号列を印刷 */ #define XPRINTVAR 21 /* プログラムで指定した変数 x[...]を印刷 */ #define ENDOFP 0 #define CENTINEL 800 typedef double OPERATION(); /* 中間言語の instruction set のデータタイプ*/ typedef struct { int instr; double *var; union{ char *str; OPERATION *op; double value; }ptr; } INSTR_PAIR; extern INSTR_PAIR iprg[IPRG_LEN]; /* 中間言語プログラムの格納場所 */ extern int prg_ctr; /* 中間言語プログラムカウンタ */ typedef struct { int addr; double value; } IPRG_STACK; extern IPRG_STACK iprg_stack[IPRG_STACK_LEN]; /* 中間言語実行時のスタック */ extern int stack_ptr; /* 中間言語実行時スタックポインタ */ extern double x[VAR_LEN]; /* 変数 */ typedef struct { int instr; union { double value; OPERATION *op; } with; union { double *var; struct { int left; int right; } the; } to; } NODE; extern int setcleaf ( double value ); #define CONSTLEAF 801 /* 定数の leaf */ #define VARLEAF 802 /* 変数の leaf */ extern char *putstring (char* str); extern double ltop(); extern double addop(); extern double subop(); extern double mulop(); extern double divop(); extern double minus();