xref: /original-bsd/usr.bin/pascal/src/yy.h (revision a141c157)
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) 06/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 comment {
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
312