]> git.xonotic.org Git - xonotic/gmqcc.git/blob - parser.c
unary - operator implemented, adding imm_vector_zero and imm_float_zero since those...
[xonotic/gmqcc.git] / parser.c
1 #include <stdio.h>
2 #include <stdarg.h>
3
4 #include "gmqcc.h"
5 #include "lexer.h"
6
7 typedef struct {
8     char *name;
9     ast_expression *var;
10 } varentry_t;
11
12 typedef struct {
13     lex_file *lex;
14     int      tok;
15
16     MEM_VECTOR_MAKE(varentry_t, globals);
17     MEM_VECTOR_MAKE(varentry_t, fields);
18     MEM_VECTOR_MAKE(ast_function*, functions);
19     MEM_VECTOR_MAKE(ast_value*, imm_float);
20     MEM_VECTOR_MAKE(ast_value*, imm_string);
21     MEM_VECTOR_MAKE(ast_value*, imm_vector);
22
23     ast_value *imm_float_zero;
24     ast_value *imm_vector_zero;
25
26     ast_function *function;
27     MEM_VECTOR_MAKE(varentry_t, locals);
28     size_t blocklocal;
29
30     size_t errors;
31
32     /* TYPE_FIELD -> parser_find_fields is used instead of find_var
33      * TODO: TYPE_VECTOR -> x, y and z are accepted in the gmqcc standard
34      * anything else: type error
35      */
36     qcint  memberof;
37 } parser_t;
38
39 MEM_VEC_FUNCTIONS(parser_t, varentry_t, globals)
40 MEM_VEC_FUNCTIONS(parser_t, varentry_t, fields)
41 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_float)
42 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_string)
43 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_vector)
44 MEM_VEC_FUNCTIONS(parser_t, varentry_t, locals)
45 MEM_VEC_FUNCTIONS(parser_t, ast_function*, functions)
46
47 static void parser_pop_local(parser_t *parser);
48 static bool parser_variable(parser_t *parser, ast_block *localblock);
49 static ast_block* parser_parse_block(parser_t *parser);
50 static ast_expression* parser_parse_statement_or_block(parser_t *parser);
51 static ast_expression* parser_expression_leave(parser_t *parser, bool stopatcomma);
52 static ast_expression* parser_expression(parser_t *parser, bool stopatcomma);
53
54 void parseerror(parser_t *parser, const char *fmt, ...)
55 {
56         va_list ap;
57
58         parser->errors++;
59
60         va_start(ap, fmt);
61     vprintmsg(LVL_ERROR, parser->lex->tok->ctx.file, parser->lex->tok->ctx.line, "parse error", fmt, ap);
62         va_end(ap);
63
64         printf("\n");
65 }
66
67 /* returns true if it counts as an error */
68 bool GMQCC_WARN parsewarning(parser_t *parser, int warntype, const char *fmt, ...)
69 {
70         va_list ap;
71         int lvl = LVL_WARNING;
72
73     if (!OPTS_WARN(warntype))
74         return false;
75
76     if (OPTS_WARN(WARN_ERROR)) {
77             parser->errors++;
78             lvl = LVL_ERROR;
79         }
80
81         va_start(ap, fmt);
82     vprintmsg(lvl, parser->lex->tok->ctx.file, parser->lex->tok->ctx.line, "warning", fmt, ap);
83         va_end(ap);
84
85         return OPTS_WARN(WARN_ERROR);
86 }
87
88 /**********************************************************************
89  * some maths used for constant folding
90  */
91
92 vector vec3_add(vector a, vector b)
93 {
94     vector out;
95     out.x = a.x + b.x;
96     out.y = a.y + b.y;
97     out.z = a.z + b.z;
98     return out;
99 }
100
101 vector vec3_sub(vector a, vector b)
102 {
103     vector out;
104     out.x = a.x - b.x;
105     out.y = a.y - b.y;
106     out.z = a.z - b.z;
107     return out;
108 }
109
110 qcfloat vec3_mulvv(vector a, vector b)
111 {
112     return (a.x * b.x + a.y * b.y + a.z * b.z);
113 }
114
115 vector vec3_mulvf(vector a, float b)
116 {
117     vector out;
118     out.x = a.x * b;
119     out.y = a.y * b;
120     out.z = a.z * b;
121     return out;
122 }
123
124 /**********************************************************************
125  * parsing
126  */
127
128 bool parser_next(parser_t *parser)
129 {
130     /* lex_do kills the previous token */
131     parser->tok = lex_do(parser->lex);
132     if (parser->tok == TOKEN_EOF || parser->tok >= TOKEN_ERROR)
133         return false;
134     return true;
135 }
136
137 /* lift a token out of the parser so it's not destroyed by parser_next */
138 token *parser_lift(parser_t *parser)
139 {
140     token *tok = parser->lex->tok;
141     parser->lex->tok = NULL;
142     return tok;
143 }
144
145 #define parser_tokval(p) (p->lex->tok->value)
146 #define parser_token(p)  (p->lex->tok)
147 #define parser_ctx(p)    (p->lex->tok->ctx)
148
149 ast_value* parser_const_float(parser_t *parser, double d)
150 {
151     size_t i;
152     ast_value *out;
153     for (i = 0; i < parser->imm_float_count; ++i) {
154         if (parser->imm_float[i]->constval.vfloat == d)
155             return parser->imm_float[i];
156     }
157     out = ast_value_new(parser_ctx(parser), "#IMMEDIATE", TYPE_FLOAT);
158     out->isconst = true;
159     out->constval.vfloat = d;
160     if (!parser_t_imm_float_add(parser, out)) {
161         ast_value_delete(out);
162         return NULL;
163     }
164     return out;
165 }
166
167 ast_value* parser_const_float_0(parser_t *parser)
168 {
169     if (!parser->imm_float_zero)
170         parser->imm_float_zero = parser_const_float(parser, 0);
171     return parser->imm_float_zero;
172 }
173
174 ast_value* parser_const_string(parser_t *parser, const char *str)
175 {
176     size_t i;
177     ast_value *out;
178     for (i = 0; i < parser->imm_string_count; ++i) {
179         if (!strcmp(parser->imm_string[i]->constval.vstring, str))
180             return parser->imm_string[i];
181     }
182     out = ast_value_new(parser_ctx(parser), "#IMMEDIATE", TYPE_STRING);
183     out->isconst = true;
184     out->constval.vstring = util_strdup(str);
185     if (!parser_t_imm_string_add(parser, out)) {
186         ast_value_delete(out);
187         return NULL;
188     }
189     return out;
190 }
191
192 ast_value* parser_const_vector(parser_t *parser, vector v)
193 {
194     size_t i;
195     ast_value *out;
196     for (i = 0; i < parser->imm_vector_count; ++i) {
197         if (!memcmp(&parser->imm_vector[i]->constval.vvec, &v, sizeof(v)))
198             return parser->imm_vector[i];
199     }
200     out = ast_value_new(parser_ctx(parser), "#IMMEDIATE", TYPE_VECTOR);
201     out->isconst = true;
202     out->constval.vvec = v;
203     if (!parser_t_imm_vector_add(parser, out)) {
204         ast_value_delete(out);
205         return NULL;
206     }
207     return out;
208 }
209
210 ast_value* parser_const_vector_f(parser_t *parser, float x, float y, float z)
211 {
212     vector v;
213     v.x = x;
214     v.y = y;
215     v.z = z;
216     return parser_const_vector(parser, v);
217 }
218
219 ast_value* parser_const_vector_0(parser_t *parser)
220 {
221     if (!parser->imm_vector_zero)
222         parser->imm_vector_zero = parser_const_vector_f(parser, 0, 0, 0);
223     return parser->imm_vector_zero;
224 }
225
226 ast_expression* parser_find_field(parser_t *parser, const char *name)
227 {
228     size_t i;
229     for (i = 0; i < parser->fields_count; ++i) {
230         if (!strcmp(parser->fields[i].name, name))
231             return parser->fields[i].var;
232     }
233     return NULL;
234 }
235
236 ast_expression* parser_find_global(parser_t *parser, const char *name)
237 {
238     size_t i;
239     for (i = 0; i < parser->globals_count; ++i) {
240         if (!strcmp(parser->globals[i].name, name))
241             return parser->globals[i].var;
242     }
243     return NULL;
244 }
245
246 ast_expression* parser_find_local(parser_t *parser, const char *name, size_t upto)
247 {
248     size_t i;
249     ast_value *fun;
250     for (i = parser->locals_count; i > upto;) {
251         --i;
252         if (!strcmp(parser->locals[i].name, name))
253             return parser->locals[i].var;
254     }
255     if (!parser->function)
256         return NULL;
257     fun = parser->function->vtype;
258     for (i = 0; i < fun->expression.params_count; ++i) {
259         if (!strcmp(fun->expression.params[i]->name, name))
260             return (ast_expression*)(fun->expression.params[i]);
261     }
262     return NULL;
263 }
264
265 ast_expression* parser_find_var(parser_t *parser, const char *name)
266 {
267     ast_expression *v;
268     v         = parser_find_local(parser, name, 0);
269     if (!v) v = parser_find_global(parser, name);
270     return v;
271 }
272
273 typedef struct {
274     MEM_VECTOR_MAKE(ast_value*, p);
275 } paramlist_t;
276 MEM_VEC_FUNCTIONS(paramlist_t, ast_value*, p)
277
278 static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc)
279 {
280     paramlist_t params;
281     ast_value *var;
282     lex_ctx   ctx = parser_ctx(parser);
283     int vtype = basetype;
284     int temptype;
285     size_t i;
286
287     MEM_VECTOR_INIT(&params, p);
288
289     *isfunc = false;
290
291     if (parser->tok == '(') {
292         *isfunc = true;
293         while (true) {
294             ast_value *param;
295             bool dummy;
296
297             if (!parser_next(parser))
298                 goto on_error;
299
300             if (parser->tok == ')')
301                 break;
302
303             temptype = parser_token(parser)->constval.t;
304             if (!parser_next(parser))
305                 goto on_error;
306
307             param = parser_parse_type(parser, temptype, &dummy);
308             (void)dummy;
309
310             if (!param)
311                 goto on_error;
312
313             if (parser->tok == TOKEN_IDENT) {
314                 /* named parameter */
315                 if (!ast_value_set_name(param, parser_tokval(parser)))
316                     goto on_error;
317                 if (!parser_next(parser))
318                     goto on_error;
319             }
320
321             if (!paramlist_t_p_add(&params, param)) {
322                 parseerror(parser, "Out of memory while parsing typename");
323                 goto on_error;
324             }
325
326             if (parser->tok == ',')
327                 continue;
328             if (parser->tok == ')')
329                 break;
330             parseerror(parser, "Unexpected token");
331             goto on_error;
332         }
333         if (!parser_next(parser))
334             goto on_error;
335     }
336
337     var = ast_value_new(ctx, "<unnamed>", vtype);
338     if (!var)
339         goto on_error;
340     MEM_VECTOR_MOVE(&params, p, &var->expression, params);
341     return var;
342 on_error:
343     for (i = 0; i < params.p_count; ++i)
344         ast_value_delete(params.p[i]);
345     MEM_VECTOR_CLEAR(&params, p);
346     return NULL;
347 }
348
349 typedef struct
350 {
351     size_t etype; /* 0 = expression, others are operators */
352     int             paren;
353     size_t          off;
354     ast_expression *out;
355     ast_block      *block; /* for commas and function calls */
356     lex_ctx ctx;
357 } sy_elem;
358 typedef struct
359 {
360     MEM_VECTOR_MAKE(sy_elem, out);
361     MEM_VECTOR_MAKE(sy_elem, ops);
362 } shunt;
363 MEM_VEC_FUNCTIONS(shunt, sy_elem, out)
364 MEM_VEC_FUNCTIONS(shunt, sy_elem, ops)
365
366 static sy_elem syexp(lex_ctx ctx, ast_expression *v) {
367     sy_elem e;
368     e.etype = 0;
369     e.out   = v;
370     e.block = NULL;
371     e.ctx   = ctx;
372     e.paren = 0;
373     return e;
374 }
375
376 static sy_elem syblock(lex_ctx ctx, ast_block *v) {
377     sy_elem e;
378     e.etype = 0;
379     e.out   = (ast_expression*)v;
380     e.block = v;
381     e.ctx   = ctx;
382     e.paren = 0;
383     return e;
384 }
385
386 static sy_elem syop(lex_ctx ctx, const oper_info *op) {
387     sy_elem e;
388     e.etype = 1 + (op - operators);
389     e.out   = NULL;
390     e.block = NULL;
391     e.ctx   = ctx;
392     e.paren = 0;
393     return e;
394 }
395
396 static sy_elem syparen(lex_ctx ctx, int p, size_t off) {
397     sy_elem e;
398     e.etype = 0;
399     e.off   = off;
400     e.out   = NULL;
401     e.block = NULL;
402     e.ctx   = ctx;
403     e.paren = p;
404     return e;
405 }
406
407 #ifdef DEBUGSHUNT
408 # define DEBUGSHUNTDO(x) x
409 #else
410 # define DEBUGSHUNTDO(x)
411 #endif
412
413 static bool parser_sy_pop(parser_t *parser, shunt *sy)
414 {
415     const oper_info *op;
416     lex_ctx ctx;
417     ast_expression *out = NULL;
418     ast_expression *exprs[3];
419     ast_block      *blocks[3];
420     ast_value      *asvalue[3];
421     size_t i, assignop;
422     qcint  generated_op = 0;
423
424     if (!sy->ops_count) {
425         parseerror(parser, "internal error: missing operator");
426         return false;
427     }
428
429     if (sy->ops[sy->ops_count-1].paren) {
430         parseerror(parser, "unmatched parenthesis");
431         return false;
432     }
433
434     op = &operators[sy->ops[sy->ops_count-1].etype - 1];
435     ctx = sy->ops[sy->ops_count-1].ctx;
436
437     DEBUGSHUNTDO(printf("apply %s\n", op->op));
438
439     if (sy->out_count < op->operands) {
440         parseerror(parser, "internal error: not enough operands: %i", sy->out_count);
441         return false;
442     }
443
444     sy->ops_count--;
445
446     sy->out_count -= op->operands;
447     for (i = 0; i < op->operands; ++i) {
448         exprs[i]  = sy->out[sy->out_count+i].out;
449         blocks[i] = sy->out[sy->out_count+i].block;
450         asvalue[i] = (ast_value*)exprs[i];
451     }
452
453     if (blocks[0] && !blocks[0]->exprs_count && op->id != opid1(',')) {
454         parseerror(parser, "internal error: operator cannot be applied on empty blocks");
455         return false;
456     }
457
458 #define NotSameType(T) \
459              (exprs[0]->expression.vtype != exprs[1]->expression.vtype || \
460               exprs[0]->expression.vtype != T)
461 #define CanConstFold1(A) \
462              (ast_istype((A), ast_value) && ((ast_value*)(A))->isconst)
463 #define CanConstFold(A, B) \
464              (CanConstFold1(A) && CanConstFold1(B))
465 #define ConstV(i) (asvalue[(i)]->constval.vvec)
466 #define ConstF(i) (asvalue[(i)]->constval.vfloat)
467     switch (op->id)
468     {
469         default:
470             parseerror(parser, "internal error: unhandled operand");
471             return false;
472
473         case opid1('.'):
474             if (exprs[0]->expression.vtype == TYPE_ENTITY) {
475                 if (exprs[1]->expression.vtype != TYPE_FIELD) {
476                     parseerror(parser, "type error: right hand of member-operand should be an entity-field");
477                     return false;
478                 }
479                 out = (ast_expression*)ast_entfield_new(ctx, exprs[0], exprs[1]);
480             }
481             else if (exprs[0]->expression.vtype == TYPE_VECTOR) {
482                 parseerror(parser, "internal error: vector access is not supposed to be handled at this point");
483                 return false;
484             }
485             else {
486                 parseerror(parser, "type error: member-of operator on something that is not an entity or vector");
487                 return false;
488             }
489             break;
490
491         case opid1(','):
492             if (blocks[0]) {
493                 if (!ast_block_exprs_add(blocks[0], exprs[1]))
494                     return false;
495             } else {
496                 blocks[0] = ast_block_new(ctx);
497                 if (!ast_block_exprs_add(blocks[0], exprs[0]) ||
498                     !ast_block_exprs_add(blocks[0], exprs[1]))
499                 {
500                     return false;
501                 }
502             }
503             if (!ast_block_set_type(blocks[0], exprs[1]))
504                 return false;
505
506             sy->out[sy->out_count++] = syblock(ctx, blocks[0]);
507             return true;
508
509         case opid2('-','P'):
510             switch (exprs[0]->expression.vtype) {
511                 case TYPE_FLOAT:
512                     if (CanConstFold1(exprs[0]))
513                         out = (ast_expression*)parser_const_float(parser, -ConstF(0));
514                     else
515                         out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_F,
516                                                               (ast_expression*)parser_const_float_0(parser),
517                                                               exprs[0]);
518                     break;
519                 case TYPE_VECTOR:
520                     if (CanConstFold1(exprs[0]))
521                         out = (ast_expression*)parser_const_vector_f(parser,
522                             -ConstV(0).x, -ConstV(0).y, -ConstV(0).z);
523                     else
524                         out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_V,
525                                                               (ast_expression*)parser_const_vector_0(parser),
526                                                               exprs[0]);
527                     break;
528                 default:
529                 parseerror(parser, "invalid types used in expression: cannot negate type %s",
530                            type_name[exprs[0]->expression.vtype]);
531                 return false;
532             }
533             break;
534
535         case opid1('+'):
536             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
537                 (exprs[0]->expression.vtype != TYPE_VECTOR && exprs[0]->expression.vtype != TYPE_FLOAT) )
538             {
539                 parseerror(parser, "invalid types used in expression: cannot add type %s and %s",
540                            type_name[exprs[0]->expression.vtype],
541                            type_name[exprs[1]->expression.vtype]);
542                 return false;
543             }
544             switch (exprs[0]->expression.vtype) {
545                 case TYPE_FLOAT:
546                     if (CanConstFold(exprs[0], exprs[1]))
547                     {
548                         out = (ast_expression*)parser_const_float(parser, ConstF(0) + ConstF(1));
549                     }
550                     else
551                         out = (ast_expression*)ast_binary_new(ctx, INSTR_ADD_F, exprs[0], exprs[1]);
552                     break;
553                 case TYPE_VECTOR:
554                     if (CanConstFold(exprs[0], exprs[1]))
555                         out = (ast_expression*)parser_const_vector(parser, vec3_add(ConstV(0), ConstV(1)));
556                     else
557                         out = (ast_expression*)ast_binary_new(ctx, INSTR_ADD_V, exprs[0], exprs[1]);
558                     break;
559                 default:
560                     parseerror(parser, "invalid types used in expression: cannot add type %s and %s",
561                                type_name[exprs[0]->expression.vtype],
562                                type_name[exprs[1]->expression.vtype]);
563                     return false;
564             };
565             break;
566         case opid1('-'):
567             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
568                 (exprs[0]->expression.vtype != TYPE_VECTOR && exprs[0]->expression.vtype != TYPE_FLOAT) )
569             {
570                 parseerror(parser, "invalid types used in expression: cannot subtract type %s from %s",
571                            type_name[exprs[1]->expression.vtype],
572                            type_name[exprs[0]->expression.vtype]);
573                 return false;
574             }
575             switch (exprs[0]->expression.vtype) {
576                 case TYPE_FLOAT:
577                     if (CanConstFold(exprs[0], exprs[1]))
578                         out = (ast_expression*)parser_const_float(parser, ConstF(0) - ConstF(1));
579                     else
580                         out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_F, exprs[0], exprs[1]);
581                     break;
582                 case TYPE_VECTOR:
583                     if (CanConstFold(exprs[0], exprs[1]))
584                         out = (ast_expression*)parser_const_vector(parser, vec3_sub(ConstV(0), ConstV(1)));
585                     else
586                         out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_V, exprs[0], exprs[1]);
587                     break;
588                 default:
589                     parseerror(parser, "invalid types used in expression: cannot subtract type %s from %s",
590                                type_name[exprs[1]->expression.vtype],
591                                type_name[exprs[0]->expression.vtype]);
592                     return false;
593             };
594             break;
595         case opid1('*'):
596             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype &&
597                 exprs[0]->expression.vtype != TYPE_VECTOR &&
598                 exprs[0]->expression.vtype != TYPE_FLOAT &&
599                 exprs[1]->expression.vtype != TYPE_VECTOR &&
600                 exprs[1]->expression.vtype != TYPE_FLOAT)
601             {
602                 parseerror(parser, "invalid types used in expression: cannot multiply types %s and %s",
603                            type_name[exprs[1]->expression.vtype],
604                            type_name[exprs[0]->expression.vtype]);
605                 return false;
606             }
607             switch (exprs[0]->expression.vtype) {
608                 case TYPE_FLOAT:
609                     if (exprs[1]->expression.vtype == TYPE_VECTOR)
610                     {
611                         if (CanConstFold(exprs[0], exprs[1]))
612                             out = (ast_expression*)parser_const_vector(parser, vec3_mulvf(ConstV(1), ConstF(0)));
613                         else
614                             out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_FV, exprs[0], exprs[1]);
615                     }
616                     else
617                     {
618                         if (CanConstFold(exprs[0], exprs[1]))
619                             out = (ast_expression*)parser_const_float(parser, ConstF(0) * ConstF(1));
620                         else
621                             out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_F, exprs[0], exprs[1]);
622                     }
623                     break;
624                 case TYPE_VECTOR:
625                     if (exprs[1]->expression.vtype == TYPE_FLOAT)
626                     {
627                         if (CanConstFold(exprs[0], exprs[1]))
628                             out = (ast_expression*)parser_const_vector(parser, vec3_mulvf(ConstV(0), ConstF(1)));
629                         else
630                             out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_VF, exprs[0], exprs[1]);
631                     }
632                     else
633                     {
634                         if (CanConstFold(exprs[0], exprs[1]))
635                             out = (ast_expression*)parser_const_float(parser, vec3_mulvv(ConstV(0), ConstV(1)));
636                         else
637                             out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_V, exprs[0], exprs[1]);
638                     }
639                     break;
640                 default:
641                     parseerror(parser, "invalid types used in expression: cannot multiply types %s and %s",
642                                type_name[exprs[1]->expression.vtype],
643                                type_name[exprs[0]->expression.vtype]);
644                     return false;
645             };
646             break;
647         case opid1('/'):
648             if (NotSameType(TYPE_FLOAT)) {
649                 parseerror(parser, "invalid types used in expression: cannot divide types %s and %s",
650                            type_name[exprs[0]->expression.vtype],
651                            type_name[exprs[1]->expression.vtype]);
652                 return false;
653             }
654             if (CanConstFold(exprs[0], exprs[1]))
655                 out = (ast_expression*)parser_const_float(parser, ConstF(0) / ConstF(1));
656             else
657                 out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]);
658             break;
659         case opid1('%'):
660         case opid2('%','='):
661             parseerror(parser, "qc does not have a modulo operator");
662             return false;
663         case opid1('|'):
664         case opid1('&'):
665             if (NotSameType(TYPE_FLOAT)) {
666                 parseerror(parser, "invalid types used in expression: cannot perform bit operations between types %s and %s",
667                            type_name[exprs[0]->expression.vtype],
668                            type_name[exprs[1]->expression.vtype]);
669                 return false;
670             }
671             if (CanConstFold(exprs[0], exprs[1]))
672                 out = (ast_expression*)parser_const_float(parser,
673                     (op->id == opid1('|') ? (float)( ((qcint)ConstF(0)) | ((qcint)ConstF(1)) ) :
674                                             (float)( ((qcint)ConstF(0)) & ((qcint)ConstF(1)) ) ));
675             else
676                 out = (ast_expression*)ast_binary_new(ctx,
677                     (op->id == opid1('|') ? INSTR_BITOR : INSTR_BITAND),
678                     exprs[0], exprs[1]);
679             break;
680         case opid1('^'):
681             parseerror(parser, "TODO: bitxor");
682             return false;
683
684         case opid2('<','<'):
685         case opid2('>','>'):
686         case opid3('<','<','='):
687         case opid3('>','>','='):
688             parseerror(parser, "TODO: shifts");
689             return false;
690
691         case opid2('|','|'):
692             generated_op += 1; /* INSTR_OR */
693         case opid2('&','&'):
694             generated_op += INSTR_AND;
695             if (NotSameType(TYPE_FLOAT)) {
696                 parseerror(parser, "invalid types used in expression: cannot perform logical operations between types %s and %s",
697                            type_name[exprs[0]->expression.vtype],
698                            type_name[exprs[1]->expression.vtype]);
699                 parseerror(parser, "TODO: logical ops for arbitrary types using INSTR_NOT");
700                 parseerror(parser, "TODO: optional early out");
701                 return false;
702             }
703             if (opts_standard == COMPILER_GMQCC)
704                 printf("TODO: early out logic\n");
705             if (CanConstFold(exprs[0], exprs[1]))
706                 out = (ast_expression*)parser_const_float(parser,
707                     (generated_op == INSTR_OR ? (ConstF(0) || ConstF(1)) : (ConstF(0) && ConstF(1))));
708             else
709                 out = (ast_expression*)ast_binary_new(ctx, generated_op, exprs[0], exprs[1]);
710             break;
711
712         case opid1('>'):
713             generated_op += 1; /* INSTR_GT */
714         case opid1('<'):
715             generated_op += 1; /* INSTR_LT */
716         case opid2('>', '='):
717             generated_op += 1; /* INSTR_GE */
718         case opid2('<', '='):
719             generated_op += INSTR_LE;
720             if (NotSameType(TYPE_FLOAT)) {
721                 parseerror(parser, "invalid types used in expression: cannot perform comparison between types %s and %s",
722                            type_name[exprs[0]->expression.vtype],
723                            type_name[exprs[1]->expression.vtype]);
724                 return false;
725             }
726             out = (ast_expression*)ast_binary_new(ctx, generated_op, exprs[0], exprs[1]);
727             break;
728         case opid2('!', '='):
729             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) {
730                 parseerror(parser, "invalid types used in expression: cannot perform comparison between types %s and %s",
731                            type_name[exprs[0]->expression.vtype],
732                            type_name[exprs[1]->expression.vtype]);
733                 return false;
734             }
735             out = (ast_expression*)ast_binary_new(ctx, type_ne_instr[exprs[0]->expression.vtype], exprs[0], exprs[1]);
736             break;
737         case opid2('=', '='):
738             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) {
739                 parseerror(parser, "invalid types used in expression: cannot perform comparison between types %s and %s",
740                            type_name[exprs[0]->expression.vtype],
741                            type_name[exprs[1]->expression.vtype]);
742                 return false;
743             }
744             out = (ast_expression*)ast_binary_new(ctx, type_eq_instr[exprs[0]->expression.vtype], exprs[0], exprs[1]);
745             break;
746
747         case opid1('='):
748             if (ast_istype(exprs[0], ast_entfield))
749                 assignop = type_storep_instr[exprs[0]->expression.vtype];
750             else
751                 assignop = type_store_instr[exprs[0]->expression.vtype];
752             out = (ast_expression*)ast_store_new(ctx, assignop, exprs[0], exprs[1]);
753             break;
754         case opid2('+','='):
755         case opid2('-','='):
756             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
757                 (exprs[0]->expression.vtype != TYPE_VECTOR && exprs[0]->expression.vtype != TYPE_FLOAT) )
758             {
759                 parseerror(parser, "invalid types used in expression: cannot add or subtract type %s and %s",
760                            type_name[exprs[0]->expression.vtype],
761                            type_name[exprs[1]->expression.vtype]);
762                 return false;
763             }
764             if (ast_istype(exprs[0], ast_entfield))
765                 assignop = type_storep_instr[exprs[0]->expression.vtype];
766             else
767                 assignop = type_store_instr[exprs[0]->expression.vtype];
768             switch (exprs[0]->expression.vtype) {
769                 case TYPE_FLOAT:
770                     out = (ast_expression*)ast_binstore_new(ctx, assignop,
771                                                             (op->id == opid2('+','=') ? INSTR_ADD_F : INSTR_SUB_F),
772                                                             exprs[0], exprs[1]);
773                     break;
774                 case TYPE_VECTOR:
775                     out = (ast_expression*)ast_binstore_new(ctx, assignop,
776                                                             (op->id == opid2('+','=') ? INSTR_ADD_V : INSTR_SUB_V),
777                                                             exprs[0], exprs[1]);
778                     break;
779                 default:
780                     parseerror(parser, "invalid types used in expression: cannot add or subtract type %s and %s",
781                                type_name[exprs[0]->expression.vtype],
782                                type_name[exprs[1]->expression.vtype]);
783                     return false;
784             };
785             break;
786     }
787 #undef NotSameType
788
789     if (!out) {
790         parseerror(parser, "failed to apply operand %s", op->op);
791         return false;
792     }
793
794     DEBUGSHUNTDO(printf("applied %s\n", op->op));
795     sy->out[sy->out_count++] = syexp(ctx, out);
796     return true;
797 }
798
799 static bool parser_close_call(parser_t *parser, shunt *sy)
800 {
801     /* was a function call */
802     ast_expression *fun;
803     ast_call       *call;
804
805     size_t          fid;
806     size_t          paramcount;
807
808     sy->ops_count--;
809     fid = sy->ops[sy->ops_count].off;
810
811     /* out[fid] is the function
812      * everything above is parameters...
813      * 0 params = nothing
814      * 1 params = ast_expression
815      * more = ast_block
816      */
817
818     if (sy->out_count < 1 || sy->out_count <= fid) {
819         parseerror(parser, "internal error: function call needs function and parameter list...");
820         return false;
821     }
822
823     fun = sy->out[fid].out;
824
825     call = ast_call_new(sy->ops[sy->ops_count].ctx, fun);
826     if (!call) {
827         parseerror(parser, "out of memory");
828         return false;
829     }
830
831     if (fid+1 == sy->out_count) {
832         /* no arguments */
833         paramcount = 0;
834     } else if (fid+2 == sy->out_count) {
835         ast_block *params;
836         sy->out_count--;
837         params = sy->out[sy->out_count].block;
838         if (!params) {
839             /* 1 param */
840             paramcount = 1;
841             if (!ast_call_params_add(call, sy->out[sy->out_count].out)) {
842                 ast_delete(sy->out[sy->out_count].out);
843                 parseerror(parser, "out of memory");
844                 return false;
845             }
846         } else {
847             paramcount = params->exprs_count;
848             MEM_VECTOR_MOVE(params, exprs, call, params);
849             ast_delete(params);
850         }
851     } else {
852         parseerror(parser, "invalid function call");
853         return false;
854     }
855
856     /* overwrite fid, the function, with a call */
857     sy->out[fid] = syexp(call->expression.node.context, (ast_expression*)call);
858
859     if (fun->expression.vtype != TYPE_FUNCTION) {
860         parseerror(parser, "not a function");
861         return false;
862     }
863
864     if (!fun->expression.next) {
865         parseerror(parser, "could not determine function return type");
866         return false;
867     } else {
868         if (fun->expression.params_count != paramcount) {
869             parseerror(parser, "expected %i parameters, got %i", (int)fun->expression.params_count, paramcount);
870             return false;
871         }
872     }
873
874     return true;
875 }
876
877 static bool parser_close_paren(parser_t *parser, shunt *sy, bool functions_only)
878 {
879     if (!sy->ops_count) {
880         parseerror(parser, "unmatched closing paren");
881         return false;
882     }
883     if (sy->ops[sy->ops_count-1].paren == 1) {
884         parseerror(parser, "empty parenthesis expression");
885         return false;
886     }
887     while (sy->ops_count) {
888         if (sy->ops[sy->ops_count-1].paren == 'f') {
889             if (!parser_close_call(parser, sy))
890                 return false;
891             break;
892         }
893         if (sy->ops[sy->ops_count-1].paren == 1) {
894             sy->ops_count--;
895             return !functions_only;
896         }
897         if (!parser_sy_pop(parser, sy))
898             return false;
899     }
900     return true;
901 }
902
903 static ast_expression* parser_expression_leave(parser_t *parser, bool stopatcomma)
904 {
905     ast_expression *expr = NULL;
906     shunt sy;
907     bool wantop = false;
908     bool gotmemberof = false;
909
910     /* count the parens because an if starts with one, so the
911      * end of a condition is an unmatched closing paren
912      */
913     int parens = 0;
914
915     MEM_VECTOR_INIT(&sy, out);
916     MEM_VECTOR_INIT(&sy, ops);
917
918     while (true)
919     {
920         if (gotmemberof)
921             gotmemberof = false;
922         else
923             parser->memberof = 0;
924         if (!wantop)
925         {
926             bool nextwant = true;
927             if (parser->tok == TOKEN_IDENT)
928             {
929                 /* variable */
930                 ast_expression *var;
931                 if (opts_standard == COMPILER_GMQCC)
932                 {
933                     if (parser->memberof == TYPE_ENTITY)
934                         var = parser_find_field(parser, parser_tokval(parser));
935                     else if (parser->memberof == TYPE_VECTOR)
936                     {
937                         parseerror(parser, "TODO: implement effective vector member access");
938                         goto onerr;
939                     }
940                     else if (parser->memberof) {
941                         parseerror(parser, "namespace for member not found");
942                         goto onerr;
943                     }
944                     else
945                         var = parser_find_var(parser, parser_tokval(parser));
946                 } else {
947                     var = parser_find_var(parser, parser_tokval(parser));
948                     if (!var)
949                         var = parser_find_field(parser, parser_tokval(parser));
950                 }
951                 if (!var) {
952                     parseerror(parser, "unexpected ident: %s", parser_tokval(parser));
953                     goto onerr;
954                 }
955                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), var))) {
956                     parseerror(parser, "out of memory");
957                     goto onerr;
958                 }
959                 DEBUGSHUNTDO(printf("push %s\n", parser_tokval(parser)));
960             }
961             else if (parser->tok == TOKEN_FLOATCONST) {
962                 ast_value *val = parser_const_float(parser, (parser_token(parser)->constval.f));
963                 if (!val)
964                     return false;
965                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
966                     parseerror(parser, "out of memory");
967                     goto onerr;
968                 }
969                 DEBUGSHUNTDO(printf("push %g\n", parser_token(parser)->constval.f));
970             }
971             else if (parser->tok == TOKEN_INTCONST) {
972                 ast_value *val = parser_const_float(parser, (double)(parser_token(parser)->constval.i));
973                 if (!val)
974                     return false;
975                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
976                     parseerror(parser, "out of memory");
977                     goto onerr;
978                 }
979                 DEBUGSHUNTDO(printf("push %i\n", parser_token(parser)->constval.i));
980             }
981             else if (parser->tok == TOKEN_STRINGCONST) {
982                 ast_value *val = parser_const_string(parser, parser_tokval(parser));
983                 if (!val)
984                     return false;
985                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
986                     parseerror(parser, "out of memory");
987                     goto onerr;
988                 }
989                 DEBUGSHUNTDO(printf("push string\n"));
990             }
991             else if (parser->tok == TOKEN_VECTORCONST) {
992                 ast_value *val = parser_const_vector(parser, parser_token(parser)->constval.v);
993                 if (!val)
994                     return false;
995                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
996                     parseerror(parser, "out of memory");
997                     goto onerr;
998                 }
999                 DEBUGSHUNTDO(printf("push '%g %g %g'\n",
1000                                     parser_token(parser)->constval.v.x,
1001                                     parser_token(parser)->constval.v.y,
1002                                     parser_token(parser)->constval.v.z));
1003             }
1004             else if (parser->tok == '(') {
1005                 ++parens;
1006                 nextwant = false; /* not expecting an operator next */
1007                 if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), 1, 0))) {
1008                     parseerror(parser, "out of memory");
1009                     goto onerr;
1010                 }
1011                 DEBUGSHUNTDO(printf("push (\n"));
1012             }
1013             else if (parser->tok == ')') {
1014                 DEBUGSHUNTDO(printf("do[nop] )\n"));
1015                 --parens;
1016                 if (parens < 0)
1017                     break;
1018                 /* allowed for function calls */
1019                 if (!parser_close_paren(parser, &sy, true))
1020                     goto onerr;
1021             }
1022             else {
1023                 /* TODO: prefix operators */
1024                 parseerror(parser, "expected statement");
1025                 goto onerr;
1026             }
1027             wantop = nextwant;
1028             parser->lex->flags.noops = !wantop;
1029         } else {
1030             bool nextwant = false;
1031             if (parser->tok == '(') {
1032                 DEBUGSHUNTDO(printf("push (\n"));
1033                 ++parens;
1034                 /* we expected an operator, this is the function-call operator */
1035                 if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), 'f', sy.out_count-1))) {
1036                     parseerror(parser, "out of memory");
1037                     goto onerr;
1038                 }
1039             }
1040             else if (parser->tok == ')') {
1041                 DEBUGSHUNTDO(printf("do[op] )\n"));
1042                 --parens;
1043                 if (parens < 0)
1044                     break;
1045                 /* we do expect an operator next */
1046                 /* closing an opening paren */
1047                 if (!parser_close_paren(parser, &sy, false))
1048                     goto onerr;
1049                 nextwant = true;
1050             }
1051             else if (parser->tok != TOKEN_OPERATOR) {
1052                 parseerror(parser, "expected operator or end of statement");
1053                 goto onerr;
1054             }
1055             else {
1056                 /* classify the operator */
1057                 /* TODO: suffix operators */
1058                 const oper_info *op;
1059                 const oper_info *olast = NULL;
1060                 size_t o;
1061                 for (o = 0; o < operator_count; ++o) {
1062                     if (!(operators[o].flags & OP_PREFIX) &&
1063                         !(operators[o].flags & OP_SUFFIX) && /* remove this */
1064                         !strcmp(parser_tokval(parser), operators[o].op))
1065                     {
1066                         break;
1067                     }
1068                 }
1069                 if (o == operator_count) {
1070                     /* no operator found... must be the end of the statement */
1071                     break;
1072                 }
1073                 /* found an operator */
1074                 op = &operators[o];
1075
1076                 /* when declaring variables, a comma starts a new variable */
1077                 if (op->id == opid1(',') && !parens && stopatcomma)
1078                     break;
1079
1080                 if (op->id == opid1('.')) {
1081                     /* for gmqcc standard: open up the namespace of the previous type */
1082                     ast_expression *prevex = sy.out[sy.out_count-1].out;
1083                     if (!prevex) {
1084                         parseerror(parser, "unexpected member operator");
1085                         goto onerr;
1086                     }
1087                     if (prevex->expression.vtype == TYPE_ENTITY)
1088                         parser->memberof = TYPE_ENTITY;
1089                     else if (prevex->expression.vtype == TYPE_VECTOR)
1090                         parser->memberof = TYPE_VECTOR;
1091                     else {
1092                         parseerror(parser, "type error: type has no members");
1093                         goto onerr;
1094                     }
1095                     gotmemberof = true;
1096                 }
1097
1098                 if (sy.ops_count && !sy.ops[sy.ops_count-1].paren)
1099                     olast = &operators[sy.ops[sy.ops_count-1].etype-1];
1100
1101                 while (olast && (
1102                         (op->prec < olast->prec) ||
1103                         (op->assoc == ASSOC_LEFT && op->prec <= olast->prec) ) )
1104                 {
1105                     if (!parser_sy_pop(parser, &sy))
1106                         goto onerr;
1107                     if (sy.ops_count && !sy.ops[sy.ops_count-1].paren)
1108                         olast = &operators[sy.ops[sy.ops_count-1].etype-1];
1109                     else
1110                         olast = NULL;
1111                 }
1112
1113                 DEBUGSHUNTDO(printf("push operator %s\n", op->op));
1114                 if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
1115                     goto onerr;
1116             }
1117             wantop = nextwant;
1118             parser->lex->flags.noops = !wantop;
1119         }
1120         if (!parser_next(parser)) {
1121             goto onerr;
1122         }
1123         if (parser->tok == ';') {
1124             break;
1125         }
1126     }
1127
1128     while (sy.ops_count) {
1129         if (!parser_sy_pop(parser, &sy))
1130             goto onerr;
1131     }
1132
1133     parser->lex->flags.noops = true;
1134     if (!sy.out_count) {
1135         parseerror(parser, "empty expression");
1136         expr = NULL;
1137     } else
1138         expr = sy.out[0].out;
1139     MEM_VECTOR_CLEAR(&sy, out);
1140     MEM_VECTOR_CLEAR(&sy, ops);
1141     DEBUGSHUNTDO(printf("shut done\n"));
1142     return expr;
1143
1144 onerr:
1145     parser->lex->flags.noops = true;
1146     MEM_VECTOR_CLEAR(&sy, out);
1147     MEM_VECTOR_CLEAR(&sy, ops);
1148     return NULL;
1149 }
1150
1151 static ast_expression* parser_expression(parser_t *parser, bool stopatcomma)
1152 {
1153     ast_expression *e = parser_expression_leave(parser, stopatcomma);
1154     if (!e)
1155         return NULL;
1156     if (!parser_next(parser)) {
1157         ast_delete(e);
1158         return NULL;
1159     }
1160     return e;
1161 }
1162
1163 static bool parser_parse_if(parser_t *parser, ast_block *block, ast_expression **out)
1164 {
1165     ast_ifthen *ifthen;
1166     ast_expression *cond, *ontrue, *onfalse = NULL;
1167
1168     lex_ctx ctx = parser_ctx(parser);
1169
1170     /* skip the 'if' and check for opening paren */
1171     if (!parser_next(parser) || parser->tok != '(') {
1172         parseerror(parser, "expected 'if' condition in parenthesis");
1173         return false;
1174     }
1175     /* parse into the expression */
1176     if (!parser_next(parser)) {
1177         parseerror(parser, "expected 'if' condition after opening paren");
1178         return false;
1179     }
1180     /* parse the condition */
1181     cond = parser_expression_leave(parser, false);
1182     if (!cond)
1183         return false;
1184     /* closing paren */
1185     if (parser->tok != ')') {
1186         parseerror(parser, "expected closing paren after 'if' condition");
1187         ast_delete(cond);
1188         return false;
1189     }
1190     /* parse into the 'then' branch */
1191     if (!parser_next(parser)) {
1192         parseerror(parser, "expected statement for on-true branch of 'if'");
1193         ast_delete(cond);
1194         return false;
1195     }
1196     ontrue = parser_parse_statement_or_block(parser);
1197     if (!ontrue) {
1198         ast_delete(cond);
1199         return false;
1200     }
1201     /* check for an else */
1202     if (!strcmp(parser_tokval(parser), "else")) {
1203         /* parse into the 'else' branch */
1204         if (!parser_next(parser)) {
1205             parseerror(parser, "expected on-false branch after 'else'");
1206             ast_delete(ontrue);
1207             ast_delete(cond);
1208             return false;
1209         }
1210         onfalse = parser_parse_statement_or_block(parser);
1211         if (!onfalse) {
1212             ast_delete(ontrue);
1213             ast_delete(cond);
1214             return false;
1215         }
1216     }
1217
1218     ifthen = ast_ifthen_new(ctx, cond, ontrue, onfalse);
1219     *out = (ast_expression*)ifthen;
1220     return true;
1221 }
1222
1223 static bool parser_parse_while(parser_t *parser, ast_block *block, ast_expression **out)
1224 {
1225     ast_loop *aloop;
1226     ast_expression *cond, *ontrue;
1227
1228     lex_ctx ctx = parser_ctx(parser);
1229
1230     /* skip the 'while' and check for opening paren */
1231     if (!parser_next(parser) || parser->tok != '(') {
1232         parseerror(parser, "expected 'while' condition in parenthesis");
1233         return false;
1234     }
1235     /* parse into the expression */
1236     if (!parser_next(parser)) {
1237         parseerror(parser, "expected 'while' condition after opening paren");
1238         return false;
1239     }
1240     /* parse the condition */
1241     cond = parser_expression_leave(parser, false);
1242     if (!cond)
1243         return false;
1244     /* closing paren */
1245     if (parser->tok != ')') {
1246         parseerror(parser, "expected closing paren after 'while' condition");
1247         ast_delete(cond);
1248         return false;
1249     }
1250     /* parse into the 'then' branch */
1251     if (!parser_next(parser)) {
1252         parseerror(parser, "expected while-loop body");
1253         ast_delete(cond);
1254         return false;
1255     }
1256     ontrue = parser_parse_statement_or_block(parser);
1257     if (!ontrue) {
1258         ast_delete(cond);
1259         return false;
1260     }
1261
1262     aloop = ast_loop_new(ctx, NULL, cond, NULL, NULL, ontrue);
1263     *out = (ast_expression*)aloop;
1264     return true;
1265 }
1266
1267 static bool parser_parse_dowhile(parser_t *parser, ast_block *block, ast_expression **out)
1268 {
1269     ast_loop *aloop;
1270     ast_expression *cond, *ontrue;
1271
1272     lex_ctx ctx = parser_ctx(parser);
1273
1274     /* skip the 'do' and get the body */
1275     if (!parser_next(parser)) {
1276         parseerror(parser, "expected loop body");
1277         return false;
1278     }
1279     ontrue = parser_parse_statement_or_block(parser);
1280     if (!ontrue)
1281         return false;
1282
1283     /* expect the "while" */
1284     if (parser->tok != TOKEN_KEYWORD ||
1285         strcmp(parser_tokval(parser), "while"))
1286     {
1287         parseerror(parser, "expected 'while' and condition");
1288         ast_delete(ontrue);
1289         return false;
1290     }
1291
1292     /* skip the 'while' and check for opening paren */
1293     if (!parser_next(parser) || parser->tok != '(') {
1294         parseerror(parser, "expected 'while' condition in parenthesis");
1295         ast_delete(ontrue);
1296         return false;
1297     }
1298     /* parse into the expression */
1299     if (!parser_next(parser)) {
1300         parseerror(parser, "expected 'while' condition after opening paren");
1301         ast_delete(ontrue);
1302         return false;
1303     }
1304     /* parse the condition */
1305     cond = parser_expression_leave(parser, false);
1306     if (!cond)
1307         return false;
1308     /* closing paren */
1309     if (parser->tok != ')') {
1310         parseerror(parser, "expected closing paren after 'while' condition");
1311         ast_delete(ontrue);
1312         ast_delete(cond);
1313         return false;
1314     }
1315     /* parse on */
1316     if (!parser_next(parser) || parser->tok != ';') {
1317         parseerror(parser, "expected semicolon after condition");
1318         ast_delete(ontrue);
1319         ast_delete(cond);
1320         return false;
1321     }
1322
1323     if (!parser_next(parser)) {
1324         parseerror(parser, "parse error");
1325         ast_delete(ontrue);
1326         ast_delete(cond);
1327         return false;
1328     }
1329
1330     aloop = ast_loop_new(ctx, NULL, NULL, cond, NULL, ontrue);
1331     *out = (ast_expression*)aloop;
1332     return true;
1333 }
1334
1335 static bool parser_parse_for(parser_t *parser, ast_block *block, ast_expression **out)
1336 {
1337     ast_loop *aloop;
1338     ast_expression *initexpr, *cond, *increment, *ontrue;
1339     size_t oldblocklocal;
1340
1341     lex_ctx ctx = parser_ctx(parser);
1342
1343     oldblocklocal = parser->blocklocal;
1344     parser->blocklocal = parser->locals_count;
1345
1346     initexpr  = NULL;
1347     cond      = NULL;
1348     increment = NULL;
1349     ontrue    = NULL;
1350
1351     /* skip the 'while' and check for opening paren */
1352     if (!parser_next(parser) || parser->tok != '(') {
1353         parseerror(parser, "expected 'for' expressions in parenthesis");
1354         goto onerr;
1355     }
1356     /* parse into the expression */
1357     if (!parser_next(parser)) {
1358         parseerror(parser, "expected 'for' initializer after opening paren");
1359         goto onerr;
1360     }
1361
1362     if (parser->tok == TOKEN_TYPENAME) {
1363         if (opts_standard != COMPILER_GMQCC) {
1364             if (parsewarning(parser, WARN_EXTENSIONS,
1365                              "current standard does not allow variable declarations in for-loop initializers"))
1366                 goto onerr;
1367         }
1368
1369         parseerror(parser, "TODO: assignment of new variables to be non-const");
1370         goto onerr;
1371         if (!parser_variable(parser, block))
1372             goto onerr;
1373     }
1374     else if (parser->tok != ';')
1375     {
1376         initexpr = parser_expression_leave(parser, false);
1377         if (!initexpr)
1378             goto onerr;
1379     }
1380
1381     /* move on to condition */
1382     if (parser->tok != ';') {
1383         parseerror(parser, "expected semicolon after for-loop initializer");
1384         goto onerr;
1385     }
1386     if (!parser_next(parser)) {
1387         parseerror(parser, "expected for-loop condition");
1388         goto onerr;
1389     }
1390
1391     /* parse the condition */
1392     if (parser->tok != ';') {
1393         cond = parser_expression_leave(parser, false);
1394         if (!cond)
1395             goto onerr;
1396     }
1397
1398     /* move on to incrementor */
1399     if (parser->tok != ';') {
1400         parseerror(parser, "expected semicolon after for-loop initializer");
1401         goto onerr;
1402     }
1403     if (!parser_next(parser)) {
1404         parseerror(parser, "expected for-loop condition");
1405         goto onerr;
1406     }
1407
1408     /* parse the incrementor */
1409     if (parser->tok != ')') {
1410         increment = parser_expression_leave(parser, false);
1411         if (!increment)
1412             goto onerr;
1413     }
1414
1415     /* closing paren */
1416     if (parser->tok != ')') {
1417         parseerror(parser, "expected closing paren after 'for-loop' incrementor");
1418         goto onerr;
1419     }
1420     /* parse into the 'then' branch */
1421     if (!parser_next(parser)) {
1422         parseerror(parser, "expected for-loop body");
1423         goto onerr;
1424     }
1425     ontrue = parser_parse_statement_or_block(parser);
1426     if (!ontrue) {
1427         goto onerr;
1428     }
1429
1430     aloop = ast_loop_new(ctx, initexpr, cond, NULL, increment, ontrue);
1431     *out = (ast_expression*)aloop;
1432
1433     while (parser->locals_count > parser->blocklocal)
1434         parser_pop_local(parser);
1435     parser->blocklocal = oldblocklocal;
1436     return true;
1437 onerr:
1438     if (initexpr)  ast_delete(initexpr);
1439     if (cond)      ast_delete(cond);
1440     if (increment) ast_delete(increment);
1441     while (parser->locals_count > parser->blocklocal)
1442         parser_pop_local(parser);
1443     parser->blocklocal = oldblocklocal;
1444     return false;
1445 }
1446
1447 static bool parser_parse_statement(parser_t *parser, ast_block *block, ast_expression **out)
1448 {
1449     if (parser->tok == TOKEN_TYPENAME)
1450     {
1451         /* local variable */
1452         if (!block) {
1453             parseerror(parser, "cannot declare a variable from here");
1454             return false;
1455         }
1456         if (opts_standard == COMPILER_QCC) {
1457             if (parsewarning(parser, WARN_EXTENSIONS, "missing 'local' keyword when declaring a local variable"))
1458                 return false;
1459         }
1460         if (!parser_variable(parser, block))
1461             return false;
1462         *out = NULL;
1463         return true;
1464     }
1465     else if (parser->tok == TOKEN_KEYWORD)
1466     {
1467         if (!strcmp(parser_tokval(parser), "local"))
1468         {
1469             if (!block) {
1470                 parseerror(parser, "cannot declare a local variable here");
1471                 return false;
1472             }
1473             if (!parser_next(parser)) {
1474                 parseerror(parser, "expected variable declaration");
1475                 return false;
1476             }
1477             if (!parser_variable(parser, block))
1478                 return false;
1479             *out = NULL;
1480             return true;
1481         }
1482         else if (!strcmp(parser_tokval(parser), "return"))
1483         {
1484             ast_expression *exp = NULL;
1485             ast_return     *ret = NULL;
1486             ast_value      *expected = parser->function->vtype;
1487
1488             if (!parser_next(parser)) {
1489                 parseerror(parser, "expected return expression");
1490                 return false;
1491             }
1492
1493             if (parser->tok != ';') {
1494                 exp = parser_expression(parser, false);
1495                 if (!exp)
1496                     return false;
1497
1498                 if (exp->expression.vtype != expected->expression.next->expression.vtype) {
1499                     parseerror(parser, "return with invalid expression");
1500                 }
1501
1502                 ret = ast_return_new(exp->expression.node.context, exp);
1503                 if (!ret) {
1504                     ast_delete(exp);
1505                     return false;
1506                 }
1507
1508                 *out = (ast_expression*)ret;
1509             } else if (!parser_next(parser)) {
1510                 parseerror(parser, "expected semicolon");
1511                 if (expected->expression.next->expression.vtype != TYPE_VOID) {
1512                     parseerror(parser, "return without value");
1513                 }
1514             }
1515             return true;
1516         }
1517         else if (!strcmp(parser_tokval(parser), "if"))
1518         {
1519             return parser_parse_if(parser, block, out);
1520         }
1521         else if (!strcmp(parser_tokval(parser), "while"))
1522         {
1523             return parser_parse_while(parser, block, out);
1524         }
1525         else if (!strcmp(parser_tokval(parser), "do"))
1526         {
1527             return parser_parse_dowhile(parser, block, out);
1528         }
1529         else if (!strcmp(parser_tokval(parser), "for"))
1530         {
1531             if (opts_standard == COMPILER_QCC) {
1532                 if (parsewarning(parser, WARN_EXTENSIONS, "for loops are not recognized in the original Quake C standard, to enable try an alternate standard --std=?"))
1533                     return false;
1534             }
1535             return parser_parse_for(parser, block, out);
1536         }
1537         parseerror(parser, "Unexpected keyword");
1538         return false;
1539     }
1540     else if (parser->tok == '{')
1541     {
1542         ast_block *inner;
1543         inner = parser_parse_block(parser);
1544         if (!inner)
1545             return false;
1546         *out = (ast_expression*)inner;
1547         return true;
1548     }
1549     else
1550     {
1551         ast_expression *exp = parser_expression(parser, false);
1552         if (!exp)
1553             return false;
1554         *out = exp;
1555         return true;
1556     }
1557 }
1558
1559 static void parser_pop_local(parser_t *parser)
1560 {
1561     parser->locals_count--;
1562     mem_d(parser->locals[parser->locals_count].name);
1563 }
1564
1565 static ast_block* parser_parse_block(parser_t *parser)
1566 {
1567     size_t oldblocklocal;
1568     ast_block *block = NULL;
1569
1570     oldblocklocal = parser->blocklocal;
1571     parser->blocklocal = parser->locals_count;
1572
1573     if (!parser_next(parser)) { /* skip the '{' */
1574         parseerror(parser, "expected function body");
1575         goto cleanup;
1576     }
1577
1578     block = ast_block_new(parser_ctx(parser));
1579
1580     while (parser->tok != TOKEN_EOF && parser->tok < TOKEN_ERROR)
1581     {
1582         ast_expression *expr;
1583         if (parser->tok == '}')
1584             break;
1585
1586         if (!parser_parse_statement(parser, block, &expr)) {
1587             ast_block_delete(block);
1588             block = NULL;
1589             goto cleanup;
1590         }
1591         if (!expr)
1592             continue;
1593         if (!ast_block_exprs_add(block, expr)) {
1594             ast_delete(expr);
1595             ast_block_delete(block);
1596             block = NULL;
1597             goto cleanup;
1598         }
1599     }
1600
1601     if (parser->tok != '}') {
1602         ast_block_delete(block);
1603         block = NULL;
1604     } else {
1605         (void)parser_next(parser);
1606     }
1607
1608 cleanup:
1609     while (parser->locals_count > parser->blocklocal)
1610         parser_pop_local(parser);
1611     parser->blocklocal = oldblocklocal;
1612     /* unroll the local vector */
1613     return block;
1614 }
1615
1616 static ast_expression* parser_parse_statement_or_block(parser_t *parser)
1617 {
1618     ast_expression *expr;
1619     if (parser->tok == '{')
1620         return (ast_expression*)parser_parse_block(parser);
1621     if (!parser_parse_statement(parser, NULL, &expr))
1622         return NULL;
1623     return expr;
1624 }
1625
1626 static bool parser_variable(parser_t *parser, ast_block *localblock)
1627 {
1628     bool          isfunc = false;
1629     ast_function *func = NULL;
1630     lex_ctx       ctx;
1631     ast_value    *var;
1632     varentry_t    varent;
1633     ast_expression *olddecl;
1634
1635     int basetype = parser_token(parser)->constval.t;
1636
1637     while (true)
1638     {
1639         if (!parser_next(parser)) { /* skip basetype or comma */
1640             parseerror(parser, "expected variable declaration");
1641             return false;
1642         }
1643
1644         olddecl = NULL;
1645         isfunc  = false;
1646         func    = NULL;
1647         ctx = parser_ctx(parser);
1648         var = parser_parse_type(parser, basetype, &isfunc);
1649
1650         if (!var)
1651             return false;
1652
1653         if (parser->tok != TOKEN_IDENT) {
1654             parseerror(parser, "expected variable name\n");
1655             return false;
1656         }
1657
1658         if (!isfunc) {
1659             if (!localblock && (olddecl = parser_find_global(parser, parser_tokval(parser)))) {
1660                 ast_value_delete(var);
1661                 parseerror(parser, "global %s already declared here: %s:%i\n",
1662                            parser_tokval(parser), ast_ctx(olddecl).file, (int)ast_ctx(olddecl).line);
1663                 return false;
1664             }
1665
1666             if (localblock && parser_find_local(parser, parser_tokval(parser), parser->blocklocal)) {
1667                 ast_value_delete(var);
1668                 parseerror(parser, "local %s already declared here: %s:%i\n",
1669                            parser_tokval(parser), ast_ctx(olddecl).file, (int)ast_ctx(olddecl).line);
1670                 return false;
1671             }
1672         }
1673
1674         if (!ast_value_set_name(var, parser_tokval(parser))) {
1675             parseerror(parser, "failed to set variable name\n");
1676             ast_value_delete(var);
1677             return false;
1678         }
1679
1680         if (isfunc) {
1681             /* a function was defined */
1682             ast_value *fval;
1683             ast_value *proto = NULL;
1684
1685             if (!localblock)
1686                 olddecl = parser_find_global(parser, parser_tokval(parser));
1687             else
1688                 olddecl = parser_find_local(parser, parser_tokval(parser), parser->blocklocal);
1689
1690             if (olddecl) {
1691                 /* we had a prototype */
1692                 if (!ast_istype(olddecl, ast_value)) {
1693                     /* theoretically not possible you think?
1694                      * well:
1695                      * vector v;
1696                      * void() v_x = {}
1697                      * got it?
1698                      */
1699                     parseerror(parser, "cannot declare a function with the same name as a vector's member: %s",
1700                                parser_tokval(parser));
1701                     ast_value_delete(var);
1702                     return false;
1703                 }
1704
1705                 proto = (ast_value*)olddecl;
1706             }
1707
1708             /* turn var into a value of TYPE_FUNCTION, with the old var
1709              * as return type
1710              */
1711             fval = ast_value_new(ctx, var->name, TYPE_FUNCTION);
1712             func = ast_function_new(ctx, var->name, fval);
1713             if (!fval || !func) {
1714                 ast_value_delete(var);
1715                 if (fval) ast_value_delete(fval);
1716                 if (func) ast_function_delete(func);
1717                 return false;
1718             }
1719
1720             fval->expression.next = (ast_expression*)var;
1721             MEM_VECTOR_MOVE(&var->expression, params, &fval->expression, params);
1722
1723             /* we compare the type late here, but it's easier than
1724              * messing with the parameter-vector etc. earlier
1725              */
1726             if (proto) {
1727                 if (!ast_compare_type((ast_expression*)proto, (ast_expression*)fval)) {
1728                     parseerror(parser, "conflicting types for `%s`, previous declaration was here: %s:%i",
1729                                proto->name,
1730                                ast_ctx(proto).file, ast_ctx(proto).line);
1731                     ast_function_delete(func);
1732                     ast_value_delete(fval);
1733                     return false;
1734                 }
1735                 ast_function_delete(func);
1736                 ast_value_delete(fval);
1737                 var = proto;
1738                 func = var->constval.vfunc;
1739             }
1740             else
1741             {
1742                 if (!parser_t_functions_add(parser, func)) {
1743                     ast_function_delete(func);
1744                     ast_value_delete(fval);
1745                     return false;
1746                 }
1747             }
1748
1749             var = fval;
1750         }
1751
1752         varent.name = util_strdup(var->name);
1753         varent.var = (ast_expression*)var;
1754         if (var->expression.vtype == TYPE_VECTOR)
1755         {
1756             size_t len = strlen(varent.name);
1757             varentry_t vx, vy, vz;
1758             vx.var = (ast_expression*)ast_member_new(var->expression.node.context, (ast_expression*)var, 0);
1759             vy.var = (ast_expression*)ast_member_new(var->expression.node.context, (ast_expression*)var, 1);
1760             vz.var = (ast_expression*)ast_member_new(var->expression.node.context, (ast_expression*)var, 2);
1761             vx.name = (char*)mem_a(len+3);
1762             vy.name = (char*)mem_a(len+3);
1763             vz.name = (char*)mem_a(len+3);
1764             memcpy(vx.name, varent.name, len);
1765             memcpy(vy.name, varent.name, len);
1766             memcpy(vz.name, varent.name, len);
1767             vx.name[len] = vy.name[len] = vz.name[len] = '_';
1768             vx.name[len+1] = 'x';
1769             vy.name[len+1] = 'y';
1770             vz.name[len+1] = 'z';
1771             vx.name[len+2] = vy.name[len+2] = vz.name[len+2] = 0;
1772
1773             if (!localblock) {
1774                 (void)!parser_t_globals_add(parser, varent);
1775                 (void)!parser_t_globals_add(parser, vx);
1776                 (void)!parser_t_globals_add(parser, vy);
1777                 (void)!parser_t_globals_add(parser, vz);
1778             } else {
1779                 (void)!parser_t_locals_add(parser, varent);
1780                 (void)!parser_t_locals_add(parser, vx);
1781                 (void)!parser_t_locals_add(parser, vy);
1782                 (void)!parser_t_locals_add(parser, vz);
1783             }
1784         }
1785         else
1786         {
1787             if ( (!localblock && !parser_t_globals_add(parser, varent)) ||
1788                  ( localblock && !parser_t_locals_add(parser, varent)) )
1789             {
1790                 ast_value_delete(var);
1791                 return false;
1792             }
1793         }
1794         if (localblock && !ast_block_locals_add(localblock, var))
1795         {
1796             parser_pop_local(parser);
1797             ast_value_delete(var);
1798             return false;
1799         }
1800
1801         if (!parser_next(parser)) {
1802             ast_value_delete(var);
1803             return false;
1804         }
1805
1806         if (parser->tok == ';') {
1807             if (!parser_next(parser))
1808                 return parser->tok == TOKEN_EOF;
1809             return true;
1810         }
1811
1812         if (parser->tok == ',') {
1813             /* another var */
1814             continue;
1815         }
1816
1817         if (parser->tok != '=') {
1818             parseerror(parser, "expected '=' or ';'");
1819             return false;
1820         }
1821
1822         if (!parser_next(parser))
1823             return false;
1824
1825         if (parser->tok == '#') {
1826             if (localblock) {
1827                 parseerror(parser, "cannot declare builtins within functions");
1828                 return false;
1829             }
1830             if (!isfunc || !func) {
1831                 parseerror(parser, "unexpected builtin number, '%s' is not a function", var->name);
1832                 return false;
1833             }
1834             if (!parser_next(parser)) {
1835                 parseerror(parser, "expected builtin number");
1836                 return false;
1837             }
1838             if (parser->tok != TOKEN_INTCONST) {
1839                 parseerror(parser, "builtin number must be an integer constant");
1840                 return false;
1841             }
1842             if (parser_token(parser)->constval.i <= 0) {
1843                 parseerror(parser, "builtin number must be positive integer greater than zero");
1844                 return false;
1845             }
1846
1847             func->builtin = -parser_token(parser)->constval.i;
1848
1849             if (!parser_next(parser))
1850                 return false;
1851         } else if (parser->tok == '{') {
1852             /* function body */
1853             ast_block *block;
1854             ast_function *old = parser->function;
1855
1856             if (localblock) {
1857                 parseerror(parser, "cannot declare functions within functions");
1858                 return false;
1859             }
1860
1861             parser->function = func;
1862             block = parser_parse_block(parser);
1863             parser->function = old;
1864
1865             if (!block)
1866                 return false;
1867
1868             if (!ast_function_blocks_add(func, block)) {
1869                 ast_block_delete(block);
1870                 return false;
1871             }
1872
1873             if (parser->tok == ';')
1874                 return parser_next(parser) || parser->tok == TOKEN_EOF;
1875             else if (opts_standard == COMPILER_QCC)
1876                 parseerror(parser, "missing semicolon after function body (mandatory with -std=qcc)");
1877             return true;
1878         } else {
1879             ast_expression *cexp;
1880             ast_value      *cval;
1881
1882             cexp = parser_expression_leave(parser, true);
1883             cval = (ast_value*)cexp;
1884             if (!ast_istype(cval, ast_value) || !cval->isconst)
1885                 parseerror(parser, "cannot initialize a global constant variable with a non-constant expression");
1886             else
1887             {
1888                 var->isconst = true;
1889                 memcpy(&var->constval, &cval->constval, sizeof(var->constval));
1890                 memset(&cval->constval, 0, sizeof(cval->constval));
1891                 ast_unref(cval);
1892             }
1893         }
1894
1895         if (parser->tok == ',') {
1896             /* another */
1897             continue;
1898         }
1899
1900         if (parser->tok != ';') {
1901             parseerror(parser, "missing semicolon");
1902             return false;
1903         }
1904
1905         (void)parser_next(parser);
1906
1907         return true;
1908     }
1909 }
1910
1911 static bool parser_do(parser_t *parser)
1912 {
1913     if (parser->tok == TOKEN_TYPENAME)
1914     {
1915         return parser_variable(parser, NULL);
1916     }
1917     else if (parser->tok == TOKEN_KEYWORD)
1918     {
1919         /* handle 'var' and 'const' */
1920         return false;
1921     }
1922     else if (parser->tok == '.')
1923     {
1924         ast_value *var;
1925         ast_value *fld;
1926         bool       isfunc = false;
1927         int        basetype;
1928         lex_ctx    ctx = parser_ctx(parser);
1929         varentry_t varent;
1930
1931         /* entity-member declaration */
1932         if (!parser_next(parser) || parser->tok != TOKEN_TYPENAME) {
1933             parseerror(parser, "expected member variable definition");
1934             return false;
1935         }
1936
1937         /* remember the base/return type */
1938         basetype = parser_token(parser)->constval.t;
1939
1940         /* parse into the declaration */
1941         if (!parser_next(parser)) {
1942             parseerror(parser, "expected field def");
1943             return false;
1944         }
1945
1946         /* parse the field type fully */
1947         var = parser_parse_type(parser, basetype, &isfunc);
1948         if (!var)
1949             return false;
1950
1951         while (true) {
1952             /* now the field name */
1953             if (parser->tok != TOKEN_IDENT) {
1954                 parseerror(parser, "expected field name");
1955                 ast_delete(var);
1956                 return false;
1957             }
1958
1959             /* check for an existing field
1960              * in original qc we also have to check for an existing
1961              * global named like the field
1962              */
1963             if (opts_standard == COMPILER_QCC) {
1964                 if (parser_find_global(parser, parser_tokval(parser))) {
1965                     parseerror(parser, "cannot declare a field and a global of the same name with -std=qcc");
1966                     ast_delete(var);
1967                     return false;
1968                 }
1969             }
1970             if (parser_find_field(parser, parser_tokval(parser))) {
1971                 parseerror(parser, "field %s already exists", parser_tokval(parser));
1972                 ast_delete(var);
1973                 return false;
1974             }
1975
1976             /* if it was a function, turn it into a function */
1977             if (isfunc) {
1978                 ast_value *fval;
1979                 /* turn var into a value of TYPE_FUNCTION, with the old var
1980                  * as return type
1981                  */
1982                 fval = ast_value_new(ctx, var->name, TYPE_FUNCTION);
1983                 if (!fval) {
1984                     ast_value_delete(var);
1985                     ast_value_delete(fval);
1986                     return false;
1987                 }
1988
1989                 fval->expression.next = (ast_expression*)var;
1990                 MEM_VECTOR_MOVE(&var->expression, params, &fval->expression, params);
1991
1992                 var = fval;
1993             }
1994
1995             /* turn it into a field */
1996             fld = ast_value_new(ctx, parser_tokval(parser), TYPE_FIELD);
1997             fld->expression.next = (ast_expression*)var;
1998
1999             varent.var = (ast_expression*)fld;
2000             varent.name = util_strdup(fld->name);
2001             (void)!parser_t_fields_add(parser, varent);
2002
2003             if (var->expression.vtype == TYPE_VECTOR)
2004             {
2005                 /* create _x, _y and _z fields as well */
2006                 size_t len;
2007                 varentry_t vx, vy, vz;
2008
2009                 len = strlen(varent.name);
2010                 vx.var = (ast_expression*)ast_member_new(ast_ctx(fld), (ast_expression*)fld, 0);
2011                 vy.var = (ast_expression*)ast_member_new(ast_ctx(fld), (ast_expression*)fld, 1);
2012                 vz.var = (ast_expression*)ast_member_new(ast_ctx(fld), (ast_expression*)fld, 2);
2013                 vx.name = (char*)mem_a(len+3);
2014                 vy.name = (char*)mem_a(len+3);
2015                 vz.name = (char*)mem_a(len+3);
2016                 memcpy(vx.name, varent.name, len);
2017                 memcpy(vy.name, varent.name, len);
2018                 memcpy(vz.name, varent.name, len);
2019                 vx.name[len] = vy.name[len] = vz.name[len] = '_';
2020                 vx.name[len+1] = 'x';
2021                 vy.name[len+1] = 'y';
2022                 vz.name[len+1] = 'z';
2023                 vx.name[len+2] = vy.name[len+2] = vz.name[len+2] = 0;
2024                 (void)!parser_t_fields_add(parser, vx);
2025                 (void)!parser_t_fields_add(parser, vy);
2026                 (void)!parser_t_fields_add(parser, vz);
2027             }
2028
2029             if (!parser_next(parser)) {
2030                 parseerror(parser, "expected semicolon or another field name");
2031                 return false;
2032             }
2033             if (parser->tok == ';')
2034                 break;
2035             if (parser->tok != ',' || !parser_next(parser)) {
2036                 parseerror(parser, "expected semicolon or another field name");
2037                 return false;
2038             }
2039         }
2040
2041         /* skip the semicolon */
2042         if (!parser_next(parser))
2043             return parser->tok == TOKEN_EOF;
2044
2045         return true;
2046     }
2047     else
2048     {
2049         parseerror(parser, "unexpected token: %s", parser->lex->tok->value);
2050         return false;
2051     }
2052     return true;
2053 }
2054
2055 static parser_t *parser;
2056
2057 bool parser_init()
2058 {
2059     parser = (parser_t*)mem_a(sizeof(parser_t));
2060     if (!parser)
2061         return false;
2062
2063     memset(parser, 0, sizeof(*parser));
2064     return true;
2065 }
2066
2067 bool parser_compile(const char *filename)
2068 {
2069     parser->lex = lex_open(filename);
2070     if (!parser->lex) {
2071         printf("failed to open file \"%s\"\n", filename);
2072         return false;
2073     }
2074
2075     /* initial lexer/parser state */
2076     parser->lex->flags.noops = true;
2077
2078     if (parser_next(parser))
2079     {
2080         while (parser->tok != TOKEN_EOF && parser->tok < TOKEN_ERROR)
2081         {
2082             if (!parser_do(parser)) {
2083                 if (parser->tok == TOKEN_EOF)
2084                     parseerror(parser, "unexpected eof");
2085                 else if (!parser->errors)
2086                     parseerror(parser, "parse error\n");
2087                 lex_close(parser->lex);
2088                 mem_d(parser);
2089                 return false;
2090             }
2091         }
2092     }
2093
2094     lex_close(parser->lex);
2095
2096     return !parser->errors;
2097 }
2098
2099 void parser_cleanup()
2100 {
2101     size_t i;
2102     for (i = 0; i < parser->functions_count; ++i) {
2103         ast_delete(parser->functions[i]);
2104     }
2105     for (i = 0; i < parser->imm_vector_count; ++i) {
2106         ast_delete(parser->imm_vector[i]);
2107     }
2108     for (i = 0; i < parser->imm_string_count; ++i) {
2109         ast_delete(parser->imm_string[i]);
2110     }
2111     for (i = 0; i < parser->imm_float_count; ++i) {
2112         ast_delete(parser->imm_float[i]);
2113     }
2114     for (i = 0; i < parser->globals_count; ++i) {
2115         ast_delete(parser->globals[i].var);
2116         mem_d(parser->globals[i].name);
2117     }
2118     MEM_VECTOR_CLEAR(parser, globals);
2119
2120     mem_d(parser);
2121 }
2122
2123 bool parser_finish(const char *output)
2124 {
2125     size_t i;
2126     ir_builder *ir;
2127
2128     if (!parser->errors)
2129     {
2130         ir = ir_builder_new("gmqcc_out");
2131         if (!ir) {
2132             printf("failed to allocate builder\n");
2133             return false;
2134         }
2135
2136         for (i = 0; i < parser->imm_float_count; ++i) {
2137             if (!ast_global_codegen(parser->imm_float[i], ir)) {
2138                 printf("failed to generate global %s\n", parser->imm_float[i]->name);
2139                 ir_builder_delete(ir);
2140                 return false;
2141             }
2142         }
2143         for (i = 0; i < parser->imm_string_count; ++i) {
2144             if (!ast_global_codegen(parser->imm_string[i], ir)) {
2145                 printf("failed to generate global %s\n", parser->imm_string[i]->name);
2146                 ir_builder_delete(ir);
2147                 return false;
2148             }
2149         }
2150         for (i = 0; i < parser->imm_vector_count; ++i) {
2151             if (!ast_global_codegen(parser->imm_vector[i], ir)) {
2152                 printf("failed to generate global %s\n", parser->imm_vector[i]->name);
2153                 ir_builder_delete(ir);
2154                 return false;
2155             }
2156         }
2157         for (i = 0; i < parser->fields_count; ++i) {
2158             ast_value *field;
2159             bool isconst;
2160             if (!ast_istype(parser->fields[i].var, ast_value))
2161                 continue;
2162             field = (ast_value*)parser->fields[i].var;
2163             isconst = field->isconst;
2164             field->isconst = false;
2165             if (!ast_global_codegen((ast_value*)field, ir)) {
2166                 printf("failed to generate field %s\n", field->name);
2167                 ir_builder_delete(ir);
2168                 return false;
2169             }
2170             if (isconst) {
2171                 ir_value *ifld;
2172                 ast_expression *subtype;
2173                 field->isconst = true;
2174                 subtype = field->expression.next;
2175                 ifld = ir_builder_create_field(ir, field->name, subtype->expression.vtype);
2176                 if (subtype->expression.vtype == TYPE_FIELD)
2177                     ifld->fieldtype = subtype->expression.next->expression.vtype;
2178                 else if (subtype->expression.vtype == TYPE_FUNCTION)
2179                     ifld->outtype = subtype->expression.next->expression.vtype;
2180                 (void)!ir_value_set_field(field->ir_v, ifld);
2181             }
2182         }
2183         for (i = 0; i < parser->globals_count; ++i) {
2184             if (!ast_istype(parser->globals[i].var, ast_value))
2185                 continue;
2186             if (!ast_global_codegen((ast_value*)(parser->globals[i].var), ir)) {
2187                 printf("failed to generate global %s\n", parser->globals[i].name);
2188                 ir_builder_delete(ir);
2189                 return false;
2190             }
2191         }
2192         for (i = 0; i < parser->functions_count; ++i) {
2193             if (!ast_function_codegen(parser->functions[i], ir)) {
2194                 printf("failed to generate function %s\n", parser->functions[i]->name);
2195                 ir_builder_delete(ir);
2196                 return false;
2197             }
2198             if (!ir_function_finalize(parser->functions[i]->ir_func)) {
2199                 printf("failed to finalize function %s\n", parser->functions[i]->name);
2200                 ir_builder_delete(ir);
2201                 return false;
2202             }
2203         }
2204
2205         if (opts_dump)
2206             ir_builder_dump(ir, printf);
2207
2208         if (!ir_builder_generate(ir, output)) {
2209             printf("*** failed to generate output file\n");
2210             ir_builder_delete(ir);
2211             return false;
2212         }
2213
2214         ir_builder_delete(ir);
2215         return true;
2216     }
2217
2218     printf("*** there were compile errors\n");
2219     return false;
2220 }