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