/*
// Full copyright information is available in the file ../doc/CREDITS
*/
#ifndef CODE_PRV_H
#define CODE_PRV_H
typedef union instr Instr;
typedef struct handler_positions Handler_positions;
/* An instruction is the code generator's temporary representation of what will
* become an opcode after the code has been completely compiled and there are
* no errors. */
union instr {
Long val;
char *str;
Id_list *errors;
};
/* A program is the parser's representation of a program, and is intermediate.
* The code generator converts a program into a method structure (see
* method.h), which is the internal form of a ColdC program used by the
* interpreter. */
struct prog {
Arguments * args;
Id_list * vars;
Stmt_list * stmts;
};
struct arguments {
Id_list *ids;
char *rest;
};
struct stmt {
Int type;
Int lineno;
union {
char *comment;
Expr *expr;
Stmt_list *stmt_list;
struct {
Expr *cond;
Stmt *true;
Stmt *false;
} if_;
struct {
char *var;
Expr *lower;
Expr *upper;
Stmt *body;
} for_range;
struct {
char *var;
Expr *list;
Stmt *body;
} for_list;
struct {
Expr *cond;
Stmt *body;
} while_;
struct {
Expr *expr;
Case_list *cases;
} switch_;
struct {
Id_list *errors;
Stmt *body;
Stmt *handler;
} ccatch;
struct {
Expr *time;
Stmt *body;
} fork;
} u;
};
struct expr {
Int type;
Int lineno;
union {
Long num, objnum;
float fnum;
char *name, *symbol, *error, *str;
Expr *expr;
Expr_list *args;
struct {
char *name;
Expr_list *args;
} function;
struct {
Expr *lval;
Expr *value;
} assign;
struct {
char *var;
Expr *value;
} optassign;
struct {
Expr *message;
Expr_list *args;
} self_expr_message;
struct {
Expr *to;
char *name;
Expr_list *args;
} message;
struct {
Expr *to;
Expr *message;
Expr_list *args;
} expr_message;
struct {
Expr *cclass;
Expr *rep;
Expr *handler;
} frob;
struct {
Expr *list;
Expr *offset;
} index;
struct {
Int opcode;
Expr *expr;
} unary;
struct {
Int opcode;
Expr *left;
Expr *right;
} binary;
struct {
Int opcode;
char *var;
Expr *value;
} doeq;
struct {
Expr *left;
Expr *right;
} and, or;
struct {
Expr *src;
char *var;
Expr *job;
} map;
struct {
Expr *start;
Expr *end;
char *var;
Expr *job;
} maprange;
struct {
Expr *cond;
Expr *true;
Expr *false;
} cond;
struct {
Expr *lower;
Expr *upper;
} range;
} u;
};
struct case_entry {
Int lineno;
Expr_list *values;
Stmt_list *stmts;
};
struct id_list {
Int lineno;
char *ident;
Id_list *next;
};
struct stmt_list {
Stmt *stmt;
Stmt_list *next;
};
struct expr_list {
Expr *expr;
Expr_list *next;
};
struct case_list {
Case_entry *case_entry;
Case_list *next;
};
#endif