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