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