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