Browse Source

ast rework

Tobias Waldekranz.com 8 years ago
parent
commit
fbb22de96c
4 changed files with 404 additions and 407 deletions
  1. 7 2
      Makefile
  2. 23 39
      node.c
  3. 9 1
      node.h
  4. 365 365
      ply.c

+ 7 - 2
Makefile

1
 CFLAGS ?= -Wall -Wextra -Werror -Wno-unused -O0 -g
1
 CFLAGS ?= -Wall -Wextra -Werror -Wno-unused -O0 -g
2
 
2
 
3
-objs := $(patsubst %.c,%.o,$(wildcard *.c))
4
-deps := $(wildcard *.c) $(wildcard *.h)
3
+srcs := ply.c node.c
4
+hdrs := node.h ply.h
5
+
6
+#srcs := $(wildcard *.c)
7
+#hdrs := $(wildcard *.h)
8
+objs := $(patsubst %.c,%.o,$(srcs))
9
+deps := $(srcs) $(hdrs)
5
 
10
 
6
 $(objs): $(deps)
11
 $(objs): $(deps)
7
 
12
 

+ 23 - 39
node.c

14
 		return;
14
 		return;
15
 
15
 
16
 	fputs(" \e[2m<", fp);
16
 	fputs(" \e[2m<", fp);
17
-	type_dump(t, fp);
17
+	/* type_dump(t, fp); */
18
 	fputs(">\e[0m", fp);
18
 	fputs(">\e[0m", fp);
19
 }
19
 }
20
 
20
 
43
 
43
 
44
 struct node_dump_info {
44
 struct node_dump_info {
45
 	FILE *fp;
45
 	FILE *fp;
46
-	int indent, width;
46
+	int indent;
47
 };
47
 };
48
 
48
 
49
 int __node_dump_pre(struct node *n, void *_info)
49
 int __node_dump_pre(struct node *n, void *_info)
51
 	struct node_dump_info *info = _info;
51
 	struct node_dump_info *info = _info;
52
 	struct node *arg;
52
 	struct node *arg;
53
 
53
 
54
-	if (info->indent)
55
-		fprintf(info->fp, "\n%*s", info->width, "");
56
-	else
57
-		fputc(' ', fp);
54
+	if (n->prev)
55
+		fputc(' ', info->fp);
58
 
56
 
59
-	if (n->ntype == N_EXPR) {
60
-		fputc('(', fp);
61
-
62
-		info->indent = 0;
57
+	if (node_is_block(n->up)) {
58
+		info->indent += 4;
59
+		fprintf(info->fp, "\n%*s", info->indent, "");
60
+	}
63
 
61
 
64
-		node_expr_foreach(n, arg) {
65
-			struct node *subarg;
62
+	if (n->ntype == N_EXPR)
63
+		fputc('(', info->fp);
66
 
64
 
67
-			if (arg->ntype != N_EXPR)
68
-				continue;
65
+	node_print(n, info->fp);
69
 
66
 
70
-			node_expr_foreach(arg, subarg) {
71
-				if (arg->ntype == N_EXPR) {
72
-					info->indent = 1;
73
-					info->width += 2;
74
-					break;
75
-				}
76
-			}
67
+	if ((n->ntype == N_EXPR) && n->expr.args)
68
+		fputc(' ', info->fp);
77
 
69
 
78
-			if (info->indent)
79
-				break;
80
-		}
81
-	}
82
-
83
-	node_print(n, info->fp);
84
 	return 0;
70
 	return 0;
85
 }
71
 }
86
 
72
 
89
 	struct node_dump_info *info = _info;
75
 	struct node_dump_info *info = _info;
90
 	struct node *c;
76
 	struct node *c;
91
 
77
 
92
-	
93
-	if (n->ntype != N_EXPR)
94
-		return 0;
95
-
96
-	/* if (info->ident) { */
97
-	/* 	info->width -= 2; */
78
+	if (node_is_block(n))
79
+		fprintf(info->fp, "\n%*s", info->indent, "");
98
 
80
 
99
-	/* 	fprintf(info->fp, "\n%*s", info->width, "");		 */
100
-	/* } */
81
+	if (n->ntype == N_EXPR)
82
+		fputc(')', info->fp);
101
 
83
 
102
-	fputc(')', info->fp);
84
+	if (node_is_block(n->up))
85
+		info->indent -= 4;
86
+	
103
 	return 0;
87
 	return 0;
104
 }
88
 }
105
 
89
 
110
 	};
94
 	};
111
 
95
 
112
 	node_walk(n, __node_dump_pre, __node_dump_post, &info);
