diff options
author | dec05eba <dec05eba@protonmail.com> | 2019-08-12 09:48:55 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2020-07-25 14:36:46 +0200 |
commit | ea97370f973374f863e4296c2bb872be8b5235a3 (patch) | |
tree | bcf74846c250dd5b1f84049622ed2766605365e7 /src/parser.c | |
parent | 4ca3b74621c3608de42a91730a71892d9d7c27b5 (diff) |
Before interpreter. Cleanup build script. Begin writing code analyzer tool to find common mistakes
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 38 |
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"); |