From 6a346745aae647a10a1c6401565fb19891108424 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Thu, 19 Jul 2012 17:39:19 +0200 Subject: [PATCH] Handling definition of builtins --- lexer.c | 2 ++ parser.c | 49 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/lexer.c b/lexer.c index 5c98d31..ebbe188 100644 --- a/lexer.c +++ b/lexer.c @@ -466,6 +466,8 @@ int lex_do(lex_file *lex) case ',': + case '#': + return (lex->tok->ttype = ch); default: break; diff --git a/parser.c b/parser.c index 8901fa2..fb24e93 100644 --- a/parser.c +++ b/parser.c @@ -125,6 +125,7 @@ bool parser_do(parser_t *parser) { if (parser->tok == TOKEN_TYPENAME) { + lex_ctx ctx = parser_ctx(parser); ast_value *var = parser_parse_type(parser); if (!var) return false; @@ -146,12 +147,12 @@ bool parser_do(parser_t *parser) return false; } - if (!parser_t_globals_add(parser, var)) - return false; - - /* Constant assignment */ - if (!parser_next(parser)) + if (!parser_t_globals_add(parser, var) || + !parser_next(parser)) + { + ast_value_delete(var); return false; + } if (parser->tok == ';') { if (!parser_next(parser)) @@ -167,9 +168,41 @@ bool parser_do(parser_t *parser) if (!parser_next(parser)) return false; - /* '=' found, assign... */ - parseerror(parser, "TODO, const assignment"); - return false; + if (parser->tok == '#') { + /* builtin function */ + ast_function *func; + ast_value *fval; + if (!parser_next(parser)) { + parseerror(parser, "expected builtin number"); + return false; + } + + fval = ast_value_new(ctx, var->name, TYPE_FUNCTION); + func = ast_function_new(ctx, var->name, fval); + if (!fval || !func) { + if (fval) ast_value_delete(fval); + if (func) ast_function_delete(func); + return false; + } + + fval->expression.next = (ast_expression*)var; + MEM_VECTOR_MOVE(var, params, fval, params); + + /* replace the variable */ + parser->globals[parser->globals_count-1] = fval; + } else { + parseerror(parser, "TODO, const assignment"); + } + + if (!parser_next(parser)) + return false; + + if (parser->tok != ';') { + parseerror(parser, "expected semicolon"); + return false; + } + + return true; } else if (parser->tok == TOKEN_KEYWORD) { -- 2.39.2