hoc.h 2.3 KB

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