1File: PARSER.H Page 1 1 /* 2 Copyright 1982 3 Alcyon Corporation 4 8716 Production Ave. 5 San Diego, Ca. 92121 6 */ 7 8 /* 9 C68 Parser - include file 10 */ 11 #include 12 #include 13 #undef putchar 14 #define putchar xputchar 15 #undef ferror 16 #define printf xprintf 17 #include "icode.h" 18 19 /*symbol attribute fields*/ 20 #define SRESWORD 001 /*is symbol a reserved word?*/ 21 #define SGLOBAL 002 /*is symbol global?*/ 22 #define STYPEDEF 004 /*typedef declaration?*/ 23 #define SDEFINED 010 /*symbol defined?*/ 24 25 /*reserved words*/ 26 #define R_AUTO 1 27 #define R_BREAK 2 28 #define R_CASE 3 29 #define R_CHAR 4 30 #define R_CONTINUE 5 31 #define R_DO 6 32 #define R_DEFAULT 7 33 #define R_DOUBLE 8 34 #define R_GOTO 9 35 #define R_ELSE 10 36 #define R_EXTERNAL 11 37 #define R_FLOAT 12 38 #define R_FOR 13 39 #define R_IF 14 40 #define R_INT 15 41 #define R_LONG 16 42 #define R_REGISTER 17 43 #define R_RETURN 18 44 #define R_SHORT 19 45 #define R_SIZEOF 20 46 #define R_STATIC 21 47 #define R_STRUCT 22 48 #define R_SWITCH 23 49 #define R_TYPEDEF 24 50 #define R_UNION 25 51 #define R_UNSIGNED 26 52 #define R_WHILE 27 53 54 /* 55 * mixed-mode conversions, entries in 2-d array indexed by: 56 * (int,unsn,long,doub,ptr) 57 */ 58 #define INT_CHAR 1 59 #define UNSN_CHAR 1 1File: PARSER.H Page 2 60 #define LONG_CHAR 1 61 #define DOUB_CHAR 1 62 #define PTR_CHAR 1 63 #define INT_UNSN 0 /*no conversion is generated*/ 64 #define INT_LONG 2 65 #define INT_DOUB 3 66 #define INT_PTR 4 67 #define UNSN_INT 0 /*no conversion is generated*/ 68 #define UNSN_LONG 6 69 #define UNSN_DOUB 7 70 #define UNSN_PTR 8 71 #define LONG_INT 9 72 #define LONG_UNSN 10 73 #define LONG_DOUB 11 74 #define LONG_PTR 12 75 #define DOUB_INT 13 76 #define DOUB_UNSN 14 77 #define DOUB_LONG 15 78 #define PTR_INT 16 79 #define PTR_UNSN 17 80 #define PTR_LONG 18 81 #define PTR_PTR 19 82 #define BADCONV 20 83 84 /* miscellaneous constants */ 85 #define OPSSIZE 40 /*operator stack size*/ 86 #define OPDSIZE 80 /*operand stack size*/ 87 #define HSIZE 517 /*hash table size, 3.4 made prime */ 88 #define SYMSIZE 1024 /*size to alloc for symbol structures*/ 89 #define SWSIZE 256 /*max no. of cases in a switch*/ 90 #define DSIZE 1000 /*dimension table size*/ 91 #define BITSPWORD 16 /*bits per word*/ 92 #define AREGLO 010 /*A reg flag*/ 93 #define HICREG 2 /*highest reg # used for code generation*/ 94 #define BITSPCHAR 8 /*bits per char*/ 95 #define CHRSPWORD 2 /*chars per word*/ 96 #define STRSIZE 300 /*max string length*/ 97 #define NFARGS 40 /*max no. of args to function*/ 98 #define NFRSTR 20 /*max no. of forward ref struct proto*/ 99 100 /*symbol table node*/ 101 struct symbol { 102 char s_attrib; /* defined, resword, global, typedef */ 103 char s_sc; /* auto, static, external, register */ 104 int s_type; /* 4bits specified, 2 bit fields for ptr... */ 105 int s_dp; /* index into dimension table */ 106 int s_ssp; /* dimension table/function arg table */ 107 int s_offset; /* offset inside of structure */ 108 char s_symbol[SSIZE]; /* symbol identifier, to SSIZE chars */ 109 struct symbol *s_struc; /* if struct, ptr to parent (sys III) */ 110 struct symbol *s_next; /* next symbol table entry */ 111 }; 112 113 /*expression tree operator node*/ 114 struct tnode { 115 int t_op; 116 int t_type; 117 int t_dp; 118 int t_ssp; 1File: PARSER.H Page 3 119 struct tnode *t_left; 120 struct tnode *t_right; 121 }; 122 123 /*expression tree node for symbol - only keeps location*/ 124 struct symnode { 125 int t_op; 126 int t_type; /*data type of symbol*/ 127 int t_dp; /*dimension pointer of symbol*/ 128 int t_ssp; /*structure size index to dtab*/ 129 int t_sc; /*storage class of symbol*/ 130 int t_offset; /*offset of symbol*/ 131 int t_label; 132 }; 133 134 /*expressioon tree node for external symbol - need to keep name*/ 135 struct extnode { 136 int t_op; 137 int t_type; 138 int t_dp; 139 int t_ssp; 140 int t_sc; 141 int t_offset; 142 int t_reg; 143 int t_symbol[SSIZE]; /*symbol name*/ 144 }; 145 146 /*expression tree node for integer constant*/ 147 struct conode { 148 int t_op; 149 int t_type; 150 int t_dp; 151 int t_ssp; 152 int t_value; /*constant value*/ 153 }; 154 155 struct lconode { 156 int t_op; 157 int t_type; 158 int t_dp; 159 int t_ssp; 160 long t_lvalue; /*constant value*/ 161 }; 162 163 struct swtch { 164 int sw_label; 165 int sw_value; 166 } swtab[SWSIZE]; 167 168 /*operator and operand stack used by expr*/ 169 struct ops { /*operator stack*/ 170 int o_op; /*operator*/ 171 int o_pri; /*priority*/ 172 } opstack[OPSSIZE], *opp; 173 174 char *opdstack[OPDSIZE]; /*operand stack*/ 175 char **opdp; /*operand stack pointer*/ 176 char *opap; /*ptr to next available loc in exprarea*/ 177 char *exprp; /*place to start building expression*/ 1File: PARSER.H Page 4 178 int opinfo[]; /*operator info table*/ 179 struct tnode *frp; /*pointer to function return info node*/ 180 int swp; /*current entry in switch table*/ 181 int cswp; /*current low switch table index*/ 182 int nextlabel; /*generates unique label numbers*/ 183 int clabel; /*continue label*/ 184 int blabel; /*break label*/ 185 int rlabel; /*return label*/ 186 int dlabel; /*default label*/ 187 int lineno; /*current line number of input*/ 188 int errcnt; /*count of errors*/ 189 int inclflag; /*in include file, don't incr line #'s*/ 190 int inclline; /*[vlh]line# in incl file for err rpting*/ 191 char inclfile[13]; /*[vlh]include filename for err rpting*/ 192 int equalstop; /*stop lex at '=', used for external init*/ 193 int commastop; /*stop parse @ comma(used for const expr)*/ 194 int colonstop; /*stop parse @ colon(used for case value)*/ 195 int instruct; /*set when in structure declaration*/ 196 int smember; /*set when seen . or ->*/ 197 int infunc; /*set when in function body*/ 198 int tdflag; /*declaration is a typedef proto*/ 199 char *tdp; /*points to typedef prototype*/ 200 int localsize; /*length of local variables*/ 201 int naregs; /*keeps track of ptr registers alloc'd*/ 202 int ndregs; /*keep track of data registers alloc'd*/ 203 int loadreg; /*need to load registers...*/ 204 int boffset; /*current bit offset in structure*/ 205 int eflag; /*[vlh] 3.4 IEEE floats */ 206 int fflag; /*[vlh] 3.4 FFP floats */ 207 int xflag; /*translate int's to long's*/ 208 int wflag; /*[vlh] don't generate warning mesgs*/ 209 int reducep; /*[vlh] if(procid); reduction*/ 210 int peektok; /*peeked at token*/ 211 212 /*dimension table*/ 213 long dtab[DSIZE]; /* [vlh] 3.4 int => long */ 214 int cdp; /*next entry in dtab to alloc*/ 215 216 /*lexical analyzer values*/ 217 int cvalue; /*current token value if keyword or CINT*/ 218 int cstrsize; /*current string size*/ 219 long clvalue; /*current token value if long constant*/ 220 struct symbol *csp; /*current token symbol ptr if SYMBOL*/ 221 char cstr[STRSIZE]; /*current token value if CSTRING*/ 222 struct symbol *dsp; /*declarator symbol pointer*/ 223 224 /* -1 -> not instruct, 0 -> unnamed struct */ 225 struct symbol *strucptr[10]; /*[vlh] ptrs to struc symbols*/ 226 227 /*function argument table, used to collect function parameters*/ 228 struct farg { 229 struct symbol *f_sp; 230 int f_offset; 231 } fargtab[NFARGS]; 232 233 /*forward referenced structure prototype names*/ 234 struct symbol *frstab[NFRSTR]; 235 int frstp; 236 1File: PARSER.H Page 5 237 /*output buffers for intermediate code and strings*/ 238 struct io_buf obuf, sbuf, ibuf, *obp; 239 240 #define stypedef(sp) (sp->s_attrib&STYPEDEF) 241 #define walign(add) ((add+1)&(~1)) 242 #define array(type) ((type&SUPTYP)==ARRAY) 243 #define function(type) ((type&SUPTYP)==FUNCTION) 244 #define pointer(type) ((type&SUPTYP)==POINTER) 245 #define notarray(type) ((type&SUPTYP)!=ARRAY) 246 #define notfunction(type) ((type&SUPTYP)!=FUNCTION) 247 #define notpointer(type) ((type&SUPTYP)!=POINTER) 248 #define btype(type) (type&TYPE) 249 #define suptype(type) (type&SUPTYP) 250 #define alltype(type) (type&(SUPTYP|TYPE)) 251 #define asgop(op) ((opinfo[op]&OPASSIGN)!=0) 252 #define relop(op) ((opinfo[op]&OPREL)!=0) 253 #define lintegral(op) ((opinfo[op]&OPLWORD)!=0) 254 #define rintegral(op) ((opinfo[op]&OPRWORD)!=0) 255 #define rasop(op) ((opinfo[op]&OPRAS)!=0) 256 #define binop(op) ((opinfo[op]&OPBIN)!=0) 257 #define unaryop(op) ((opinfo[op]&OPBIN)==0) 258 #define leaf(op) ((opinfo[op]&OPTERM)!=0) 259 #define lvalop(op) ((opinfo[op]&OPLVAL)!=0) 260 #define oppriority(op) (opinfo[op]&OPPRI) 261 #define makeiop(op) (op|(0254<<8)) 262 /* checks for symbol with structure element storage class */ 263 #define isstel(tp) (tp->t_op==SYMBOL && (sesc(tp))) 264 #define sesc(t) (t->t_sc==STELCL||t->t_sc==UNELCL||t->t_sc==BFIELDCL) 265 /* peek at next token, if not read token put back, else delete */ 266 /* 1 if matched, 0 otherwise */ 267 #define peek(tok) ( (peektok=gettok()) == tok ) 268 269 #define outcommon(sym,size) printf("\t.comm _%.8s,%ld\n",sym,size) 270 #define outgoto(lab) if( lab > 0 ) printf("\tbra L%d\n",lab) 271 /* change to text segment */ 272 #define outtext() printf("\t.text\n") 273 /* change segment to bss */ 274 #define outbss() printf("\t.bss\n") 275 /* output global symbol references */ 276 #define outextdef(sym) printf("\t.globl _%.8s\n",sym) 277 /* outputs reserved memory [vlh] 3.4 %d => %ld */ 278 #define outresmem(size) printf("\t.ds.b %ld\n",size) 279 /* output padding for word alignments */ 280 #define outpad() printf("\t.even\n") 281 /* output long constant to assembler */ 282 #define outlcon(val) printf("\t.dc.l %d\n",val) 283 /* output label constant */ 284 #define outclab(lab) printf("\t.dc.l L%d\n",lab) 285 /* output a label */ 286 #define outlab(lab) printf("\tL%d:",lab) 287 /* output function label */ 288 #define outflab(sym) printf("\t_%.8s:\n\t~~%.8s:\n",sym,sym) 289 /* output data label */ 290 #define outdlab(sym) printf("\t_%.8s:\n",sym) 291 292 /*functions returning pointers*/ 293 char *expr(); 294 char *talloc(); 295 char *tnalloc(); 1File: PARSER.H Page 6 296 char *enalloc(); 297 char *snalloc(); 298 char *cnalloc(); 299 char *lcnalloc(); 300 char *fpcnalloc(); 301 char *popopd(); 302 char *cvopgen(); 303 char *arrayref(); 304 char *funcref(); 305 char *install(); 306 char *lookup(); 307 char *balpar(); 308 char *sbrk(); 309 310 long initlist(); 311 long dsize(); 312 long psize(); 313 long dodecl(); 314 long dlist(); 315 long getdec(); 316 long gethex(); 317 long getoct(); 318 long getfp(); 319 long toieee(); 320 long toffp();