1742Speter /* Copyright (c) 1979 Regents of the University of California */ 2742Speter 3*12395Speter /* static char sccsid[] = "@(#)yy.h 1.2 05/11/83"; */ 4742Speter 5742Speter #include "y.tab.h" 6742Speter /* 7742Speter * INPUT/OUTPUT 8742Speter */ 9742Speter 10742Speter /* 11742Speter * The buffer for the input file is normally "ibuf". 12742Speter * When files are included, however, this may be 13742Speter * pushed down in the stack of currently active 14742Speter * files. For this reason, the pointer ibp always 15742Speter * references the i/o buffer of the current input file. 16742Speter */ 17742Speter FILE *ibuf, *ibp; 18742Speter 19742Speter /* 20742Speter * Line and token buffers. Charbuf is the character buffer for 21742Speter * input lines, token the buffer for tokens returned 22742Speter * by the scanner. CBSIZE defines the maximum line 23742Speter * length allowed on input and is doubtless too small. 24742Speter * The token buffer should be a local array in yylex. 25742Speter */ 26*12395Speter #ifdef ADDR16 27742Speter #define CBSIZE 161 28*12395Speter #endif ADDR16 29*12395Speter #ifdef ADDR32 30*12395Speter #define CBSIZE 1024 31*12395Speter #endif ADDR32 32742Speter 33742Speter char charbuf[CBSIZE], *bufp, token[CBSIZE]; 34742Speter 35742Speter #define digit(c) (c >= '0' && c <= '9') 36742Speter #define alph(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) 37742Speter 38742Speter /* 39742Speter * Flag to prevent reprinting current line after 40742Speter * an error. 41742Speter */ 42742Speter char yyprtd; 43742Speter 44742Speter /* 45742Speter * The following variables are maintained by 46742Speter * the scanner in the file lex and used in scanning 47742Speter * and in parsing. 48742Speter * 49742Speter * The variable yychar is the current scanner character. 50742Speter * Currently, the scanner must be called as 51742Speter * yychar = yylex() 52742Speter * even though it should set yychar itself. 53742Speter * Yychar has value YEOF at end of file, and negative value if 54742Speter * there is no yychar, e.g. after a shift in the parser. 55742Speter * 56742Speter * The variable yycol is the current column in the line whose number 57742Speter * is given by yyline. Yyecol and yyeline give the position for an 58742Speter * error message to flag, usually the start of an input token. 59742Speter * Yylval is the semantic return from the scanner. 60742Speter * 61742Speter * In fact all of these variables are "per token". 62742Speter * In the usual case, only the copies in the scanner token structure 63742Speter * 'Y' are used, and the #defines below serve to make them look 64742Speter * like variables. 65742Speter * 66742Speter * For the purposes of the error recovery, however, they are copied 67742Speter * and restored quite freely. For the error recovery also, the 68742Speter * file name which the input line this token is on and the seek 69742Speter * pointer of this line in its source file are saved as yyefile 70742Speter * and yyseekp. The global variable yylinpt is the seek pointer 71742Speter * of the current input line. 72742Speter */ 73742Speter int yycol; 74742Speter int yyline; 75742Speter int yyseqid; 76742Speter int yysavc; 77742Speter int yylinpt; 78742Speter 79742Speter /* *** NOTE *** 80742Speter * It would be much better to not have the Yyeline and Yyefile 81742Speter * in the scanner structure and to have a mechanism for mapping 82742Speter * seqid's to these globally. 83742Speter */ 84742Speter struct yytok { 85742Speter int Yychar; 86742Speter int Yylval; 87742Speter int Yyecol; 88742Speter int Yyeline; 89742Speter int Yyseekp; 90742Speter char *Yyefile; 91742Speter int Yyeseqid; 92742Speter } Y, OY; 93742Speter 94742Speter #define yychar Y.Yychar 95742Speter #define yylval Y.Yylval 96742Speter #define yyecol Y.Yyecol 97742Speter #define yyeline Y.Yyeline 98742Speter #define yyseekp Y.Yyseekp 99742Speter #define yyefile Y.Yyefile 100742Speter #define yyeseqid Y.Yyeseqid 101742Speter 102742Speter /* 103742Speter * Yyval is the semantic value returned by a reduction. 104742Speter * It is what "$$" is expanded to by yacc. 105742Speter */ 106742Speter int *Ps, *yyval; 107742Speter 108742Speter /* 109742Speter * N is the length of a reduction. 110742Speter * Used externally by "lineof" to get the left and 111742Speter * right margins for a reduction. 112742Speter */ 113742Speter int N; 114742Speter /* 115742Speter * Definitions for looking up keywords. 116742Speter * The keyword array is called yykey, and 117742Speter * lastkey points at the end of it. 118742Speter */ 119742Speter char *lastkey; 120742Speter 121742Speter struct kwtab { 122742Speter char *kw_str; 123742Speter int kw_val; 124742Speter } yykey[]; 125742Speter 126742Speter /* 127742Speter * ERROR RECOVERY EXTERNALS 128742Speter */ 129742Speter 130742Speter #define CLIMIT 40 /* see yyrecover.c */ 131742Speter char *tokname(); 132742Speter char *charname(); 133742Speter 134742Speter char *classes[]; 135742Speter 136742Speter /* 137742Speter * Tokens which yacc doesn't define 138742Speter */ 139742Speter #define YEOF 0 140742Speter #define ERROR 256 141742Speter 142742Speter /* 143742Speter * Limit on the number of syntax errors 144742Speter */ 145742Speter #define MAXSYNERR 100 146742Speter 147742Speter /* 148742Speter * Big costs 149742Speter */ 150742Speter #define HUGE 50 151742Speter #define INFINITY 100 152742Speter 153742Speter /* 154742Speter * Kinds of panics 155742Speter */ 156742Speter #define PDECL 0 157742Speter #define PSTAT 1 158742Speter #define PEXPR 2 159742Speter #define PPROG 3 160742Speter 161742Speter #define yyresume() yyResume = 1; 162742Speter 163742Speter char yyResume; 164742Speter 165742Speter char dquote; 166742Speter 167742Speter char errout; 168742Speter 169742Speter /* 170742Speter * Yyidwant and yyidhave are the namelist classes 171742Speter * of identifiers associated with a identifier reduce 172742Speter * error, set before the recovery is called. 173742Speter * Since they may be set again during the forward move 174742Speter * they must be saved by yyrecover, which uses them in printing 175742Speter * error messages. 176742Speter */ 177742Speter int yyidhave, yyidwant; 178742Speter 179742Speter /* 180742Speter * The variables yy*shifts are used to prevent looping and the printing 181742Speter * of spurious messages in the parser. Yyshifts gives the number of 182742Speter * true input shifts since the last corrective action. YyOshifts 183742Speter * is the value of yyshifts before it was last cleared, and is used 184742Speter * by yyPerror in yypanic.c to suppress messages. 185742Speter * 186742Speter * Yytshifts counts true input shifts. It is used to prevent looping 187742Speter * inserting unique symbols. If yytshifts == yyTshifts (local to 188742Speter * yyrecover.c) then there has been no shift over true input since 189742Speter * the last unique symbol insertion. We refuse, in this case, 190742Speter * to insert more unique symbols so as to prevent looping. 191742Speter * 192742Speter * The recovery cannot loop because it guarantees the progress of the 193742Speter * parse, i.e.: 194742Speter * 195742Speter * 1) Any insertion guarantees to shift over 2 symbols, a replacement 196742Speter * over one symbol. 197742Speter * 198742Speter * 2) Unique symbol insertions are limited to one for each true 199742Speter * symbol of input, or "safe" insertion of the keywords "end" 200742Speter * and "until" at zero cost (safe since these are know to match 201742Speter * stack that cannot have been generated - e.g. "begin" or "repeat") 202742Speter * 203742Speter * 3) We never panic more than once from a given state without 204742Speter * shifting over input, i.e. we force the parse stack to shrink 205742Speter * after each unsuccessful panic. 206742Speter */ 207742Speter int yyshifts, yyOshifts; 208742Speter unsigned yytshifts; 209742Speter 210742Speter #ifdef PXP 211742Speter 212742Speter /* 213742Speter * Identifier class definitions 214742Speter */ 215742Speter #define UNDEF 0 216742Speter #define CONST 1 217742Speter #define TYPE 2 218742Speter #define VAR 3 219742Speter #define ARRAY 4 220742Speter #define PTRFILE 5 221742Speter #define RECORD 6 222742Speter #define FIELD 7 223742Speter #define PROC 8 224742Speter #define FUNC 9 225742Speter #define FVAR 10 226742Speter #define REF 11 227742Speter #define PTR 12 228742Speter #define FILET 13 229742Speter #define SET 14 230742Speter #define RANGE 15 231742Speter #define LABEL 16 232742Speter #define WITHPTR 17 233742Speter #define SCAL 18 234742Speter #define STR 19 235742Speter #define PROG 20 236742Speter #define IMPROPER 21 237742Speter 238742Speter /* 239742Speter * COMMENT FORMATTING DEFINITIONS 240742Speter */ 241742Speter 242742Speter /* 243742Speter * Count of tokens on this input line 244742Speter * Note that this can be off if input is not syntactically correct. 245742Speter */ 246742Speter int yytokcnt; 247742Speter int yywhcnt; 248742Speter 249742Speter /* 250742Speter * Types of comments 251742Speter */ 252742Speter #define CLMARG 0 253742Speter #define CALIGN 1 254742Speter #define CTRAIL 2 255742Speter #define CRMARG 3 256742Speter #define CSRMARG 4 257742Speter #define CNL 5 258742Speter #define CNLBL 6 259742Speter #define CFORM 7 260742Speter #define CINCLUD 8 261742Speter 262742Speter /* 263742Speter * Comment structure 264742Speter * Cmhp is the head of the current list of comments 265742Speter */ 266742Speter struct comment { 267742Speter struct comment *cmnext; 268742Speter int cmdelim; 269742Speter struct commline *cml; 270742Speter int cmjust; 271742Speter int cmseqid; 272742Speter } *cmhp; 273742Speter 274742Speter /* 275742Speter * Structure for holding a comment line 276742Speter */ 277742Speter struct commline { 278742Speter char *cmtext; 279742Speter int cmcol; /* Only used for first line of comment currently */ 280742Speter struct commline *cml; 281742Speter }; 282742Speter 283742Speter struct W { 284742Speter int Wseqid; 285742Speter int Wcol; 286742Speter } yyw[MAXDEPTH + 1], *yypw; 287742Speter 288742Speter #define commform() quickcomm(CFORM) 289742Speter #define commnl() quickcomm(CNL) 290742Speter #define commnlbl() quickcomm(CNLBL) 291742Speter #endif 292