96
 	node_walk(n, __node_dump_pre, __node_dump_post, &info);
97
+	fputc('\n', fp);		
113
 }
98
 }
114
 
99
 
115
 
100
 
166
 	n = calloc(1, sizeof(*n));
151
 	n = calloc(1, sizeof(*n));
167
 	assert(n);
152
 	assert(n);
168
 
153
 
169
-	n->ntype = N_IDENT;
170
-	n->ident.name = name;
154
+	n->ntype = ntype;
171
 	return n;
155
 	return n;
172
 }
156
 }
173
 
157
 
226
         va_start(ap, func);
210
         va_start(ap, func);
227
 
211
 
228
         while ((arg = va_arg(ap, struct node *)))
212
         while ((arg = va_arg(ap, struct node *)))
229
-		append(n, arg);
213
+		node_append(n, arg);
230
 
214
 
231
         va_end(ap);
215
         va_end(ap);
232
 
216
 

+ 9 - 1
node.h

55
 int node_replace(struct node *n, struct node *new);
55
 int node_replace(struct node *n, struct node *new);
56
 
56
 
57
 #define node_expr_foreach(_expr, _arg) \
57
 #define node_expr_foreach(_expr, _arg) \
58
-	for ((_arg) = (_expr)->args; (_arg); (_arg) = (_arg)->next)
58
+	for ((_arg) = (_expr)->expr.args; (_arg); (_arg) = (_arg)->next)
59
 
59
 
60
 /* constructors */
60
 /* constructors */
61
 struct node *node_string(char *data);
61
 struct node *node_string(char *data);
64
 struct node *node_append(struct node *n, struct node *arg);
64
 struct node *node_append(struct node *n, struct node *arg);
65
 struct node *node_expr  (char *func, ...);
65
 struct node *node_expr  (char *func, ...);
66
 
66
 
67
+static inline int node_is_block(struct node *n)
68
+{
69
+	if (!n || (n->ntype != N_EXPR))
70
+		return 0;
71
+
72
+	return n->expr.func[0] == '\0';
73
+}
74
+
67
 /* static inline node_t *node_head(node_t *n) */
75
 /* static inline node_t *node_head(node_t *n) */
68
 /* { */
76
 /* { */
69
 /* 	if (!n) */
77
 /* 	if (!n) */

+ 365 - 365
ply.c

71
 					      node_ident("@t"),
71
 					      node_ident("@t"),
72
 					      node_num(0),
72
 					      node_num(0),
73
 					      NULL),
73
 					      NULL),
74
-				    node_expr("time"),
74
+				    node_expr("time", NULL),
75
 				    NULL),
75
 				    NULL),
76
 			  node_expr("=",
76
 			  node_expr("=",
77
 				    node_expr("[]",
77
 				    node_expr("[]",
82
 				    NULL),
82
 				    NULL),
83
 			  NULL);
83
 			  NULL);
84
 
84
 
85
-	prog->provider = provider_get("k");
86
-	prog->provider->probe(prog);
87
-	prog->ir = ir_new();
85
+	/* prog->provider = provider_get("k"); */
86
+	/* prog->provider->probe(prog); */
87
+	/* prog->ir = ir_new(); */
88
 	ctx->progs[0] = prog;
88
 	ctx->progs[0] = prog;
89
 
89
 
90
 	/* PROBE1 */
90
 	/* PROBE1 */
109
 				    NULL),
109
 				    NULL),
110
 			  NULL);
110
 			  NULL);
111
 
111
 
112
-	prog->provider = provider_get("k");
113
-	prog->provider->probe(prog);
114
-	prog->ir = ir_new();
112
+	/* prog->provider = provider_get("k"); */
113
+	/* prog->provider->probe(prog); */
114
+	/* prog->ir = ir_new(); */
115
 	ctx->progs[1] = prog;
115
 	ctx->progs[1] = prog;
116
 
116
 
117
 	return ctx;
117
 	return ctx;
118
 }
118
 }
119
 
119
 
120
 
120
 
