|
|
1.1 root 1:
2: # line 2 "../mip/cgram.y"
3: #ifndef lint
4: static char sccsid[] = "@(#)cgram.y 1.1 86/02/03 SMI"; /* from UCB X.X XX/XX/XX */
5: #endif
6: # define NAME 2
7: # define STRING 3
8: # define ICON 4
9: # define FCON 5
10: # define PLUS 6
11: # define MINUS 8
12: # define MUL 11
13: # define AND 14
14: # define OR 17
15: # define ER 19
16: # define QUEST 21
17: # define COLON 22
18: # define ANDAND 23
19: # define OROR 24
20: # define ASOP 25
21: # define RELOP 26
22: # define EQUOP 27
23: # define DIVOP 28
24: # define SHIFTOP 29
25: # define INCOP 30
26: # define UNOP 31
27: # define STROP 32
28: # define TYPE 33
29: # define CLASS 34
30: # define STRUCT 35
31: # define RETURN 36
32: # define GOTO 37
33: # define IF 38
34: # define ELSE 39
35: # define SWITCH 40
36: # define BREAK 41
37: # define CONTINUE 42
38: # define WHILE 43
39: # define DO 44
40: # define FOR 45
41: # define DEFAULT 46
42: # define CASE 47
43: # define SIZEOF 48
44: # define ENUM 49
45: # define LP 50
46: # define RP 51
47: # define LC 52
48: # define RC 53
49: # define LB 54
50: # define RB 55
51: # define CM 56
52: # define SM 57
53: # define ASSIGN 58
54: # define ASM 112
55:
56: # line 116 "../mip/cgram.y"
57: # include "cpass1.h"
58: # define yyerror( x ) ccerror( x, yychar )
59: #define yyclearin yychar = -1
60: #define yyerrok yyerrflag = 0
61: extern int yychar;
62: extern short yyerrflag;
63: #ifndef YYMAXDEPTH
64: #define YYMAXDEPTH 150
65: #endif
66: YYSTYPE yylval, yyval;
67:
68: # line 136 "../mip/cgram.y"
69: static int fake = 0;
70: #ifndef FLEXNAMES
71: static char fakename[NCHNAM+1];
72: #else
73: static char fakename[24];
74: #endif
75: static int noassign = 0;
76: extern int errline, lineno;
77: # define YYERRCODE 256
78:
79: # line 982 "../mip/cgram.y"
80:
81:
82: NODE *
83: mkty( t, d, s ) unsigned t; {
84: return( block( TYPE, NIL, NIL, t, d, s ) );
85: }
86:
87: NODE *
88: bdty( op, p, v ) NODE *p; {
89: register NODE *q;
90:
91: q = block( op, p, NIL, INT, 0, INT );
92:
93: switch( op ){
94:
95: case UNARY MUL:
96: case UNARY CALL:
97: break;
98:
99: case LB:
100: q->in.right = bcon(v);
101: break;
102:
103: case NAME:
104: q->tn.rval = v;
105: break;
106:
107: default:
108: cerror( "bad bdty" );
109: }
110:
111: return( q );
112: }
113:
114: dstash( n )
115: {
116: /* put n into the dimension table */
117: extern char *realloc();
118:
119: if( (unsigned)curdim % DIMTABSZ == 0 ) {
120: dimtab = (int*)realloc(dimtab, (curdim+DIMTABSZ)*sizeof(dimtab[0]));
121: if (dimtab == NULL) {
122: cerror("dimension table overflow");
123: }
124: }
125: dimtab[ curdim++ ] = n;
126: }
127:
128: savebc() {
129: if( psavbc > & asavbc[BCSZ-4 ] ){
130: cerror( "whiles, fors, etc. too deeply nested");
131: }
132: *psavbc++ = brklab;
133: *psavbc++ = contlab;
134: *psavbc++ = flostat;
135: *psavbc++ = swx;
136: flostat = 0;
137: }
138:
139: resetbc(mask){
140:
141: swx = *--psavbc;
142: flostat = *--psavbc | (flostat&mask);
143: contlab = *--psavbc;
144: brklab = *--psavbc;
145:
146: }
147:
148: #ifndef LINT
149: savelineno(){
150: if( psavbc > & asavbc[BCSZ-1 ] ){
151: cerror( "whiles, fors, etc. too deeply nested");
152: }
153: *psavbc++ = lineno;
154: }
155:
156: resetlineno(){
157: return *--psavbc;
158: }
159: #endif
160:
161: addcase(p) NODE *p; { /* add case to switch */
162:
163: p = optim( p ); /* change enum to ints */
164: if( p->in.op != ICON ){
165: uerror( "non-constant case expression");
166: return;
167: }
168: if( swp == swtab ){
169: uerror( "case not in switch");
170: return;
171: }
172: if( swp >= &swtab[SWITSZ] ){
173: cerror( "switch table overflow");
174: }
175: swp->sval = p->tn.lval;
176: deflab( swp->slab = getlab() );
177: ++swp;
178: tfree(p);
179: }
180:
181: adddef(){ /* add default case to switch */
182: if( swtab[swx].slab >= 0 ){
183: uerror( "duplicate default in switch");
184: return;
185: }
186: if( swp == swtab ){
187: uerror( "default not inside switch");
188: return;
189: }
190: deflab( swtab[swx].slab = getlab() );
191: }
192:
193: swstart(){
194: /* begin a switch block */
195: if( swp >= &swtab[SWITSZ] ){
196: cerror( "switch table overflow");
197: }
198: swx = swp - swtab;
199: swp->slab = -1;
200: ++swp;
201: }
202:
203: swend(){ /* end a switch block */
204:
205: register struct sw *swbeg, *p, *q, *r, *r1;
206: CONSZ temp;
207: int tempi;
208:
209: swbeg = &swtab[swx+1];
210:
211: /* sort */
212:
213: r1 = swbeg;
214: r = swp-1;
215:
216: while( swbeg < r ){
217: /* bubble largest to end */
218: for( q=swbeg; q<r; ++q ){
219: if( q->sval > (q+1)->sval ){
220: /* swap */
221: r1 = q+1;
222: temp = q->sval;
223: q->sval = r1->sval;
224: r1->sval = temp;
225: tempi = q->slab;
226: q->slab = r1->slab;
227: r1->slab = tempi;
228: }
229: }
230: r = r1;
231: r1 = swbeg;
232: }
233:
234: /* it is now sorted */
235:
236: for( p = swbeg+1; p<swp; ++p ){
237: if( p->sval == (p-1)->sval ){
238: uerror( "duplicate case in switch, %d", tempi=p->sval );
239: return;
240: }
241: }
242:
243: genswitch( swbeg-1, swp-swbeg );
244: swp = swbeg-1;
245: }
246: extern short yyexca[];
247: # define YYNPROD 194
248: # define YYLAST 1238
249: extern short yyact[];
250: short yyexca [] ={
251: -1, 1,
252: 0, -1,
253: 2, 24,
254: 11, 24,
255: 50, 24,
256: 57, 24,
257: -2, 0,
258: -1, 21,
259: 56, 84,
260: 57, 84,
261: -2, 8,
262: -1, 26,
263: 56, 83,
264: 57, 83,
265: -2, 81,
266: -1, 28,
267: 56, 87,
268: 57, 87,
269: -2, 82,
270: -1, 34,
271: 52, 47,
272: -2, 45,
273: -1, 36,
274: 52, 39,
275: -2, 37,
276: -1, 61,
277: 53, 52,
278: 57, 52,
279: -2, 0,
280: -1, 115,
281: 33, 19,
282: 34, 19,
283: 35, 19,
284: 49, 19,
285: -2, 14,
286: -1, 284,
287: 57, 138,
288: -2, 0,
289: -1, 289,
290: 33, 17,
291: 34, 17,
292: 35, 17,
293: 49, 17,
294: -2, 15,
295: -1, 310,
296: 33, 18,
297: 34, 18,
298: 35, 18,
299: 49, 18,
300: -2, 16,
301: };
302: extern short yypact[];
303: short yyact []={
304:
305: 217, 98, 269, 20, 137, 238, 94, 92, 93, 215,
306: 11, 85, 15, 206, 83, 29, 138, 84, 218, 22,
307: 11, 10, 15, 29, 23, 49, 17, 172, 29, 7,
308: 39, 310, 23, 87, 86, 101, 17, 23, 63, 227,
309: 228, 233, 153, 237, 225, 226, 234, 235, 236, 240,
310: 239, 88, 97, 89, 80, 116, 263, 116, 279, 103,
311: 229, 326, 278, 24, 162, 213, 238, 94, 92, 93,
312: 169, 24, 85, 118, 48, 83, 24, 105, 84, 257,
313: 54, 325, 139, 289, 59, 322, 107, 109, 39, 38,
314: 154, 158, 318, 300, 87, 86, 273, 272, 113, 4,
315: 227, 228, 233, 170, 237, 225, 226, 234, 235, 236,
316: 240, 239, 88, 210, 89, 230, 116, 216, 209, 292,
317: 106, 229, 174, 175, 176, 178, 180, 182, 184, 186,
318: 187, 189, 191, 193, 194, 195, 196, 197, 11, 10,
319: 15, 139, 96, 166, 201, 200, 91, 94, 92, 93,
320: 199, 71, 85, 154, 17, 83, 162, 116, 84, 91,
321: 94, 92, 93, 29, 29, 85, 168, 104, 83, 311,
322: 293, 84, 23, 23, 87, 86, 230, 26, 242, 120,
323: 243, 161, 244, 101, 245, 75, 246, 87, 86, 247,
324: 76, 248, 88, 249, 89, 203, 117, 198, 78, 214,
325: 139, 43, 45, 241, 79, 88, 70, 89, 251, 163,
326: 261, 24, 24, 262, 41, 74, 252, 295, 42, 19,
327: 257, 259, 260, 41, 270, 165, 208, 42, 275, 265,
328: 266, 267, 268, 60, 271, 160, 35, 51, 82, 100,
329: 287, 52, 281, 5, 33, 290, 91, 94, 92, 93,
330: 280, 291, 85, 164, 320, 83, 315, 167, 84, 231,
331: 253, 238, 94, 92, 93, 207, 258, 85, 51, 102,
332: 83, 298, 52, 84, 87, 86, 255, 28, 204, 50,
333: 77, 69, 28, 302, 304, 270, 308, 306, 65, 87,
334: 86, 100, 88, 313, 89, 227, 228, 233, 208, 237,
335: 225, 226, 234, 235, 236, 240, 239, 88, 314, 89,
336: 99, 116, 312, 285, 321, 212, 229, 21, 286, 270,
337: 231, 323, 146, 147, 148, 149, 150, 151, 51, 73,
338: 9, 29, 52, 284, 44, 46, 124, 207, 125, 30,
339: 23, 127, 283, 282, 129, 277, 159, 130, 159, 131,
340: 142, 134, 144, 132, 133, 135, 121, 128, 123, 126,
341: 55, 114, 56, 18, 61, 297, 91, 94, 92, 93,
342: 145, 230, 85, 296, 143, 83, 10, 108, 84, 24,
343: 57, 324, 91, 94, 92, 93, 122, 32, 136, 100,
344: 11, 10, 15, 288, 87, 86, 301, 8, 37, 11,
345: 307, 15, 127, 124, 276, 125, 17, 31, 127, 294,
346: 87, 86, 88, 305, 89, 17, 202, 102, 28, 123,
347: 155, 64, 192, 121, 128, 123, 126, 61, 88, 124,
348: 89, 125, 119, 124, 127, 125, 36, 129, 127, 34,
349: 130, 129, 131, 256, 134, 72, 132, 133, 135, 121,
350: 128, 123, 126, 121, 128, 123, 126, 232, 115, 112,
351: 111, 140, 53, 27, 66, 47, 211, 124, 95, 125,
352: 58, 124, 127, 125, 319, 129, 127, 62, 130, 122,
353: 131, 136, 134, 155, 132, 133, 135, 121, 128, 123,
354: 126, 173, 171, 123, 256, 110, 68, 67, 40, 3,
355: 303, 2, 157, 124, 90, 125, 12, 13, 127, 6,
356: 25, 129, 317, 14, 130, 231, 131, 122, 134, 136,
357: 132, 133, 135, 121, 128, 123, 126, 16, 224, 222,
358: 223, 221, 219, 220, 1, 0, 124, 0, 125, 0,
359: 0, 127, 0, 0, 0, 0, 0, 0, 316, 124,
360: 0, 125, 108, 122, 127, 136, 121, 129, 123, 126,
361: 130, 0, 131, 0, 134, 309, 132, 133, 135, 121,
362: 128, 123, 126, 124, 0, 125, 0, 0, 127, 0,
363: 0, 129, 0, 0, 130, 0, 131, 0, 134, 0,
364: 132, 133, 135, 121, 128, 123, 126, 0, 124, 122,
365: 125, 136, 0, 127, 0, 124, 129, 125, 0, 130,
366: 127, 131, 0, 134, 0, 132, 133, 135, 121, 128,
367: 123, 126, 0, 122, 299, 136, 0, 123, 126, 0,
368: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
369: 0, 0, 0, 0, 0, 0, 0, 0, 122, 264,
370: 136, 124, 0, 125, 0, 0, 127, 0, 0, 129,
371: 0, 0, 130, 0, 131, 0, 134, 0, 132, 133,
372: 135, 121, 128, 123, 126, 124, 0, 125, 0, 0,
373: 127, 0, 0, 129, 0, 0, 130, 0, 131, 0,
374: 134, 250, 132, 133, 135, 121, 128, 123, 126, 0,
375: 254, 122, 0, 136, 0, 0, 0, 0, 0, 0,
376: 0, 124, 0, 125, 0, 0, 127, 0, 0, 129,
377: 0, 0, 130, 0, 131, 122, 134, 136, 132, 133,
378: 135, 121, 128, 123, 126, 0, 0, 0, 0, 0,
379: 0, 0, 0, 0, 0, 0, 0, 124, 0, 125,
380: 0, 0, 127, 0, 0, 129, 205, 0, 130, 0,
381: 131, 122, 134, 136, 132, 133, 135, 121, 128, 123,
382: 126, 124, 0, 125, 0, 0, 127, 0, 0, 129,
383: 0, 0, 130, 0, 131, 0, 134, 0, 132, 133,
384: 135, 121, 128, 123, 126, 0, 0, 122, 0, 136,
385: 91, 94, 92, 93, 0, 0, 85, 0, 0, 83,
386: 0, 0, 84, 91, 94, 92, 93, 0, 0, 85,
387: 0, 0, 83, 136, 0, 84, 0, 0, 87, 86,
388: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
389: 0, 87, 86, 0, 0, 0, 88, 0, 89, 0,
390: 0, 91, 94, 92, 93, 0, 190, 85, 0, 88,
391: 83, 89, 0, 84, 91, 94, 92, 93, 0, 188,
392: 85, 0, 0, 83, 0, 0, 84, 0, 0, 87,
393: 86, 0, 0, 0, 0, 0, 0, 0, 0, 0,
394: 0, 0, 87, 86, 0, 0, 0, 88, 0, 89,
395: 0, 0, 91, 94, 92, 93, 0, 185, 85, 0,
396: 88, 83, 89, 0, 84, 91, 94, 92, 93, 0,
397: 183, 85, 0, 0, 83, 0, 0, 84, 0, 0,
398: 87, 86, 0, 0, 0, 0, 0, 0, 0, 0,
399: 0, 0, 0, 87, 86, 0, 0, 0, 88, 0,
400: 89, 0, 0, 91, 94, 92, 93, 0, 181, 85,
401: 0, 88, 83, 89, 0, 84, 91, 94, 92, 93,
402: 0, 179, 85, 0, 0, 83, 0, 0, 84, 0,
403: 0, 87, 86, 0, 0, 0, 0, 0, 0, 0,
404: 0, 0, 0, 0, 87, 86, 0, 0, 0, 88,
405: 0, 89, 0, 0, 91, 94, 92, 93, 0, 177,
406: 85, 0, 88, 83, 89, 0, 84, 0, 0, 0,
407: 0, 274, 0, 0, 0, 0, 0, 0, 91, 94,
408: 92, 93, 87, 86, 85, 0, 0, 83, 0, 0,
409: 84, 0, 0, 0, 0, 0, 0, 0, 0, 0,
410: 88, 0, 89, 0, 141, 0, 87, 86, 0, 11,
411: 0, 15, 0, 0, 0, 0, 0, 0, 0, 0,
412: 0, 0, 0, 0, 88, 17, 89, 91, 94, 92,
413: 93, 0, 0, 85, 0, 0, 83, 0, 0, 84,
414: 91, 94, 92, 93, 0, 0, 85, 0, 0, 83,
415: 0, 0, 84, 0, 0, 87, 86, 0, 0, 0,
416: 0, 0, 0, 0, 0, 0, 0, 0, 87, 86,
417: 0, 0, 0, 88, 0, 89, 0, 81, 91, 94,
418: 92, 93, 0, 0, 85, 0, 88, 83, 89, 156,
419: 84, 91, 94, 92, 93, 0, 0, 85, 0, 0,
420: 83, 0, 0, 84, 0, 0, 87, 86, 0, 0,
421: 124, 0, 125, 0, 0, 127, 0, 0, 129, 87,
422: 86, 130, 0, 131, 88, 134, 89, 132, 133, 0,
423: 121, 128, 123, 126, 0, 0, 124, 88, 125, 152,
424: 0, 127, 0, 0, 129, 0, 0, 130, 0, 131,
425: 0, 0, 0, 132, 0, 0, 121, 128, 123, 126,
426: 124, 0, 125, 0, 124, 127, 125, 0, 129, 127,
427: 0, 130, 129, 131, 0, 0, 0, 131, 0, 0,
428: 121, 128, 123, 126, 121, 128, 123, 126 };
429: extern short yypgo[];
430: short yypact []={
431:
432: -1000, -13,-1000,-1000, 313,-1000, 162,-1000, 366, 342,
433: -1000, 354,-1000,-1000, 192, 437, 184, 434, 395,-1000,
434: 32, 173,-1000, 329, 329, 23, 218, 22,-1000, 310,
435: -1000, 366, 347, -23,-1000, 419,-1000, 237,-1000,-1000,
436: -1000, 230, 151, 218, 173, 278, 164, 134,-1000,-1000,
437: -1000, 229, 143,1075,-1000,-1000,-1000,-1000, 85,-1000,
438: -1000, 161, 111,-1000, 19, 63, 21,-1000, 105,-1000,
439: -1000, 141,1126,-1000,-1000,-1000, 430,-1000,-1000, 124,
440: 765,1002, 320,1126,1126,1126,1126,1126,1139,1026,
441: 1088, 298,-1000,-1000,-1000, 182, 366, 100,-1000, 173,
442: 187,-1000,-1000, 172, 419,-1000,-1000,-1000, 173,-1000,
443: -1000,-1000,-1000, 13, 46,-1000,-1000,-1000, 765,-1000,
444: -1000,1126,1126, 951, 913, 900, 862, 849,1126, 811,
445: 798, 364,1126,1126,1126,1126,1126, 94,-1000, 765,
446: 1002,-1000,-1000,1126, 414,-1000, 320, 320, 320, 320,
447: 320, 320,1026, 227, 705, 287,-1000, 62, 765,-1000,
448: -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 8,-1000,
449: -1000,-1000, 64, 357, 599, 765,-1000,1126, 391,1126,
450: 391,1126, 465,1126,-1000,1126, 530, 397,1126,1208,
451: 1126, 427,1126,1204,1180, 669, 765, 765, 155,1002,
452: 94, 645,-1000, 225,1126,-1000, 25, 215, 287,1126,
453: -1000, 161,-1000,-1000, 3,-1000,-1000, 592,-1000, 259,
454: 259, 259, 259,1126, 259, 40, 39, 964, 402,-1000,
455: 295, 5, 259, 293, 292,-1000, 283, 263, 296,1126,
456: 371, 26, 765, 765, 765, 765, 765, 765, 765, 765,
457: 1126,-1000,-1000, 66,-1000, 380, 320, 115,-1000, 166,
458: 25, 765,-1000,-1000,-1000, 334,-1000,-1000, 322, 220,
459: 741,-1000,-1000,-1000,-1000, 567, 36, 393,-1000,-1000,
460: -1000,-1000, 244, 157, 144,1126,-1000, 543,-1000,-1000,
461: -26,1154,-1000,-1000, 114, 262,-1000, 243, 259,-1000,
462: -1000, 205, 497,-1000, 461,-1000, 35,-1000, 423,-1000,
463: -1000,-1000, 203,1126,-1000, 28,-1000,-1000,1126,-1000,
464: -1000, 330,-1000, 24, 4,-1000,-1000 };
465: extern short yyr1[];
466: short yypgo []={
467:
468: 0, 534, 151, 533, 532, 531, 530, 529, 528, 527,
469: 513, 510, 0, 2, 238, 29, 509, 330, 507, 506,
470: 42, 13, 504, 1, 310, 177, 502, 501, 499, 3,
471: 498, 497, 496, 18, 495, 27, 9, 492, 491, 52,
472: 397, 477, 59, 38, 470, 468, 84, 466, 465, 19,
473: 464, 463, 462, 4, 16, 461, 460, 459, 458, 457,
474: 445 };
475: extern short yyr2[];
476: short yyr1 []={
477:
478: 0, 1, 1, 27, 27, 27, 28, 28, 30, 28,
479: 31, 32, 32, 35, 35, 37, 37, 38, 38, 38,
480: 34, 34, 34, 16, 16, 15, 15, 15, 15, 15,
481: 40, 17, 17, 17, 17, 17, 18, 18, 9, 9,
482: 41, 41, 43, 43, 19, 19, 10, 10, 44, 44,
483: 44, 46, 46, 39, 47, 39, 23, 23, 23, 23,
484: 23, 25, 25, 25, 25, 25, 25, 24, 24, 24,
485: 24, 24, 24, 24, 11, 48, 48, 48, 29, 50,
486: 29, 51, 51, 49, 49, 49, 49, 49, 53, 53,
487: 54, 54, 42, 42, 45, 45, 52, 52, 55, 33,
488: 33, 56, 57, 58, 36, 36, 36, 36, 36, 36,
489: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
490: 36, 36, 36, 59, 59, 59, 7, 4, 4, 3,
491: 5, 5, 6, 6, 8, 60, 2, 13, 13, 26,
492: 26, 12, 12, 12, 12, 12, 12, 12, 12, 12,
493: 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
494: 12, 12, 12, 12, 12, 12, 14, 14, 14, 14,
495: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
496: 14, 14, 14, 14, 20, 21, 21, 21, 21, 21,
497: 21, 21, 22, 22 };
498: extern short yychk[];
499: short yyr2 []={
500:
501: 0, 2, 0, 1, 5, 1, 2, 3, 0, 4,
502: 2, 2, 0, 2, 0, 3, 4, 3, 4, 0,
503: 3, 2, 2, 1, 0, 2, 2, 1, 1, 3,
504: 1, 1, 2, 3, 1, 1, 5, 2, 1, 2,
505: 1, 3, 1, 3, 5, 2, 1, 2, 1, 3,
506: 1, 2, 1, 1, 0, 4, 1, 1, 3, 2,
507: 1, 2, 3, 3, 4, 1, 3, 2, 3, 3,
508: 4, 3, 3, 2, 2, 1, 3, 1, 1, 0,
509: 4, 1, 1, 1, 1, 3, 6, 1, 1, 3,
510: 1, 4, 0, 1, 0, 1, 0, 1, 1, 1,
511: 1, 4, 3, 1, 2, 1, 2, 2, 2, 7,
512: 4, 2, 2, 2, 2, 3, 3, 1, 5, 2,
513: 2, 2, 2, 2, 3, 2, 1, 4, 3, 3,
514: 4, 3, 6, 3, 4, 0, 2, 1, 0, 1,
515: 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
516: 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
517: 4, 4, 5, 3, 3, 1, 2, 2, 2, 2,
518: 2, 2, 2, 4, 4, 4, 2, 3, 3, 1,
519: 1, 1, 1, 3, 2, 0, 2, 5, 2, 3,
520: 4, 3, 2, 2 };
521: extern short yydef[];
522: short yychk []={
523:
524: -1000, -1, -27, -28, 112, 256, -16, -15, -40, -17,
525: 34, 33, -19, -18, -10, 35, -9, 49, 50, 57,
526: -29, -24, -49, 11, 50, -11, -25, -51, 256, 2,
527: -17, -40, 33, 52, 2, 52, 2, 3, 57, 56,
528: -30, 50, 54, -25, -24, -25, -24, -48, 51, 2,
529: 256, 50, 54, -52, 58, 50, -17, 33, -44, -46,
530: 256, -17, -41, -43, 2, 51, -50, -31, -32, 51,
531: 55, -2, -60, 51, 51, 51, 56, 51, 55, -2,
532: -12, 52, -14, 11, 14, 8, 31, 30, 48, 50,
533: -22, 2, 4, 5, 3, -45, 57, -39, -23, -24,
534: -25, 22, 256, -42, 56, 58, 57, -49, -24, -33,
535: -34, -56, -57, -15, 256, -58, 52, 55, -12, 2,
536: 55, 26, 56, 28, 6, 8, 29, 11, 27, 14,
537: 17, 19, 23, 24, 21, 25, 58, -53, -54, -12,
538: -55, 52, 30, 54, 32, 50, -14, -14, -14, -14,
539: -14, -14, 50, -20, -12, -17, 51, -26, -12, 50,
540: 53, -46, 56, 22, -2, 53, -43, -2, -39, 57,
541: 57, -37, -35, -38, -12, -12, -12, 58, -12, 58,
542: -12, 58, -12, 58, -12, 58, -12, -12, 58, -12,
543: 58, -12, 58, -12, -12, -12, -12, -12, -42, 56,
544: -53, -12, 2, -20, 51, 51, -21, 50, 11, 56,
545: 51, -47, -2, 57, -35, -36, 53, -12, -33, -4,
546: -3, -5, -7, -6, -8, 41, 42, 36, 37, 57,
547: 112, 256, -59, 38, 43, 44, 45, 40, 2, 47,
548: 46, -15, -12, -12, -12, -12, -12, -12, -12, -12,
549: 22, 53, -54, -42, 55, 51, -14, 54, 51, -21,
550: -21, -12, -23, 53, 57, -36, -36, -36, -36, -13,
551: -12, -36, 57, 57, 57, -12, 2, 50, 57, 53,
552: -33, -36, 50, 50, 50, 50, 22, -12, 22, 57,
553: -29, -12, 53, 55, -2, 51, 39, 43, 51, 57,
554: 57, 3, -12, 256, -12, 256, -13, 256, -12, 22,
555: 57, 55, 50, 50, -36, 51, 51, 51, 57, 51,
556: 51, -12, 57, -13, 51, 57, 57 };
557: # ifdef YYDEBUG
558: # include "y.debug"
559: # endif
560:
561: # define YYFLAG -1000
562: # define YYERROR goto yyerrlab
563: # define YYACCEPT return(0)
564: # define YYABORT return(1)
565:
566: /* parser for yacc output */
567:
568: #ifdef YYDEBUG
569: int yydebug = 0; /* 1 for debugging */
570: #endif
571: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
572: int yychar = -1; /* current input token number */
573: int yynerrs = 0; /* number of errors */
574: short yyerrflag = 0; /* error recovery flag */
575:
576: yyparse()
577: { short yys[YYMAXDEPTH];
578: int yyj, yym;
579: register YYSTYPE *yypvt;
580: register int yystate, yyn;
581: register short *yyps;
582: register YYSTYPE *yypv;
583: register short *yyxi;
584:
585: yystate = 0;
586: yychar = -1;
587: yynerrs = 0;
588: yyerrflag = 0;
589: yyps= &yys[-1];
590: yypv= &yyv[-1];
591:
592: yystack: /* put a state and value onto the stack */
593: #ifdef YYDEBUG
594: if(yydebug >= 3)
595: if(yychar < 0 || yytoknames[yychar] == 0)
596: printf("char %d in %s", yychar, yystates[yystate]);
597: else
598: printf("%s in %s", yytoknames[yychar], yystates[yystate]);
599: #endif
600: if( ++yyps >= &yys[YYMAXDEPTH] ) {
601: yyerror( "yacc stack overflow" );
602: return(1);
603: }
604: *yyps = yystate;
605: ++yypv;
606: *yypv = yyval;
607: yynewstate:
608: yyn = yypact[yystate];
609: if(yyn <= YYFLAG) goto yydefault; /* simple state */
610: if(yychar<0) {
611: yychar = yylex();
612: #ifdef YYDEBUG
613: if(yydebug >= 2) {
614: if(yychar <= 0)
615: printf("lex EOF\n");
616: else if(yytoknames[yychar])
617: printf("lex %s\n", yytoknames[yychar]);
618: else
619: printf("lex (%c)\n", yychar);
620: }
621: #endif
622: if(yychar < 0)
623: yychar = 0;
624: }
625: if((yyn += yychar) < 0 || yyn >= YYLAST)
626: goto yydefault;
627: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
628: yychar = -1;
629: yyval = yylval;
630: yystate = yyn;
631: if( yyerrflag > 0 ) --yyerrflag;
632: goto yystack;
633: }
634: yydefault:
635: /* default state action */
636: if( (yyn=yydef[yystate]) == -2 ) {
637: if(yychar < 0) {
638: yychar = yylex();
639: #ifdef YYDEBUG
640: if(yydebug >= 2)
641: if(yychar < 0)
642: printf("lex EOF\n");
643: else
644: printf("lex %s\n", yytoknames[yychar]);
645: #endif
646: if(yychar < 0)
647: yychar = 0;
648: }
649: /* look through exception table */
650: for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
651: yyxi += 2 ) ; /* VOID */
652: while( *(yyxi+=2) >= 0 ){
653: if( *yyxi == yychar ) break;
654: }
655: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
656: }
657: if( yyn == 0 ){ /* error */
658: /* error ... attempt to resume parsing */
659: switch( yyerrflag ){
660: case 0: /* brand new error */
661: #ifdef YYDEBUG
662: yyerror("syntax error\n%s", yystates[yystate]);
663: if(yytoknames[yychar])
664: yyerror("saw %s\n", yytoknames[yychar]);
665: else if(yychar >= ' ' && yychar < '\177')
666: yyerror("saw `%c'\n", yychar);
667: else if(yychar == 0)
668: yyerror("saw EOF\n");
669: else
670: yyerror("saw char 0%o\n", yychar);
671: #else
672: yyerror( "syntax error" );
673: #endif
674: yyerrlab:
675: ++yynerrs;
676: case 1:
677: case 2: /* incompletely recovered error ... try again */
678: yyerrflag = 3;
679: /* find a state where "error" is a legal shift action */
680: while ( yyps >= yys ) {
681: yyn = yypact[*yyps] + YYERRCODE;
682: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
683: yystate = yyact[yyn]; /* simulate a shift of "error" */
684: goto yystack;
685: }
686: yyn = yypact[*yyps];
687: /* the current yyps has no shift onn "error", pop stack */
688: #ifdef YYDEBUG
689: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
690: #endif
691: --yyps;
692: --yypv;
693: }
694: /* there is no state on the stack with an error shift ... abort */
695: yyabort:
696: return(1);
697: case 3: /* no shift yet; clobber input char */
698: #ifdef YYDEBUG
699: if( yydebug ) {
700: printf("error recovery discards ");
701: if(yytoknames[yychar])
702: printf("%s\n", yytoknames[yychar]);
703: else if(yychar >= ' ' && yychar < '\177')
704: printf("`%c'\n", yychar);
705: else if(yychar == 0)
706: printf("EOF\n");
707: else
708: printf("char 0%o\n", yychar);
709: }
710: #endif
711: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
712: yychar = -1;
713: goto yynewstate; /* try again in the same state */
714: }
715: }
716: /* reduction by production yyn */
717: #ifdef YYDEBUG
718: if(yydebug) { char *s;
719: printf("reduce %d in:\n\t", yyn);
720: for(s = yystates[yystate]; *s; s++) {
721: putchar(*s);
722: if(*s == '\n' && *(s+1))
723: putchar('\t');
724: }
725: }
726: #endif
727: yyps -= yyr2[yyn];
728: yypvt = yypv;
729: yypv -= yyr2[yyn];
730: yyval = yypv[1];
731: yym=yyn;
732: /* consult goto table to find next state */
733: yyn = yyr1[yyn];
734: yyj = yypgo[yyn] + *yyps + 1;
735: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
736: switch(yym){
737:
738: case 2:
739: # line 148 "../mip/cgram.y"
740: {
741: ftnend();
742: #ifndef LINT
743: beg_file();
744: #endif
745: } break;
746: case 3:
747: # line 156 "../mip/cgram.y"
748: { curclass = SNULL; blevel = 0; } break;
749: case 4:
750: # line 158 "../mip/cgram.y"
751: { asmout(); curclass = SNULL; blevel = 0; } break;
752: case 5:
753: # line 160 "../mip/cgram.y"
754: { curclass = SNULL; blevel = 0; instruct = 0; } break;
755: case 6:
756: # line 164 "../mip/cgram.y"
757: { yypvt[-1].nodep->in.op = FREE; } break;
758: case 7:
759: # line 166 "../mip/cgram.y"
760: { yypvt[-2].nodep->in.op = FREE; } break;
761: case 8:
762: # line 167 "../mip/cgram.y"
763: {
764: defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass==STATIC?STATIC:EXTDEF );
765: } break;
766: case 9:
767: # line 170 "../mip/cgram.y"
768: {
769: if( blevel ) cerror( "function level error" );
770: if( reached ) retstat |= NRETVAL;
771: yypvt[-3].nodep->in.op = FREE;
772: ftnend();
773: } break;
774: case 10:
775: # line 179 "../mip/cgram.y"
776: {
777: #ifndef LINT
778: psline(lineno);
779: #endif
780: } break;
781: case 12:
782: # line 186 "../mip/cgram.y"
783: { blevel = 1; } break;
784: case 14:
785: # line 191 "../mip/cgram.y"
786: { bccode();
787: locctr(PROG);
788: } break;
789: case 15:
790: # line 197 "../mip/cgram.y"
791: { yypvt[-1].nodep->in.op = FREE;
792: #ifndef LINT
793: plcstab(blevel);
794: #endif
795: } break;
796: case 16:
797: # line 203 "../mip/cgram.y"
798: { yypvt[-2].nodep->in.op = FREE;
799: #ifndef LINT
800: plcstab(blevel);
801: #endif
802: } break;
803: case 17:
804: # line 211 "../mip/cgram.y"
805: { yypvt[-1].nodep->in.op = FREE; } break;
806: case 18:
807: # line 213 "../mip/cgram.y"
808: { yypvt[-2].nodep->in.op = FREE; } break;
809: case 20:
810: # line 217 "../mip/cgram.y"
811: { curclass = SNULL; yypvt[-2].nodep->in.op = FREE; } break;
812: case 21:
813: # line 219 "../mip/cgram.y"
814: { curclass = SNULL; yypvt[-1].nodep->in.op = FREE; } break;
815: case 22:
816: # line 221 "../mip/cgram.y"
817: { curclass = SNULL; } break;
818: case 24:
819: # line 225 "../mip/cgram.y"
820: { yyval.nodep = mkty(INT,0,INT); curclass = SNULL; } break;
821: case 25:
822: # line 228 "../mip/cgram.y"
823: { yyval.nodep = yypvt[-0].nodep; } break;
824: case 27:
825: # line 231 "../mip/cgram.y"
826: { yyval.nodep = mkty(INT,0,INT); } break;
827: case 28:
828: # line 233 "../mip/cgram.y"
829: { curclass = SNULL ; } break;
830: case 29:
831: # line 235 "../mip/cgram.y"
832: { yypvt[-2].nodep->in.type = types( yypvt[-2].nodep->in.type, yypvt[-0].nodep->in.type, UNDEF );
833: yypvt[-0].nodep->in.op = FREE;
834: } break;
835: case 30:
836: # line 242 "../mip/cgram.y"
837: { curclass = yypvt[-0].intval; } break;
838: case 32:
839: # line 248 "../mip/cgram.y"
840: { yypvt[-1].nodep->in.type = types( yypvt[-1].nodep->in.type, yypvt[-0].nodep->in.type, UNDEF );
841: yypvt[-0].nodep->in.op = FREE;
842: } break;
843: case 33:
844: # line 252 "../mip/cgram.y"
845: { yypvt[-2].nodep->in.type = types( yypvt[-2].nodep->in.type, yypvt[-1].nodep->in.type, yypvt[-0].nodep->in.type );
846: yypvt[-1].nodep->in.op = yypvt[-0].nodep->in.op = FREE;
847: } break;
848: case 36:
849: # line 260 "../mip/cgram.y"
850: { yyval.nodep = dclstruct(yypvt[-4].intval); } break;
851: case 37:
852: # line 262 "../mip/cgram.y"
853: { yyval.nodep = rstruct(yypvt[-0].intval,0); stwart = instruct; } break;
854: case 38:
855: # line 266 "../mip/cgram.y"
856: { yyval.intval = bstruct(-1,0); stwart = SEENAME; } break;
857: case 39:
858: # line 268 "../mip/cgram.y"
859: { yyval.intval = bstruct(yypvt[-0].intval,0); stwart = SEENAME; } break;
860: case 42:
861: # line 276 "../mip/cgram.y"
862: { moedef( yypvt[-0].intval ); } break;
863: case 43:
864: # line 278 "../mip/cgram.y"
865: { strucoff = yypvt[-0].intval; moedef( yypvt[-2].intval ); } break;
866: case 44:
867: # line 282 "../mip/cgram.y"
868: { yyval.nodep = dclstruct(yypvt[-4].intval); } break;
869: case 45:
870: # line 284 "../mip/cgram.y"
871: { yyval.nodep = rstruct(yypvt[-0].intval,yypvt[-1].intval); } break;
872: case 46:
873: # line 288 "../mip/cgram.y"
874: { yyval.intval = bstruct(-1,yypvt[-0].intval); stwart=0; } break;
875: case 47:
876: # line 290 "../mip/cgram.y"
877: { yyval.intval = bstruct(yypvt[-0].intval,yypvt[-1].intval); stwart=0; } break;
878: case 51:
879: # line 299 "../mip/cgram.y"
880: { curclass = SNULL; stwart=0; yypvt[-1].nodep->in.op = FREE; } break;
881: case 52:
882: # line 301 "../mip/cgram.y"
883: { if( curclass != MOU ){
884: curclass = SNULL;
885: }
886: else {
887: sprintf( fakename, "$%dFAKE", fake++ );
888: #ifdef FLEXSTRINGS
889: /* No need to hash this, we won't look it up */
890: defid( tymerge(yypvt[-0].nodep, bdty(NAME,NIL,lookup( savestr(fakename), SMOS ))), curclass );
891: #else
892: defid( tymerge(yypvt[-0].nodep, bdty(NAME,NIL,lookup( fakename, SMOS ))), curclass );
893: #endif
894: werror("structure typed union member must be named");
895: }
896: stwart = 0;
897: yypvt[-0].nodep->in.op = FREE;
898: } break;
899: case 53:
900: # line 321 "../mip/cgram.y"
901: { defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass); stwart = instruct; } break;
902: case 54:
903: # line 322 "../mip/cgram.y"
904: {yyval.nodep=yypvt[-2].nodep;} break;
905: case 55:
906: # line 323 "../mip/cgram.y"
907: { defid( tymerge(yypvt[-4].nodep,yypvt[-0].nodep), curclass); stwart = instruct; } break;
908: case 56:
909: # line 325 "../mip/cgram.y"
910: { noargs(); } break;
911: case 58:
912: # line 329 "../mip/cgram.y"
913: { if( !(instruct&INSTRUCT) ) uerror( "field outside of structure" );
914: if( yypvt[-0].intval<0 || yypvt[-0].intval >= FIELD ){
915: uerror( "illegal field size" );
916: yypvt[-0].intval = 1;
917: }
918: defid( tymerge(yypvt[-3].nodep,yypvt[-2].nodep), FIELD|yypvt[-0].intval );
919: yyval.nodep = NIL;
920: } break;
921: case 59:
922: # line 339 "../mip/cgram.y"
923: { if( !(instruct&INSTRUCT) ) uerror( "field outside of structure" );
924: falloc( stab[0], yypvt[-0].intval, -1, yypvt[-2].nodep ); /* alignment or hole */
925: yyval.nodep = NIL;
926: } break;
927: case 60:
928: # line 344 "../mip/cgram.y"
929: { yyval.nodep = NIL; } break;
930: case 61:
931: # line 349 "../mip/cgram.y"
932: { umul:
933: yyval.nodep = bdty( UNARY MUL, yypvt[-0].nodep, 0 ); } break;
934: case 62:
935: # line 352 "../mip/cgram.y"
936: { uftn:
937: yyval.nodep = bdty( UNARY CALL, yypvt[-2].nodep, 0 ); } break;
938: case 63:
939: # line 355 "../mip/cgram.y"
940: { uary:
941: yyval.nodep = bdty( LB, yypvt[-2].nodep, 0 ); } break;
942: case 64:
943: # line 358 "../mip/cgram.y"
944: { bary:
945: if( (int)yypvt[-1].intval <= 0 ) werror( "zero or negative subscript" );
946: yyval.nodep = bdty( LB, yypvt[-3].nodep, yypvt[-1].intval ); } break;
947: case 65:
948: # line 362 "../mip/cgram.y"
949: { yyval.nodep = bdty( NAME, NIL, yypvt[-0].intval ); } break;
950: case 66:
951: # line 364 "../mip/cgram.y"
952: { yyval.nodep=yypvt[-1].nodep; } break;
953: case 67:
954: # line 367 "../mip/cgram.y"
955: { goto umul; } break;
956: case 68:
957: # line 369 "../mip/cgram.y"
958: { goto uftn; } break;
959: case 69:
960: # line 371 "../mip/cgram.y"
961: { goto uary; } break;
962: case 70:
963: # line 373 "../mip/cgram.y"
964: { goto bary; } break;
965: case 71:
966: # line 375 "../mip/cgram.y"
967: { yyval.nodep = yypvt[-1].nodep; } break;
968: case 72:
969: # line 377 "../mip/cgram.y"
970: {
971: if( blevel!=0 ) uerror("function declaration in bad context");
972: yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,yypvt[-2].intval), 0 );
973: stwart = 0;
974: } break;
975: case 73:
976: # line 383 "../mip/cgram.y"
977: {
978: yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,yypvt[-1].intval), 0 );
979: stwart = 0;
980: } break;
981: case 74:
982: # line 390 "../mip/cgram.y"
983: {
984: /* turn off typedefs for argument names */
985: stwart = SEENAME;
986: if( STP(yypvt[-1].intval)->sclass == SNULL )
987: STP(yypvt[-1].intval)->stype = FTN;
988: } break;
989: case 75:
990: # line 399 "../mip/cgram.y"
991: { ftnarg( yypvt[-0].intval ); stwart = SEENAME; } break;
992: case 76:
993: # line 401 "../mip/cgram.y"
994: { ftnarg( yypvt[-0].intval ); stwart = SEENAME; } break;
995: case 79:
996: # line 407 "../mip/cgram.y"
997: {yyval.nodep=yypvt[-2].nodep;} break;
998: case 81:
999: # line 411 "../mip/cgram.y"
1000: { defid( yypvt[-0].nodep = tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass);
1001: beginit(yypvt[-0].nodep->tn.rval);
1002: } break;
1003: case 83:
1004: # line 418 "../mip/cgram.y"
1005: { nidcl( tymerge(yypvt[-1].nodep,yypvt[-0].nodep) ); } break;
1006: case 84:
1007: # line 420 "../mip/cgram.y"
1008: { noargs(); defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), uclass(curclass) );
1009: } break;
1010: case 85:
1011: # line 424 "../mip/cgram.y"
1012: {
1013: #ifndef LINT
1014: psline(lineno);
1015: #endif
1016:
1017: doinit( yypvt[-0].nodep );
1018: endinit();
1019: if (noassign && errline != lineno)
1020: werror( "old-fashioned initialization: use =" );
1021: } break;
1022: case 86:
1023: # line 435 "../mip/cgram.y"
1024: {
1025: endinit();
1026: if (noassign && errline != lineno)
1027: werror( "old-fashioned initialization: use =" );
1028: } break;
1029: case 90:
1030: # line 449 "../mip/cgram.y"
1031: { doinit( yypvt[-0].nodep ); } break;
1032: case 91:
1033: # line 451 "../mip/cgram.y"
1034: { irbrace(); } break;
1035: case 96:
1036: # line 463 "../mip/cgram.y"
1037: { noassign = 1; } break;
1038: case 97:
1039: # line 465 "../mip/cgram.y"
1040: { noassign = 0; } break;
1041: case 98:
1042: # line 470 "../mip/cgram.y"
1043: { ilbrace(); } break;
1044: case 101:
1045: # line 480 "../mip/cgram.y"
1046: {
1047: #ifndef LINT
1048: prcstab(blevel);
1049: #endif
1050: --blevel;
1051: if( blevel == 1 ) blevel = 0;
1052: clearst( blevel );
1053: checkst( blevel );
1054: autooff = *--psavbc;
1055: regvar = *--psavbc;
1056: } break;
1057: case 102:
1058: # line 494 "../mip/cgram.y"
1059: { --blevel;
1060: if( blevel == 1 ) blevel = 0;
1061: clearst( blevel );
1062: checkst( blevel );
1063: autooff = *--psavbc;
1064: regvar = *--psavbc;
1065: } break;
1066: case 103:
1067: # line 504 "../mip/cgram.y"
1068: {
1069: if( blevel == 1 ) dclargs();
1070: ++blevel;
1071: if( psavbc > &asavbc[BCSZ-2] ) cerror( "nesting too deep" );
1072: *psavbc++ = regvar;
1073: *psavbc++ = autooff;
1074: } break;
1075: case 104:
1076: # line 514 "../mip/cgram.y"
1077: {
1078: #ifndef LINT
1079: psline(lineno);
1080: #endif
1081: ecomp( yypvt[-1].nodep );
1082: } break;
1083: case 106:
1084: # line 522 "../mip/cgram.y"
1085: { deflab(yypvt[-1].intval);
1086: reached = 1;
1087: } break;
1088: case 107:
1089: # line 526 "../mip/cgram.y"
1090: { if( yypvt[-1].intval != NOLAB ){
1091: deflab( yypvt[-1].intval );
1092: reached = 1;
1093: }
1094: } break;
1095: case 108:
1096: # line 532 "../mip/cgram.y"
1097: { branch( contlab );
1098: deflab( brklab );
1099: if( (flostat&FBRK) || !(flostat&FLOOP)) reached = 1;
1100: else reached = 0;
1101: resetbc(0);
1102: } break;
1103: case 109:
1104: # line 539 "../mip/cgram.y"
1105: {
1106: #ifndef LINT
1107: psline(lineno);
1108: #endif
1109: deflab( contlab );
1110: if( flostat & FCONT ) reached = 1;
1111: ecomp( buildtree( CBRANCH, buildtree( NOT, yypvt[-2].nodep, NIL ), bcon( yypvt[-6].intval ) ) );
1112: deflab( brklab );
1113: reached = 1;
1114: resetbc(0);
1115: } break;
1116: case 110:
1117: # line 551 "../mip/cgram.y"
1118: {
1119: deflab( contlab );
1120: if( flostat&FCONT ) reached = 1;
1121: #ifndef LINT
1122: psline( resetlineno());
1123: #endif
1124: if( yypvt[-2].nodep ) ecomp( yypvt[-2].nodep );
1125: branch( yypvt[-3].intval );
1126: deflab( brklab );
1127: if( (flostat&FBRK) || !(flostat&FLOOP) ) reached = 1;
1128: else reached = 0;
1129: resetbc(0);
1130: } break;
1131: case 111:
1132: # line 565 "../mip/cgram.y"
1133: {
1134: if( reached ) branch( brklab );
1135: #ifndef LINT
1136: psline( resetlineno());
1137: #endif
1138: deflab( yypvt[-1].intval );
1139: swend();
1140: deflab(brklab);
1141: if( (flostat&FBRK) || !(flostat&FDEF) ) reached = 1;
1142: resetbc(FCONT);
1143: } break;
1144: case 112:
1145: # line 577 "../mip/cgram.y"
1146: {
1147: #ifndef LINT
1148: psline(lineno);
1149: #endif
1150: if( brklab == NOLAB ) uerror( "illegal break");
1151: else if(reached) branch( brklab );
1152: flostat |= FBRK;
1153: if( brkflag ) goto rch;
1154: reached = 0;
1155: } break;
1156: case 113:
1157: # line 588 "../mip/cgram.y"
1158: {
1159: #ifndef LINT
1160: psline(lineno);
1161: #endif
1162: if( contlab == NOLAB ) uerror( "illegal continue");
1163: else branch( contlab );
1164: flostat |= FCONT;
1165: goto rch;
1166: } break;
1167: case 114:
1168: # line 598 "../mip/cgram.y"
1169: {
1170: #ifndef LINT
1171: psline(lineno);
1172: #endif
1173: retstat |= NRETVAL;
1174: branch( retlab );
1175: rch:
1176: if( !reached ) werror( "statement not reached");
1177: reached = 0;
1178: } break;
1179: case 115:
1180: # line 609 "../mip/cgram.y"
1181: { register NODE *temp;
1182: #ifndef LINT
1183: psline(lineno);
1184: #endif
1185: idname = curftn;
1186: temp = buildtree( NAME, NIL, NIL );
1187: if(temp->in.type == TVOID)
1188: uerror("void function %s cannot return value",
1189: STP(idname)->sname);
1190: temp->in.type = DECREF( temp->in.type );
1191: temp = buildtree( RETURN, temp, yypvt[-1].nodep );
1192: /* now, we have the type of the RHS correct */
1193: temp->in.left->in.op = FREE;
1194: temp->in.op = FREE;
1195: ecomp( buildtree( FORCE, temp->in.right, NIL ) );
1196: retstat |= RETVAL;
1197: branch( retlab );
1198: reached = 0;
1199: } break;
1200: case 116:
1201: # line 629 "../mip/cgram.y"
1202: { register NODE *q;
1203: #ifndef LINT
1204: psline(lineno);
1205: #endif
1206: q = block( FREE, NIL, NIL, INT|ARY, 0, INT );
1207: q->tn.rval = idname = yypvt[-1].intval;
1208: defid( q, ULABEL );
1209: STP(idname)->suse = -lineno;
1210: branch( STP(idname)->offset );
1211: goto rch;
1212: } break;
1213: case 118:
1214: # line 642 "../mip/cgram.y"
1215: {
1216: asmout();
1217: #ifndef LINT
1218: psline(lineno);
1219: #endif
1220: } break;
1221: case 123:
1222: # line 654 "../mip/cgram.y"
1223: { register NODE *q;
1224: q = block( FREE, NIL, NIL, INT|ARY, 0, LABEL );
1225: q->tn.rval = yypvt[-1].intval;
1226: defid( q, LABEL );
1227: reached = 1;
1228: } break;
1229: case 124:
1230: # line 661 "../mip/cgram.y"
1231: { addcase(yypvt[-1].nodep);
1232: reached = 1;
1233: } break;
1234: case 125:
1235: # line 665 "../mip/cgram.y"
1236: { reached = 1;
1237: adddef();
1238: flostat |= FDEF;
1239: } break;
1240: case 126:
1241: # line 671 "../mip/cgram.y"
1242: {
1243: #ifndef LINT
1244: psline(lineno);
1245: #endif
1246: savebc();
1247: if( !reached ) werror( "loop not entered at top");
1248: brklab = getlab();
1249: contlab = getlab();
1250: deflab( yyval.intval = getlab() );
1251: reached = 1;
1252: } break;
1253: case 127:
1254: # line 684 "../mip/cgram.y"
1255: {
1256: #ifndef LINT
1257: psline(lineno);
1258: #endif
1259: ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( yyval.intval=getlab()) ) ) ;
1260: reached = 1;
1261: } break;
1262: case 128:
1263: # line 692 "../mip/cgram.y"
1264: { /* no use compiling expression */
1265: /* but we do need to define a label */
1266: yyval.intval = getlab();
1267: reached = 1;
1268: } break;
1269: case 129:
1270: # line 699 "../mip/cgram.y"
1271: { if( reached ) branch( yyval.intval = getlab() );
1272: else yyval.intval = NOLAB;
1273: deflab( yypvt[-2].intval );
1274: reached = 1;
1275: } break;
1276: case 130:
1277: # line 707 "../mip/cgram.y"
1278: {
1279: #ifndef LINT
1280: psline(lineno);
1281: #endif
1282: savebc();
1283: if( !reached ) werror( "loop not entered at top");
1284: if( yypvt[-1].nodep->in.op == ICON && yypvt[-1].nodep->tn.lval != 0 ) flostat = FLOOP;
1285: deflab( contlab = getlab() );
1286: reached = 1;
1287: brklab = getlab();
1288: if( flostat == FLOOP ) tfree( yypvt[-1].nodep );
1289: else ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( brklab) ) );
1290: } break;
1291: case 131:
1292: # line 721 "../mip/cgram.y"
1293: { /* don't compile expression, but try other semantics */
1294: savebc();
1295: if( !reached ) werror( "loop not entered at top");
1296: deflab( contlab = getlab() );
1297: reached = 1;
1298: brklab = getlab();
1299: } break;
1300: case 132:
1301: # line 730 "../mip/cgram.y"
1302: {
1303: #ifndef LINT
1304: psline(lineno);
1305: #endif
1306: if( yypvt[-3].nodep ) ecomp( yypvt[-3].nodep );
1307: else if( !reached ) werror( "loop not entered at top");
1308: savebc();
1309: #ifndef LINT
1310: savelineno();
1311: #endif
1312: contlab = getlab();
1313: brklab = getlab();
1314: deflab( yyval.intval = getlab() );
1315: reached = 1;
1316: if( yypvt[-1].nodep ) ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( brklab) ) );
1317: else flostat |= FLOOP;
1318: } break;
1319: case 133:
1320: # line 748 "../mip/cgram.y"
1321: { /* do some semantics anyway */
1322: savebc();
1323: #ifndef LINT
1324: savelineno();
1325: #endif
1326: contlab = getlab();
1327: brklab = getlab();
1328: deflab( yyval.intval = getlab() );
1329: reached = 1;
1330: } break;
1331: case 134:
1332: # line 760 "../mip/cgram.y"
1333: {
1334: #ifndef LINT
1335: psline(lineno);
1336: #endif
1337: savebc();
1338: #ifndef LINT
1339: savelineno();
1340: #endif
1341: brklab = getlab();
1342: #ifdef VAX
1343: ecomp( buildtree( FORCE, yypvt[-1].nodep, NIL ) );
1344: #else
1345: ecomp( buildtree( FORCE, makety(yypvt[-1].nodep,INT,0,INT), NIL ) );
1346: #endif
1347: branch( yyval.intval = getlab() );
1348: swstart();
1349: reached = 0;
1350: } break;
1351: case 135:
1352: # line 780 "../mip/cgram.y"
1353: { yyval.intval=instruct; stwart=instruct=0; } break;
1354: case 136:
1355: # line 782 "../mip/cgram.y"
1356: { yyval.intval = icons( yypvt[-0].nodep ); instruct=yypvt[-1].intval; } break;
1357: case 138:
1358: # line 786 "../mip/cgram.y"
1359: { yyval.nodep=0; } break;
1360: case 140:
1361: # line 791 "../mip/cgram.y"
1362: { goto bop; } break;
1363: case 141:
1364: # line 795 "../mip/cgram.y"
1365: {
1366: preconf:
1367: if( yychar==RELOP||yychar==EQUOP||yychar==AND||yychar==OR||yychar==ER ){
1368: precplaint:
1369: if( hflag ) werror( "precedence confusion possible: parenthesize!" );
1370: }
1371: bop:
1372: yyval.nodep = buildtree( yypvt[-1].intval, yypvt[-2].nodep, yypvt[-0].nodep );
1373: } break;
1374: case 142:
1375: # line 805 "../mip/cgram.y"
1376: { yypvt[-1].intval = COMOP;
1377: goto bop;
1378: } break;
1379: case 143:
1380: # line 809 "../mip/cgram.y"
1381: { goto bop; } break;
1382: case 144:
1383: # line 811 "../mip/cgram.y"
1384: { if(yychar==SHIFTOP) goto precplaint; else goto bop; } break;
1385: case 145:
1386: # line 813 "../mip/cgram.y"
1387: { if(yychar==SHIFTOP ) goto precplaint; else goto bop; } break;
1388: case 146:
1389: # line 815 "../mip/cgram.y"
1390: { if(yychar==PLUS||yychar==MINUS) goto precplaint; else goto bop; } break;
1391: case 147:
1392: # line 817 "../mip/cgram.y"
1393: { goto bop; } break;
1394: case 148:
1395: # line 819 "../mip/cgram.y"
1396: { goto preconf; } break;
1397: case 149:
1398: # line 821 "../mip/cgram.y"
1399: { if( yychar==RELOP||yychar==EQUOP ) goto preconf; else goto bop; } break;
1400: case 150:
1401: # line 823 "../mip/cgram.y"
1402: { if(yychar==RELOP||yychar==EQUOP) goto preconf; else goto bop; } break;
1403: case 151:
1404: # line 825 "../mip/cgram.y"
1405: { if(yychar==RELOP||yychar==EQUOP) goto preconf; else goto bop; } break;
1406: case 152:
1407: # line 827 "../mip/cgram.y"
1408: { goto bop; } break;
1409: case 153:
1410: # line 829 "../mip/cgram.y"
1411: { goto bop; } break;
1412: case 154:
1413: # line 831 "../mip/cgram.y"
1414: { abop:
1415: yyval.nodep = buildtree( ASG yypvt[-2].intval, yypvt[-3].nodep, yypvt[-0].nodep );
1416: } break;
1417: case 155:
1418: # line 835 "../mip/cgram.y"
1419: { goto abop; } break;
1420: case 156:
1421: # line 837 "../mip/cgram.y"
1422: { goto abop; } break;
1423: case 157:
1424: # line 839 "../mip/cgram.y"
1425: { goto abop; } break;
1426: case 158:
1427: # line 841 "../mip/cgram.y"
1428: { goto abop; } break;
1429: case 159:
1430: # line 843 "../mip/cgram.y"
1431: { goto abop; } break;
1432: case 160:
1433: # line 845 "../mip/cgram.y"
1434: { goto abop; } break;
1435: case 161:
1436: # line 847 "../mip/cgram.y"
1437: { goto abop; } break;
1438: case 162:
1439: # line 849 "../mip/cgram.y"
1440: { yyval.nodep=buildtree(QUEST, yypvt[-4].nodep, buildtree( COLON, yypvt[-2].nodep, yypvt[-0].nodep ) );
1441: } break;
1442: case 163:
1443: # line 852 "../mip/cgram.y"
1444: { werror( "old-fashioned assignment operator" ); goto bop; } break;
1445: case 164:
1446: # line 854 "../mip/cgram.y"
1447: { goto bop; } break;
1448: case 166:
1449: # line 858 "../mip/cgram.y"
1450: { yyval.nodep = buildtree( yypvt[-0].intval, yypvt[-1].nodep, bcon(1) ); } break;
1451: case 167:
1452: # line 860 "../mip/cgram.y"
1453: { ubop:
1454: yyval.nodep = buildtree( UNARY yypvt[-1].intval, yypvt[-0].nodep, NIL );
1455: } break;
1456: case 168:
1457: # line 864 "../mip/cgram.y"
1458: { if( ISFTN(yypvt[-0].nodep->in.type) || ISARY(yypvt[-0].nodep->in.type) ){
1459: werror( "& before array or function: ignored" );
1460: yyval.nodep = yypvt[-0].nodep;
1461: }
1462: else goto ubop;
1463: } break;
1464: case 169:
1465: # line 871 "../mip/cgram.y"
1466: { goto ubop; } break;
1467: case 170:
1468: # line 873 "../mip/cgram.y"
1469: {
1470: yyval.nodep = buildtree( yypvt[-1].intval, yypvt[-0].nodep, NIL );
1471: } break;
1472: case 171:
1473: # line 877 "../mip/cgram.y"
1474: { yyval.nodep = buildtree( yypvt[-1].intval==INCR ? ASG PLUS : ASG MINUS,
1475: yypvt[-0].nodep,
1476: bcon(1) );
1477: } break;
1478: case 172:
1479: # line 882 "../mip/cgram.y"
1480: { yyval.nodep = doszof( yypvt[-0].nodep ); } break;
1481: case 173:
1482: # line 884 "../mip/cgram.y"
1483: { yyval.nodep = buildtree( CAST, yypvt[-2].nodep, yypvt[-0].nodep );
1484: yyval.nodep->in.left->in.op = FREE;
1485: yyval.nodep->in.op = FREE;
1486: yyval.nodep = yyval.nodep->in.right;
1487: } break;
1488: case 174:
1489: # line 890 "../mip/cgram.y"
1490: { yyval.nodep = doszof( yypvt[-1].nodep ); } break;
1491: case 175:
1492: # line 892 "../mip/cgram.y"
1493: { yyval.nodep = buildtree( UNARY MUL, buildtree( PLUS, yypvt[-3].nodep, yypvt[-1].nodep ), NIL ); } break;
1494: case 176:
1495: # line 894 "../mip/cgram.y"
1496: { yyval.nodep=buildtree(UNARY CALL,yypvt[-1].nodep,NIL); } break;
1497: case 177:
1498: # line 896 "../mip/cgram.y"
1499: { yyval.nodep=buildtree(CALL,yypvt[-2].nodep,yypvt[-1].nodep); } break;
1500: case 178:
1501: # line 898 "../mip/cgram.y"
1502: { if( yypvt[-1].intval == DOT ){
1503: if( notlval( yypvt[-2].nodep ) ) {
1504: uerror("structure reference must be addressable");
1505: if (yypvt[-2].nodep == NIL) {
1506: yypvt[-2].nodep = bcon(0);
1507: yypvt[-2].nodep->tn.type = (PTR|INT);
1508: yypvt[-2].nodep = buildtree(UNARY MUL, yypvt[-2].nodep, NIL);
1509: }
1510: }
1511: yypvt[-2].nodep = buildtree( UNARY AND, yypvt[-2].nodep, NIL );
1512: }
1513: idname = yypvt[-0].intval;
1514: yyval.nodep = buildtree( STREF, yypvt[-2].nodep, buildtree( NAME, NIL, NIL ) );
1515: } break;
1516: case 179:
1517: # line 913 "../mip/cgram.y"
1518: { idname = yypvt[-0].intval;
1519: /* recognize identifiers in initializations */
1520: if( blevel==0 && STP(idname)->stype == UNDEF ) {
1521: register NODE *q;
1522: #ifndef FLEXNAMES
1523: werror( "undeclared initializer name %.8s", STP(idname)->sname );
1524: #else
1525: werror( "undeclared initializer name %s", STP(idname)->sname );
1526: #endif
1527: q = block( FREE, NIL, NIL, INT, 0, INT );
1528: q->tn.rval = idname;
1529: defid( q, EXTERN );
1530: }
1531: yyval.nodep=buildtree(NAME,NIL,NIL);
1532: STP(yypvt[-0].intval)->suse = -lineno;
1533: } break;
1534: case 180:
1535: # line 930 "../mip/cgram.y"
1536: { yyval.nodep=bcon(0);
1537: yyval.nodep->tn.lval = lastcon;
1538: yyval.nodep->tn.rval = NONAME;
1539: if( yypvt[-0].intval ) yyval.nodep->fn.csiz = yyval.nodep->in.type = ctype(LONG);
1540: } break;
1541: case 181:
1542: # line 936 "../mip/cgram.y"
1543: { yyval.nodep=buildtree(FCON,NIL,NIL);
1544: yyval.nodep->fpn.dval = dcon;
1545: } break;
1546: case 182:
1547: # line 940 "../mip/cgram.y"
1548: { yyval.nodep = getstr(); /* get string contents */ } break;
1549: case 183:
1550: # line 942 "../mip/cgram.y"
1551: { yyval.nodep=yypvt[-1].nodep; } break;
1552: case 184:
1553: # line 946 "../mip/cgram.y"
1554: {
1555: yyval.nodep = tymerge( yypvt[-1].nodep, yypvt[-0].nodep );
1556: yyval.nodep->in.op = NAME;
1557: yypvt[-1].nodep->in.op = FREE;
1558: } break;
1559: case 185:
1560: # line 954 "../mip/cgram.y"
1561: { yyval.nodep = bdty( NAME, NIL, -1 ); } break;
1562: case 186:
1563: # line 956 "../mip/cgram.y"
1564: { yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,-1),0); } break;
1565: case 187:
1566: # line 958 "../mip/cgram.y"
1567: { yyval.nodep = bdty( UNARY CALL, yypvt[-3].nodep, 0 ); } break;
1568: case 188:
1569: # line 960 "../mip/cgram.y"
1570: { goto umul; } break;
1571: case 189:
1572: # line 962 "../mip/cgram.y"
1573: { goto uary; } break;
1574: case 190:
1575: # line 964 "../mip/cgram.y"
1576: { goto bary; } break;
1577: case 191:
1578: # line 966 "../mip/cgram.y"
1579: { yyval.nodep = yypvt[-1].nodep; } break;
1580: case 192:
1581: # line 970 "../mip/cgram.y"
1582: { if( STP(yypvt[-1].intval)->stype == UNDEF ){
1583: register NODE *q;
1584: q = block( FREE, NIL, NIL, FTN|INT, 0, INT );
1585: q->tn.rval = yypvt[-1].intval;
1586: defid( q, EXTERN );
1587: }
1588: idname = yypvt[-1].intval;
1589: yyval.nodep=buildtree(NAME,NIL,NIL);
1590: STP(idname)->suse = -lineno;
1591: } break;
1592: }
1593: goto yystack; /* stack new state and value */
1594: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.