diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-31 11:15:16 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-31 11:15:16 +0100 |
commit | 3ed3aa338296f82046de2061e717b49328c8b057 (patch) | |
tree | ab7a90c367e54edc15f272618b4fafb0447446c0 | |
parent | a31eff3926b4355ab9a4d7a76b0007fae0dd68b2 (diff) | |
download | bdl-3ed3aa338296f82046de2061e717b49328c8b057.tar.gz bdl-3ed3aa338296f82046de2061e717b49328c8b057.zip |
Ensure lambdas wrap their env tables
-rw-r--r-- | src/parser.c | 6 | ||||
-rwxr-xr-x | src/parser.h | 11 |
2 files changed, 10 insertions, 7 deletions
diff --git a/src/parser.c b/src/parser.c index d1a5e7a..59e8075 100644 --- a/src/parser.c +++ b/src/parser.c | |||
@@ -91,6 +91,7 @@ parse_lambda(Parser *parser, Errors *errors) { | |||
91 | Object *lambda = object_alloc(start, OBJ_TYPE_LAMBDA); | 91 | Object *lambda = object_alloc(start, OBJ_TYPE_LAMBDA); |
92 | array_init(lambda->params, 0); | 92 | array_init(lambda->params, 0); |
93 | array_init(lambda->body, 0); | 93 | array_init(lambda->body, 0); |
94 | lambda->env = NULL; | ||
94 | 95 | ||
95 | // Parse parameters. | 96 | // Parse parameters. |
96 | Token tok = next_token(parser); | 97 | Token tok = next_token(parser); |
@@ -450,6 +451,7 @@ check_object_scope(Environment *env, Object *obj, Errors *errors) { | |||
450 | } break; | 451 | } break; |
451 | case OBJ_TYPE_LAMBDA: { | 452 | case OBJ_TYPE_LAMBDA: { |
452 | Environment *new_env = env_alloc(env); | 453 | Environment *new_env = env_alloc(env); |
454 | obj->env = new_env; | ||
453 | for (size_t i = 0; i < array_size(obj->body); i++) { | 455 | for (size_t i = 0; i < array_size(obj->body); i++) { |
454 | Object *expr = obj->body[i]; | 456 | Object *expr = obj->body[i]; |
455 | check_object_scope(new_env, expr, errors); | 457 | check_object_scope(new_env, expr, errors); |
@@ -488,7 +490,7 @@ remove_unused_expr(Object *obj) { | |||
488 | IS_STRING(expr) || | 490 | IS_STRING(expr) || |
489 | IS_SYMBOL(expr) || | 491 | IS_SYMBOL(expr) || |
490 | IS_LAMBDA(expr) || | 492 | IS_LAMBDA(expr) || |
491 | IS_BOOL(expr) || | 493 | IS_BOOL(expr) || |
492 | IS_NIL(expr)) { | 494 | IS_NIL(expr)) { |
493 | continue; | 495 | continue; |
494 | } | 496 | } |
@@ -556,7 +558,7 @@ parse(Token *tokens, Errors *errors) { | |||
556 | IS_STRING(root) || | 558 | IS_STRING(root) || |
557 | IS_SYMBOL(root) || | 559 | IS_SYMBOL(root) || |
558 | IS_LAMBDA(root) || | 560 | IS_LAMBDA(root) || |
559 | IS_BOOL(root) || | 561 | IS_BOOL(root) || |
560 | IS_NIL(root)) { | 562 | IS_NIL(root)) { |
561 | continue; | 563 | continue; |
562 | } | 564 | } |
diff --git a/src/parser.h b/src/parser.h index 01f53b0..fa8858e 100755 --- a/src/parser.h +++ b/src/parser.h | |||
@@ -4,6 +4,11 @@ | |||
4 | #include "lexer.h" | 4 | #include "lexer.h" |
5 | #include "hashtable.h" | 5 | #include "hashtable.h" |
6 | 6 | ||
7 | typedef struct Environment { | ||
8 | HashTable *table; | ||
9 | struct Environment *parent; | ||
10 | } Environment; | ||
11 | |||
7 | typedef enum ObjectType { | 12 | typedef enum ObjectType { |
8 | OBJ_TYPE_NIL, | 13 | OBJ_TYPE_NIL, |
9 | OBJ_TYPE_TRUE, | 14 | OBJ_TYPE_TRUE, |
@@ -38,6 +43,7 @@ typedef struct Object { | |||
38 | struct { | 43 | struct { |
39 | struct Object **params; | 44 | struct Object **params; |
40 | struct Object **body; | 45 | struct Object **body; |
46 | Environment *env; | ||
41 | }; | 47 | }; |
42 | 48 | ||
43 | // OBJ_TYPE_IF | 49 | // OBJ_TYPE_IF |
@@ -59,11 +65,6 @@ typedef struct Object { | |||
59 | size_t col; | 65 | size_t col; |
60 | } Object; | 66 | } Object; |
61 | 67 | ||
62 | typedef struct Environment { | ||
63 | HashTable *table; | ||
64 | struct Environment *parent; | ||
65 | } Environment; | ||
66 | |||
67 | typedef struct Parser { | 68 | typedef struct Parser { |
68 | Token *tokens; | 69 | Token *tokens; |
69 | size_t current; | 70 | size_t current; |