home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v92.tgz / v92.tar / v92 / src / rtt / rtt1.h < prev    next >
C/C++ Source or Header  |  1996-03-22  |  8KB  |  192 lines

  1. #include "::preproc:preproc.h"
  2. #include "::preproc:pproto.h"
  3.  
  4. #define IndentInc 3
  5. #define MaxCol 80
  6.  
  7. #if (MVS || VM) && SASC
  8. #define Max(x,y)        __builtin_max(x,y)
  9. #else                                   /* SASC */
  10. #define Max(x,y)        ((x)>(y)?(x):(y))
  11. #endif                                  /* SASC */
  12.  
  13. /*
  14.  * cfile is used to create a list of cfiles created from a source file.
  15.  */
  16. struct cfile {
  17.    char *name;
  18.    struct cfile *next;
  19.    };
  20.  
  21. /*
  22.  * srcfile is an entry of dependants of a source file.
  23.  */
  24. struct srcfile {
  25.    char *name;
  26.    struct cfile *dependents;
  27.    struct srcfile *next;
  28.    };
  29.  
  30. #define ForceNl() nl = 1;
  31. extern int nl;  /* flag: a new-line is needed in the output */
  32.  
  33. /*
  34.  * The lexical analyzer recognizes 3 states. Operators are treated differently
  35.  *  in each state.
  36.  */
  37. #define DfltLex  0    /* Covers most input. */
  38. #define OpHead   1    /* In head of an operator definition. */
  39. #define TypeComp 2    /* In abstract type computation */
  40.  
  41. extern int lex_state;      /* state of operator recognition */
  42. extern char *compiler_def; /* #define for COMPILER */
  43. extern FILE *out_file;     /* output file */
  44. extern int def_fnd;        /* C input defines something concrete */
  45. extern char *inclname;     /* include file to be included by C compiler */
  46. extern int iconx_flg;      /* flag: indicate that iconx style code is needed */
  47. extern int enable_out;     /* enable output of C code */
  48. extern char *largeints;    /* "Largeints" or "NoLargeInts" */
  49.  
  50. /*
  51.  * The symbol table is used by the lexical analyser to decide whether an
  52.  *  identifier is an ordinary identifier, a typedef name, or a reserved
  53.  *  word. It is used by the parse tree builder to decide whether an
  54.  *  identifier is an ordinary C variable, a tended variable, a parameter
  55.  *  to a run-time routine, or the special variable "result".
  56.  */
  57. struct sym_entry {
  58.    int tok_id;        /* Ident, Type, or identification of reserved word */
  59.    char *image;        /* image of symbol */
  60.    int id_type;        /* OtherDcl, TndDesc, TndStr, TndBlk, Label, RtParm,
  61.                            DrfPrm, RsltLoc */
  62.    union {
  63.       struct {            /* RtParm: */
  64.          int param_num;        /*   parameter number */
  65.          int cur_loc;        /*   PrmTend, PrmCStr, PrmInt, or PrmDbl */
  66.          int non_tend;        /*   non-tended locations used */
  67.          int parm_mod;          /*   something may have modified it */
  68.          struct sym_entry *next;
  69.          } param_info;
  70.       struct {                  /* TndDesc, TndStr, TndBlk: */
  71.          struct node *init;     /*   initial value from declaration */
  72.          char *blk_name;    /*   TndBlk: struct name of block */
  73.          struct sym_entry *next;
  74.          } tnd_var;
  75.       struct {            /* OtherDcl from "declare {...}": */
  76.          struct node *tqual;    /*   storage class, type qualifier list */
  77.          struct node *dcltor;    /*   declarator */
  78.          struct node *init;     /*   initial value from declaration */
  79.          struct sym_entry *next;
  80.          } declare_var;
  81.       int typ_indx;             /* index into arrays of type information */
  82.       word lbl_num;             /* label number used in in-line code */
  83.       int referenced;        /* RsltLoc: is referenced */
  84.       } u;
  85.    int t_indx;        /* index into tended array */
  86.    int il_indx;        /* index used in in-line code */
  87.    int nest_lvl;    /* 0 - reserved word, 1 - global, >= 2 - local */
  88.    int may_mod;         /* may be modified in particular piece of code */
  89.    int ref_cnt;
  90.    struct sym_entry *next;
  91.    };
  92.  
  93. /*
  94.  * Path-specific parameter information must be saved and merged for
  95.  *  branching and joining of paths.
  96.  */
  97. struct parminfo {
  98.    int cur_loc;
  99.    int parm_mod;
  100.    };
  101.  
  102. /*
  103.  * A list is maintained of information needed to initialize tended descriptors.
  104.  */
  105. struct init_tend {
  106.    int t_indx;         /* index into tended array */
  107.    int init_typ;       /* TndDesc, TndStr, TndBlk */
  108.    struct node *init;  /* initial value from declaration */
  109.    int nest_lvl;            /* level of nesting of current use of tended slot */
  110.    int in_use;              /* tended slot is being used in current scope */
  111.    struct init_tend *next;
  112.    };
  113.  
  114.  
  115. extern int op_type;                /* Function, Keyword, Operator, or OrdFunc */
  116. extern char lc_letter;             /* f = function, o = operator, k = keyword */
  117. extern char uc_letter;             /* F = function, O = operator, K = keyword */
  118. extern char prfx1;                 /* 1st char of unique prefix for operation */
  119. extern char prfx2;                 /* 2nd char of unique prefix for operation */
  120. extern char *fname;                /* current source file name */
  121. extern int line;                   /* current source line number */
  122. extern struct implement *cur_impl; /* data base entry for current operator */
  123. extern struct token *comment;      /* descriptive comment for current oper */
  124. extern int n_tmp_str;              /* total number of string buffers needed */
  125. extern int n_tmp_cset;             /* total number of cset buffers needed */
  126. extern int nxt_sbuf;               /* index of next string buffer */
  127. extern int nxt_cbuf;               /* index of next cset buffer */
  128. extern struct sym_entry *params;   /* current list of parameters */
  129. extern struct sym_entry *decl_lst; /* declarations from "declare {...}" */
  130. extern struct init_tend *tend_lst; /* list of allocated tended slots */
  131. extern char *str_rslt;             /* string "result" in string table */
  132. extern word lbl_num;               /* next unused label number */
  133. extern struct sym_entry *v_len;    /* symbol entry for size of varargs */
  134. extern int il_indx;                /* next index into data base symbol table */
  135.  
  136. /*
  137.  * lvl_entry keeps track of what is happening at a level of nested declarations.
  138.  */
  139. struct lvl_entry {
  140.    int nest_lvl;
  141.    int kind_dcl;    /* IsTypedef, TndDesc, TndStr, TndBlk, or OtherDcl */
  142.    char *blk_name;      /* for TndBlk, the struct name of the block */
  143.    int parms_done;      /* level consists of parameter list which is complete */
  144.    struct sym_entry *tended; /* symbol table entries for tended variables */
  145.    struct lvl_entry *next;
  146.    };
  147.  
  148. extern struct lvl_entry *dcl_stk; /* stack of declaration contexts */
  149.  
  150. extern int fnc_ret;  /* RetInt, RetDbl, RetNoVal, or RetSig for current func */
  151.  
  152. #define NoAbstr  -1001 /* no abstract return statement has been encountered */
  153. #define SomeType -1002 /* assume returned value is consistent with abstr ret */
  154. extern int abs_ret; /* type from abstract return statement */
  155.  
  156. /*
  157.  * Definitions for use in parse tree nodes.
  158.  */
  159.  
  160. #define PrimryNd  1 /* simply a token */
  161. #define PrefxNd   2 /* a prefix expression */
  162. #define PstfxNd   3 /* a postfix expression */
  163. #define BinryNd   4 /* a binary expression (not necessarily infix) */
  164. #define TrnryNd   5 /* an expression with 3 subexpressions */
  165. #define QuadNd    6 /* an expression with 4 subexpressions */
  166. #define LstNd     7 /* list of declaration parts */
  167. #define CommaNd   8 /* arg lst, declarator lst, or init lst, not comma op */
  168. #define StrDclNd  9 /* structure field declaration */
  169. #define PreSpcNd 10 /* prefix expression that needs a space after it */
  170. #define ConCatNd 11 /* two ajacent pieces of code with no other syntax */
  171. #define SymNd    12 /* a symbol (identifier) node */
  172. #define ExactCnv 13 /* (exact)integer or (exact)C_integer conversion */
  173. #define CompNd   14 /* compound statement */
  174. #define AbstrNd  15 /* abstract type computation */
  175. #define IcnTypNd 16 /* name of an Icon type */
  176.  
  177. #define NewNode(size) (struct node *)alloc((unsigned int)\
  178.     (sizeof(struct node) + (size-1) * sizeof(union field)))
  179.  
  180. union field {
  181.    struct node *child;
  182.    struct sym_entry *sym;   /* used with SymNd & CompNd*/
  183.    };
  184.  
  185. struct node {
  186.    int nd_id;
  187.    struct token *tok;
  188.    union field u[1]; /* actual size varies with node type */
  189.    };
  190.  
  191. #include "rttproto.h"
  192.