121
-int pass_resolve_symbols(node_t *n, void *_prog)
122
-{
123
-	prog_t *prog = _prog;
124
-	provider_t *global = provider_get(":");
125
-	node_t *op;
126
-	int err;
127
-
128
-	if (n->ntype != N_IDENT)
129
-		return 0;
130
-
131
-	err = prog->provider->resolve(prog, n);
132
-	if (!err || (err != -ENOENT))
133
-		return err;
134
-
135
-	err = global->resolve(prog, n);
136
-	if (!err || (err != -ENOENT))
137
-		return err;
138
-
139
-	/* neither provider identifier nor global ditto => user
140
-	 * variable, add it as a global symbol of unknown type. */
141
-	return sym_add(prog->globals, n->ident, NULL, &n->sym);
142
-}
143
-
144
-int infer_type_list(prog_t *prog, node_t *n)
145
-{
146
-	type_t *t;
147
-
148
-	/* list of lists (code block) => void */
149
-	if (n->list->ntype == N_LIST) {
150
-		n->type = &t_void;
151
-		return 0;
152
-	}
153
-
154
-	t = n->list->type;
155
-	if (!t)
156
-		return 0;
157
-
158
-	switch (t->ttype) {
159
-	case T_FUNC:
160
-		n->type = t->t.func.type;
161
-		break;
162
-	default:
163
-		n->type = t;
164
-	}
165
-	return 0;
166
-}
167
-
168
-int infer_type_keyword(prog_t *prog, node_t *n)
169
-{
170
-	node_t *dst, *src;
171
-
172
-	switch (n->keyword.class) {
173
-	case KW_ASSIGN:
174
-		dst = node_next(n);
175
-		src = node_next(dst);
176
-		assert(dst && src);
177
-
178
-		if (!src->type)
179
-			return 0;
180
-
181
-		/* TODO: assignment is statement for now. do we need
182
-		 * c-style assignment expressions? e.g `a = b = 2;` */
183
-		n->type = &t_void;
184
-
185
-		if (dst->type)
186
-			return 0;
187
-
188
-		dst->type = src->type;
189
-
190
-		if (dst->ntype != N_IDENT)
191
-			return 0;
192
-
193
-		return sym_add(dst->sym->st, dst->ident, dst->type, NULL);
194
-
195
-	case KW_BINOP:
196
-		dst = node_next(n);
197
-		src = node_next(dst);
198
-		assert(dst && src);
199
-
200
-		if (!(src->type && dst->type && type_equal(src->type, dst->type)))
201
-			return 0;
202
-
203
-		n->type = dst->type;
204
-		return 0;
205
-
206
-	default:
207
-		n->type = &t_void;
208
-		return 0;
209
-	}
210
-
211
-	return -ENOSYS;
212
-}
213
-
214
-int infer_type_sym(prog_t *prog, node_t *n)
215
-{
216
-	node_t *parent, *key;
217
-
218
-	if (n->sym->type) {
219
-		/* the symbol type could have been inferred in another
220
-		 * probe, in that case copy the type to this node. */
221
-		if (!n->type)
222
-			n->type = n->sym->type;
223
-
224
-		return 0;
225
-	}
226
-
227
-	parent = node_up(n);
228
-	key = node_next(n);
229
-
230
-	/* match `somemap[somekey]` where the type of the entire
231
-	 * expression and the type of the key is known, since that
232
-	 * means the type of the map itself is also known. */
233
-	if (parent && parent->type
234
-	    && (parent->list->ntype == N_KEYWORD)
235
-	    && (parent->list->keyword.class == KW_SUBSCRIPT)
236
-	    && key && key->type) {
237
-		n->type = type_map_of(key->type, parent->type);
238
-
239
-		return sym_add(n->sym->st, n->ident, n->type, NULL);
240
-	}
241
-
242
-	return 0;
243
-}
244
-
245
-int pass_infer_types(node_t *n, void *_prog)
246
-{
247
-	prog_t *prog = _prog;
248
-
249
-	if (n->type)
250
-		return 0;
251
-
252
-	switch (n->ntype) {
253
-	case N_LIST:
254
-		return infer_type_list(prog, n);
255
-	case N_KEYWORD:
256
-		return infer_type_keyword(prog, n);
257
-	case N_IDENT:
258
-		return infer_type_sym(prog, n);
259
-	default:
260
-		break;
261
-	}
262
-
263
-	return 0;
264
-}
265
-
266
-int validate_func(node_t *n)
267
-{
268
-	node_t *arg;
269
-	field_t *f;
270
-	int i;
271
-
272
-	for (arg = node_next(n), f = n->type->t.func.args, i = 1;
273
-	     arg && f && f->type; arg = node_next(arg), f++, i++) {
274
-		if (type_compatible(arg->type, f->type))
275
-			continue;
276
-
277
-		node_print(n, stderr);
278
-		fprintf(stderr, ": incompatible type of argument %d (", i);
279
-		type_dump(arg->type, stderr);
280
-		fputs("), expected ", stderr);
281
-		type_dump(f->type, stderr);
282
-		fputs("\n", stderr);
283
-		return -EINVAL;
284
-	}
285
-
286
-	if (!arg && (!f || !f->type))
287
-		return 0;
288
-
289
-	if (arg) {
290
-		node_print(n, stderr);
291
-		fprintf(stderr, ": too many arguments, expected %d", i);
292
-		return -EINVAL;
293
-	}
294
-
295
-	if (f->optional)
296
-		return 0;
297
-
298
-	node_print(n, stderr);
299
-	fputs(": too few arguments", stderr);
300
-	return -EINVAL;	
301
-}
302
-
303
-int pass_validate_types(node_t *n, void *_prog)
304
-{
305
-	prog_t *prog = _prog;
306
-
307
-	node_print(n, stdout); putchar('\n'); 
308
-	if (!n->type) {
309
-		node_print(n, stderr);
310
-		fputs(": type unknown\n", stderr);
311
-		return -EINVAL;
312
-	}
313
-
314
-	if (n->ntype != N_LIST)
315
-		return 0;
316
-
317
-	if (n->list->ntype != N_IDENT)
318
-		return 0;
319
-
320
-	assert(n->list->type->ttype == T_FUNC);
321
-	return validate_func(n->list);
322
-}
323
-
324
-int validate_syms(prog_t *prog)
325
-{
326
-	return 0;
327
-}
328
-
329
-int run_validate_types(pass_t *pass, ctx_t *ctx)
330
-{
331
-	prog_t **prog;
332
-	int err;
333
-
334
-	for (prog = ctx->progs; *prog; prog++) {
335
-		/* check syms first to give better error messages.
336
-		 * e.g. "i: type unknown", not "b-: type unknown" */
337
-		err = validate_syms(*prog);
338
-		if (err)
339
-			return err;
121
+/* int pass_resolve_symbols(node_t *n, void *_prog) */
122
+/* { */
123
+/* 	prog_t *prog = _prog; */
124
+/* 	provider_t *global = provider_get(":"); */
125
+/* 	node_t *op; */
126
+/* 	int err; */
340
 
127
 
341
-		err = node_walk((*prog)->ast, pass->pre, pass->post, *prog);
342
-		if (err)
343
-			return err;
344
-	}
128
+/* 	if (n->ntype != N_IDENT) */
129
+/* 		return 0; */
345
 
130
 
346
-	return 0;
347
-
348
-}
349
-
350
-int rewrite_const_math(node_t *n)
351
-{
352
-	int64_t result;
353
-	node_t *a, *b, *new;
354
-	int op;
131
+/* 	err = prog->provider->resolve(prog, n); */
132
+/* 	if (!err || (err != -ENOENT)) */
133
+/* 		return err; */
134
+
135
+/* 	err = global->resolve(prog, n); */
136
+/* 	if (!err || (err != -ENOENT)) */
137
+/* 		return err; */
138
+
139
+/* 	/\* neither provider identifier nor global ditto => user */
140
+/* 	 * variable, add it as a global symbol of unknown type. *\/ */
141
+/* 	return sym_add(prog->globals, n->ident, NULL, &n->sym); */
142
+/* } */
143
+
144
+/* int infer_type_list(prog_t *prog, node_t *n) */
145
+/* { */
146
+/* 	type_t *t; */
147
+
148
+/* 	/\* list of lists (code block) => void *\/ */
149
+/* 	if (n->list->ntype == N_LIST) { */
150
+/* 		n->type = &t_void; */
151
+/* 		return 0; */
152
+/* 	} */
355
 
153
 
356
-	/* TODO: handle L/UL/ULL correctly */
154
+/* 	t = n->list->type; */
155
+/* 	if (!t) */
156
+/* 		return 0; */
157
+
158
+/* 	switch (t->ttype) { */
159
+/* 	case T_FUNC: */
160
+/* 		n->type = t->t.func.type; */
161
+/* 		break; */
162
+/* 	default: */
163
+/* 		n->type = t; */
164
+/* 	} */
165
+/* 	return 0; */
166
+/* } */
167
+
168
+/* int infer_type_keyword(prog_t *prog, node_t *n) */
169
+/* { */
170
+/* 	node_t *dst, *src; */
171
+
172
+/* 	switch (n->keyword.class) { */
173
+/* 	case KW_ASSIGN: */
174
+/* 		dst = node_next(n); */
175
+/* 		src = node_next(dst); */
176
+/* 		assert(dst && src); */
177
+
178
+/* 		if (!src->type) */
179
+/* 			return 0; */
180
+
181
+/* 		/\* TODO: assignment is statement for now. do we need */
182
+/* 		 * c-style assignment expressions? e.g `a = b = 2;` *\/ */
183
+/* 		n->type = &t_void; */
184
+
185
+/* 		if (dst->type) */
186
+/* 			return 0; */
187
+
188
+/* 		dst->type = src->type; */
189
+
190
+/* 		if (dst->ntype != N_IDENT) */
191
+/* 			return 0; */
192
+
193
+/* 		return sym_add(dst->sym->st, dst->ident, dst->type, NULL); */
194
+
195
+/* 	case KW_BINOP: */
196
+/* 		dst = node_next(n); */
197
+/* 		src = node_next(dst); */
198
+/* 		assert(dst && src); */
199
+
200
+/* 		if (!(src->type && dst->type && type_equal(src->type, dst->type))) */
201
+/* 			return 0; */
202
+
203
+/* 		n->type = dst->type; */
204
+/* 		return 0; */
205
+
206
+/* 	default: */
207
+/* 		n->type = &t_void; */
208
+/* 		return 0; */
209
+/* 	} */
210
+
211
+/* 	return -ENOSYS; */
212
+/* } */
213
+
214
+/* int infer_type_sym(prog_t *prog, node_t *n) */
215
+/* { */
216
+/* 	node_t *parent, *key; */
217
+
218
+/* 	if (n->sym->type) { */
219
+/* 		/\* the symbol type could have been inferred in another */
220
+/* 		 * probe, in that case copy the type to this node. *\/ */
221
+/* 		if (!n->type) */
222
+/* 			n->type = n->sym->type; */
223
+
224
+/* 		return 0; */
225
+/* 	} */
226
+
227
+/* 	parent = node_up(n); */
228
+/* 	key = node_next(n); */
229
+
230
+/* 	/\* match `somemap[somekey]` where the type of the entire */
231
+/* 	 * expression and the type of the key is known, since that */
232
+/* 	 * means the type of the map itself is also known. *\/ */
233
+/* 	if (parent && parent->type */
234
+/* 	    && (parent->list->ntype == N_KEYWORD) */
235
+/* 	    && (parent->list->keyword.class == KW_SUBSCRIPT) */
236
+/* 	    && key && key->type) { */
237
+/* 		n->type = type_map_of(key->type, parent->type); */
238
+
239
+/* 		return sym_add(n->sym->st, n->ident, n->type, NULL); */
240
+/* 	} */
241
+
242
+/* 	return 0; */
243
+/* } */
244
+
245
+/* int pass_infer_types(node_t *n, void *_prog) */
246
+/* { */
247
+/* 	prog_t *prog = _prog; */
248
+
249
+/* 	if (n->type) */
250
+/* 		return 0; */
251
+
252
+/* 	switch (n->ntype) { */
253
+/* 	case N_LIST: */
254
+/* 		return infer_type_list(prog, n); */
255
+/* 	case N_KEYWORD: */
256
+/* 		return infer_type_keyword(prog, n); */
257
+/* 	case N_IDENT: */
258
+/* 		return infer_type_sym(prog, n); */
259
+/* 	default: */
260
+/* 		break; */
261
+/* 	} */
262
+
263
+/* 	return 0; */
264
+/* } */
265
+
266
+/* int validate_func(node_t *n) */
267
+/* { */
268
+/* 	node_t *arg; */
269
+/* 	field_t *f; */
270
+/* 	int i; */
271
+
272
+/* 	for (arg = node_next(n), f = n->type->t.func.args, i = 1; */
273
+/* 	     arg && f && f->type; arg = node_next(arg), f++, i++) { */
274
+/* 		if (type_compatible(arg->type, f->type)) */
275
+/* 			continue; */
276
+
277
+/* 		node_print(n, stderr); */
278
+/* 		fprintf(stderr, ": incompatible type of argument %d (", i); */
279
+/* 		type_dump(arg->type, stderr); */
280
+/* 		fputs("), expected ", stderr); */
281
+/* 		type_dump(f->type, stderr); */
282
+/* 		fputs("\n", stderr); */
283
+/* 		return -EINVAL; */
284
+/* 	} */
285
+
286
+/* 	if (!arg && (!f || !f->type)) */
287
+/* 		return 0; */
288
+
289
+/* 	if (arg) { */
290
+/* 		node_print(n, stderr); */
291
+/* 		fprintf(stderr, ": too many arguments, expected %d", i); */
292
+/* 		return -EINVAL; */
293
+/* 	} */
294
+
295
+/* 	if (f->optional) */
296
+/* 		return 0; */
297
+
298
+/* 	node_print(n, stderr); */
299
+/* 	fputs(": too few arguments", stderr); */
300
+/* 	return -EINVAL;	 */
301
+/* } */
302
+
303
+/* int pass_validate_types(node_t *n, void *_prog) */
304
+/* { */
305
+/* 	prog_t *prog = _prog; */
306
+
307
+/* 	node_print(n, stdout); putchar('\n');  */
308
+/* 	if (!n->type) { */
309
+/* 		node_print(n, stderr); */
310
+/* 		fputs(": type unknown\n", stderr); */
311
+/* 		return -EINVAL; */
312
+/* 	} */
313
+
314
+/* 	if (n->ntype != N_LIST) */
315
+/* 		return 0; */
316
+
317
+/* 	if (n->list->ntype != N_IDENT) */
318
+/* 		return 0; */
319
+
320
+/* 	assert(n->list->type->ttype == T_FUNC); */
321
+/* 	return validate_func(n->list); */
322
+/* } */
323
+
324
+/* int validate_syms(prog_t *prog) */
325
+/* { */
326
+/* 	return 0; */
327
+/* } */
328
+
329
+/* int run_validate_types(pass_t *pass, ctx_t *ctx) */
330
+/* { */
331
+/* 	prog_t **prog; */
332
+/* 	int err; */
333
+
334
+/* 	for (prog = ctx->progs; *prog; prog++) { */
335
+/* 		/\* check syms first to give better error messages. */
336
+/* 		 * e.g. "i: type unknown", not "b-: type unknown" *\/ */
337
+/* 		err = validate_syms(*prog); */
338
+/* 		if (err) */
339
+/* 			return err; */
340
+
341
+/* 		err = node_walk((*prog)->ast, pass->pre, pass->post, *prog); */
342
+/* 		if (err) */
343
+/* 			return err; */
344
+/* 	} */
345
+
346
+/* 	return 0; */
347
+
348
+/* } */
349
+
350
+/* int rewrite_const_math(node_t *n) */
351
+/* { */
352
+/* 	int64_t result; */
353
+/* 	node_t *a, *b, *new; */
354
+/* 	int op; */
355
+
356
+/* 	/\* TODO: handle L/UL/ULL correctly *\/ */
357
 	
357
 	
358
-	op = n->list->keyword.op;
359
-	a = node_next(n->list);
360
-	b = node_next(a);
361
-
362
-	switch (op) {
363
-	case '*': result = a->num *  b->num; break;
364
-	case '/': result = a->num /  b->num; break;
365
-	case '%': result = a->num %  b->num; break;
366
-	case '+': result = a->num +  b->num; break;
367
-	case '-': result = a->num -  b->num; break;
368
-	case '<': result = a->num << b->num; break;
369
-	case '>': result = a->num >> b->num; break;
370
-	default: return 0;
371
-	}
372
-
373
-	new = node_num(result);
374
-	new->type = n->type;
375
-	return node_replace(n, new);
376
-}
377
-
378
-int pass_rewrite_ast(node_t *n, void *_prog)
379
-{
380
-	prog_t *prog = _prog;
381
-	provider_t *global = provider_get(":");
382
-	int err;
383
-
384
-	if (prog->provider->rewrite_node) {
385
-		err = prog->provider->rewrite_node(prog, n);
386
-		if (err)
387
-			return err;
388
-	}
389
-
390
-	if (global->rewrite_node) {
391
-		err = global->rewrite_node(prog, n);
392
-		if (err)
393
-			return err;
394
-	}
395
-
396
-	/* pre-compute binops where both sides are constants */
397
-	if ((n->ntype == N_LIST)
398
-	    && (n->list->ntype == N_KEYWORD)
399
-	    && (n->list->keyword.class == KW_BINOP)
400
-	    && (node_next(n->list)->ntype == N_NUM)
401
-	    && (node_next(node_next(n->list))->ntype == N_NUM))
402
-		return rewrite_const_math(n);
403
-
404
-	return 0;
405
-}
406
-
407
-int generate_ir_ident(prog_t *prog, node_t *n)
408
-{
409
-
410
-	switch (n->sym->type->ttype) {
411
-	case T_FUNC:
412
-		return n->sym->type->t.func.generate_ir(prog, n);
413
-	case T_MAP:
414
-		ir_emit_ldmap(prog->ir, BPF_REG_0, n->sym);
415
-		return 0;
416
-	default:
417
-		break;
418
-	}
419
-
420
-	return 0;
421
-}
422
-
423
-int pass_generate_ir(node_t *n, void *_prog)
424
-{
425
-	prog_t *prog = _prog;
426
-
427
-	switch (n->ntype) {
428
-	case N_LIST:
429
-		return 0;
430
-	case N_IDENT:
431
-		return generate_ir_ident(prog, n);
432
-
433
-	default:
434
-		break;
435
-	}
436
-	return 0;
437
-}
438
-
439
-int run_generate_ir(pass_t *pass, ctx_t *ctx)
440
-{
441
-	prog_t **progp;
442
-	int err;
443
-
444
-	for (progp = ctx->progs; *progp; progp++) {
445
-		prog_t *prog = *progp;
446
-
447
-		int return_label = ir_alloc_label(prog->ir);
448
-
449
-		err = prog->provider->ir_prologue ?
450
-			prog->provider->ir_prologue(prog) : 0;
451
-		if (err)
452
-			return err;
453
-
454
-		err = node_walk(prog->ast, NULL, pass_generate_ir, prog);
455
-		if (err)
456
-			return err;
457
-
458
-		err = prog->provider->ir_epilogue ?
459
-			prog->provider->ir_epilogue(prog) : 0;
460
-		if (err)
461
-			return err;
462
-
463
-		ir_emit_label(prog->ir, return_label);
464
-		ir_emit_insn(prog->ir, EXIT, 0, 0);
465
-	}
466
-
467
-	return 0;
468
-}
358
+/* 	op = n->list->keyword.op; */
359
+/* 	a = node_next(n->list); */
360
+/* 	b = node_next(a); */
361
+
362
+/* 	switch (op) { */
363
+/* 	case '*': result = a->num *  b->num; break; */
364
+/* 	case '/': result = a->num /  b->num; break; */
365
+/* 	case '%': result = a->num %  b->num; break; */
366
+/* 	case '+': result = a->num +  b->num; break; */
367
+/* 	case '-': result = a->num -  b->num; break; */
368
+/* 	case '<': result = a->num << b->num; break; */
369
+/* 	case '>': result = a->num >> b->num; break; */
370
+/* 	default: return 0; */
371
+/* 	} */
372
+
373
+/* 	new = node_num(result); */
374
+/* 	new->type = n->type; */
375
+/* 	return node_replace(n, new); */
376
+/* } */
377
+
378
+/* int pass_rewrite_ast(node_t *n, void *_prog) */
379
+/* { */
380
+/* 	prog_t *prog = _prog; */
381
+/* 	provider_t *global = provider_get(":"); */
382
+/* 	int err; */
383
+
384
+/* 	if (prog->provider->rewrite_node) { */
385
+/* 		err = prog->provider->rewrite_node(prog, n); */
386
+/* 		if (err) */
387
+/* 			return err; */
388
+/* 	} */
389
+
390
+/* 	if (global->rewrite_node) { */
391
+/* 		err = global->rewrite_node(prog, n); */
392
+/* 		if (err) */
393
+/* 			return err; */
394
+/* 	} */
395
+
396
+/* 	/\* pre-compute binops where both sides are constants *\/ */
397
+/* 	if ((n->ntype == N_LIST) */
398
+/* 	    && (n->list->ntype == N_KEYWORD) */
399
+/* 	    && (n->list->keyword.class == KW_BINOP) */
400
+/* 	    && (node_next(n->list)->ntype == N_NUM) */
401
+/* 	    && (node_next(node_next(n->list))->ntype == N_NUM)) */
402
+/* 		return rewrite_const_math(n); */
403
+
404
+/* 	return 0; */
405
+/* } */
406
+
407
+/* int generate_ir_ident(prog_t *prog, node_t *n) */
408
+/* { */
409
+
410
+/* 	switch (n->sym->type->ttype) { */
411
+/* 	case T_FUNC: */
412
+/* 		return n->sym->type->t.func.generate_ir(prog, n); */
413
+/* 	case T_MAP: */
414
+/* 		ir_emit_ldmap(prog->ir, BPF_REG_0, n->sym); */
415
+/* 		return 0; */
416
+/* 	default: */
417
+/* 		break; */
418
+/* 	} */
419
+
420
+/* 	return 0; */
421
+/* } */
422
+
423
+/* int pass_generate_ir(node_t *n, void *_prog) */
424
+/* { */
425
+/* 	prog_t *prog = _prog; */
426
+
427
+/* 	switch (n->ntype) { */
428
+/* 	case N_LIST: */
429
+/* 		return 0; */
430
+/* 	case N_IDENT: */
431
+/* 		return generate_ir_ident(prog, n); */
432
+
433
+/* 	default: */
434
+/* 		break; */
435
+/* 	} */
436
+/* 	return 0; */
437
+/* } */
438
+
439
+/* int run_generate_ir(pass_t *pass, ctx_t *ctx) */
440
+/* { */
441
+/* 	prog_t **progp; */
442
+/* 	int err; */
443
+
444
+/* 	for (progp = ctx->progs; *progp; progp++) { */
445
+/* 		prog_t *prog = *progp; */
446
+
447
+/* 		int return_label = ir_alloc_label(prog->ir); */
448
+
449
+/* 		err = prog->provider->ir_prologue ? */
450
+/* 			prog->provider->ir_prologue(prog) : 0; */
451
+/* 		if (err) */
452
+/* 			return err; */
453
+
454
+/* 		err = node_walk(prog->ast, NULL, pass_generate_ir, prog); */
455
+/* 		if (err) */
456
+/* 			return err; */
457
+
458
+/* 		err = prog->provider->ir_epilogue ? */
459
+/* 			prog->provider->ir_epilogue(prog) : 0; */
460
+/* 		if (err) */
461
+/* 			return err; */
462
+
463
+/* 		ir_emit_label(prog->ir, return_label); */
464
+/* 		ir_emit_insn(prog->ir, EXIT, 0, 0); */
465
+/* 	} */
466
+
467
+/* 	return 0; */
468
+/* } */
469
 
