aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/parser.c b/src/parser.c
index fdf34ce..e36790f 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -61,7 +61,7 @@ int parser_init(Parser *self, amal_compiler *compiler, ArenaAllocator *allocator
self->error_context = ERROR_CONTEXT_NONE;
return_if_error(structdecl_init(&self->struct_decl, &compiler->root_scope, allocator));
self->struct_decl.body.parser = self;
- lhsexpr_init(&self->file_decl, bool_true, bool_true, bool_true, create_buffer_view_null());
+ lhsexpr_init(&self->file_decl, DECL_FLAG_EXTERN | DECL_FLAG_PUB | DECL_FLAG_CONST, create_buffer_view_null());
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;
self->has_func_parent = bool_false;
@@ -192,29 +192,39 @@ LHS_DECLARATION = 'extern'? 'pub'? 'const'|'var' TOK_IDENTIFIER VAR_TYPE_DEF?
*/
static CHECK_RESULT LhsExpr* parser_parse_declaration_lhs(Parser *self) {
LhsExpr *result;
+ DeclFlag decl_flag;
bool is_extern;
bool is_pub;
bool is_const;
BufferView var_name;
+ decl_flag = DECL_FLAG_NONE;
throw_if_error(tokenizer_consume_if(&self->tokenizer, TOK_EXTERN, &is_extern));
- if(is_extern && self->has_func_parent) {
- self->error = tokenizer_create_error(&self->tokenizer,
- tokenizer_get_code_reference_index(&self->tokenizer, self->tokenizer.value.identifier.data),
- "Only declarations in global structs can be extern");
- throw(PARSER_UNEXPECTED_TOKEN);
+ if(is_extern) {
+ decl_flag |= DECL_FLAG_EXTERN;
+ if(self->has_func_parent) {
+ self->error = tokenizer_create_error(&self->tokenizer,
+ tokenizer_get_code_reference_index(&self->tokenizer, self->tokenizer.value.identifier.data),
+ "Only declarations in global structs can be extern");
+ throw(PARSER_UNEXPECTED_TOKEN);
+ }
}
throw_if_error(tokenizer_consume_if(&self->tokenizer, TOK_PUB, &is_pub));
- if(is_pub && self->has_func_parent) {
- self->error = tokenizer_create_error(&self->tokenizer,
- tokenizer_get_code_reference_index(&self->tokenizer, self->tokenizer.value.identifier.data),
- "Only declarations in global structs can be public");
- throw(PARSER_UNEXPECTED_TOKEN);
+ if(is_pub) {
+ decl_flag |= DECL_FLAG_PUB;
+ if(self->has_func_parent) {
+ self->error = tokenizer_create_error(&self->tokenizer,
+ tokenizer_get_code_reference_index(&self->tokenizer, self->tokenizer.value.identifier.data),
+ "Only declarations in global structs can be public");
+ throw(PARSER_UNEXPECTED_TOKEN);
+ }
}
throw_if_error(tokenizer_consume_if(&self->tokenizer, TOK_CONST, &is_const));
- if(!is_const) {
+ if(is_const) {
+ decl_flag |= DECL_FLAG_CONST;
+ } else {
bool isVar;
if(is_extern) {
@@ -232,7 +242,7 @@ static CHECK_RESULT LhsExpr* parser_parse_declaration_lhs(Parser *self) {
throw_if_error(tokenizer_accept(&self->tokenizer, TOK_IDENTIFIER));
var_name = self->tokenizer.value.identifier;
throw_if_error(arena_allocator_alloc(self->allocator, sizeof(LhsExpr), (void**)&result));
- lhsexpr_init(result, is_extern, is_pub, is_const, var_name);
+ lhsexpr_init(result, decl_flag, var_name);
parser_parse_var_type_def(self, &result->type);
return result;
@@ -642,7 +652,7 @@ Ast* parser_parse_body(Parser *self) {
bool match;
throw_if_error(ast_create(self->allocator, lhs_expr, AST_LHS, &result));
- if(lhs_expr->is_extern) {
+ if(LHS_EXPR_IS_EXTERN(lhs_expr)) {
throw_if_error(tokenizer_accept(&self->tokenizer, TOK_SEMICOLON));
if (lhs_expr->type.type == VARIABLE_TYPE_NONE) {
self->error = tokenizer_create_error(&self->tokenizer, self->tokenizer.prev_index, "A variable can't be declared without a type or assignment");