|
|
1.1 root 1: # ifndef EXIT
2: # define EXIT exit
3: # endif
4:
5: int nerrors = 0; /* number of errors */
6:
7: NODE *NIL; /* pointer which always has 0 in it */
8:
9: NODE *lastfree; /* pointer to last free node; (for allocator) */
10:
11: /* VARARGS1 */
12: uerror( s, a ) char *s; { /* nonfatal error message */
13: /* the routine where is different for pass 1 and pass 2;
14: /* it tells where the error took place */
15:
16: ++nerrors;
17: where('u');
18: fprintf( stderr, s, a );
19: fprintf( stderr, "\n" );
20: if( nerrors > 30 ) cerror( "too many errors");
21: }
22:
23: /* VARARGS1 */
24: cerror( s, a, b, c ) char *s; { /* compiler error: die */
25: where('c');
26: if( nerrors && nerrors <= 30 ){ /* give the compiler the benefit of the doubt */
27: fprintf( stderr, "cannot recover from earlier errors: goodbye!\n" );
28: }
29: else {
30: fprintf( stderr, "compiler error: " );
31: fprintf( stderr, s, a, b, c );
32: fprintf( stderr, "\n" );
33: }
34: EXIT(1);
35: }
36:
37: /* VARARGS1 */
38: int Wflag = 0;
39: werror( s, a, b ) char *s; { /* warning */
40: if(Wflag) return;
41: where('w');
42: fprintf( stderr, "warning: " );
43: fprintf( stderr, s, a, b );
44: fprintf( stderr, "\n" );
45: }
46:
47: tinit(){ /* initialize expression tree search */
48:
49: NODE *p;
50:
51: for( p=node; p<= &node[TREESZ-1]; ++p ) p->op = FREE;
52: lastfree = node;
53:
54: }
55:
56: # define TNEXT(p) (p== &node[TREESZ-1]?node:p+1)
57:
58: NODE *
59: talloc(){
60: NODE *p, *q;
61:
62: q = lastfree;
63: for( p = TNEXT(q); p!=q; p= TNEXT(p))
64: if( p->op ==FREE ) return(lastfree=p);
65:
66: cerror( "out of tree space; simplify expression");
67: /* NOTREACHED */
68: }
69:
70: tcheck(){ /* ensure that all nodes have been freed */
71:
72: NODE *p;
73:
74: if( !nerrors )
75: for( p=node; p<= &node[TREESZ-1]; ++p )
76: if( p->op != FREE ) cerror( "wasted space: %o", p );
77: tinit();
78: }
79: tfree( p ) NODE *p; {
80: /* free the tree p */
81: extern tfree1();
82:
83: if( p->op != FREE ) walkf( p, tfree1 );
84:
85: }
86:
87: tfree1(p) NODE *p; {
88: if( p == 0 ) cerror( "freeing blank tree!");
89: else p->op = FREE;
90: }
91:
92: fwalk( t, f, down ) register NODE *t; int (*f)(); {
93:
94: int down1, down2;
95:
96: more:
97: down1 = down2 = 0;
98:
99: (*f)( t, down, &down1, &down2 );
100:
101: switch( optype( t->op ) ){
102:
103: case BITYPE:
104: fwalk( t->left, f, down1 );
105: t = t->right;
106: down = down2;
107: goto more;
108:
109: case UTYPE:
110: t = t->left;
111: down = down1;
112: goto more;
113:
114: }
115: }
116:
117: walkf( t, f ) register NODE *t; int (*f)(); {
118: register opty;
119:
120: opty = optype(t->op);
121:
122: if( opty != LTYPE ) walkf( t->left, f );
123: if( opty == BITYPE ) walkf( t->right, f );
124: (*f)( t );
125: }
126:
127:
128:
129: int dope[ DSIZE ];
130: char *opst[DSIZE];
131:
132: struct dopest { int dopeop; char opst[8]; int dopeval; } indope[] = {
133:
134: NAME, "NAME", LTYPE,
135: STRING, "STRING", LTYPE,
136: REG, "REG", LTYPE,
137: OREG, "OREG", LTYPE,
138: ICON, "ICON", LTYPE,
139: FCON, "FCON", LTYPE,
140: CCODES, "CCODES", LTYPE,
141: UNARY MINUS, "U-", UTYPE,
142: UNARY MUL, "U*", UTYPE,
143: UNARY AND, "U&", UTYPE,
144: UNARY CALL, "UCALL", UTYPE|CALLFLG,
145: UNARY FORTCALL, "UFCALL", UTYPE|CALLFLG,
146: NOT, "!", UTYPE|LOGFLG,
147: COMPL, "~", UTYPE,
148: FORCE, "FORCE", UTYPE,
149: INIT, "INIT", UTYPE,
150: SCONV, "SCONV", UTYPE,
151: PCONV, "PCONV", UTYPE,
152: PLUS, "+", BITYPE|FLOFLG|SIMPFLG|COMMFLG,
153: ASG PLUS, "+=", BITYPE|ASGFLG|ASGOPFLG|FLOFLG|SIMPFLG|COMMFLG,
154: MINUS, "-", BITYPE|FLOFLG|SIMPFLG,
155: ASG MINUS, "-=", BITYPE|FLOFLG|SIMPFLG|ASGFLG|ASGOPFLG,
156: MUL, "*", BITYPE|FLOFLG|MULFLG,
157: ASG MUL, "*=", BITYPE|FLOFLG|MULFLG|ASGFLG|ASGOPFLG,
158: AND, "&", BITYPE|SIMPFLG|COMMFLG,
159: ASG AND, "&=", BITYPE|SIMPFLG|COMMFLG|ASGFLG|ASGOPFLG,
160: QUEST, "?", BITYPE,
161: COLON, ":", BITYPE,
162: ANDAND, "&&", BITYPE|LOGFLG,
163: OROR, "||", BITYPE|LOGFLG,
164: CM, ",", BITYPE,
165: COMOP, ",OP", BITYPE,
166: ASSIGN, "=", BITYPE|ASGFLG,
167: DIV, "/", BITYPE|FLOFLG|MULFLG|DIVFLG,
168: ASG DIV, "/=", BITYPE|FLOFLG|MULFLG|DIVFLG|ASGFLG|ASGOPFLG,
169: MOD, "%", BITYPE|DIVFLG,
170: ASG MOD, "%=", BITYPE|DIVFLG|ASGFLG|ASGOPFLG,
171: LS, "<<", BITYPE|SHFFLG,
172: ASG LS, "<<=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
173: RS, ">>", BITYPE|SHFFLG,
174: ASG RS, ">>=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
175: OR, "|", BITYPE|COMMFLG|SIMPFLG,
176: ASG OR, "|=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
177: ER, "^", BITYPE|COMMFLG|SIMPFLG,
178: ASG ER, "^=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
179: INCR, "++", BITYPE|ASGFLG,
180: DECR, "--", BITYPE|ASGFLG,
181: STREF, "->", BITYPE,
182: CALL, "CALL", BITYPE|CALLFLG,
183: FORTCALL, "FCALL", BITYPE|CALLFLG,
184: EQ, "==", BITYPE|LOGFLG,
185: NE, "!=", BITYPE|LOGFLG,
186: LE, "<=", BITYPE|LOGFLG,
187: LT, "<", BITYPE|LOGFLG,
188: GE, ">", BITYPE|LOGFLG,
189: GT, ">", BITYPE|LOGFLG,
190: UGT, "UGT", BITYPE|LOGFLG,
191: UGE, "UGE", BITYPE|LOGFLG,
192: ULT, "ULT", BITYPE|LOGFLG,
193: ULE, "ULE", BITYPE|LOGFLG,
194: ARS, "A>>", BITYPE,
195: TYPE, "TYPE", LTYPE,
196: LB, "[", BITYPE,
197: CBRANCH, "CBRANCH", BITYPE,
198: FLD, "FLD", UTYPE,
199: PMCONV, "PMCONV", BITYPE,
200: PVCONV, "PVCONV", BITYPE,
201: RETURN, "RETURN", BITYPE|ASGFLG|ASGOPFLG,
202: CAST, "CAST", BITYPE|ASGFLG|ASGOPFLG,
203: GOTO, "GOTO", UTYPE,
204: STASG, "STASG", BITYPE|ASGFLG,
205: STARG, "STARG", UTYPE,
206: STCALL, "STCALL", BITYPE|CALLFLG,
207: UNARY STCALL, "USTCALL", UTYPE|CALLFLG,
208:
209: -1, 0
210: };
211:
212: mkdope(){
213: register struct dopest *q;
214:
215: for( q = indope; q->dopeop >= 0; ++q ){
216: dope[q->dopeop] = q->dopeval;
217: opst[q->dopeop] = q->opst;
218: }
219: }
220: tprint( t ) TWORD t; { /* output a nice description of the type of t */
221:
222: static char * tnames[] = {
223: "undef",
224: "farg",
225: "char",
226: "short",
227: "int",
228: "long",
229: "float",
230: "double",
231: "strty",
232: "unionty",
233: "enumty",
234: "moety",
235: "uchar",
236: "ushort",
237: "unsigned",
238: "ulong",
239: "?", "?"
240: };
241:
242: for(;; t = DECREF(t) ){
243:
244: if( ISPTR(t) ) printf( "PTR " );
245: else if( ISFTN(t) ) printf( "FTN " );
246: else if( ISARY(t) ) printf( "ARY " );
247: else {
248: printf( "%s", tnames[t] );
249: return;
250: }
251: }
252: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.