]> git.xonotic.org Git - xonotic/gmqcc.git/blob - parser.c
Merging master to handle vector members, fields, and members of vector fields
[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     int      fieldsize;
17
18     MEM_VECTOR_MAKE(varentry_t, globals);
19     MEM_VECTOR_MAKE(varentry_t, fields);
20     MEM_VECTOR_MAKE(ast_function*, functions);
21     MEM_VECTOR_MAKE(ast_value*, imm_float);
22     MEM_VECTOR_MAKE(ast_value*, imm_string);
23     MEM_VECTOR_MAKE(ast_value*, imm_vector);
24
25     ast_function *function;
26     MEM_VECTOR_MAKE(varentry_t, locals);
27     size_t blocklocal;
28
29     size_t errors;
30 } parser_t;
31
32 MEM_VEC_FUNCTIONS(parser_t, varentry_t, globals)
33 MEM_VEC_FUNCTIONS(parser_t, varentry_t, fields)
34 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_float)
35 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_string)
36 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_vector)
37 MEM_VEC_FUNCTIONS(parser_t, varentry_t, locals)
38 MEM_VEC_FUNCTIONS(parser_t, ast_function*, functions)
39
40 void parseerror(parser_t *parser, const char *fmt, ...)
41 {
42         va_list ap;
43
44         parser->errors++;
45
46     if (parser)
47             printf("error %s:%lu: ", parser->lex->tok->ctx.file, (unsigned long)parser->lex->tok->ctx.line);
48         else
49             printf("error: ");
50
51         va_start(ap, fmt);
52         vprintf(fmt, ap);
53         va_end(ap);
54
55         printf("\n");
56 }
57
58 bool parser_next(parser_t *parser)
59 {
60     /* lex_do kills the previous token */
61     parser->tok = lex_do(parser->lex);
62     if (parser->tok == TOKEN_EOF || parser->tok >= TOKEN_ERROR)
63         return false;
64     return true;
65 }
66
67 /* lift a token out of the parser so it's not destroyed by parser_next */
68 token *parser_lift(parser_t *parser)
69 {
70     token *tok = parser->lex->tok;
71     parser->lex->tok = NULL;
72     return tok;
73 }
74
75 #define parser_tokval(p) (p->lex->tok->value)
76 #define parser_token(p)  (p->lex->tok)
77 #define parser_ctx(p)    (p->lex->tok->ctx)
78
79 ast_value* parser_const_float(parser_t *parser, double d)
80 {
81     size_t i;
82     ast_value *out;
83     for (i = 0; i < parser->imm_float_count; ++i) {
84         if (parser->imm_float[i]->constval.vfloat == d)
85             return parser->imm_float[i];
86     }
87     out = ast_value_new(parser_ctx(parser), "#IMMEDIATE", TYPE_FLOAT);
88     out->isconst = true;
89     out->constval.vfloat = d;
90     if (!parser_t_imm_float_add(parser, out)) {
91         ast_value_delete(out);
92         return NULL;
93     }
94     return out;
95 }
96
97 ast_value* parser_const_string(parser_t *parser, const char *str)
98 {
99     size_t i;
100     ast_value *out;
101     for (i = 0; i < parser->imm_string_count; ++i) {
102         if (!strcmp(parser->imm_string[i]->constval.vstring, str))
103             return parser->imm_string[i];
104     }
105     out = ast_value_new(parser_ctx(parser), "#IMMEDIATE", TYPE_STRING);
106     out->isconst = true;
107     out->constval.vstring = util_strdup(str);
108     if (!parser_t_imm_string_add(parser, out)) {
109         ast_value_delete(out);
110         return NULL;
111     }
112     return out;
113 }
114
115 ast_value* parser_const_vector(parser_t *parser, vector v)
116 {
117     size_t i;
118     ast_value *out;
119     for (i = 0; i < parser->imm_vector_count; ++i) {
120         if (!memcmp(&parser->imm_vector[i]->constval.vvec, &v, sizeof(v)))
121             return parser->imm_vector[i];
122     }
123     out = ast_value_new(parser_ctx(parser), "#IMMEDIATE", TYPE_VECTOR);
124     out->isconst = true;
125     out->constval.vvec = v;
126     if (!parser_t_imm_vector_add(parser, out)) {
127         ast_value_delete(out);
128         return NULL;
129     }
130     return out;
131 }
132
133 ast_expression* parser_find_field(parser_t *parser, const char *name)
134 {
135     size_t i;
136     for (i = 0; i < parser->fields_count; ++i) {
137         if (!strcmp(parser->fields[i].name, name))
138             return parser->fields[i].var;
139     }
140     return NULL;
141 }
142
143 ast_expression* parser_find_global(parser_t *parser, const char *name)
144 {
145     size_t i;
146     for (i = 0; i < parser->globals_count; ++i) {
147         if (!strcmp(parser->globals[i].name, name))
148             return parser->globals[i].var;
149     }
150     return NULL;
151 }
152
153 ast_expression* parser_find_local(parser_t *parser, const char *name, size_t upto)
154 {
155     size_t i;
156     ast_value *fun;
157     for (i = parser->locals_count; i > upto;) {
158         --i;
159         if (!strcmp(parser->locals[i].name, name))
160             return parser->locals[i].var;
161     }
162     fun = parser->function->vtype;
163     for (i = 0; i < fun->expression.params_count; ++i) {
164         if (!strcmp(fun->expression.params[i]->name, name))
165             return (ast_expression*)(fun->expression.params[i]);
166     }
167     return NULL;
168 }
169
170 ast_expression* parser_find_var(parser_t *parser, const char *name)
171 {
172     ast_expression *v;
173     v         = parser_find_local(parser, name, 0);
174     if (!v) v = parser_find_global(parser, name);
175     return v;
176 }
177
178 typedef struct {
179     MEM_VECTOR_MAKE(ast_value*, p);
180 } paramlist_t;
181 MEM_VEC_FUNCTIONS(paramlist_t, ast_value*, p)
182
183 static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc)
184 {
185     paramlist_t params;
186     ast_value *var;
187     lex_ctx   ctx = parser_ctx(parser);
188     int vtype = basetype;
189     int temptype;
190     size_t i;
191
192     MEM_VECTOR_INIT(&params, p);
193
194     *isfunc = false;
195
196     if (parser->tok == '(') {
197         *isfunc = true;
198         while (true) {
199             ast_value *param;
200             bool dummy;
201
202             if (!parser_next(parser))
203                 goto on_error;
204
205             if (parser->tok == ')')
206                 break;
207
208             temptype = parser_token(parser)->constval.t;
209             if (!parser_next(parser))
210                 goto on_error;
211
212             param = parser_parse_type(parser, temptype, &dummy);
213             (void)dummy;
214
215             if (!param)
216                 goto on_error;
217
218             if (parser->tok == TOKEN_IDENT) {
219                 /* named parameter */
220                 if (!ast_value_set_name(param, parser_tokval(parser)))
221                     goto on_error;
222                 if (!parser_next(parser))
223                     goto on_error;
224             }
225
226             if (!paramlist_t_p_add(&params, param)) {
227                 parseerror(parser, "Out of memory while parsing typename");
228                 goto on_error;
229             }
230
231             if (parser->tok == ',')
232                 continue;
233             if (parser->tok == ')')
234                 break;
235             parseerror(parser, "Unexpected token");
236             goto on_error;
237         }
238         if (!parser_next(parser))
239             goto on_error;
240     }
241
242     var = ast_value_new(ctx, "<unnamed>", vtype);
243     if (!var)
244         goto on_error;
245     MEM_VECTOR_MOVE(&params, p, &var->expression, params);
246     return var;
247 on_error:
248     for (i = 0; i < params.p_count; ++i)
249         ast_value_delete(params.p[i]);
250     MEM_VECTOR_CLEAR(&params, p);
251     return NULL;
252 }
253
254 typedef struct
255 {
256     size_t etype; /* 0 = expression, others are operators */
257     int             paren;
258     size_t          off;
259     ast_expression *out;
260     ast_block      *block; /* for commas and function calls */
261     lex_ctx ctx;
262 } sy_elem;
263 typedef struct
264 {
265     MEM_VECTOR_MAKE(sy_elem, out);
266     MEM_VECTOR_MAKE(sy_elem, ops);
267 } shunt;
268 MEM_VEC_FUNCTIONS(shunt, sy_elem, out)
269 MEM_VEC_FUNCTIONS(shunt, sy_elem, ops)
270
271 static sy_elem syexp(lex_ctx ctx, ast_expression *v) {
272     sy_elem e;
273     e.etype = 0;
274     e.out   = v;
275     e.block = NULL;
276     e.ctx   = ctx;
277     e.paren = 0;
278     return e;
279 }
280
281 static sy_elem syblock(lex_ctx ctx, ast_block *v) {
282     sy_elem e;
283     e.etype = 0;
284     e.out   = (ast_expression*)v;
285     e.block = v;
286     e.ctx   = ctx;
287     e.paren = 0;
288     return e;
289 }
290
291 static sy_elem syop(lex_ctx ctx, const oper_info *op) {
292     sy_elem e;
293     e.etype = 1 + (op - operators);
294     e.out   = NULL;
295     e.block = NULL;
296     e.ctx   = ctx;
297     e.paren = 0;
298     return e;
299 }
300
301 static sy_elem syparen(lex_ctx ctx, int p, size_t off) {
302     sy_elem e;
303     e.etype = 0;
304     e.off   = off;
305     e.out   = NULL;
306     e.block = NULL;
307     e.ctx   = ctx;
308     e.paren = p;
309     return e;
310 }
311
312 static bool parser_sy_pop(parser_t *parser, shunt *sy)
313 {
314     const oper_info *op;
315     lex_ctx ctx;
316     ast_expression *out = NULL;
317     ast_expression *exprs[3];
318     ast_block      *blocks[3];
319     size_t i;
320
321     if (!sy->ops_count) {
322         parseerror(parser, "internal error: missing operator");
323         return false;
324     }
325
326     if (sy->ops[sy->ops_count-1].paren) {
327         parseerror(parser, "unmatched parenthesis");
328         return false;
329     }
330
331     op = &operators[sy->ops[sy->ops_count-1].etype - 1];
332     ctx = sy->ops[sy->ops_count-1].ctx;
333
334     if (sy->out_count < op->operands) {
335         parseerror(parser, "internal error: not enough operands: %i", sy->out_count);
336         return false;
337     }
338
339     sy->ops_count--;
340
341     sy->out_count -= op->operands;
342     for (i = 0; i < op->operands; ++i) {
343         exprs[i]  = sy->out[sy->out_count+i].out;
344         blocks[i] = sy->out[sy->out_count+i].block;
345     }
346
347     if (blocks[0] && !blocks[0]->exprs_count && op->id != opid1(',')) {
348         parseerror(parser, "internal error: operator cannot be applied on empty blocks");
349         return false;
350     }
351
352     switch (op->id)
353     {
354         default:
355             parseerror(parser, "internal error: unhandled operand");
356             return false;
357
358         case opid1(','):
359             if (blocks[0]) {
360                 if (!ast_block_exprs_add(blocks[0], exprs[1]))
361                     return false;
362             } else {
363                 blocks[0] = ast_block_new(ctx);
364                 if (!ast_block_exprs_add(blocks[0], exprs[0]) ||
365                     !ast_block_exprs_add(blocks[0], exprs[1]))
366                 {
367                     return false;
368                 }
369             }
370             if (!ast_block_set_type(blocks[0], exprs[1]))
371                 return false;
372
373             sy->out[sy->out_count++] = syblock(ctx, blocks[0]);
374             return true;
375
376         case opid1('+'):
377             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) {
378                 parseerror(parser, "Cannot add type %s and %s",
379                            type_name[exprs[0]->expression.vtype],
380                            type_name[exprs[1]->expression.vtype]);
381                 return false;
382             }
383             switch (exprs[0]->expression.vtype) {
384                 case TYPE_FLOAT:
385                     out = (ast_expression*)ast_binary_new(ctx, INSTR_ADD_F, exprs[0], exprs[1]);
386                     break;
387                 case TYPE_VECTOR:
388                     out = (ast_expression*)ast_binary_new(ctx, INSTR_ADD_V, exprs[0], exprs[1]);
389                     break;
390                 default:
391                     parseerror(parser, "Cannot add type %s and %s",
392                                type_name[exprs[0]->expression.vtype],
393                                type_name[exprs[1]->expression.vtype]);
394                     return false;
395             };
396             break;
397         case opid1('-'):
398             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) {
399                 parseerror(parser, "Cannot subtract type %s from %s",
400                            type_name[exprs[1]->expression.vtype],
401                            type_name[exprs[0]->expression.vtype]);
402                 return false;
403             }
404             switch (exprs[0]->expression.vtype) {
405                 case TYPE_FLOAT:
406                     out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_F, exprs[0], exprs[1]);
407                     break;
408                 case TYPE_VECTOR:
409                     out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_V, exprs[0], exprs[1]);
410                     break;
411                 default:
412                     parseerror(parser, "Cannot add type %s from %s",
413                                type_name[exprs[1]->expression.vtype],
414                                type_name[exprs[0]->expression.vtype]);
415                     return false;
416             };
417             break;
418         case opid1('*'):
419             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype &&
420                 exprs[0]->expression.vtype != TYPE_VECTOR &&
421                 exprs[0]->expression.vtype != TYPE_FLOAT &&
422                 exprs[1]->expression.vtype != TYPE_VECTOR &&
423                 exprs[1]->expression.vtype != TYPE_FLOAT)
424             {
425                 parseerror(parser, "Cannot multiply type %s from %s",
426                            type_name[exprs[1]->expression.vtype],
427                            type_name[exprs[0]->expression.vtype]);
428                 return false;
429             }
430             switch (exprs[0]->expression.vtype) {
431                 case TYPE_FLOAT:
432                     if (exprs[1]->expression.vtype == TYPE_VECTOR)
433                         out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_FV, exprs[0], exprs[1]);
434                     else
435                         out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_F, exprs[0], exprs[1]);
436                     break;
437                 case TYPE_VECTOR:
438                     if (exprs[1]->expression.vtype == TYPE_FLOAT)
439                         out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_VF, exprs[0], exprs[1]);
440                     else
441                         out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_V, exprs[0], exprs[1]);
442                     break;
443                 default:
444                     parseerror(parser, "Cannot add type %s from %s",
445                                type_name[exprs[1]->expression.vtype],
446                                type_name[exprs[0]->expression.vtype]);
447                     return false;
448             };
449             break;
450         case opid1('/'):
451             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
452                 exprs[0]->expression.vtype != TYPE_FLOAT)
453             {
454                 parseerror(parser, "Cannot divide types %s and %s",
455                            type_name[exprs[0]->expression.vtype],
456                            type_name[exprs[1]->expression.vtype]);
457                 return false;
458             }
459             out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]);
460             break;
461
462
463         case opid1('='):
464             out = (ast_expression*)ast_store_new(ctx,
465                                                  type_store_instr[exprs[0]->expression.vtype],
466                                                  exprs[0], exprs[1]);
467             break;
468     }
469
470     if (!out) {
471         parseerror(parser, "failed to apply operand %s", op->op);
472         return false;
473     }
474
475     sy->out[sy->out_count++] = syexp(ctx, out);
476     return true;
477 }
478
479 static bool parser_close_call(parser_t *parser, shunt *sy)
480 {
481     /* was a function call */
482     ast_expression *fun;
483     ast_call       *call;
484
485     size_t          fid;
486     size_t          paramcount;
487
488     sy->ops_count--;
489     fid = sy->ops[sy->ops_count].off;
490
491     /* out[fid] is the function
492      * everything above is parameters...
493      * 0 params = nothing
494      * 1 params = ast_expression
495      * more = ast_block
496      */
497
498     if (sy->out_count < 1 || sy->out_count <= fid) {
499         parseerror(parser, "internal error: function call needs function and parameter list...");
500         return false;
501     }
502
503     fun = sy->out[fid].out;
504
505     call = ast_call_new(sy->ops[sy->ops_count].ctx, fun);
506     if (!call) {
507         parseerror(parser, "out of memory");
508         return false;
509     }
510
511     if (fid+1 == sy->out_count) {
512         /* no arguments */
513         paramcount = 0;
514     } else if (fid+2 == sy->out_count) {
515         ast_block *params;
516         sy->out_count--;
517         params = sy->out[sy->out_count].block;
518         if (!params) {
519             /* 1 param */
520             paramcount = 1;
521             if (!ast_call_params_add(call, sy->out[sy->out_count].out)) {
522                 ast_delete(sy->out[sy->out_count].out);
523                 parseerror(parser, "out of memory");
524                 return false;
525             }
526         } else {
527             paramcount = params->exprs_count;
528             MEM_VECTOR_MOVE(params, exprs, call, params);
529             ast_delete(params);
530         }
531     } else {
532         parseerror(parser, "invalid function call");
533         return false;
534     }
535
536     /* overwrite fid, the function, with a call */
537     sy->out[fid] = syexp(call->expression.node.context, (ast_expression*)call);
538
539     if (fun->expression.vtype != TYPE_FUNCTION) {
540         parseerror(parser, "not a function");
541         return false;
542     }
543
544     if (!fun->expression.next) {
545         parseerror(parser, "could not determine function return type");
546         return false;
547     } else {
548         if (fun->expression.params_count != paramcount) {
549             parseerror(parser, "expected %i parameters, got %i", (int)fun->expression.params_count, paramcount);
550             return false;
551         }
552     }
553
554     return true;
555 }
556
557 static bool parser_close_paren(parser_t *parser, shunt *sy, bool functions_only)
558 {
559     if (!sy->ops_count) {
560         parseerror(parser, "unmatched closing paren");
561         return false;
562     }
563     if (sy->ops[sy->ops_count-1].paren == 1) {
564         parseerror(parser, "empty parenthesis expression");
565         return false;
566     }
567     while (sy->ops_count) {
568         if (sy->ops[sy->ops_count-1].paren == 'f') {
569             if (!parser_close_call(parser, sy))
570                 return false;
571             break;
572         }
573         if (sy->ops[sy->ops_count-1].paren == 1) {
574             sy->ops_count--;
575             return !functions_only;
576         }
577         if (!parser_sy_pop(parser, sy))
578             return false;
579     }
580     return true;
581 }
582
583 static ast_expression* parser_expression(parser_t *parser)
584 {
585     ast_expression *expr = NULL;
586     shunt sy;
587     bool wantop = false;
588
589     /* count the parens because an if starts with one, so the
590      * end of a condition is an unmatched closing paren
591      */
592     int parens = 0;
593
594     MEM_VECTOR_INIT(&sy, out);
595     MEM_VECTOR_INIT(&sy, ops);
596
597     while (true)
598     {
599         if (!wantop)
600         {
601             bool nextwant = true;
602             if (parser->tok == TOKEN_IDENT)
603             {
604                 /* variable */
605                 ast_expression *var = parser_find_var(parser, parser_tokval(parser));
606                 if (!var) {
607                     parseerror(parser, "unexpected ident: %s", parser_tokval(parser));
608                     goto onerr;
609                 }
610                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), var))) {
611                     parseerror(parser, "out of memory");
612                     goto onerr;
613                 }
614             }
615             else if (parser->tok == TOKEN_FLOATCONST) {
616                 ast_value *val = parser_const_float(parser, (parser_token(parser)->constval.f));
617                 if (!val)
618                     return false;
619                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
620                     parseerror(parser, "out of memory");
621                     goto onerr;
622                 }
623             }
624             else if (parser->tok == TOKEN_INTCONST) {
625                 ast_value *val = parser_const_float(parser, (double)(parser_token(parser)->constval.i));
626                 if (!val)
627                     return false;
628                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
629                     parseerror(parser, "out of memory");
630                     goto onerr;
631                 }
632             }
633             else if (parser->tok == TOKEN_STRINGCONST) {
634                 ast_value *val = parser_const_string(parser, parser_tokval(parser));
635                 if (!val)
636                     return false;
637                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
638                     parseerror(parser, "out of memory");
639                     goto onerr;
640                 }
641             }
642             else if (parser->tok == TOKEN_VECTORCONST) {
643                 ast_value *val = parser_const_vector(parser, parser_token(parser)->constval.v);
644                 if (!val)
645                     return false;
646                 if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
647                     parseerror(parser, "out of memory");
648                     goto onerr;
649                 }
650             }
651             else if (parser->tok == '(') {
652                 ++parens;
653                 nextwant = false; /* not expecting an operator next */
654                 if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), 1, 0))) {
655                     parseerror(parser, "out of memory");
656                     goto onerr;
657                 }
658             }
659             else if (parser->tok == ')') {
660                 --parens;
661                 if (parens < 0)
662                     break;
663                 /* allowed for function calls */
664                 if (!parser_close_paren(parser, &sy, true))
665                     goto onerr;
666             }
667             else {
668                 /* TODO: prefix operators */
669                 parseerror(parser, "expected statement");
670                 goto onerr;
671             }
672             wantop = nextwant;
673             parser->lex->flags.noops = !wantop;
674         } else {
675             if (parser->tok == '(') {
676                 ++parens;
677                 /* we expected an operator, this is the function-call operator */
678                 if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), 'f', sy.out_count-1))) {
679                     parseerror(parser, "out of memory");
680                     goto onerr;
681                 }
682             }
683             else if (parser->tok == ')') {
684                 --parens;
685                 if (parens < 0)
686                     break;
687                 /* we do expect an operator next */
688                 /* closing an opening paren */
689                 if (!parser_close_paren(parser, &sy, false))
690                     goto onerr;
691             }
692             else if (parser->tok != TOKEN_OPERATOR) {
693                 parseerror(parser, "expected operator or end of statement");
694                 goto onerr;
695             }
696             else {
697                 /* classify the operator */
698                 /* TODO: suffix operators */
699                 const oper_info *op;
700                 const oper_info *olast = NULL;
701                 size_t o;
702                 for (o = 0; o < operator_count; ++o) {
703                     if (!(operators[o].flags & OP_PREFIX) &&
704                         !(operators[o].flags & OP_SUFFIX) && /* remove this */
705                         !strcmp(parser_tokval(parser), operators[o].op))
706                     {
707                         break;
708                     }
709                 }
710                 if (o == operator_count) {
711                     /* no operator found... must be the end of the statement */
712                     break;
713                 }
714                 /* found an operator */
715                 op = &operators[o];
716
717                 if (sy.ops_count && !sy.ops[sy.ops_count-1].paren)
718                     olast = &operators[sy.ops[sy.ops_count-1].etype-1];
719
720                 while (olast && (
721                         (op->prec < olast->prec) ||
722                         (op->assoc == ASSOC_LEFT && op->prec <= olast->prec) ) )
723                 {
724                     if (!parser_sy_pop(parser, &sy))
725                         goto onerr;
726                     if (sy.ops_count && !sy.ops[sy.ops_count-1].paren)
727                         olast = &operators[sy.ops[sy.ops_count-1].etype-1];
728                 }
729
730                 if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
731                     goto onerr;
732             }
733             wantop = false;
734             parser->lex->flags.noops = true;
735         }
736         if (!parser_next(parser)) {
737             goto onerr;
738         }
739         if (parser->tok == ';') {
740             break;
741         }
742     }
743     if (parens >= 0 && !parser_next(parser)) {
744         parseerror(parser, "Unexpected end of file");
745         goto onerr;
746     }
747
748     while (sy.ops_count) {
749         if (!parser_sy_pop(parser, &sy))
750             goto onerr;
751     }
752
753     parser->lex->flags.noops = true;
754     if (!sy.out_count) {
755         parseerror(parser, "empty expression");
756         expr = NULL;
757     } else
758         expr = sy.out[0].out;
759     MEM_VECTOR_CLEAR(&sy, out);
760     MEM_VECTOR_CLEAR(&sy, ops);
761     return expr;
762
763 onerr:
764     parser->lex->flags.noops = true;
765     MEM_VECTOR_CLEAR(&sy, out);
766     MEM_VECTOR_CLEAR(&sy, ops);
767     return NULL;
768 }
769
770 static bool parser_variable(parser_t *parser, ast_block *localblock);
771 static ast_block* parser_parse_block(parser_t *parser);
772 static ast_expression* parser_parse_statement_or_block(parser_t *parser);
773 static bool parser_parse_statement(parser_t *parser, ast_block *block, ast_expression **out)
774 {
775     if (parser->tok == TOKEN_TYPENAME)
776     {
777         /* local variable */
778         if (!block) {
779             parseerror(parser, "cannot declare a variable from here");
780             return false;
781         }
782         if (!parser_variable(parser, block))
783             return false;
784         *out = NULL;
785         return true;
786     }
787     else if (parser->tok == TOKEN_KEYWORD)
788     {
789         if (!strcmp(parser_tokval(parser), "return"))
790         {
791             ast_expression *exp = NULL;
792             ast_return     *ret = NULL;
793             ast_value      *expected = parser->function->vtype;
794
795             if (!parser_next(parser)) {
796                 parseerror(parser, "expected return expression");
797                 return false;
798             }
799
800             if (parser->tok != ';') {
801                 exp = parser_expression(parser);
802                 if (!exp)
803                     return false;
804
805                 if (exp->expression.vtype != expected->expression.next->expression.vtype) {
806                     parseerror(parser, "return with invalid expression");
807                 }
808
809                 ret = ast_return_new(exp->expression.node.context, exp);
810                 if (!ret) {
811                     ast_delete(exp);
812                     return false;
813                 }
814
815                 *out = (ast_expression*)ret;
816             } else if (!parser_next(parser)) {
817                 parseerror(parser, "expected semicolon");
818                 if (expected->expression.next->expression.vtype != TYPE_VOID) {
819                     parseerror(parser, "return without value");
820                 }
821             }
822             return true;
823         }
824         else if (!strcmp(parser_tokval(parser), "if"))
825         {
826             ast_ifthen *ifthen;
827             ast_expression *cond, *ontrue, *onfalse = NULL;
828
829             lex_ctx ctx = parser_ctx(parser);
830
831             /* skip the 'if' and check for opening paren */
832             if (!parser_next(parser) || parser->tok != '(') {
833                 parseerror(parser, "expected 'if' condition in parenthesis");
834                 return false;
835             }
836             /* parse into the expression */
837             if (!parser_next(parser)) {
838                 parseerror(parser, "expected 'if' condition after opening paren");
839                 return false;
840             }
841             /* parse the condition */
842             cond = parser_expression(parser);
843             if (!cond)
844                 return false;
845             /* closing paren */
846             if (parser->tok != ')') {
847                 parseerror(parser, "expected closing paren after 'if' condition");
848                 ast_delete(cond);
849                 return false;
850             }
851             /* parse into the 'then' branch */
852             if (!parser_next(parser)) {
853                 parseerror(parser, "expected statement for on-true branch of 'if'");
854                 ast_delete(cond);
855                 return false;
856             }
857             ontrue = parser_parse_statement_or_block(parser);
858             if (!ontrue) {
859                 ast_delete(cond);
860                 return false;
861             }
862             /* check for an else */
863             if (!strcmp(parser_tokval(parser), "else")) {
864                 /* parse into the 'else' branch */
865                 if (!parser_next(parser)) {
866                     parseerror(parser, "expected on-false branch after 'else'");
867                     ast_delete(ontrue);
868                     ast_delete(cond);
869                     return false;
870                 }
871                 onfalse = parser_parse_statement_or_block(parser);
872                 if (!onfalse) {
873                     ast_delete(ontrue);
874                     ast_delete(cond);
875                     return false;
876                 }
877             }
878
879             ifthen = ast_ifthen_new(ctx, cond, ontrue, onfalse);
880             *out = (ast_expression*)ifthen;
881             return true;
882         }
883         parseerror(parser, "Unexpected keyword");
884         return false;
885     }
886     else if (parser->tok == '{')
887     {
888         ast_block *inner;
889         inner = parser_parse_block(parser);
890         if (!inner)
891             return false;
892         *out = (ast_expression*)inner;
893         return true;
894     }
895     else
896     {
897         ast_expression *exp = parser_expression(parser);
898         if (!exp)
899             return false;
900         *out = exp;
901         return true;
902     }
903 }
904
905 static void parser_pop_local(parser_t *parser)
906 {
907     parser->locals_count--;
908     mem_d(parser->locals[parser->locals_count].name);
909 }
910
911 static ast_block* parser_parse_block(parser_t *parser)
912 {
913     size_t oldblocklocal;
914     ast_block *block = NULL;
915
916     oldblocklocal = parser->blocklocal;
917     parser->blocklocal = parser->locals_count;
918
919     if (!parser_next(parser)) { /* skip the '{' */
920         parseerror(parser, "expected function body");
921         goto cleanup;
922     }
923
924     block = ast_block_new(parser_ctx(parser));
925
926     while (parser->tok != TOKEN_EOF && parser->tok < TOKEN_ERROR)
927     {
928         ast_expression *expr;
929         if (parser->tok == '}')
930             break;
931
932         if (!parser_parse_statement(parser, block, &expr)) {
933             ast_block_delete(block);
934             block = NULL;
935             goto cleanup;
936         }
937         if (!expr)
938             continue;
939         if (!ast_block_exprs_add(block, expr)) {
940             ast_delete(expr);
941             ast_block_delete(block);
942             block = NULL;
943             goto cleanup;
944         }
945     }
946
947     if (parser->tok != '}') {
948         ast_block_delete(block);
949         block = NULL;
950     } else {
951         (void)parser_next(parser);
952     }
953
954 cleanup:
955     parser->blocklocal = oldblocklocal;
956     /* unroll the local vector */
957     while (parser->locals_count > parser->blocklocal)
958         parser_pop_local(parser);
959     return block;
960 }
961
962 static ast_expression* parser_parse_statement_or_block(parser_t *parser)
963 {
964     ast_expression *expr;
965     if (parser->tok == '{')
966         return (ast_expression*)parser_parse_block(parser);
967     if (!parser_parse_statement(parser, NULL, &expr))
968         return NULL;
969     return expr;
970 }
971
972 static bool parser_variable(parser_t *parser, ast_block *localblock)
973 {
974     bool          isfunc = false;
975     ast_function *func = NULL;
976     lex_ctx       ctx;
977     ast_value    *var;
978     varentry_t    varent;
979
980     int basetype = parser_token(parser)->constval.t;
981
982     while (true)
983     {
984         if (!parser_next(parser)) { /* skip basetype or comma */
985             parseerror(parser, "expected variable declaration");
986             return false;
987         }
988
989         isfunc = false;
990         func = NULL;
991         ctx = parser_ctx(parser);
992         var = parser_parse_type(parser, basetype, &isfunc);
993
994         if (!var)
995             return false;
996
997         if (parser->tok != TOKEN_IDENT) {
998             parseerror(parser, "expected variable name\n");
999             return false;
1000         }
1001
1002         if (!localblock && parser_find_global(parser, parser_tokval(parser))) {
1003             ast_value_delete(var);
1004             parseerror(parser, "global already exists: %s\n", parser_tokval(parser));
1005             return false;
1006         }
1007
1008         if (localblock && parser_find_local(parser, parser_tokval(parser), parser->blocklocal)) {
1009             ast_value_delete(var);
1010             parseerror(parser, "local variable already exists: %s\n", parser_tokval(parser));
1011             return false;
1012         }
1013
1014         if (!ast_value_set_name(var, parser_tokval(parser))) {
1015             parseerror(parser, "failed to set variable name\n");
1016             ast_value_delete(var);
1017             return false;
1018         }
1019
1020         if (isfunc) {
1021             /* a function was defined */
1022             ast_value *fval;
1023
1024             /* turn var into a value of TYPE_FUNCTION, with the old var
1025              * as return type
1026              */
1027             fval = ast_value_new(ctx, var->name, TYPE_FUNCTION);
1028             func = ast_function_new(ctx, var->name, fval);
1029             if (!fval || !func) {
1030                 ast_value_delete(var);
1031                 if (fval) ast_value_delete(fval);
1032                 if (func) ast_function_delete(func);
1033                 return false;
1034             }
1035
1036             fval->expression.next = (ast_expression*)var;
1037             MEM_VECTOR_MOVE(&var->expression, params, &fval->expression, params);
1038
1039             if (!parser_t_functions_add(parser, func)) {
1040                 ast_value_delete(var);
1041                 if (fval) ast_value_delete(fval);
1042                 if (func) ast_function_delete(func);
1043                 return false;
1044             }
1045
1046             var = fval;
1047         }
1048
1049         varent.name = util_strdup(var->name);
1050         varent.var = (ast_expression*)var;
1051         if (var->expression.vtype == TYPE_VECTOR)
1052         {
1053             size_t len = strlen(varent.name);
1054             varentry_t vx, vy, vz;
1055             vx.var = (ast_expression*)ast_member_new(var->expression.node.context, (ast_expression*)var, 0);
1056             vy.var = (ast_expression*)ast_member_new(var->expression.node.context, (ast_expression*)var, 1);
1057             vz.var = (ast_expression*)ast_member_new(var->expression.node.context, (ast_expression*)var, 2);
1058             vx.name = mem_a(len+3);
1059             vy.name = mem_a(len+3);
1060             vz.name = mem_a(len+3);
1061             strcpy(vx.name, varent.name);
1062             strcpy(vy.name, varent.name);
1063             strcpy(vz.name, varent.name);
1064             vx.name[len] = vy.name[len] = vz.name[len] = '_';
1065             vx.name[len+1] = 'x';
1066             vy.name[len+1] = 'y';
1067             vz.name[len+1] = 'z';
1068             vx.name[len+2] = vy.name[len+2] = vz.name[len+2] = 0;
1069
1070             if (!localblock) {
1071                 (void)!parser_t_globals_add(parser, varent);
1072                 (void)!parser_t_globals_add(parser, vx);
1073                 (void)!parser_t_globals_add(parser, vy);
1074                 (void)!parser_t_globals_add(parser, vz);
1075             } else {
1076                 (void)!parser_t_locals_add(parser, varent);
1077                 (void)!parser_t_locals_add(parser, vx);
1078                 (void)!parser_t_locals_add(parser, vy);
1079                 (void)!parser_t_locals_add(parser, vz);
1080             }
1081         }
1082         else
1083         {
1084             if ( (!localblock && !parser_t_globals_add(parser, varent)) ||
1085                  ( localblock && !parser_t_locals_add(parser, varent)) )
1086             {
1087                 ast_value_delete(var);
1088                 return false;
1089             }
1090         }
1091         if (localblock && !ast_block_locals_add(localblock, var))
1092         {
1093             parser_pop_local(parser);
1094             ast_value_delete(var);
1095             return false;
1096         }
1097
1098         if (!parser_next(parser)) {
1099             ast_value_delete(var);
1100             return false;
1101         }
1102
1103         if (parser->tok == ';') {
1104             if (!parser_next(parser))
1105                 return parser->tok == TOKEN_EOF;
1106             return true;
1107         }
1108
1109         if (parser->tok == ',') {
1110             /* another var */
1111             continue;
1112         }
1113
1114         if (parser->tok != '=') {
1115             parseerror(parser, "expected '=' or ';'");
1116             return false;
1117         }
1118
1119         if (!parser_next(parser))
1120             return false;
1121
1122         if (parser->tok == '#') {
1123             if (localblock) {
1124                 parseerror(parser, "cannot declare builtins within functions");
1125                 return false;
1126             }
1127             if (!isfunc || !func) {
1128                 parseerror(parser, "unexpected builtin number, '%s' is not a function", var->name);
1129                 return false;
1130             }
1131             if (!parser_next(parser)) {
1132                 parseerror(parser, "expected builtin number");
1133                 return false;
1134             }
1135             if (parser->tok != TOKEN_INTCONST) {
1136                 parseerror(parser, "builtin number must be an integer constant");
1137                 return false;
1138             }
1139             if (parser_token(parser)->constval.i <= 0) {
1140                 parseerror(parser, "builtin number must be positive integer greater than zero");
1141                 return false;
1142             }
1143
1144             func->builtin = -parser_token(parser)->constval.i;
1145         } else if (parser->tok == '{') {
1146             /* function body */
1147             ast_block *block;
1148             ast_function *old = parser->function;
1149
1150             if (localblock) {
1151                 parseerror(parser, "cannot declare functions within functions");
1152                 return false;
1153             }
1154
1155             parser->function = func;
1156             block = parser_parse_block(parser);
1157             parser->function = old;
1158
1159             if (!block)
1160                 return false;
1161
1162             if (!ast_function_blocks_add(func, block)) {
1163                 ast_block_delete(block);
1164                 return false;
1165             }
1166             return true;
1167         } else {
1168             parseerror(parser, "TODO, const assignment");
1169         }
1170
1171         if (!parser_next(parser))
1172             return false;
1173
1174         if (parser->tok == ',') {
1175             /* another */
1176             continue;
1177         }
1178
1179         if (parser->tok != ';') {
1180             parseerror(parser, "expected semicolon");
1181             return false;
1182         }
1183
1184         (void)parser_next(parser);
1185
1186         return true;
1187     }
1188 }
1189
1190 static bool parser_do(parser_t *parser)
1191 {
1192     if (parser->tok == TOKEN_TYPENAME)
1193     {
1194         return parser_variable(parser, NULL);
1195     }
1196     else if (parser->tok == TOKEN_KEYWORD)
1197     {
1198         /* handle 'var' and 'const' */
1199         return false;
1200     }
1201     else if (parser->tok == '.')
1202     {
1203         ast_value *var;
1204         ast_value *fld;
1205         bool       isfunc = false;
1206         int        basetype;
1207         lex_ctx    ctx = parser_ctx(parser);
1208         varentry_t varent;
1209
1210         /* entity-member declaration */
1211         if (!parser_next(parser) || parser->tok != TOKEN_TYPENAME) {
1212             parseerror(parser, "expected member variable definition");
1213             return false;
1214         }
1215
1216         /* remember the base/return type */
1217         basetype = parser_token(parser)->constval.t;
1218
1219         /* parse into the declaration */
1220         if (!parser_next(parser)) {
1221             parseerror(parser, "expected field def");
1222             return false;
1223         }
1224
1225         /* parse the field type fully */
1226         var = parser_parse_type(parser, basetype, &isfunc);
1227         if (!var)
1228             return false;
1229
1230         /* now the field name */
1231         if (parser->tok != TOKEN_IDENT) {
1232             parseerror(parser, "expected field name");
1233             ast_delete(var);
1234             return false;
1235         }
1236
1237         /* check for an existing field
1238          * in original qc we also have to check for an existing
1239          * global named like the field
1240          */
1241         if (opts_standard == COMPILER_QCC) {
1242             if (parser_find_global(parser, parser_tokval(parser))) {
1243                 parseerror(parser, "cannot declare a field and a global of the same name with -std=qcc");
1244                 ast_delete(var);
1245                 return false;
1246             }
1247         }
1248         if (parser_find_field(parser, parser_tokval(parser))) {
1249             parseerror(parser, "field %s already exists", parser_tokval(parser));
1250             ast_delete(var);
1251             return false;
1252         }
1253
1254         /* if it was a function, turn it into a function */
1255         if (isfunc) {
1256             ast_value *fval;
1257             /* turn var into a value of TYPE_FUNCTION, with the old var
1258              * as return type
1259              */
1260             fval = ast_value_new(ctx, var->name, TYPE_FUNCTION);
1261             if (!fval) {
1262                 ast_value_delete(var);
1263                 ast_value_delete(fval);
1264                 return false;
1265             }
1266
1267             fval->expression.next = (ast_expression*)var;
1268             MEM_VECTOR_MOVE(&var->expression, params, &fval->expression, params);
1269
1270             var = fval;
1271         }
1272
1273         /* turn it into a field */
1274         fld = ast_value_new(ctx, parser_tokval(parser), TYPE_FIELD);
1275         fld->expression.next = (ast_expression*)var;
1276
1277         varent.var = (ast_expression*)fld;
1278         if (var->expression.vtype == TYPE_VECTOR)
1279         {
1280             /* create _x, _y and _z fields as well */
1281             parseerror(parser, "TODO: vector field members (_x,_y,_z)");
1282             ast_delete(fld);
1283             return false;
1284         }
1285
1286         varent.name = util_strdup(fld->name);
1287         (void)!parser_t_fields_add(parser, varent);
1288
1289         /* end with a semicolon */
1290         if (!parser_next(parser) || parser->tok != ';') {
1291             parseerror(parser, "semicolon expected");
1292             return false;
1293         }
1294
1295         /* skip the semicolon */
1296         if (!parser_next(parser))
1297             return parser->tok == TOKEN_EOF;
1298
1299         return true;
1300     }
1301     else
1302     {
1303         parseerror(parser, "unexpected token: %s", parser->lex->tok->value);
1304         return false;
1305     }
1306     return true;
1307 }
1308
1309 static parser_t *parser;
1310
1311 bool parser_init()
1312 {
1313     parser = (parser_t*)mem_a(sizeof(parser_t));
1314     if (!parser)
1315         return false;
1316
1317     memset(parser, 0, sizeof(parser));
1318
1319     MEM_VECTOR_INIT(parser, globals);
1320     MEM_VECTOR_INIT(parser, locals);
1321     return true;
1322 }
1323
1324 bool parser_compile(const char *filename)
1325 {
1326     parser->lex = lex_open(filename);
1327     if (!parser->lex) {
1328         printf("failed to open file \"%s\"\n", filename);
1329         return false;
1330     }
1331
1332     /* initial lexer/parser state */
1333     parser->lex->flags.noops = true;
1334
1335     if (parser_next(parser))
1336     {
1337         while (parser->tok != TOKEN_EOF && parser->tok < TOKEN_ERROR)
1338         {
1339             if (!parser_do(parser)) {
1340                 if (parser->tok == TOKEN_EOF)
1341                     parseerror(parser, "unexpected eof");
1342                 else
1343                     parseerror(parser, "parse error\n");
1344                 lex_close(parser->lex);
1345                 mem_d(parser);
1346                 return false;
1347             }
1348         }
1349     }
1350
1351     lex_close(parser->lex);
1352
1353     return !parser->errors;
1354 }
1355
1356 void parser_cleanup()
1357 {
1358     size_t i;
1359     for (i = 0; i < parser->functions_count; ++i) {
1360         ast_delete(parser->functions[i]);
1361     }
1362     for (i = 0; i < parser->imm_vector_count; ++i) {
1363         ast_delete(parser->imm_vector[i]);
1364     }
1365     for (i = 0; i < parser->imm_string_count; ++i) {
1366         ast_delete(parser->imm_string[i]);
1367     }
1368     for (i = 0; i < parser->imm_float_count; ++i) {
1369         ast_delete(parser->imm_float[i]);
1370     }
1371     for (i = 0; i < parser->globals_count; ++i) {
1372         ast_delete(parser->globals[i].var);
1373         mem_d(parser->globals[i].name);
1374     }
1375     MEM_VECTOR_CLEAR(parser, globals);
1376
1377     mem_d(parser);
1378 }
1379
1380 bool parser_finish(const char *output)
1381 {
1382     size_t i;
1383     ir_builder *ir;
1384
1385     if (!parser->errors)
1386     {
1387         ir = ir_builder_new("gmqcc_out");
1388         if (!ir) {
1389             printf("failed to allocate builder\n");
1390             return false;
1391         }
1392
1393         for (i = 0; i < parser->imm_float_count; ++i) {
1394             if (!ast_global_codegen(parser->imm_float[i], ir)) {
1395                 printf("failed to generate global %s\n", parser->imm_float[i]->name);
1396                 ir_builder_delete(ir);
1397                 return false;
1398             }
1399         }
1400         for (i = 0; i < parser->imm_string_count; ++i) {
1401             if (!ast_global_codegen(parser->imm_string[i], ir)) {
1402                 printf("failed to generate global %s\n", parser->imm_string[i]->name);
1403                 ir_builder_delete(ir);
1404                 return false;
1405             }
1406         }
1407         for (i = 0; i < parser->imm_vector_count; ++i) {
1408             if (!ast_global_codegen(parser->imm_vector[i], ir)) {
1409                 printf("failed to generate global %s\n", parser->imm_vector[i]->name);
1410                 ir_builder_delete(ir);
1411                 return false;
1412             }
1413         }
1414         for (i = 0; i < parser->fields_count; ++i) {
1415             ast_value *field;
1416             bool isconst;
1417             if (!ast_istype(parser->fields[i].var, ast_value))
1418                 continue;
1419             field = (ast_value*)parser->fields[i].var;
1420             isconst = field->isconst;
1421             field->isconst = false;
1422             if (!ast_global_codegen((ast_value*)field, ir)) {
1423                 printf("failed to generate field %s\n", field->name);
1424                 ir_builder_delete(ir);
1425                 return false;
1426             }
1427             if (isconst) {
1428                 ir_value *ifld;
1429                 ast_expression *subtype;
1430                 field->isconst = true;
1431                 subtype = field->expression.next;
1432                 ifld = ir_builder_create_field(ir, field->name, subtype->expression.vtype);
1433                 if (subtype->expression.vtype == TYPE_FIELD)
1434                     ifld->fieldtype = subtype->expression.next->expression.vtype;
1435                 else if (subtype->expression.vtype == TYPE_FUNCTION)
1436                     ifld->outtype = subtype->expression.next->expression.vtype;
1437                 (void)!ir_value_set_field(field->ir_v, ifld);
1438             }
1439         }
1440         for (i = 0; i < parser->globals_count; ++i) {
1441             if (!ast_istype(parser->globals[i].var, ast_value))
1442                 continue;
1443             if (!ast_global_codegen((ast_value*)(parser->globals[i].var), ir)) {
1444                 printf("failed to generate global %s\n", parser->globals[i].name);
1445                 ir_builder_delete(ir);
1446                 return false;
1447             }
1448         }
1449         for (i = 0; i < parser->functions_count; ++i) {
1450             if (!ast_function_codegen(parser->functions[i], ir)) {
1451                 printf("failed to generate function %s\n", parser->functions[i]->name);
1452                 ir_builder_delete(ir);
1453                 return false;
1454             }
1455             if (!ir_function_finalize(parser->functions[i]->ir_func)) {
1456                 printf("failed to finalize function %s\n", parser->functions[i]->name);
1457                 ir_builder_delete(ir);
1458                 return false;
1459             }
1460         }
1461
1462         ir_builder_dump(ir, printf);
1463
1464         if (!ir_builder_generate(ir, output)) {
1465             printf("*** failed to generate output file\n");
1466             ir_builder_delete(ir);
1467             return false;
1468         }
1469
1470         ir_builder_delete(ir);
1471         return true;
1472     }
1473
1474     printf("*** there were compile errors\n");
1475     return false;
1476 }