]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - parser.c
Proto for parsing a function body
[xonotic/gmqcc.git] / parser.c
index a59efe402bb0df1d17cdb7146981a05b0fab2a1a..c0a1fbb806c7994d8702810752ba7453e9f2093b 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -10,6 +10,8 @@ typedef struct {
 
     MEM_VECTOR_MAKE(ast_value*, globals);
     MEM_VECTOR_MAKE(ast_function*, functions);
+
+    ast_function *function;
 } parser_t;
 
 MEM_VEC_FUNCTIONS(parser_t, ast_value*, globals)
@@ -92,6 +94,9 @@ ast_value *parser_parse_type(parser_t *parser, bool *isfunc)
                 return NULL;
             }
 
+            if (parser->tok == ')')
+                break;
+
             param = parser_parse_type(parser, &dummy);
             (void)dummy;
 
@@ -129,6 +134,11 @@ ast_value *parser_parse_type(parser_t *parser, bool *isfunc)
     return var;
 }
 
+bool parser_parse_body(parser_t *parser)
+{
+    return false;
+}
+
 bool parser_do(parser_t *parser)
 {
     if (parser->tok == TOKEN_TYPENAME)
@@ -174,7 +184,7 @@ bool parser_do(parser_t *parser)
             }
 
             fval->expression.next = (ast_expression*)var;
-            MEM_VECTOR_MOVE(var, params, func, params);
+            MEM_VECTOR_MOVE(var, params, fval, params);
 
             if (!parser_t_functions_add(parser, func)) {
                 ast_value_delete(var);
@@ -228,6 +238,12 @@ bool parser_do(parser_t *parser)
             func->builtin = -parser_token(parser)->constval.i;
         } else if (parser->tok == '{') {
             /* function body */
+            bool ret;
+            ast_function *old = parser->function;
+            parser->function = func;
+            ret = parser_parse_body(parser);
+            parser->function = old;
+            return ret;
         } else {
             parseerror(parser, "TODO, const assignment");
         }
@@ -240,6 +256,8 @@ bool parser_do(parser_t *parser)
             return false;
         }
 
+        (void)parser_next(parser);
+
         return true;
     }
     else if (parser->tok == TOKEN_KEYWORD)
@@ -270,6 +288,8 @@ bool parser_compile(const char *filename)
     if (!parser)
         return false;
 
+    memset(&parser, 0, sizeof(parser));
+
     MEM_VECTOR_INIT(parser, globals);
     parser->lex = lex_open(filename);