1733Speter /* Copyright (c) 1979 Regents of the University of California */ 2733Speter 3*3071Smckusic /* static char sccsid[] = "@(#)0.h 1.4 03/08/81"; */ 4733Speter 5733Speter #define DEBUG 6*3071Smckusic #define CONSETS 7733Speter #define CHAR 8733Speter #define STATIC 9733Speter #define hp21mx 0 10733Speter 11733Speter #include <stdio.h> 12733Speter #include <sys/types.h> 13733Speter 14*3071Smckusic typedef enum {FALSE, TRUE} bool; 15733Speter 16733Speter /* 17733Speter * Option flags 18733Speter * 19733Speter * The following options are recognized in the text of the program 20733Speter * and also on the command line: 21733Speter * 22733Speter * b block buffer the file output 23733Speter * 24733Speter * i make a listing of the procedures and functions in 25733Speter * the following include files 26733Speter * 27733Speter * l make a listing of the program 28733Speter * 29733Speter * n place each include file on a new page with a header 30733Speter * 31733Speter * p disable post mortem and statement limit counting 32733Speter * 33733Speter * t disable run-time tests 34733Speter * 35733Speter * u card image mode; only first 72 chars of input count 36733Speter * 37733Speter * w suppress special diagnostic warnings 38733Speter * 39733Speter * z generate counters for an execution profile 40733Speter */ 41733Speter #ifdef DEBUG 42733Speter bool fulltrace, errtrace, testtrace, yyunique; 43733Speter #endif DEBUG 44733Speter 45733Speter /* 46733Speter * Each option has a stack of 17 option values, with opts giving 47733Speter * the current, top value, and optstk the value beneath it. 48733Speter * One refers to option `l' as, e.g., opt('l') in the text for clarity. 49733Speter */ 50733Speter char opts[ 'z' - 'A' + 1]; 51733Speter short optstk[ 'z' - 'A' + 1]; 52733Speter 53733Speter #define opt(c) opts[c-'A'] 54733Speter 55733Speter /* 56733Speter * Monflg is set when we are generating 57733Speter * a pxp profile. this is set by the -z command line option. 58733Speter */ 59733Speter bool monflg; 60733Speter 61733Speter /* 62733Speter * profflag is set when we are generating a prof profile. 63733Speter * this is set by the -p command line option. 64733Speter */ 65733Speter bool profflag; 66733Speter 67733Speter 68733Speter /* 69733Speter * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES 70733Speter * 71733Speter * Pi uses expandable tables for 72733Speter * its namelist (symbol table), string table 73733Speter * hash table, and parse tree space. The following 74733Speter * definitions specify the size of the increments 75733Speter * for these items in fundamental units so that 76733Speter * each uses approximately 1024 bytes. 77733Speter */ 78733Speter 79733Speter #define STRINC 1024 /* string space increment */ 80733Speter #define TRINC 512 /* tree space increment */ 81733Speter #define HASHINC 509 /* hash table size in words, each increment */ 82733Speter #define NLINC 56 /* namelist increment size in nl structs */ 83733Speter 84733Speter /* 85733Speter * The initial sizes of the structures. 86733Speter * These should be large enough to compile 87733Speter * an "average" sized program so as to minimize 88733Speter * storage requests. 89733Speter * On a small system or and 11/34 or 11/40 90733Speter * these numbers can be trimmed to make the 91733Speter * compiler smaller. 92733Speter */ 93733Speter #define ITREE 2000 94733Speter #define INL 200 95733Speter #define IHASH 509 96733Speter 97733Speter /* 98733Speter * The following limits on hash and tree tables currently 99733Speter * allow approximately 1200 symbols and 20k words of tree 100733Speter * space. The fundamental limit of 64k total data space 101733Speter * should be exceeded well before these are full. 102733Speter */ 103733Speter /* 104733Speter * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables 105733Speter */ 106*3071Smckusic #ifdef VAX 107733Speter #define TABLE_MULTIPLIER 8 108*3071Smckusic #else 109*3071Smckusic #define TABLE_MULTIPLIER 1 110*3071Smckusic #endif VAX 111733Speter #define MAXHASH (4 * TABLE_MULTIPLIER) 112733Speter #define MAXNL (12 * TABLE_MULTIPLIER) 113733Speter #define MAXTREE (30 * TABLE_MULTIPLIER) 114733Speter /* 115733Speter * MAXDEPTH is the depth of the parse stack. 116733Speter * STACK_MULTIPLIER is for increasing its size. 117733Speter */ 118*3071Smckusic #ifdef VAX 119733Speter #define STACK_MULTIPLIER 8 120*3071Smckusic #else 121*3071Smckusic #define STACK_MULTIPLIER 1 122*3071Smckusic #endif VAX 123733Speter #define MAXDEPTH ( 150 * STACK_MULTIPLIER ) 124733Speter 125733Speter /* 126733Speter * ERROR RELATED DEFINITIONS 127733Speter */ 128733Speter 129733Speter /* 130733Speter * Exit statuses to pexit 131733Speter * 132733Speter * AOK 133733Speter * ERRS Compilation errors inhibit obj productin 134733Speter * NOSTART Errors before we ever got started 135733Speter * DIED We ran out of memory or some such 136733Speter */ 137733Speter #define AOK 0 138733Speter #define ERRS 1 139733Speter #define NOSTART 2 140733Speter #define DIED 3 141733Speter 142733Speter bool Recovery; 143733Speter 144733Speter #define eholdnl() Eholdnl = 1 145733Speter #define nocascade() Enocascade = 1 146733Speter 147733Speter bool Eholdnl, Enocascade; 148733Speter 149733Speter 150733Speter /* 151733Speter * The flag eflg is set whenever we have a hard error. 152733Speter * The character in errpfx will precede the next error message. 153733Speter * When cgenflg is set code generation is suppressed. 154733Speter * This happens whenver we have an error (i.e. if eflg is set) 155733Speter * and when we are walking the tree to determine types only. 156733Speter */ 157733Speter bool eflg; 158733Speter char errpfx; 159733Speter 160733Speter #define setpfx(x) errpfx = x 161733Speter 162733Speter #define standard() setpfx('s') 163733Speter #define warning() setpfx('w') 164733Speter #define recovered() setpfx('e') 165733Speter 166*3071Smckusic int cgenflg; 167733Speter 168733Speter 169733Speter /* 170733Speter * The flag syneflg is used to suppress the diagnostics of the form 171733Speter * E 10 a, defined in someprocedure, is neither used nor set 172733Speter * when there were syntax errors in "someprocedure". 173733Speter * In this case, it is likely that these warinings would be spurious. 174733Speter */ 175733Speter bool syneflg; 176733Speter 177733Speter /* 178733Speter * The compiler keeps its error messages in a file. 179733Speter * The variable efil is the unit number on which 180733Speter * this file is open for reading of error message text. 181733Speter * Similarly, the file ofil is the unit of the file 182733Speter * "obj" where we write the interpreter code. 183733Speter */ 184733Speter short efil; 185733Speter short ofil; 186733Speter short obuf[518]; 187733Speter 188*3071Smckusic bool Enoline; 189*3071Smckusic #define elineoff() Enoline = TRUE 190*3071Smckusic #define elineon() Enoline = FALSE 191733Speter 192733Speter 193733Speter /* 194733Speter * SYMBOL TABLE STRUCTURE DEFINITIONS 195733Speter * 196733Speter * The symbol table is henceforth referred to as the "namelist". 197733Speter * It consists of a number of structures of the form "nl" below. 198733Speter * These are contained in a number of segments of the symbol 199733Speter * table which are dynamically allocated as needed. 200733Speter * The major namelist manipulation routines are contained in the 201733Speter * file "nl.c". 202733Speter * 203733Speter * The major components of a namelist entry are the "symbol", giving 204733Speter * a pointer into the string table for the string associated with this 205733Speter * entry and the "class" which tells which of the (currently 19) 206733Speter * possible types of structure this is. 207733Speter * 208733Speter * Many of the classes use the "type" field for a pointer to the type 209733Speter * which the entry has. 210733Speter * 211733Speter * Other pieces of information in more than one class include the block 212733Speter * in which the symbol is defined, flags indicating whether the symbol 213733Speter * has been used and whether it has been assigned to, etc. 214733Speter * 215733Speter * A more complete discussion of the features of the namelist is impossible 216733Speter * here as it would be too voluminous. Refer to the "PI 1.0 Implementation 217733Speter * Notes" for more details. 218733Speter */ 219733Speter 220733Speter /* 221733Speter * The basic namelist structure. 222733Speter * There are also two other variants, defining the real 223733Speter * field as longs or integers given below. 224733Speter * 225733Speter * The array disptab defines the hash header for the symbol table. 226733Speter * Symbols are hashed based on the low 6 bits of their pointer into 227733Speter * the string table; see the routines in the file "lookup.c" and also "fdec.c" 228733Speter * especially "funcend". 229733Speter */ 230733Speter #ifdef PTREE 231733Speter # include "pTree.h" 232733Speter #endif PTREE 233733Speter struct nl { 234733Speter char *symbol; 235733Speter char class, nl_flags; 236733Speter #ifdef PC 237733Speter char ext_flags; /* an extra flag is used for externals */ 238733Speter #endif PC 239733Speter struct nl *type; 240733Speter struct nl *chain, *nl_next; 241733Speter int *ptr[4]; 242733Speter #ifdef PI 243733Speter int entloc; 244733Speter #endif PI 245733Speter # ifdef PTREE 246733Speter pPointer inTree; 247733Speter # endif PTREE 248733Speter } *nlp, *disptab[077+1]; 249733Speter 250733Speter extern struct nl nl[INL]; 251733Speter 252733Speter struct { 253733Speter char *symbol; 254733Speter char class, nl_flags; 255733Speter #ifdef PC 256733Speter char ext_flags; 257733Speter #endif 258733Speter struct nl *type; 259733Speter struct nl *chain, *nl_next; 260733Speter double real; 261733Speter }; 262733Speter 263733Speter struct { 264733Speter char *symbol; 265733Speter char class, nl_block; 266733Speter #ifdef PC 267733Speter char ext_flags; 268733Speter #endif 269733Speter struct nl *type; 270733Speter struct nl *chain, *nl_next; 271733Speter long range[2]; 272733Speter }; 273733Speter 274733Speter struct { 275733Speter char *symbol; 276733Speter char class, nl_flags; 277733Speter #ifdef PC 278733Speter char ext_flags; 279733Speter #endif 280733Speter struct nl *type; 281733Speter struct nl *chain, *nl_next; 282*3071Smckusic int value[5]; 283733Speter }; 284733Speter 285733Speter /* 286733Speter * NL FLAGS BITS 287733Speter * 288733Speter * Definitions of the usage of the bits in 289733Speter * the nl_flags byte. Note that the low 5 bits of the 290733Speter * byte are the "nl_block" and that some classes make use 291733Speter * of this byte as a "width". 292733Speter * 293733Speter * The only non-obvious bit definition here is "NFILES" 294733Speter * which records whether a structure contains any files. 295733Speter * Such structures are not allowed to be dynamically allocated. 296733Speter */ 297733Speter #define NUSED 0100 298733Speter #define NMOD 0040 299733Speter #define NFORWD 0200 300733Speter #define NFILES 0200 301733Speter 302733Speter #ifdef PC 303733Speter #define NEXTERN 0001 /* flag used to mark external funcs and procs */ 304733Speter #endif 305733Speter 306733Speter /* 307733Speter * Definition of the commonly used "value" fields. 308733Speter * The most important one is NL_OFFS which gives 309733Speter * the offset of a variable in its stack mark. 310733Speter */ 311733Speter #define NL_OFFS 0 312733Speter 313733Speter #define NL_CNTR 1 314733Speter #define NL_FVAR 3 315733Speter 316733Speter #define NL_GOLEV 2 317733Speter #define NL_GOLINE 3 318733Speter #define NL_FORV 1 319733Speter 320733Speter #define NL_FLDSZ 1 321733Speter #define NL_VARNT 2 322733Speter #define NL_VTOREC 2 323733Speter #define NL_TAG 3 324733Speter 325*3071Smckusic #define NL_ELABEL 4 326733Speter 327733Speter /* 328733Speter * For BADUSE nl structures, NL_KINDS is a bit vector 329733Speter * indicating the kinds of illegal usages complained about 330733Speter * so far. For kind of bad use "kind", "1 << kind" is set. 331733Speter * The low bit is reserved as ISUNDEF to indicate whether 332733Speter * this identifier is totally undefined. 333733Speter */ 334733Speter #define NL_KINDS 0 335733Speter 336733Speter #define ISUNDEF 1 337733Speter 338733Speter /* 339733Speter * NAMELIST CLASSES 340733Speter * 341733Speter * The following are the namelist classes. 342733Speter * Different classes make use of the value fields 343733Speter * of the namelist in different ways. 344733Speter * 345733Speter * The namelist should be redesigned by providing 346733Speter * a number of structure definitions with one corresponding 347733Speter * to each namelist class, ala a variant record in Pascal. 348733Speter */ 349733Speter #define BADUSE 0 350733Speter #define CONST 1 351733Speter #define TYPE 2 352733Speter #define VAR 3 353733Speter #define ARRAY 4 354733Speter #define PTRFILE 5 355733Speter #define RECORD 6 356733Speter #define FIELD 7 357733Speter #define PROC 8 358733Speter #define FUNC 9 359733Speter #define FVAR 10 360733Speter #define REF 11 361733Speter #define PTR 12 362733Speter #define FILET 13 363733Speter #define SET 14 364733Speter #define RANGE 15 365733Speter #define LABEL 16 366733Speter #define WITHPTR 17 367733Speter #define SCAL 18 368733Speter #define STR 19 369733Speter #define PROG 20 370733Speter #define IMPROPER 21 371733Speter #define VARNT 22 3721194Speter #define FPROC 23 3731194Speter #define FFUNC 24 374733Speter 375733Speter /* 376733Speter * Clnames points to an array of names for the 377733Speter * namelist classes. 378733Speter */ 379733Speter char **clnames; 380733Speter 381733Speter /* 382733Speter * PRE-DEFINED NAMELIST OFFSETS 383733Speter * 384733Speter * The following are the namelist offsets for the 385733Speter * primitive types. The ones which are negative 386733Speter * don't actually exist, but are generated and tested 387733Speter * internally. These definitions are sensitive to the 388733Speter * initializations in nl.c. 389733Speter */ 390733Speter #define TFIRST -7 391733Speter #define TFILE -7 392733Speter #define TREC -6 393733Speter #define TARY -5 394733Speter #define TSCAL -4 395733Speter #define TPTR -3 396733Speter #define TSET -2 397733Speter #define TSTR -1 398733Speter #define NIL 0 399733Speter #define TBOOL 1 400733Speter #define TCHAR 2 401733Speter #define TINT 3 402733Speter #define TDOUBLE 4 403733Speter #define TNIL 5 404733Speter #define T1INT 6 405733Speter #define T2INT 7 406733Speter #define T4INT 8 407733Speter #define T1CHAR 9 408733Speter #define T1BOOL 10 409733Speter #define T8REAL 11 410733Speter #define TLAST 11 411733Speter 412733Speter /* 413733Speter * SEMANTIC DEFINITIONS 414733Speter */ 415733Speter 416733Speter /* 417733Speter * NOCON and SAWCON are flags in the tree telling whether 418733Speter * a constant set is part of an expression. 419733Speter */ 420733Speter #define NOCON 0 421733Speter #define SAWCON 1 422733Speter 423733Speter /* 424733Speter * The variable cbn gives the current block number, 425733Speter * the variable bn is set as a side effect of a call to 426733Speter * lookup, and is the block number of the variable which 427733Speter * was found. 428733Speter */ 429733Speter short bn, cbn; 430733Speter 431733Speter /* 432733Speter * The variable line is the current semantic 433733Speter * line and is set in stat.c from the numbers 434733Speter * embedded in statement type tree nodes. 435733Speter */ 436733Speter short line; 437733Speter 438733Speter /* 439733Speter * The size of the display 440733Speter * which defines the maximum nesting 441733Speter * of procedures and functions allowed. 442733Speter * Because of the flags in the current namelist 443733Speter * this must be no greater than 32. 444733Speter */ 445733Speter #define DSPLYSZ 20 446733Speter 447733Speter /* 448733Speter * The following structure is used 449733Speter * to keep track of the amount of variable 450733Speter * storage required by each block. 451733Speter * "Max" is the high water mark, "off" 452733Speter * the current need. Temporaries for "for" 453733Speter * loops and "with" statements are allocated 454733Speter * in the local variable area and these 455733Speter * numbers are thereby changed if necessary. 456733Speter */ 457733Speter struct om { 458733Speter long om_off; 459733Speter long om_max; 460733Speter } sizes[DSPLYSZ]; 461733Speter 462733Speter /* 463733Speter * the following structure records whether a level declares 464733Speter * any variables which are (or contain) files. 465733Speter * this so that the runtime routines for file cleanup can be invoked. 466733Speter */ 467733Speter bool dfiles[ DSPLYSZ ]; 468733Speter 469733Speter /* 470733Speter * Structure recording information about a constant 471733Speter * declaration. It is actually the return value from 472733Speter * the routine "gconst", but since C doesn't support 473733Speter * record valued functions, this is more convenient. 474733Speter */ 475733Speter struct { 476733Speter struct nl *ctype; 477733Speter short cival; 478733Speter double crval; 479733Speter int *cpval; 480733Speter } con; 481733Speter 482733Speter /* 483733Speter * The set structure records the lower bound 484733Speter * and upper bound with the lower bound normalized 485733Speter * to zero when working with a set. It is set by 486733Speter * the routine setran in var.c. 487733Speter */ 488733Speter struct { 489733Speter short lwrb, uprbp; 490733Speter } set; 491733Speter 492733Speter /* 493733Speter * structures of this kind are filled in by precset and used by postcset 494733Speter * to indicate things about constant sets. 495733Speter */ 496733Speter struct csetstr { 497733Speter struct nl *csettype; 498733Speter long paircnt; 499733Speter long singcnt; 500733Speter bool comptime; 501733Speter }; 502733Speter /* 503733Speter * The following flags are passed on calls to lvalue 504733Speter * to indicate how the reference is to affect the usage 505733Speter * information for the variable being referenced. 506733Speter * MOD is used to set the NMOD flag in the namelist 507733Speter * entry for the variable, ASGN permits diagnostics 508733Speter * to be formed when a for variable is assigned to in 509733Speter * the range of the loop. 510733Speter */ 511733Speter #define NOFLAGS 0 512733Speter #define MOD 01 513733Speter #define ASGN 02 514733Speter #define NOUSE 04 515733Speter 516733Speter /* 517733Speter * the following flags are passed to lvalue and rvalue 518733Speter * to tell them whether an lvalue or rvalue is required. 519733Speter * the semantics checking is done according to the function called, 520733Speter * but for pc, lvalue may put out an rvalue by indirecting afterwards, 521733Speter * and rvalue may stop short of putting out the indirection. 522733Speter */ 523733Speter #define LREQ 01 524733Speter #define RREQ 02 525733Speter 526733Speter double MAXINT; 527733Speter double MININT; 528733Speter 529733Speter /* 530733Speter * Variables for generation of profile information. 531733Speter * Monflg is set when we want to generate a profile. 532733Speter * Gocnt record the total number of goto's and 533733Speter * cnts records the current counter for generating 534733Speter * COUNT operators. 535733Speter */ 536733Speter short gocnt; 537733Speter short cnts; 538733Speter 539733Speter /* 540733Speter * Most routines call "incompat" rather than asking "!compat" 541733Speter * for historical reasons. 542733Speter */ 543733Speter #define incompat !compat 544733Speter 545733Speter /* 546733Speter * Parts records which declaration parts have been seen. 547833Speter * The grammar allows the "label" "const" "type" "var" and routine 548733Speter * parts to be repeated and to be in any order, so that 549733Speter * they can be detected semantically to give better 550733Speter * error diagnostics. 551733Speter */ 552833Speter int parts[ DSPLYSZ ]; 553733Speter 554833Speter #define LPRT 1 555833Speter #define CPRT 2 556833Speter #define TPRT 4 557833Speter #define VPRT 8 558833Speter #define RPRT 16 559733Speter 560733Speter /* 561733Speter * Flags for the "you used / instead of div" diagnostic 562733Speter */ 563733Speter bool divchk; 564733Speter bool divflg; 565733Speter 566*3071Smckusic bool errcnt[DSPLYSZ]; 567733Speter 568733Speter /* 569733Speter * Forechain links those types which are 570733Speter * ^ sometype 571733Speter * so that they can be evaluated later, permitting 572733Speter * circular, recursive list structures to be defined. 573733Speter */ 574733Speter struct nl *forechain; 575733Speter 576733Speter /* 577733Speter * Withlist links all the records which are currently 578733Speter * opened scopes because of with statements. 579733Speter */ 580733Speter struct nl *withlist; 581733Speter 582733Speter struct nl *intset; 583733Speter struct nl *input, *output; 584733Speter struct nl *program; 585733Speter 586733Speter /* progseen flag used by PC to determine if 587733Speter * a routine segment is being compiled (and 588733Speter * therefore no program statement seen) 589733Speter */ 590733Speter bool progseen; 591733Speter 592733Speter 593733Speter /* 594733Speter * STRUCTURED STATEMENT GOTO CHECKING 595733Speter * 596733Speter * The variable level keeps track of the current 597733Speter * "structured statement level" when processing the statement 598733Speter * body of blocks. This is used in the detection of goto's into 599733Speter * structured statements in a block. 600733Speter * 601733Speter * Each label's namelist entry contains two pieces of information 602733Speter * related to this check. The first `NL_GOLEV' either contains 603733Speter * the level at which the label was declared, `NOTYET' if the label 604733Speter * has not yet been declared, or `DEAD' if the label is dead, i.e. 605733Speter * if we have exited the level in which the label was defined. 606733Speter * 607733Speter * When we discover a "goto" statement, if the label has not 608733Speter * been defined yet, then we record the current level and the current line 609733Speter * for a later error check. If the label has been already become "DEAD" 610733Speter * then a reference to it is an error. Now the compiler maintains, 611733Speter * for each block, a linked list of the labels headed by "gotos[bn]". 612733Speter * When we exit a structured level, we perform the routine 613733Speter * ungoto in stat.c. It notices labels whose definition levels have been 614733Speter * exited and makes them be dead. For labels which have not yet been 615733Speter * defined, ungoto will maintain NL_GOLEV as the minimum structured level 616733Speter * since the first usage of the label. It is not hard to see that the label 617733Speter * must eventually be declared at this level or an outer level to this 618733Speter * one or a goto into a structured statement will exist. 619733Speter */ 620733Speter short level; 621733Speter struct nl *gotos[DSPLYSZ]; 622733Speter 623733Speter #define NOTYET 10000 624733Speter #define DEAD 10000 625733Speter 626733Speter /* 627733Speter * Noreach is true when the next statement will 628733Speter * be unreachable unless something happens along 629733Speter * (like exiting a looping construct) to save 630733Speter * the day. 631733Speter */ 632733Speter bool noreach; 633733Speter 634733Speter /* 635733Speter * UNDEFINED VARIABLE REFERENCE STRUCTURES 636733Speter */ 637733Speter struct udinfo { 638733Speter int ud_line; 639733Speter struct udinfo *ud_next; 640733Speter char nullch; 641733Speter }; 642733Speter 643733Speter /* 644733Speter * CODE GENERATION DEFINITIONS 645733Speter */ 646733Speter 647733Speter /* 648733Speter * NSTAND is or'ed onto the abstract machine opcode 649733Speter * for non-standard built-in procedures and functions. 650733Speter */ 651733Speter #define NSTAND 0400 652733Speter 653733Speter #define codeon() cgenflg++ 654733Speter #define codeoff() --cgenflg 655733Speter 656733Speter /* 657733Speter * Codeline is the last lino output in the code generator. 658733Speter * It used to be used to suppress LINO operators but no 659733Speter * more since we now count statements. 660733Speter * Lc is the intepreter code location counter. 661733Speter * 662733Speter short codeline; 663733Speter */ 664733Speter char *lc; 665733Speter 666733Speter 667733Speter /* 668733Speter * Routines which need types 669733Speter * other than "integer" to be 670733Speter * assumed by the compiler. 671733Speter */ 672733Speter double atof(); 673733Speter long lwidth(); 674*3071Smckusic long leven(); 675733Speter long aryconst(); 676733Speter long a8tol(); 677*3071Smckusic long roundup(); 678733Speter struct nl *lookup(); 679733Speter double atof(); 680733Speter int *tree(); 681733Speter int *hash(); 682733Speter char *alloc(); 683733Speter int *calloc(); 684733Speter char *savestr(); 685733Speter struct nl *lookup1(); 686733Speter struct nl *hdefnl(); 687733Speter struct nl *defnl(); 688733Speter struct nl *enter(); 689733Speter struct nl *nlcopy(); 690733Speter struct nl *tyrecl(); 691733Speter struct nl *tyary(); 692733Speter struct nl *fields(); 693733Speter struct nl *variants(); 694733Speter struct nl *deffld(); 695733Speter struct nl *defvnt(); 696733Speter struct nl *tyrec1(); 697733Speter struct nl *reclook(); 698733Speter struct nl *asgnop1(); 699733Speter struct nl *gtype(); 700733Speter struct nl *call(); 701733Speter struct nl *lvalue(); 702733Speter struct nl *rvalue(); 703733Speter struct nl *cset(); 704733Speter 705733Speter /* 706733Speter * type cast NIL to keep lint happy (which is not so bad) 707733Speter */ 708733Speter #define NLNIL ( (struct nl *) NIL ) 709733Speter 710733Speter /* 711733Speter * Funny structures to use 712733Speter * pointers in wild and wooly ways 713733Speter */ 714733Speter struct { 715733Speter char pchar; 716733Speter }; 717733Speter struct { 718733Speter short pint; 719733Speter short pint2; 720733Speter }; 721733Speter struct { 722733Speter long plong; 723733Speter }; 724733Speter struct { 725733Speter double pdouble; 726733Speter }; 727733Speter 728733Speter #define OCT 1 729733Speter #define HEX 2 730733Speter 731733Speter /* 732733Speter * MAIN PROGRAM VARIABLES, MISCELLANY 733733Speter */ 734733Speter 735733Speter /* 736733Speter * Variables forming a data base referencing 737733Speter * the command line arguments with the "i" option, e.g. 738733Speter * in "pi -i scanner.i compiler.p". 739733Speter */ 740733Speter char **pflist; 741733Speter short pflstc; 742733Speter short pfcnt; 743733Speter 744733Speter char *filename; /* current source file name */ 745733Speter long tvec; 746733Speter extern char *snark; /* SNARK */ 747733Speter extern char *classes[ ]; /* maps namelist classes to string names */ 748733Speter 749733Speter #define derror error 750733Speter 751733Speter #ifdef PC 752733Speter 753733Speter /* 754733Speter * the current function number, for [ lines 755733Speter */ 756733Speter int ftnno; 757733Speter 758733Speter /* 759733Speter * the pc output stream 760733Speter */ 761733Speter FILE *pcstream; 762733Speter 763733Speter #endif PC 764