From: Mike Lowis Date: Tue, 15 Dec 2015 09:11:06 +0000 (+0000) Subject: Implemented function application syntax X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=456ca878cee9ca722a9836834137e2bc4e7c2934;p=proto%2Fsclpl.git Implemented function application syntax --- diff --git a/source/ast.c b/source/ast.c index 3332931..a4a09f8 100644 --- a/source/ast.c +++ b/source/ast.c @@ -34,6 +34,11 @@ static void ast_free(void* ptr) gc_delref(ast->value.func.body); break; + case AST_FNAPP: + gc_delref(ast->value.fnapp.fn); + vec_deinit(&(ast->value.fnapp.args)); + break; + default: break; } @@ -266,17 +271,27 @@ void func_set_body(AST* func, AST* body) func->value.func.body = (AST*)gc_addref(body); } -AST* FnApp(AST* fn) +AST* FnApp(AST* fnapp) { AST* node = ast(AST_FNAPP); - node->value.fnapp.fn = (AST*)gc_addref(fn); + node->value.fnapp.fn = (AST*)gc_addref(fnapp); vec_init(&(node->value.fnapp.args)); return node; } -void fnapp_add_arg(AST* func, AST* arg) +AST* fnapp_fn(AST* fnapp) +{ + return fnapp->value.fnapp.fn; +} + +vec_t* fnapp_args(AST* fnapp) +{ + return &(fnapp->value.fnapp.args); +} + +void fnapp_add_arg(AST* fnapp, AST* arg) { - vec_push_back(&(func->value.fnapp.args), gc_addref(arg)); + vec_push_back(&(fnapp->value.fnapp.args), gc_addref(arg)); } diff --git a/source/grammar.c b/source/grammar.c index aef5ce2..2d560bb 100644 --- a/source/grammar.c +++ b/source/grammar.c @@ -149,7 +149,7 @@ static AST* func_app(Parser* p, AST* fn) AST* app = FnApp(fn); expect(p,T_LPAR); while (peek(p)->type != T_RPAR) { - fnapp_add_arg(p, expression(p)); + fnapp_add_arg(app, expression(p)); if (peek(p)->type != T_RPAR) expect(p, T_COMMA); } diff --git a/source/pprint.c b/source/pprint.c index 9b49226..350e609 100644 --- a/source/pprint.c +++ b/source/pprint.c @@ -166,6 +166,16 @@ void pprint_tree(FILE* file, AST* tree, int depth) printf(")"); break; + case AST_FNAPP: + printf("("); + pprint_tree(file, fnapp_fn(tree), depth); + for (size_t i = 0; i < vec_size(fnapp_args(tree)); i++) { + printf(" "); + pprint_tree(file, vec_at(fnapp_args(tree), i), depth); + } + printf(")"); + break; + default: pprint_literal(file, tree, depth); break; diff --git a/source/sclpl.h b/source/sclpl.h index b031129..4493960 100644 --- a/source/sclpl.h +++ b/source/sclpl.h @@ -185,10 +185,10 @@ void func_set_body(AST* func, AST* body); /* Function Application */ AST* FnApp(AST* fn); +AST* fnapp_fn(AST* fnapp); +vec_t* fnapp_args(AST* fnapp); void fnapp_add_arg(AST* func, AST* arg); - - ///* Annotation */ //AST* Ann(char* name, AST* value); //char* ann_name(AST* def);