From a718a62a45b081bfd2cff8da56da2d2856ca244b Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 6 Apr 2022 22:30:21 -0300 Subject: Add scope pointer to blocks and functions --- src/nodes.c | 1 + src/nodes.h | 1 + src/parser.c | 10 +++------- 3 files changed, 5 insertions(+), 7 deletions(-) (limited to 'src') 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) { node->type = type; node->line = 0; node->col = 0; + node->scope = NULL; return node; } 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 { NodeType type; size_t line; size_t col; + struct Scope *scope; union { // 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) { } } break; case NODE_FUN: { - // TODO: Store scope in Node block? Scope *prev_scope = parser->parse_tree->current_scope; parser->parse_tree->current_scope = alloc_scope(prev_scope); + node->scope = parser->parse_tree->current_scope; // Parameters. for (size_t i = 0; i < array_size(node->fun.param_names); ++i) { @@ -538,6 +538,7 @@ symbol_check(Parser *parser, Node *node) { // Body. Node *body = node->fun.body; if (body->type == NODE_BLOCK) { + body->scope = parser->parse_tree->current_scope; for (size_t i = 0; i < array_size(body->block.expr); ++i) { Node *expr = body->block.expr[i]; symbol_check(parser, expr); @@ -548,9 +549,9 @@ symbol_check(Parser *parser, Node *node) { parser->parse_tree->current_scope = prev_scope; } break; case NODE_BLOCK: { - // TODO: Store scope in Node block? Scope *prev_scope = parser->parse_tree->current_scope; parser->parse_tree->current_scope = alloc_scope(prev_scope); + node->scope = parser->parse_tree->current_scope; for (size_t i = 0; i < array_size(node->block.expr); ++i) { Node *expr = node->block.expr[i]; symbol_check(parser, expr); @@ -612,11 +613,6 @@ parse(Token *tokens) { }; parser.parse_tree = alloc_parsetree(); - // DEBUG: TOKENS - printf("-- tokens --\n"); - print_tokens(parser.tokens); - printf("------------\n"); - if (!parse_roots(&parser)) { return NULL; } -- cgit v1.2.1