aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-04-06 22:30:21 -0300
committerBad Diode <bd@badd10de.dev>2022-04-06 22:30:21 -0300
commita718a62a45b081bfd2cff8da56da2d2856ca244b (patch)
tree95a27118f2882a6a1b4a99f6f1f05bddcc001267 /src
parentee525dc0a7ccd42ab1d1daa44776eba5a9be37a5 (diff)
downloadbdl-a718a62a45b081bfd2cff8da56da2d2856ca244b.tar.gz
bdl-a718a62a45b081bfd2cff8da56da2d2856ca244b.zip
Add scope pointer to blocks and functions
Diffstat (limited to 'src')
-rw-r--r--src/nodes.c1
-rw-r--r--src/nodes.h1
-rw-r--r--src/parser.c10
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 }