rsc | c5b9ff9 | 2003-12-04 17:45:49 +0000 | [diff] [blame] | 1 | typedef void (*Inst)(void); |
| 2 | #define STOP (Inst) 0 |
| 3 | |
| 4 | typedef struct Symbol Symbol; |
| 5 | typedef union Datum Datum; |
| 6 | typedef struct Formal Formal; |
| 7 | typedef struct Saveval Saveval; |
| 8 | typedef struct Fndefn Fndefn; |
| 9 | typedef union Symval Symval; |
| 10 | |
| 11 | union Symval { /* value of a symbol */ |
| 12 | double val; /* VAR */ |
| 13 | double (*ptr)(double); /* BLTIN */ |
| 14 | Fndefn *defn; /* FUNCTION, PROCEDURE */ |
| 15 | char *str; /* STRING */ |
| 16 | }; |
| 17 | |
| 18 | struct Symbol { /* symbol table entry */ |
| 19 | char *name; |
| 20 | long type; |
| 21 | Symval u; |
| 22 | struct Symbol *next; /* to link to another */ |
| 23 | }; |
| 24 | Symbol *install(char*, int, double), *lookup(char*); |
| 25 | |
| 26 | union Datum { /* interpreter stack type */ |
| 27 | double val; |
| 28 | Symbol *sym; |
| 29 | }; |
| 30 | |
| 31 | struct Saveval { /* saved value of variable */ |
| 32 | Symval val; |
| 33 | long type; |
| 34 | Saveval *next; |
| 35 | }; |
| 36 | |
| 37 | struct Formal { /* formal parameter */ |
| 38 | Symbol *sym; |
| 39 | Saveval *save; |
| 40 | Formal *next; |
| 41 | }; |
| 42 | |
| 43 | struct Fndefn { /* formal parameter */ |
| 44 | Inst *code; |
| 45 | Formal *formals; |
| 46 | int nargs; |
| 47 | }; |
| 48 | |
| 49 | extern Formal *formallist(Symbol*, Formal*); |
| 50 | extern double Fgetd(int); |
| 51 | extern int moreinput(void); |
| 52 | extern void restore(Symbol*); |
| 53 | extern void restoreall(void); |
| 54 | extern void execerror(char*, char*); |
| 55 | extern void define(Symbol*, Formal*), verify(Symbol*); |
| 56 | extern Datum pop(void); |
| 57 | extern void initcode(void), push(Datum), xpop(void), constpush(void); |
| 58 | extern void varpush(void); |
| 59 | #define div hocdiv |
| 60 | extern void eval(void), add(void), sub(void), mul(void), div(void), mod(void); |
| 61 | extern void negate(void), power(void); |
| 62 | extern void addeq(void), subeq(void), muleq(void), diveq(void), modeq(void); |
| 63 | |
| 64 | extern Inst *progp, *progbase, prog[], *code(Inst); |
| 65 | extern void assign(void), bltin(void), varread(void); |
| 66 | extern void prexpr(void), prstr(void); |
| 67 | extern void gt(void), lt(void), eq(void), ge(void), le(void), ne(void); |
| 68 | extern void and(void), or(void), not(void); |
| 69 | extern void ifcode(void), whilecode(void), forcode(void); |
| 70 | extern void call(void), arg(void), argassign(void); |
| 71 | extern void funcret(void), procret(void); |
| 72 | extern void preinc(void), predec(void), postinc(void), postdec(void); |
| 73 | extern void execute(Inst*); |
| 74 | extern void printtop(void); |
| 75 | |
| 76 | extern double Log(double), Log10(double), Gamma(double), Sqrt(double), Exp(double); |
| 77 | extern double Asin(double), Acos(double), Sinh(double), Cosh(double), integer(double); |
| 78 | extern double Pow(double, double); |
| 79 | |
| 80 | extern void init(void); |
| 81 | extern int yyparse(void); |
| 82 | extern void execerror(char*, char*); |
| 83 | extern void *emalloc(unsigned); |