1 /* Copyright (c) 1979 Regents of the University of California */ 2 3 /* static char sccsid[] = "@(#)yy.h 1.1 08/27/80"; */ 4 5 #include "y.tab.h" 6 /* 7 * INPUT/OUTPUT 8 */ 9 10 /* 11 * The buffer for the input file is normally "ibuf". 12 * When files are included, however, this may be 13 * pushed down in the stack of currently active 14 * files. For this reason, the pointer ibp always 15 * references the i/o buffer of the current input file. 16 */ 17 FILE *ibuf, *ibp; 18 19 /* 20 * Line and token buffers. Charbuf is the character buffer for 21 * input lines, token the buffer for tokens returned 22 * by the scanner. CBSIZE defines the maximum line 23 * length allowed on input and is doubtless too small. 24 * The token buffer should be a local array in yylex. 25 */ 26 #define CBSIZE 161 27 28 char charbuf[CBSIZE], *bufp, token[CBSIZE]; 29 30 #define digit(c) (c >= '0' && c <= '9') 31 #define alph(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) 32 33 /* 34 * Flag to prevent reprinting current line after 35 * an error. 36 */ 37 char yyprtd; 38 39 /* 40 * The following variables are maintained by 41 * the scanner in the file lex and used in scanning 42 * and in parsing. 43 * 44 * The variable yychar is the current scanner character. 45 * Currently, the scanner must be called as 46 * yychar = yylex() 47 * even though it should set yychar itself. 48 * Yychar has value YEOF at end of file, and negative value if 49 * there is no yychar, e.g. after a shift in the parser. 50 * 51 * The variable yycol is the current column in the line whose number 52 * is given by yyline. Yyecol and yyeline give the position for an 53 * error message to flag, usually the start of an input token. 54 * Yylval is the semantic return from the scanner. 55 * 56 * In fact all of these variables are "per token". 57 * In the usual case, only the copies in the scanner token structure 58 * 'Y' are used, and the #defines below serve to make them look 59 * like variables. 60 * 61 * For the purposes of the error recovery, however, they are copied 62 * and restored quite freely. For the error recovery also, the 63 * file name which the input line this token is on and the seek 64 * pointer of this line in its source file are saved as yyefile 65 * and yyseekp. The global variable yylinpt is the seek pointer 66 * of the current input line. 67 */ 68 int yycol; 69 int yyline; 70 int yyseqid; 71 int yysavc; 72 int yylinpt; 73 74 /* *** NOTE *** 75 * It would be much better to not have the Yyeline and Yyefile 76 * in the scanner structure and to have a mechanism for mapping 77 * seqid's to these globally. 78 */ 79 struct yytok { 80 int Yychar; 81 int Yylval; 82 int Yyecol; 83 int Yyeline; 84 int Yyseekp; 85 char *Yyefile; 86 int Yyeseqid; 87 } Y, OY; 88 89 #define yychar Y.Yychar 90 #define yylval Y.Yylval 91 #define yyecol Y.Yyecol 92 #define yyeline Y.Yyeline 93 #define yyseekp Y.Yyseekp 94 #define yyefile Y.Yyefile 95 #define yyeseqid Y.Yyeseqid 96 97 /* 98 * Yyval is the semantic value returned by a reduction. 99 * It is what "$$" is expanded to by yacc. 100 */ 101 int *Ps, *yyval; 102 103 /* 104 * N is the length of a reduction. 105 * Used externally by "lineof" to get the left and 106 * right margins for a reduction. 107 */ 108 int N; 109 /* 110 * Definitions for looking up keywords. 111 * The keyword array is called yykey, and 112 * lastkey points at the end of it. 113 */ 114 char *lastkey; 115 116 struct kwtab { 117 char *kw_str; 118 int kw_val; 119 } yykey[]; 120 121 /* 122 * ERROR RECOVERY EXTERNALS 123 */ 124 125 #define CLIMIT 40 /* see yyrecover.c */ 126 char *tokname(); 127 char *charname(); 128 129 char *classes[]; 130 131 /* 132 * Tokens which yacc doesn't define 133 */ 134 #define YEOF 0 135 #define ERROR 256 136 137 /* 138 * Limit on the number of syntax errors 139 */ 140 #define MAXSYNERR 100 141 142 /* 143 * Big costs 144 */ 145 #define HUGE 50 146 #define INFINITY 100 147 148 /* 149 * Kinds of panics 150 */ 151 #define PDECL 0 152 #define PSTAT 1 153 #define PEXPR 2 154 #define PPROG 3 155 156 #define yyresume() yyResume = 1; 157 158 char yyResume; 159 160 char dquote; 161 162 char errout; 163 164 /* 165 * Yyidwant and yyidhave are the namelist classes 166 * of identifiers associated with a identifier reduce 167 * error, set before the recovery is called. 168 * Since they may be set again during the forward move 169 * they must be saved by yyrecover, which uses them in printing 170 * error messages. 171 */ 172 int yyidhave, yyidwant; 173 174 /* 175 * The variables yy*shifts are used to prevent looping and the printing 176 * of spurious messages in the parser. Yyshifts gives the number of 177 * true input shifts since the last corrective action. YyOshifts 178 * is the value of yyshifts before it was last cleared, and is used 179 * by yyPerror in yypanic.c to suppress messages. 180 * 181 * Yytshifts counts true input shifts. It is used to prevent looping 182 * inserting unique symbols. If yytshifts == yyTshifts (local to 183 * yyrecover.c) then there has been no shift over true input since 184 * the last unique symbol insertion. We refuse, in this case, 185 * to insert more unique symbols so as to prevent looping. 186 * 187 * The recovery cannot loop because it guarantees the progress of the 188 * parse, i.e.: 189 * 190 * 1) Any insertion guarantees to shift over 2 symbols, a replacement 191 * over one symbol. 192 * 193 * 2) Unique symbol insertions are limited to one for each true 194 * symbol of input, or "safe" insertion of the keywords "end" 195 * and "until" at zero cost (safe since these are know to match 196 * stack that cannot have been generated - e.g. "begin" or "repeat") 197 * 198 * 3) We never panic more than once from a given state without 199 * shifting over input, i.e. we force the parse stack to shrink 200 * after each unsuccessful panic. 201 */ 202 int yyshifts, yyOshifts; 203 unsigned yytshifts; 204 205 #ifdef PXP 206 207 /* 208 * Identifier class definitions 209 */ 210 #define UNDEF 0 211 #define CONST 1 212 #define TYPE 2 213 #define VAR 3 214 #define ARRAY 4 215 #define PTRFILE 5 216 #define RECORD 6 217 #define FIELD 7 218 #define PROC 8 219 #define FUNC 9 220 #define FVAR 10 221 #define REF 11 222 #define PTR 12 223 #define FILET 13 224 #define SET 14 225 #define RANGE 15 226 #define LABEL 16 227 #define WITHPTR 17 228 #define SCAL 18 229 #define STR 19 230 #define PROG 20 231 #define IMPROPER 21 232 233 /* 234 * COMMENT FORMATTING DEFINITIONS 235 */ 236 237 /* 238 * Count of tokens on this input line 239 * Note that this can be off if input is not syntactically correct. 240 */ 241 int yytokcnt; 242 int yywhcnt; 243 244 /* 245 * Types of comments 246 */ 247 #define CLMARG 0 248 #define CALIGN 1 249 #define CTRAIL 2 250 #define CRMARG 3 251 #define CSRMARG 4 252 #define CNL 5 253 #define CNLBL 6 254 #define CFORM 7 255 #define CINCLUD 8 256 257 /* 258 * Comment structure 259 * Cmhp is the head of the current list of comments 260 */ 261 struct comment { 262 struct comment *cmnext; 263 int cmdelim; 264 struct commline *cml; 265 int cmjust; 266 int cmseqid; 267 } *cmhp; 268 269 /* 270 * Structure for holding a comment line 271 */ 272 struct commline { 273 char *cmtext; 274 int cmcol; /* Only used for first line of comment currently */ 275 struct commline *cml; 276 }; 277 278 struct W { 279 int Wseqid; 280 int Wcol; 281 } yyw[MAXDEPTH + 1], *yypw; 282 283 #define commform() quickcomm(CFORM) 284 #define commnl() quickcomm(CNL) 285 #define commnlbl() quickcomm(CNLBL) 286 #endif 287