Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

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);
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);