13e12c5d1SDavid du Colombier typedef void (*Inst)(void); 23e12c5d1SDavid du Colombier #define STOP (Inst) 0 33e12c5d1SDavid du Colombier 4*7dd7cddfSDavid du Colombier typedef struct Symbol Symbol; 5*7dd7cddfSDavid du Colombier typedef union Datum Datum; 6*7dd7cddfSDavid du Colombier typedef struct Formal Formal; 7*7dd7cddfSDavid du Colombier typedef struct Saveval Saveval; 8*7dd7cddfSDavid du Colombier typedef struct Fndefn Fndefn; 9*7dd7cddfSDavid du Colombier typedef union Symval Symval; 10*7dd7cddfSDavid du Colombier 11*7dd7cddfSDavid du Colombier union Symval { /* value of a symbol */ 123e12c5d1SDavid du Colombier double val; /* VAR */ 133e12c5d1SDavid du Colombier double (*ptr)(double); /* BLTIN */ 14*7dd7cddfSDavid du Colombier Fndefn *defn; /* FUNCTION, PROCEDURE */ 153e12c5d1SDavid du Colombier char *str; /* STRING */ 16*7dd7cddfSDavid du Colombier }; 17*7dd7cddfSDavid du Colombier 18*7dd7cddfSDavid du Colombier struct Symbol { /* symbol table entry */ 19*7dd7cddfSDavid du Colombier char *name; 20*7dd7cddfSDavid du Colombier long type; 21*7dd7cddfSDavid du Colombier Symval u; 223e12c5d1SDavid du Colombier struct Symbol *next; /* to link to another */ 23*7dd7cddfSDavid du Colombier }; 243e12c5d1SDavid du Colombier Symbol *install(char*, int, double), *lookup(char*); 253e12c5d1SDavid du Colombier 26*7dd7cddfSDavid du Colombier union Datum { /* interpreter stack type */ 273e12c5d1SDavid du Colombier double val; 283e12c5d1SDavid du Colombier Symbol *sym; 29*7dd7cddfSDavid du Colombier }; 30*7dd7cddfSDavid du Colombier 31*7dd7cddfSDavid du Colombier struct Saveval { /* saved value of variable */ 32*7dd7cddfSDavid du Colombier Symval val; 33*7dd7cddfSDavid du Colombier long type; 34*7dd7cddfSDavid du Colombier Saveval *next; 35*7dd7cddfSDavid du Colombier }; 36*7dd7cddfSDavid du Colombier 37*7dd7cddfSDavid du Colombier struct Formal { /* formal parameter */ 38*7dd7cddfSDavid du Colombier Symbol *sym; 39*7dd7cddfSDavid du Colombier Saveval *save; 40*7dd7cddfSDavid du Colombier Formal *next; 41*7dd7cddfSDavid du Colombier }; 42*7dd7cddfSDavid du Colombier 43*7dd7cddfSDavid du Colombier struct Fndefn { /* formal parameter */ 44*7dd7cddfSDavid du Colombier Inst *code; 45*7dd7cddfSDavid du Colombier Formal *formals; 46*7dd7cddfSDavid du Colombier int nargs; 47*7dd7cddfSDavid du Colombier }; 48*7dd7cddfSDavid du Colombier 49*7dd7cddfSDavid du Colombier extern Formal *formallist(Symbol*, Formal*); 503e12c5d1SDavid du Colombier extern double Fgetd(int); 513e12c5d1SDavid du Colombier extern int moreinput(void); 52*7dd7cddfSDavid du Colombier extern void restore(Symbol*); 53*7dd7cddfSDavid du Colombier extern void restoreall(void); 543e12c5d1SDavid du Colombier extern void execerror(char*, char*); 55*7dd7cddfSDavid du Colombier extern void define(Symbol*, Formal*), verify(Symbol*); 563e12c5d1SDavid du Colombier extern Datum pop(void); 573e12c5d1SDavid du Colombier extern void initcode(void), push(Datum), xpop(void), constpush(void); 583e12c5d1SDavid du Colombier extern void varpush(void); 593e12c5d1SDavid du Colombier extern void eval(void), add(void), sub(void), mul(void), div(void), mod(void); 603e12c5d1SDavid du Colombier extern void negate(void), power(void); 613e12c5d1SDavid du Colombier extern void addeq(void), subeq(void), muleq(void), diveq(void), modeq(void); 623e12c5d1SDavid du Colombier 633e12c5d1SDavid du Colombier extern Inst *progp, *progbase, prog[], *code(Inst); 643e12c5d1SDavid du Colombier extern void assign(void), bltin(void), varread(void); 653e12c5d1SDavid du Colombier extern void prexpr(void), prstr(void); 663e12c5d1SDavid du Colombier extern void gt(void), lt(void), eq(void), ge(void), le(void), ne(void); 673e12c5d1SDavid du Colombier extern void and(void), or(void), not(void); 683e12c5d1SDavid du Colombier extern void ifcode(void), whilecode(void), forcode(void); 693e12c5d1SDavid du Colombier extern void call(void), arg(void), argassign(void); 703e12c5d1SDavid du Colombier extern void funcret(void), procret(void); 713e12c5d1SDavid du Colombier extern void preinc(void), predec(void), postinc(void), postdec(void); 723e12c5d1SDavid du Colombier extern void execute(Inst*); 733e12c5d1SDavid du Colombier extern void printtop(void); 743e12c5d1SDavid du Colombier 753e12c5d1SDavid du Colombier extern double Log(double), Log10(double), Gamma(double), Sqrt(double), Exp(double); 763e12c5d1SDavid du Colombier extern double Asin(double), Acos(double), Sinh(double), Cosh(double), integer(double); 773e12c5d1SDavid du Colombier extern double Pow(double, double); 783e12c5d1SDavid du Colombier 793e12c5d1SDavid du Colombier extern void init(void); 803e12c5d1SDavid du Colombier extern int yyparse(void); 813e12c5d1SDavid du Colombier extern void execerror(char*, char*); 823e12c5d1SDavid du Colombier extern void *emalloc(unsigned); 83