469
 
470
 int run_walk(pass_t *pass, ctx_t *ctx)
470
 int run_walk(pass_t *pass, ctx_t *ctx)
471
 {
471
 {
482
 }
482
 }
483
 
483
 
484
 pass_t passes[] = {
484
 pass_t passes[] = {
485
-	{ .run = run_walk, .post = pass_resolve_symbols },
486
-	{ .run = run_walk, .post = pass_infer_types },
487
-	{ .run = run_walk, .post = pass_infer_types },
488
-	{ .run = run_walk, .post = pass_infer_types },
489
-	{ .run = run_validate_types, .post = pass_validate_types },
490
-	{ .run = run_walk, .post = pass_rewrite_ast },
491
-	{ .run = run_generate_ir },
485
+	/* { .run = run_walk, .post = pass_resolve_symbols }, */
486
+	/* { .run = run_walk, .post = pass_infer_types }, */
487
+	/* { .run = run_walk, .post = pass_infer_types }, */
488
+	/* { .run = run_walk, .post = pass_infer_types }, */
489
+	/* { .run = run_validate_types, .post = pass_validate_types }, */
490
+	/* { .run = run_walk, .post = pass_rewrite_ast }, */
491
+	/* { .run = run_generate_ir }, */
492
 
492
 
493
 	{ NULL }
493
 	{ NULL }
494
 };
494
 };
