| typedef void (*Inst)(void); |
| #define STOP (Inst) 0 |
| |
| typedef struct Symbol Symbol; |
| typedef union Datum Datum; |
| typedef struct Formal Formal; |
| typedef struct Saveval Saveval; |
| typedef struct Fndefn Fndefn; |
| typedef union Symval Symval; |
| |
| union Symval { /* value of a symbol */ |
| double val; /* VAR */ |
| double (*ptr)(double); /* BLTIN */ |
| Fndefn *defn; /* FUNCTION, PROCEDURE */ |
| char *str; /* STRING */ |
| }; |
| |
| struct Symbol { /* symbol table entry */ |
| char *name; |
| long type; |
| Symval u; |
| struct Symbol *next; /* to link to another */ |
| }; |
| Symbol *install(char*, int, double), *lookup(char*); |
| |
| union Datum { /* interpreter stack type */ |
| double val; |
| Symbol *sym; |
| }; |
| |
| struct Saveval { /* saved value of variable */ |
| Symval val; |
| long type; |
| Saveval *next; |
| }; |
| |
| struct Formal { /* formal parameter */ |
| Symbol *sym; |
| Saveval *save; |
| Formal *next; |
| }; |
| |
| struct Fndefn { /* formal parameter */ |
| Inst *code; |
| Formal *formals; |
| int nargs; |
| }; |
| |
| extern Formal *formallist(Symbol*, Formal*); |
| extern double Fgetd(int); |
| extern int moreinput(void); |
| extern void restore(Symbol*); |
| extern void restoreall(void); |
| extern void execerror(char*, char*); |
| extern void define(Symbol*, Formal*), verify(Symbol*); |
| extern Datum pop(void); |
| extern void initcode(void), push(Datum), xpop(void), constpush(void); |
| extern void varpush(void); |
| #define div hocdiv |
| extern void eval(void), add(void), sub(void), mul(void), div(void), mod(void); |
| extern void negate(void), power(void); |
| extern void addeq(void), subeq(void), muleq(void), diveq(void), modeq(void); |
| |
| extern Inst *progp, *progbase, prog[], *code(Inst); |
| extern void assign(void), bltin(void), varread(void); |
| extern void prexpr(void), prstr(void); |
| extern void gt(void), lt(void), eq(void), ge(void), le(void), ne(void); |
| extern void and(void), or(void), not(void); |
| extern void ifcode(void), whilecode(void), forcode(void); |
| extern void call(void), arg(void), argassign(void); |
| extern void funcret(void), procret(void); |
| extern void preinc(void), predec(void), postinc(void), postdec(void); |
| extern void execute(Inst*); |
| extern void printtop(void); |
| |
| extern double Log(double), Log10(double), Gamma(double), Sqrt(double), Exp(double); |
| extern double Asin(double), Acos(double), Sinh(double), Cosh(double), integer(double); |
| extern double Pow(double, double); |
| |
| extern void init(void); |
| extern int yyparse(void); |
| extern void execerror(char*, char*); |
| extern void *emalloc(unsigned); |