|
|
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: short yyexca[] ={
247: -1, 1,
248: 0, -1,
249: 2, 24,
250: 11, 24,
251: 50, 24,
252: 57, 24,
253: -2, 0,
254: -1, 21,
255: 56, 84,
256: 57, 84,
257: -2, 8,
258: -1, 26,
259: 56, 83,
260: 57, 83,
261: -2, 81,
262: -1, 28,
263: 56, 87,
264: 57, 87,
265: -2, 82,
266: -1, 34,
267: 52, 47,
268: -2, 45,
269: -1, 36,
270: 52, 39,
271: -2, 37,
272: -1, 61,
273: 53, 52,
274: 57, 52,
275: -2, 0,
276: -1, 115,
277: 33, 19,
278: 34, 19,
279: 35, 19,
280: 49, 19,
281: -2, 14,
282: -1, 284,
283: 57, 138,
284: -2, 0,
285: -1, 289,
286: 33, 17,
287: 34, 17,
288: 35, 17,
289: 49, 17,
290: -2, 15,
291: -1, 310,
292: 33, 18,
293: 34, 18,
294: 35, 18,
295: 49, 18,
296: -2, 16,
297: };
298: # define YYNPROD 194
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.