|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: /* static char sccsid[] = "@(#)0.h 1.3 10/2/80"; */
4:
5: #define DEBUG
6: #define CHAR
7: #define STATIC
8: #define hp21mx 0
9:
10: #include <stdio.h>
11: #include <sys/types.h>
12:
13: #define bool short
14: #define TRUE 1
15: #define FALSE 0
16:
17: /*
18: * Option flags
19: *
20: * The following options are recognized in the text of the program
21: * and also on the command line:
22: *
23: * b block buffer the file output
24: *
25: * i make a listing of the procedures and functions in
26: * the following include files
27: *
28: * l make a listing of the program
29: *
30: * n place each include file on a new page with a header
31: *
32: * p disable post mortem and statement limit counting
33: *
34: * t disable run-time tests
35: *
36: * u card image mode; only first 72 chars of input count
37: *
38: * w suppress special diagnostic warnings
39: *
40: * z generate counters for an execution profile
41: */
42: #ifdef DEBUG
43: bool fulltrace, errtrace, testtrace, yyunique;
44: #endif DEBUG
45:
46: /*
47: * Each option has a stack of 17 option values, with opts giving
48: * the current, top value, and optstk the value beneath it.
49: * One refers to option `l' as, e.g., opt('l') in the text for clarity.
50: */
51: char opts[ 'z' - 'A' + 1];
52: short optstk[ 'z' - 'A' + 1];
53:
54: #define opt(c) opts[c-'A']
55:
56: /*
57: * Monflg is set when we are generating
58: * a pxp profile. this is set by the -z command line option.
59: */
60: bool monflg;
61:
62: /*
63: * profflag is set when we are generating a prof profile.
64: * this is set by the -p command line option.
65: */
66: bool profflag;
67:
68:
69: /*
70: * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
71: *
72: * Pi uses expandable tables for
73: * its namelist (symbol table), string table
74: * hash table, and parse tree space. The following
75: * definitions specify the size of the increments
76: * for these items in fundamental units so that
77: * each uses approximately 1024 bytes.
78: */
79:
80: #define STRINC 1024 /* string space increment */
81: #define TRINC 512 /* tree space increment */
82: #define HASHINC 509 /* hash table size in words, each increment */
83: #define NLINC 56 /* namelist increment size in nl structs */
84:
85: /*
86: * The initial sizes of the structures.
87: * These should be large enough to compile
88: * an "average" sized program so as to minimize
89: * storage requests.
90: * On a small system or and 11/34 or 11/40
91: * these numbers can be trimmed to make the
92: * compiler smaller.
93: */
94: #define ITREE 2000
95: #define INL 200
96: #define IHASH 509
97:
98: /*
99: * The following limits on hash and tree tables currently
100: * allow approximately 1200 symbols and 20k words of tree
101: * space. The fundamental limit of 64k total data space
102: * should be exceeded well before these are full.
103: */
104: /*
105: * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
106: */
107: #define TABLE_MULTIPLIER 8
108: #define MAXHASH (4 * TABLE_MULTIPLIER)
109: #define MAXNL (12 * TABLE_MULTIPLIER)
110: #define MAXTREE (30 * TABLE_MULTIPLIER)
111: /*
112: * MAXDEPTH is the depth of the parse stack.
113: * STACK_MULTIPLIER is for increasing its size.
114: */
115: #define STACK_MULTIPLIER 8
116: #define MAXDEPTH ( 150 * STACK_MULTIPLIER )
117:
118: /*
119: * ERROR RELATED DEFINITIONS
120: */
121:
122: /*
123: * Exit statuses to pexit
124: *
125: * AOK
126: * ERRS Compilation errors inhibit obj productin
127: * NOSTART Errors before we ever got started
128: * DIED We ran out of memory or some such
129: */
130: #define AOK 0
131: #define ERRS 1
132: #define NOSTART 2
133: #define DIED 3
134:
135: bool Recovery;
136:
137: #define eholdnl() Eholdnl = 1
138: #define nocascade() Enocascade = 1
139:
140: bool Eholdnl, Enocascade;
141:
142:
143: /*
144: * The flag eflg is set whenever we have a hard error.
145: * The character in errpfx will precede the next error message.
146: * When cgenflg is set code generation is suppressed.
147: * This happens whenver we have an error (i.e. if eflg is set)
148: * and when we are walking the tree to determine types only.
149: */
150: bool eflg;
151: char errpfx;
152:
153: #define setpfx(x) errpfx = x
154:
155: #define standard() setpfx('s')
156: #define warning() setpfx('w')
157: #define recovered() setpfx('e')
158:
159: bool cgenflg;
160:
161:
162: /*
163: * The flag syneflg is used to suppress the diagnostics of the form
164: * E 10 a, defined in someprocedure, is neither used nor set
165: * when there were syntax errors in "someprocedure".
166: * In this case, it is likely that these warinings would be spurious.
167: */
168: bool syneflg;
169:
170: /*
171: * The compiler keeps its error messages in a file.
172: * The variable efil is the unit number on which
173: * this file is open for reading of error message text.
174: * Similarly, the file ofil is the unit of the file
175: * "obj" where we write the interpreter code.
176: */
177: short efil;
178: short ofil;
179: short obuf[518];
180:
181: #define elineoff() Enoline++
182: #define elineon() Enoline = 0
183:
184: bool Enoline;
185:
186: /*
187: * SYMBOL TABLE STRUCTURE DEFINITIONS
188: *
189: * The symbol table is henceforth referred to as the "namelist".
190: * It consists of a number of structures of the form "nl" below.
191: * These are contained in a number of segments of the symbol
192: * table which are dynamically allocated as needed.
193: * The major namelist manipulation routines are contained in the
194: * file "nl.c".
195: *
196: * The major components of a namelist entry are the "symbol", giving
197: * a pointer into the string table for the string associated with this
198: * entry and the "class" which tells which of the (currently 19)
199: * possible types of structure this is.
200: *
201: * Many of the classes use the "type" field for a pointer to the type
202: * which the entry has.
203: *
204: * Other pieces of information in more than one class include the block
205: * in which the symbol is defined, flags indicating whether the symbol
206: * has been used and whether it has been assigned to, etc.
207: *
208: * A more complete discussion of the features of the namelist is impossible
209: * here as it would be too voluminous. Refer to the "PI 1.0 Implementation
210: * Notes" for more details.
211: */
212:
213: /*
214: * The basic namelist structure.
215: * There are also two other variants, defining the real
216: * field as longs or integers given below.
217: *
218: * The array disptab defines the hash header for the symbol table.
219: * Symbols are hashed based on the low 6 bits of their pointer into
220: * the string table; see the routines in the file "lookup.c" and also "fdec.c"
221: * especially "funcend".
222: */
223: #ifdef PTREE
224: # include "pTree.h"
225: #endif PTREE
226: struct nl {
227: char *symbol;
228: char class, nl_flags;
229: #ifdef PC
230: char ext_flags; /* an extra flag is used for externals */
231: #endif PC
232: struct nl *type;
233: struct nl *chain, *nl_next;
234: int *ptr[4];
235: #ifdef PI
236: int entloc;
237: #endif PI
238: # ifdef PTREE
239: pPointer inTree;
240: # endif PTREE
241: } *nlp, *disptab[077+1];
242:
243: extern struct nl nl[INL];
244:
245: struct {
246: char *symbol;
247: char class, nl_flags;
248: #ifdef PC
249: char ext_flags;
250: #endif
251: struct nl *type;
252: struct nl *chain, *nl_next;
253: double real;
254: };
255:
256: struct {
257: char *symbol;
258: char class, nl_block;
259: #ifdef PC
260: char ext_flags;
261: #endif
262: struct nl *type;
263: struct nl *chain, *nl_next;
264: long range[2];
265: };
266:
267: struct {
268: char *symbol;
269: char class, nl_flags;
270: #ifdef PC
271: char ext_flags;
272: #endif
273: struct nl *type;
274: struct nl *chain, *nl_next;
275: long value[4];
276: };
277:
278: /*
279: * NL FLAGS BITS
280: *
281: * Definitions of the usage of the bits in
282: * the nl_flags byte. Note that the low 5 bits of the
283: * byte are the "nl_block" and that some classes make use
284: * of this byte as a "width".
285: *
286: * The only non-obvious bit definition here is "NFILES"
287: * which records whether a structure contains any files.
288: * Such structures are not allowed to be dynamically allocated.
289: */
290: #define NUSED 0100
291: #define NMOD 0040
292: #define NFORWD 0200
293: #define NFILES 0200
294:
295: #ifdef PC
296: #define NEXTERN 0001 /* flag used to mark external funcs and procs */
297: #endif
298:
299: /*
300: * Definition of the commonly used "value" fields.
301: * The most important one is NL_OFFS which gives
302: * the offset of a variable in its stack mark.
303: */
304: #define NL_OFFS 0
305:
306: #define NL_CNTR 1
307: #define NL_FVAR 3
308:
309: #define NL_GOLEV 2
310: #define NL_GOLINE 3
311: #define NL_FORV 1
312:
313: #define NL_FLDSZ 1
314: #define NL_VARNT 2
315: #define NL_VTOREC 2
316: #define NL_TAG 3
317:
318: #define NL_ELABEL 3
319:
320: /*
321: * For BADUSE nl structures, NL_KINDS is a bit vector
322: * indicating the kinds of illegal usages complained about
323: * so far. For kind of bad use "kind", "1 << kind" is set.
324: * The low bit is reserved as ISUNDEF to indicate whether
325: * this identifier is totally undefined.
326: */
327: #define NL_KINDS 0
328:
329: #define ISUNDEF 1
330:
331: /*
332: * NAMELIST CLASSES
333: *
334: * The following are the namelist classes.
335: * Different classes make use of the value fields
336: * of the namelist in different ways.
337: *
338: * The namelist should be redesigned by providing
339: * a number of structure definitions with one corresponding
340: * to each namelist class, ala a variant record in Pascal.
341: */
342: #define BADUSE 0
343: #define CONST 1
344: #define TYPE 2
345: #define VAR 3
346: #define ARRAY 4
347: #define PTRFILE 5
348: #define RECORD 6
349: #define FIELD 7
350: #define PROC 8
351: #define FUNC 9
352: #define FVAR 10
353: #define REF 11
354: #define PTR 12
355: #define FILET 13
356: #define SET 14
357: #define RANGE 15
358: #define LABEL 16
359: #define WITHPTR 17
360: #define SCAL 18
361: #define STR 19
362: #define PROG 20
363: #define IMPROPER 21
364: #define VARNT 22
365: #define FPROC 23
366: #define FFUNC 24
367:
368: /*
369: * Clnames points to an array of names for the
370: * namelist classes.
371: */
372: char **clnames;
373:
374: /*
375: * PRE-DEFINED NAMELIST OFFSETS
376: *
377: * The following are the namelist offsets for the
378: * primitive types. The ones which are negative
379: * don't actually exist, but are generated and tested
380: * internally. These definitions are sensitive to the
381: * initializations in nl.c.
382: */
383: #define TFIRST -7
384: #define TFILE -7
385: #define TREC -6
386: #define TARY -5
387: #define TSCAL -4
388: #define TPTR -3
389: #define TSET -2
390: #define TSTR -1
391: #define NIL 0
392: #define TBOOL 1
393: #define TCHAR 2
394: #define TINT 3
395: #define TDOUBLE 4
396: #define TNIL 5
397: #define T1INT 6
398: #define T2INT 7
399: #define T4INT 8
400: #define T1CHAR 9
401: #define T1BOOL 10
402: #define T8REAL 11
403: #define TLAST 11
404:
405: /*
406: * SEMANTIC DEFINITIONS
407: */
408:
409: /*
410: * NOCON and SAWCON are flags in the tree telling whether
411: * a constant set is part of an expression.
412: */
413: #define NOCON 0
414: #define SAWCON 1
415:
416: /*
417: * The variable cbn gives the current block number,
418: * the variable bn is set as a side effect of a call to
419: * lookup, and is the block number of the variable which
420: * was found.
421: */
422: short bn, cbn;
423:
424: /*
425: * The variable line is the current semantic
426: * line and is set in stat.c from the numbers
427: * embedded in statement type tree nodes.
428: */
429: short line;
430:
431: /*
432: * The size of the display
433: * which defines the maximum nesting
434: * of procedures and functions allowed.
435: * Because of the flags in the current namelist
436: * this must be no greater than 32.
437: */
438: #define DSPLYSZ 20
439:
440: /*
441: * The following structure is used
442: * to keep track of the amount of variable
443: * storage required by each block.
444: * "Max" is the high water mark, "off"
445: * the current need. Temporaries for "for"
446: * loops and "with" statements are allocated
447: * in the local variable area and these
448: * numbers are thereby changed if necessary.
449: */
450: struct om {
451: long om_off;
452: long om_max;
453: } sizes[DSPLYSZ];
454:
455: /*
456: * the following structure records whether a level declares
457: * any variables which are (or contain) files.
458: * this so that the runtime routines for file cleanup can be invoked.
459: */
460: bool dfiles[ DSPLYSZ ];
461:
462: /*
463: * Structure recording information about a constant
464: * declaration. It is actually the return value from
465: * the routine "gconst", but since C doesn't support
466: * record valued functions, this is more convenient.
467: */
468: struct {
469: struct nl *ctype;
470: short cival;
471: double crval;
472: int *cpval;
473: } con;
474:
475: /*
476: * The set structure records the lower bound
477: * and upper bound with the lower bound normalized
478: * to zero when working with a set. It is set by
479: * the routine setran in var.c.
480: */
481: struct {
482: short lwrb, uprbp;
483: } set;
484:
485: /*
486: * structures of this kind are filled in by precset and used by postcset
487: * to indicate things about constant sets.
488: */
489: struct csetstr {
490: struct nl *csettype;
491: long paircnt;
492: long singcnt;
493: bool comptime;
494: };
495: /*
496: * The following flags are passed on calls to lvalue
497: * to indicate how the reference is to affect the usage
498: * information for the variable being referenced.
499: * MOD is used to set the NMOD flag in the namelist
500: * entry for the variable, ASGN permits diagnostics
501: * to be formed when a for variable is assigned to in
502: * the range of the loop.
503: */
504: #define NOFLAGS 0
505: #define MOD 01
506: #define ASGN 02
507: #define NOUSE 04
508:
509: /*
510: * the following flags are passed to lvalue and rvalue
511: * to tell them whether an lvalue or rvalue is required.
512: * the semantics checking is done according to the function called,
513: * but for pc, lvalue may put out an rvalue by indirecting afterwards,
514: * and rvalue may stop short of putting out the indirection.
515: */
516: #define LREQ 01
517: #define RREQ 02
518:
519: double MAXINT;
520: double MININT;
521:
522: /*
523: * Variables for generation of profile information.
524: * Monflg is set when we want to generate a profile.
525: * Gocnt record the total number of goto's and
526: * cnts records the current counter for generating
527: * COUNT operators.
528: */
529: short gocnt;
530: short cnts;
531:
532: /*
533: * Most routines call "incompat" rather than asking "!compat"
534: * for historical reasons.
535: */
536: #define incompat !compat
537:
538: /*
539: * Parts records which declaration parts have been seen.
540: * The grammar allows the "label" "const" "type" "var" and routine
541: * parts to be repeated and to be in any order, so that
542: * they can be detected semantically to give better
543: * error diagnostics.
544: */
545: int parts[ DSPLYSZ ];
546:
547: #define LPRT 1
548: #define CPRT 2
549: #define TPRT 4
550: #define VPRT 8
551: #define RPRT 16
552:
553: /*
554: * Flags for the "you used / instead of div" diagnostic
555: */
556: bool divchk;
557: bool divflg;
558:
559: short errcnt[DSPLYSZ];
560:
561: /*
562: * Forechain links those types which are
563: * ^ sometype
564: * so that they can be evaluated later, permitting
565: * circular, recursive list structures to be defined.
566: */
567: struct nl *forechain;
568:
569: /*
570: * Withlist links all the records which are currently
571: * opened scopes because of with statements.
572: */
573: struct nl *withlist;
574:
575: struct nl *intset;
576: struct nl *input, *output;
577: struct nl *program;
578:
579: /* progseen flag used by PC to determine if
580: * a routine segment is being compiled (and
581: * therefore no program statement seen)
582: */
583: bool progseen;
584:
585:
586: /*
587: * STRUCTURED STATEMENT GOTO CHECKING
588: *
589: * The variable level keeps track of the current
590: * "structured statement level" when processing the statement
591: * body of blocks. This is used in the detection of goto's into
592: * structured statements in a block.
593: *
594: * Each label's namelist entry contains two pieces of information
595: * related to this check. The first `NL_GOLEV' either contains
596: * the level at which the label was declared, `NOTYET' if the label
597: * has not yet been declared, or `DEAD' if the label is dead, i.e.
598: * if we have exited the level in which the label was defined.
599: *
600: * When we discover a "goto" statement, if the label has not
601: * been defined yet, then we record the current level and the current line
602: * for a later error check. If the label has been already become "DEAD"
603: * then a reference to it is an error. Now the compiler maintains,
604: * for each block, a linked list of the labels headed by "gotos[bn]".
605: * When we exit a structured level, we perform the routine
606: * ungoto in stat.c. It notices labels whose definition levels have been
607: * exited and makes them be dead. For labels which have not yet been
608: * defined, ungoto will maintain NL_GOLEV as the minimum structured level
609: * since the first usage of the label. It is not hard to see that the label
610: * must eventually be declared at this level or an outer level to this
611: * one or a goto into a structured statement will exist.
612: */
613: short level;
614: struct nl *gotos[DSPLYSZ];
615:
616: #define NOTYET 10000
617: #define DEAD 10000
618:
619: /*
620: * Noreach is true when the next statement will
621: * be unreachable unless something happens along
622: * (like exiting a looping construct) to save
623: * the day.
624: */
625: bool noreach;
626:
627: /*
628: * UNDEFINED VARIABLE REFERENCE STRUCTURES
629: */
630: struct udinfo {
631: int ud_line;
632: struct udinfo *ud_next;
633: char nullch;
634: };
635:
636: /*
637: * CODE GENERATION DEFINITIONS
638: */
639:
640: /*
641: * NSTAND is or'ed onto the abstract machine opcode
642: * for non-standard built-in procedures and functions.
643: */
644: #define NSTAND 0400
645:
646: #define codeon() cgenflg++
647: #define codeoff() --cgenflg
648:
649: /*
650: * Codeline is the last lino output in the code generator.
651: * It used to be used to suppress LINO operators but no
652: * more since we now count statements.
653: * Lc is the intepreter code location counter.
654: *
655: short codeline;
656: */
657: char *lc;
658:
659:
660: /*
661: * Routines which need types
662: * other than "integer" to be
663: * assumed by the compiler.
664: */
665: double atof();
666: long lwidth();
667: long aryconst();
668: long a8tol();
669: struct nl *lookup();
670: double atof();
671: int *tree();
672: int *hash();
673: char *alloc();
674: int *calloc();
675: char *savestr();
676: struct nl *lookup1();
677: struct nl *hdefnl();
678: struct nl *defnl();
679: struct nl *enter();
680: struct nl *nlcopy();
681: struct nl *tyrecl();
682: struct nl *tyary();
683: struct nl *fields();
684: struct nl *variants();
685: struct nl *deffld();
686: struct nl *defvnt();
687: struct nl *tyrec1();
688: struct nl *reclook();
689: struct nl *asgnop1();
690: struct nl *gtype();
691: struct nl *call();
692: struct nl *lvalue();
693: struct nl *rvalue();
694: struct nl *cset();
695:
696: /*
697: * type cast NIL to keep lint happy (which is not so bad)
698: */
699: #define NLNIL ( (struct nl *) NIL )
700:
701: /*
702: * Funny structures to use
703: * pointers in wild and wooly ways
704: */
705: struct {
706: char pchar;
707: };
708: struct {
709: short pint;
710: short pint2;
711: };
712: struct {
713: long plong;
714: };
715: struct {
716: double pdouble;
717: };
718:
719: #define OCT 1
720: #define HEX 2
721:
722: /*
723: * MAIN PROGRAM VARIABLES, MISCELLANY
724: */
725:
726: /*
727: * Variables forming a data base referencing
728: * the command line arguments with the "i" option, e.g.
729: * in "pi -i scanner.i compiler.p".
730: */
731: char **pflist;
732: short pflstc;
733: short pfcnt;
734:
735: char *filename; /* current source file name */
736: long tvec;
737: extern char *snark; /* SNARK */
738: extern char *classes[ ]; /* maps namelist classes to string names */
739:
740: #define derror error
741:
742: #ifdef PC
743:
744: /*
745: * the current function number, for [ lines
746: */
747: int ftnno;
748:
749: /*
750: * the pc output stream
751: */
752: FILE *pcstream;
753:
754: #endif PC
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.