xref: /csrg-svn/usr.bin/pascal/src/yy.h (revision 12395)
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