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