]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
Implemented function application syntax
authorMike Lowis <mike.lowis@gentex.com>
Tue, 15 Dec 2015 09:11:06 +0000 (09:11 +0000)
committerMike Lowis <mike.lowis@gentex.com>
Tue, 15 Dec 2015 09:11:06 +0000 (09:11 +0000)
source/ast.c
source/grammar.c
source/pprint.c
source/sclpl.h

index 3332931d3d4d0f28336e7c82fd52b118141fa4d1..a4a09f8f383838d07ae99e3d26342eac5acef9aa 100644 (file)
@@ -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));
 }
 
 
index aef5ce21e19076602392219107fb351c28eac6d1..2d560bb44d7d5a6348da979bd85a63a4f0b0807e 100644 (file)
@@ -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);
     }
index 9b49226fbf4031358e969865b4a1c9ba9e81de71..350e609f773f400f8c60441af66e986688ef39a3 100644 (file)
@@ -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;
index b031129b7e2750af1f8a86c1f4bdadb4bd70c1a7..4493960d806e5a977f73bea1efb73d0cdca035de 100644 (file)
@@ -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);