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