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