498
 	ctx_t *ctx = ctx_get();
498
 	ctx_t *ctx = ctx_get();
499
 	prog_t **prog;
499
 	prog_t **prog;
500
 	pass_t *pass;
500
 	pass_t *pass;
501
-	int err;
501
+	int err = 0;
502
 
502
 
503
 	for (pass = passes; pass->run; pass++) {
503
 	for (pass = passes; pass->run; pass++) {
504
 		err = pass->run(pass, ctx);
504
 		err = pass->run(pass, ctx);
509
 	for (prog = ctx->progs; *prog; prog++) {
509
 	for (prog = ctx->progs; *prog; prog++) {
510
 		printf("\n\e[34m%s\e[0m\n", (*prog)->probe);
510
 		printf("\n\e[34m%s\e[0m\n", (*prog)->probe);
511
 		node_dump((*prog)->ast, stdout);
511
 		node_dump((*prog)->ast, stdout);
512
-		printf("\n-- locals\n");
513
-		symtab_dump((*prog)->locals, stdout);
514
-		printf("-- ir\n");
515
-		ir_dump((*prog)->ir, stdout);
512
+		/* printf("\n-- locals\n"); */
513
+		/* symtab_dump((*prog)->locals, stdout); */
514
+		/* printf("-- ir\n"); */
515
+		/* ir_dump((*prog)->ir, stdout); */
516
 	}
516
 	}
517
 
517
 
518
-	printf("\n\n-- globals\n");
519
-	symtab_dump(ctx->globals, stdout);
518
+	/* printf("\n\n-- globals\n"); */
519
+	/* symtab_dump(ctx->globals, stdout); */
520
 
520
 
521
 	if (err)
521
 	if (err)
522
 		printf("ERR: %d\n", err);
522
 		printf("ERR: %d\n", err);