diff options
author | Bad Diode <bd@badd10de.dev> | 2022-04-06 22:30:21 -0300 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-04-06 22:30:21 -0300 |
commit | a718a62a45b081bfd2cff8da56da2d2856ca244b (patch) | |
tree | 95a27118f2882a6a1b4a99f6f1f05bddcc001267 /src | |
parent | ee525dc0a7ccd42ab1d1daa44776eba5a9be37a5 (diff) | |
download | bdl-a718a62a45b081bfd2cff8da56da2d2856ca244b.tar.gz bdl-a718a62a45b081bfd2cff8da56da2d2856ca244b.zip |
Add scope pointer to blocks and functions
Diffstat (limited to 'src')
-rw-r--r-- | src/nodes.c | 1 | ||||
-rw-r--r-- | src/nodes.h | 1 | ||||
-rw-r--r-- | src/parser.c | 10 |
3 files changed, 5 insertions, 7 deletions
diff --git a/src/nodes.c b/src/nodes.c index a420189..a5b67d1 100644 --- a/src/nodes.c +++ b/src/nodes.c | |||
@@ -8,6 +8,7 @@ alloc_node(NodeType type) { | |||
8 | node->type = type; | 8 | node->type = type; |
9 | node->line = 0; | 9 | node->line = 0; |
10 | node->col = 0; | 10 | node->col = 0; |
11 | node->scope = NULL; | ||
11 | return node; | 12 | return node; |
12 | } | 13 | } |
13 | 14 | ||
diff --git a/src/nodes.h b/src/nodes.h index cf0e749..acbe19e 100644 --- a/src/nodes.h +++ b/src/nodes.h | |||
@@ -19,6 +19,7 @@ typedef struct Node { | |||
19 | NodeType type; | 19 | NodeType type; |
20 | size_t line; | 20 | size_t line; |
21 | size_t col; | 21 | size_t col; |
22 | struct Scope *scope; | ||
22 | 23 | ||
23 | union { | 24 | union { |
24 | // Numbers. | 25 | // Numbers. |
diff --git a/src/parser.c b/src/parser.c index 8d846d6..841a516 100644 --- a/src/parser.c +++ b/src/parser.c | |||
@@ -523,9 +523,9 @@ symbol_check(Parser *parser, Node *node) { | |||
523 | } | 523 | } |
524 | } break; | 524 | } break; |
525 | case NODE_FUN: { | 525 | case NODE_FUN: { |
526 | // TODO: Store scope in Node block? | ||
527 | Scope *prev_scope = parser->parse_tree->current_scope; | 526 | Scope *prev_scope = parser->parse_tree->current_scope; |
528 | parser->parse_tree->current_scope = alloc_scope(prev_scope); | 527 | parser->parse_tree->current_scope = alloc_scope(prev_scope); |
528 | node->scope = parser->parse_tree->current_scope; | ||
529 | 529 | ||
530 | // Parameters. | 530 | // Parameters. |
531 | for (size_t i = 0; i < array_size(node->fun.param_names); ++i) { | 531 | for (size_t i = 0; i < array_size(node->fun.param_names); ++i) { |
@@ -538,6 +538,7 @@ symbol_check(Parser *parser, Node *node) { | |||
538 | // Body. | 538 | // Body. |
539 | Node *body = node->fun.body; | 539 | Node *body = node->fun.body; |
540 | if (body->type == NODE_BLOCK) { | 540 | if (body->type == NODE_BLOCK) { |
541 | body->scope = parser->parse_tree->current_scope; | ||
541 | for (size_t i = 0; i < array_size(body->block.expr); ++i) { | 542 | for (size_t i = 0; i < array_size(body->block.expr); ++i) { |
542 | Node *expr = body->block.expr[i]; | 543 | Node *expr = body->block.expr[i]; |
543 | symbol_check(parser, expr); | 544 | symbol_check(parser, expr); |
@@ -548,9 +549,9 @@ symbol_check(Parser *parser, Node *node) { | |||
548 | parser->parse_tree->current_scope = prev_scope; | 549 | parser->parse_tree->current_scope = prev_scope; |
549 | } break; | 550 | } break; |
550 | case NODE_BLOCK: { | 551 | case NODE_BLOCK: { |
551 | // TODO: Store scope in Node block? | ||
552 | Scope *prev_scope = parser->parse_tree->current_scope; | 552 | Scope *prev_scope = parser->parse_tree->current_scope; |
553 | parser->parse_tree->current_scope = alloc_scope(prev_scope); | 553 | parser->parse_tree->current_scope = alloc_scope(prev_scope); |
554 | node->scope = parser->parse_tree->current_scope; | ||
554 | for (size_t i = 0; i < array_size(node->block.expr); ++i) { | 555 | for (size_t i = 0; i < array_size(node->block.expr); ++i) { |
555 | Node *expr = node->block.expr[i]; | 556 | Node *expr = node->block.expr[i]; |
556 | symbol_check(parser, expr); | 557 | symbol_check(parser, expr); |
@@ -612,11 +613,6 @@ parse(Token *tokens) { | |||
612 | }; | 613 | }; |
613 | parser.parse_tree = alloc_parsetree(); | 614 | parser.parse_tree = alloc_parsetree(); |
614 | 615 | ||
615 | // DEBUG: TOKENS | ||
616 | printf("-- tokens --\n"); | ||
617 | print_tokens(parser.tokens); | ||
618 | printf("------------\n"); | ||
619 | |||
620 | if (!parse_roots(&parser)) { | 616 | if (!parse_roots(&parser)) { |
621 | return NULL; | 617 | return NULL; |
622 | } | 618 | } |