1 typedef void (*Inst)(void); 2 #define STOP (Inst) 0 3 4 typedef struct Symbol { /* symbol table entry */ 5 char *name; 6 long type; 7 union { 8 double val; /* VAR */ 9 double (*ptr)(double); /* BLTIN */ 10 Inst *defn; /* FUNCTION, PROCEDURE */ 11 char *str; /* STRING */ 12 } u; 13 struct Symbol *next; /* to link to another */ 14 } Symbol; 15 Symbol *install(char*, int, double), *lookup(char*); 16 17 typedef union Datum { /* interpreter stack type */ 18 double val; 19 Symbol *sym; 20 } Datum; 21 extern double Fgetd(int); 22 extern int moreinput(void); 23 extern void execerror(char*, char*); 24 extern void define(Symbol*), verify(Symbol*); 25 extern Datum pop(void); 26 extern void initcode(void), push(Datum), xpop(void), constpush(void); 27 extern void varpush(void); 28 extern void eval(void), add(void), sub(void), mul(void), div(void), mod(void); 29 extern void negate(void), power(void); 30 extern void addeq(void), subeq(void), muleq(void), diveq(void), modeq(void); 31 32 extern Inst *progp, *progbase, prog[], *code(Inst); 33 extern void assign(void), bltin(void), varread(void); 34 extern void prexpr(void), prstr(void); 35 extern void gt(void), lt(void), eq(void), ge(void), le(void), ne(void); 36 extern void and(void), or(void), not(void); 37 extern void ifcode(void), whilecode(void), forcode(void); 38 extern void call(void), arg(void), argassign(void); 39 extern void funcret(void), procret(void); 40 extern void preinc(void), predec(void), postinc(void), postdec(void); 41 extern void argaddeq(void), argsubeq(void), argmuleq(void); 42 extern void argdiveq(void), argmodeq(void); 43 extern void execute(Inst*); 44 extern void printtop(void); 45 46 extern double Log(double), Log10(double), Gamma(double), Sqrt(double), Exp(double); 47 extern double Asin(double), Acos(double), Sinh(double), Cosh(double), integer(double); 48 extern double Pow(double, double); 49 50 extern void init(void); 51 extern int yyparse(void); 52 extern void execerror(char*, char*); 53 extern void *emalloc(unsigned); 54