Initial revision
This commit is contained in:
91
lang/occam/comp/symtab.h
Normal file
91
lang/occam/comp/symtab.h
Normal file
@@ -0,0 +1,91 @@
|
||||
#ifndef nil
|
||||
#define nil 0
|
||||
#endif
|
||||
|
||||
/* Symbol/Expression type: */
|
||||
#define T_VAR 0x0000
|
||||
#define T_CHAN 0x0001
|
||||
#define T_CONST 0x0002
|
||||
#define T_VALUE 0x0003
|
||||
#define T_PROC 0x0004
|
||||
#define T_NOW 0x0005
|
||||
#define T_VOID 0x0006
|
||||
|
||||
#define T_TYPE 0x0007 /* Mask for type bits */
|
||||
|
||||
/* Flags: */
|
||||
#define T_ARR 0x0008 /* Object is an array */
|
||||
#define T_BYTE 0x0010 /* Object is a byte array if T_ARR */
|
||||
#define T_PARAM 0x0020 /* Formal parameter */
|
||||
#define T_LVALUE 0x0040 /* This object may be assigned */
|
||||
#define T_NOTDECL 0x0080 /* If you didn't declare it */
|
||||
#define T_USED 0x0100 /* If you've used it */
|
||||
#define T_ASSIGNED 0x0200 /* Or assigned it */
|
||||
#define T_REP 0x0400 /* Replicator index */
|
||||
#define T_BUILTIN 0x0800 /* Builtin name */
|
||||
#define T_RECURS 0x1000 /* This proc is now compiled */
|
||||
/* Note that some types and flags are only used for symbols, and others only
|
||||
* for expressions.
|
||||
*/
|
||||
|
||||
struct symbol;
|
||||
|
||||
struct par_list { /* List of parameter types for a proc object */
|
||||
struct par_list *next;
|
||||
struct symbol *var; /* The formal parameter while visible */
|
||||
int type; /* Its type */
|
||||
};
|
||||
|
||||
struct expr;
|
||||
|
||||
union storage { /* An object is found */
|
||||
int level; /* either at a certain local level */
|
||||
char *builtin; /* or using a global builtin name */
|
||||
};
|
||||
|
||||
union type_info {
|
||||
struct {
|
||||
union storage st;
|
||||
int offset; /* from its local level or builtin name */
|
||||
} vc; /* Variable or channel */
|
||||
|
||||
struct expr *const;
|
||||
|
||||
struct {
|
||||
union storage st;
|
||||
char *file; /* file it is in */
|
||||
int label; /* A unique id*/
|
||||
struct par_list *pars;
|
||||
} proc;
|
||||
};
|
||||
|
||||
struct symbol {
|
||||
char *name;
|
||||
short type;
|
||||
int arr_siz;
|
||||
union type_info info;
|
||||
struct symbol *left, *right;
|
||||
};
|
||||
|
||||
struct symtab {
|
||||
struct symbol *local;
|
||||
struct symtab *global;
|
||||
int old_offset;
|
||||
};
|
||||
|
||||
struct symbol *insert();
|
||||
struct symbol *searchall();
|
||||
|
||||
void sym_down();
|
||||
void sym_up();
|
||||
void var_memory(), chan_memory();
|
||||
|
||||
void pars_add();
|
||||
int form_offsets();
|
||||
void check_recursion();
|
||||
|
||||
#define var_constant(v) (((v)->type&T_TYPE)==T_CONST)
|
||||
#define var_proc(v) (((v)->type&T_TYPE)==T_PROC)
|
||||
#define var_declared(v) (! ((v)->type&T_NOTDECL))
|
||||
|
||||
extern union type_info none;
|
||||
Reference in New Issue
Block a user