diff options
Diffstat (limited to 'src/rtt/rtt1.h')
-rw-r--r-- | src/rtt/rtt1.h | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/rtt/rtt1.h b/src/rtt/rtt1.h new file mode 100644 index 0000000..76779c7 --- /dev/null +++ b/src/rtt/rtt1.h @@ -0,0 +1,187 @@ +#include "../preproc/preproc.h" +#include "../preproc/pproto.h" + +#define IndentInc 3 +#define MaxCol 80 + +#define Max(x,y) ((x)>(y)?(x):(y)) + +/* + * cfile is used to create a list of cfiles created from a source file. + */ +struct cfile { + char *name; + struct cfile *next; + }; + +/* + * srcfile is an entry of dependants of a source file. + */ +struct srcfile { + char *name; + struct cfile *dependents; + struct srcfile *next; + }; + +#define ForceNl() nl = 1; +extern int nl; /* flag: a new-line is needed in the output */ + +/* + * The lexical analyzer recognizes 3 states. Operators are treated differently + * in each state. + */ +#define DfltLex 0 /* Covers most input. */ +#define OpHead 1 /* In head of an operator definition. */ +#define TypeComp 2 /* In abstract type computation */ + +extern int lex_state; /* state of operator recognition */ +extern char *compiler_def; /* #define for COMPILER */ +extern FILE *out_file; /* output file */ +extern int def_fnd; /* C input defines something concrete */ +extern char *inclname; /* include file to be included by C compiler */ +extern int iconx_flg; /* flag: indicate that iconx style code is needed */ +extern int enable_out; /* enable output of C code */ +extern char *largeints; /* "Largeints" or "NoLargeInts" */ + +/* + * The symbol table is used by the lexical analyser to decide whether an + * identifier is an ordinary identifier, a typedef name, or a reserved + * word. It is used by the parse tree builder to decide whether an + * identifier is an ordinary C variable, a tended variable, a parameter + * to a run-time routine, or the special variable "result". + */ +struct sym_entry { + int tok_id; /* Ident, TokType, or identification of reserved word */ + char *image; /* image of symbol */ + int id_type; /* OtherDcl, TndDesc, TndStr, TndBlk, Label, RtParm, + DrfPrm, RsltLoc */ + union { + struct { /* RtParm: */ + int param_num; /* parameter number */ + int cur_loc; /* PrmTend, PrmCStr, PrmInt, or PrmDbl */ + int non_tend; /* non-tended locations used */ + int parm_mod; /* something may have modified it */ + struct sym_entry *next; + } param_info; + struct { /* TndDesc, TndStr, TndBlk: */ + struct node *init; /* initial value from declaration */ + char *blk_name; /* TndBlk: struct name of block */ + struct sym_entry *next; + } tnd_var; + struct { /* OtherDcl from "declare {...}": */ + struct node *tqual; /* storage class, type qualifier list */ + struct node *dcltor; /* declarator */ + struct node *init; /* initial value from declaration */ + struct sym_entry *next; + } declare_var; + int typ_indx; /* index into arrays of type information */ + word lbl_num; /* label number used in in-line code */ + int referenced; /* RsltLoc: is referenced */ + } u; + int t_indx; /* index into tended array */ + int il_indx; /* index used in in-line code */ + int nest_lvl; /* 0 - reserved word, 1 - global, >= 2 - local */ + int may_mod; /* may be modified in particular piece of code */ + int ref_cnt; + struct sym_entry *next; + }; + +/* + * Path-specific parameter information must be saved and merged for + * branching and joining of paths. + */ +struct parminfo { + int cur_loc; + int parm_mod; + }; + +/* + * A list is maintained of information needed to initialize tended descriptors. + */ +struct init_tend { + int t_indx; /* index into tended array */ + int init_typ; /* TndDesc, TndStr, TndBlk */ + struct node *init; /* initial value from declaration */ + int nest_lvl; /* level of nesting of current use of tended slot */ + int in_use; /* tended slot is being used in current scope */ + struct init_tend *next; + }; + + +extern int op_type; /* Function, Keyword, Operator, or OrdFunc */ +extern char lc_letter; /* f = function, o = operator, k = keyword */ +extern char uc_letter; /* F = function, O = operator, K = keyword */ +extern char prfx1; /* 1st char of unique prefix for operation */ +extern char prfx2; /* 2nd char of unique prefix for operation */ +extern char *fname; /* current source file name */ +extern int line; /* current source line number */ +extern struct implement *cur_impl; /* data base entry for current operator */ +extern struct token *comment; /* descriptive comment for current oper */ +extern int n_tmp_str; /* total number of string buffers needed */ +extern int n_tmp_cset; /* total number of cset buffers needed */ +extern int nxt_sbuf; /* index of next string buffer */ +extern int nxt_cbuf; /* index of next cset buffer */ +extern struct sym_entry *params; /* current list of parameters */ +extern struct sym_entry *decl_lst; /* declarations from "declare {...}" */ +extern struct init_tend *tend_lst; /* list of allocated tended slots */ +extern char *str_rslt; /* string "result" in string table */ +extern word lbl_num; /* next unused label number */ +extern struct sym_entry *v_len; /* symbol entry for size of varargs */ +extern int il_indx; /* next index into data base symbol table */ + +/* + * lvl_entry keeps track of what is happening at a level of nested declarations. + */ +struct lvl_entry { + int nest_lvl; + int kind_dcl; /* IsTypedef, TndDesc, TndStr, TndBlk, or OtherDcl */ + char *blk_name; /* for TndBlk, the struct name of the block */ + int parms_done; /* level consists of parameter list which is complete */ + struct sym_entry *tended; /* symbol table entries for tended variables */ + struct lvl_entry *next; + }; + +extern struct lvl_entry *dcl_stk; /* stack of declaration contexts */ + +extern int fnc_ret; /* RetInt, RetDbl, RetNoVal, or RetSig for current func */ + +#define NoAbstr -1001 /* no abstract return statement has been encountered */ +#define SomeType -1002 /* assume returned value is consistent with abstr ret */ +extern int abs_ret; /* type from abstract return statement */ + +/* + * Definitions for use in parse tree nodes. + */ + +#define PrimryNd 1 /* simply a token */ +#define PrefxNd 2 /* a prefix expression */ +#define PstfxNd 3 /* a postfix expression */ +#define BinryNd 4 /* a binary expression (not necessarily infix) */ +#define TrnryNd 5 /* an expression with 3 subexpressions */ +#define QuadNd 6 /* an expression with 4 subexpressions */ +#define LstNd 7 /* list of declaration parts */ +#define CommaNd 8 /* arg lst, declarator lst, or init lst, not comma op */ +#define StrDclNd 9 /* structure field declaration */ +#define PreSpcNd 10 /* prefix expression that needs a space after it */ +#define ConCatNd 11 /* two ajacent pieces of code with no other syntax */ +#define SymNd 12 /* a symbol (identifier) node */ +#define ExactCnv 13 /* (exact)integer or (exact)C_integer conversion */ +#define CompNd 14 /* compound statement */ +#define AbstrNd 15 /* abstract type computation */ +#define IcnTypNd 16 /* name of an Icon type */ + +#define NewNode(size) (struct node *)alloc(\ + sizeof(struct node) + (size-1) * sizeof(union field)) + +union field { + struct node *child; + struct sym_entry *sym; /* used with SymNd & CompNd*/ + }; + +struct node { + int nd_id; + struct token *tok; + union field u[1]; /* actual size varies with node type */ + }; + +#include "rttproto.h" |