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