www.pudn.com > interpreter.zip > interpreter.h


#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();