aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c15
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: