diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/parser.c b/src/parser.c index 9e92ddd..7b69ee7 100644 --- a/src/parser.c +++ b/src/parser.c @@ -58,12 +58,15 @@ int parser_init(Parser *self, amal_compiler *compiler, ScopedAllocator *allocato self->error.index = 0; self->error.str = NULL; self->error_context = ERROR_CONTEXT_NONE; - self->current_scope = &self->scope; - return scope_init(&self->scope, &compiler->root_scope, self->allocator); + return_if_error(structdecl_init(&self->struct_decl, &compiler->root_scope, allocator)); + return_if_error(lhsexpr_init(&self->file_decl, bool_true, bool_true, create_buffer_view_null(), self->allocator)); + return_if_error(ast_create(self->allocator, &self->struct_decl, AST_STRUCT_DECL, &self->file_decl.rhs_expr)); + self->current_scope = &self->struct_decl.body; + return PARSER_OK; } static bool parser_is_global_scope(Parser *self) { - return self->current_scope == &self->scope; + return self->current_scope == &self->struct_decl.body; } /* @@ -345,7 +348,8 @@ static CHECK_RESULT Ast* parser_parse_number(Parser *self) { return result; throw_if_error(scoped_allocator_alloc(self->allocator, sizeof(Number), (void**)&number)); - number_init(number, self->tokenizer.value.integer, self->tokenizer.number_is_integer); + number_init(number, self->tokenizer.value.integer, self->tokenizer.number_is_integer, + create_buffer_view(self->tokenizer.code.data + self->tokenizer.prev_index, self->tokenizer.index - self->tokenizer.prev_index)); throw_if_error(ast_create(self->allocator, number, AST_NUMBER, &result)); return result; } @@ -564,10 +568,11 @@ ROOT = BODY_LOOP */ int parser_parse_buffer(Parser *self, BufferView code_buffer, BufferView buffer_name) { int result; + self->file_decl.var_name = buffer_name; throw_if_error(tokenizer_init(&self->tokenizer, self->allocator, code_buffer, buffer_name)); result = setjmp(self->parse_env); if(result == 0) - parser_parse_body_loop(self, &self->scope, TOK_END_OF_FILE); + parser_parse_body_loop(self, &self->struct_decl.body, TOK_END_OF_FILE); else if(self->error.str != NULL) { switch(self->error_context) { case ERROR_CONTEXT_NONE: |