diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/parser.c b/src/parser.c index 5396b72..57606b5 100644 --- a/src/parser.c +++ b/src/parser.c @@ -75,6 +75,10 @@ int parser_init(Parser *self, amal_compiler *compiler, ScopedAllocator *allocato return scope_init(&self->scope, &compiler->root_scope, self->allocator); } +static bool parser_is_global_scope(Parser *self) { + return self->current_scope == &self->scope; +} + /* BODY_LOOP = BODY* @end_token */ @@ -158,12 +162,21 @@ LHS = ('const' TOK_IDENTIFIER VAR_TYPE_DEF? '=') | ('var' TOK_IDENTIFIER VAR_TYPE_DEF? '='|';') */ static THROWABLE parser_parse_lhs(Parser *self, LhsExpr **result, bool *assignment_or_rhs) { + bool is_pub; bool is_const; bool match; BufferView var_name; *result = NULL; *assignment_or_rhs = bool_true; + throw_if_error(tokenizer_consume_if(&self->tokenizer, TOK_PUB, &is_pub)); + if(is_pub && !parser_is_global_scope(self)) { + self->error = tokenizer_create_error(&self->tokenizer, + tokenizer_get_code_reference_index(&self->tokenizer, self->tokenizer.value.identifier.data), + "Only declarations in global scope can be public"); + throw(PARSER_UNEXPECTED_TOKEN); + } + throw_if_error(tokenizer_consume_if(&self->tokenizer, TOK_CONST, &is_const)); if(!is_const) { bool isVar; @@ -175,7 +188,7 @@ static THROWABLE parser_parse_lhs(Parser *self, LhsExpr **result, bool *assignme throw_if_error(tokenizer_accept(&self->tokenizer, TOK_IDENTIFIER)); var_name = self->tokenizer.value.identifier; throw_if_error(scoped_allocator_alloc(self->allocator, sizeof(LhsExpr), (void**)result)); - lhsexpr_init(*result, is_const, var_name); + lhsexpr_init(*result, is_pub, is_const, var_name); try(parser_parse_var_type_def(self, &(*result)->type.name)); @@ -574,7 +587,6 @@ int parser_parse_buffer(Parser *self, BufferView code_buffer, BufferView buffer_ if(result != 0) { amal_log_info("Failed, reason: %d", result); } - assert(self->current_scope == &self->scope); return result; } @@ -620,7 +632,6 @@ int parser_queue_file(Parser *self, BufferView path, FileScopeReference **file_s self->error = tokenizer_create_error(&self->tokenizer, tokenizer_get_code_reference_index(&self->tokenizer, path.data), "Failed to while parsing path %s (invalid path?)", path_relative); - self->error_context = ERROR_CONTEXT_NONE; am_free(path_relative); throw(result); } |