diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-12-18 20:34:55 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-12-18 20:34:55 +0000 |
| commit | 5217eb55b4d0b53828d9ba4599a249216c813d42 (patch) | |
| tree | 88d8106a8ca42eb64fc273f529c012f754f33f61 /src/parser.c | |
| parent | 062a2c63e16c31cd68f758ec8946b9cd3bfe4d34 (diff) | |
Change of `proc` and `type` declaration syntax to "prefix" style
`proc name()` from `name :: proc()`
Diffstat (limited to 'src/parser.c')
| -rw-r--r-- | src/parser.c | 106 |
1 files changed, 61 insertions, 45 deletions
diff --git a/src/parser.c b/src/parser.c index f2e61bfc4..9f3a044fe 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1565,10 +1565,13 @@ AstNode *parse_operand(AstFile *f, bool lhs) { default: { AstNode *type = parse_identifier_or_type(f); if (type != NULL) { + // TODO(bill): Is this correct??? // NOTE(bill): Sanity check as identifiers should be handled already - GB_ASSERT_MSG(type->kind != AstNode_Ident, "Type Cannot be identifier"); + // TokenPos pos = ast_node_token(type).pos; + // GB_ASSERT_MSG(type->kind != AstNode_Ident, "Type Cannot be identifier %.*s(%td:%td)", LIT(pos.file), pos.line, pos.column); return type; } + break; } } @@ -1859,9 +1862,6 @@ void parse_check_name_list_for_reserves(AstFile *f, AstNodeArray names) { } } -AstNode *parse_proc_decl(AstFile *f, Token proc_token, AstNode *name); - - AstNode *parse_simple_stmt(AstFile *f) { isize lhs_count = 0, rhs_count = 0; AstNodeArray lhs = parse_lhs_expr_list(f); @@ -1932,33 +1932,33 @@ AstNode *parse_simple_stmt(AstFile *f) { Token colon_colon = expect_token(f, Token_ColonColon); - if (f->curr_token.kind == Token_type || - f->curr_token.kind == Token_struct || - f->curr_token.kind == Token_enum || - f->curr_token.kind == Token_union || - f->curr_token.kind == Token_raw_union) { - // if (f->curr_token.kind == Token_type) { - Token token = f->curr_token; - if (token.kind == Token_type) { - next_token(f); - } - if (names.count != 1) { - syntax_error_node(names.e[0], "You can only declare one type at a time"); - return make_bad_decl(f, names.e[0]->Ident, token); - } - - return make_type_decl(f, token, names.e[0], parse_type(f)); - } else if (f->curr_token.kind == Token_proc) { - // NOTE(bill): Procedure declarations - Token proc_token = f->curr_token; - AstNode *name = names.e[0]; - if (names.count != 1) { - syntax_error(proc_token, "You can only declare one procedure at a time"); - return make_bad_decl(f, name->Ident, proc_token); - } - - return parse_proc_decl(f, proc_token, name); - } + // if (f->curr_token.kind == Token_type || + // f->curr_token.kind == Token_struct || + // f->curr_token.kind == Token_enum || + // f->curr_token.kind == Token_union || + // f->curr_token.kind == Token_raw_union) { + // // if (f->curr_token.kind == Token_type) { + // Token token = f->curr_token; + // if (token.kind == Token_type) { + // next_token(f); + // } + // if (names.count != 1) { + // syntax_error_node(names.e[0], "You can only declare one type at a time"); + // return make_bad_decl(f, names.e[0]->Ident, token); + // } + + // return make_type_decl(f, token, names.e[0], parse_type(f)); + // } else if (f->curr_token.kind == Token_proc) { + // // NOTE(bill): Procedure declarations + // Token proc_token = f->curr_token; + // AstNode *name = names.e[0]; + // if (names.count != 1) { + // syntax_error(proc_token, "You can only declare one procedure at a time"); + // return make_bad_decl(f, name->Ident, proc_token); + // } + + // return parse_proc_decl(f, proc_token, name); + // } AstNodeArray values = parse_rhs_expr_list(f); if (values.count > names.count) { @@ -2059,13 +2059,14 @@ AstNode *parse_type(AstFile *f) { } -Token parse_proc_signature(AstFile *f, AstNodeArray *params, AstNodeArray *results); +void parse_proc_signature(AstFile *f, AstNodeArray *params, AstNodeArray *results); AstNode *parse_proc_type(AstFile *f) { AstNodeArray params = {0}; AstNodeArray results = {0}; - Token proc_token = parse_proc_signature(f, ¶ms, &results); + Token proc_token = expect_token(f, Token_proc); + parse_proc_signature(f, ¶ms, &results); return make_proc_type(f, proc_token, params, results, 0); } @@ -2406,15 +2407,13 @@ AstNodeArray parse_results(AstFile *f) { return results; } -Token parse_proc_signature(AstFile *f, - AstNodeArray *params, - AstNodeArray *results) { - Token proc_token = expect_token(f, Token_proc); +void parse_proc_signature(AstFile *f, + AstNodeArray *params, + AstNodeArray *results) { expect_token(f, Token_OpenParen); *params = parse_parameter_list(f, true); expect_token_after(f, Token_CloseParen, "parameter list"); *results = parse_results(f); - return proc_token; } AstNode *parse_body(AstFile *f) { @@ -2429,8 +2428,16 @@ AstNode *parse_body(AstFile *f) { -AstNode *parse_proc_decl(AstFile *f, Token proc_token, AstNode *name) { - AstNode *proc_type = parse_proc_type(f); +AstNode *parse_proc_decl(AstFile *f) { + Token proc_token = expect_token(f, Token_proc); + + AstNode *name = parse_identifier(f); + + AstNodeArray params = {0}; + AstNodeArray results = {0}; + parse_proc_signature(f, ¶ms, &results); + + AstNode *proc_type = make_proc_type(f, proc_token, params, results, 0); AstNode *body = NULL; u64 tags = 0; @@ -2737,9 +2744,6 @@ AstNode *parse_defer_stmt(AstFile *f) { AstNode *parse_asm_stmt(AstFile *f) { Token token = expect_token(f, Token_asm); bool is_volatile = false; - if (allow_token(f, Token_volatile)) { - is_volatile = true; - } Token open, close, code_string; open = expect_token(f, Token_OpenBrace); code_string = expect_token(f, Token_String); @@ -2764,7 +2768,14 @@ AstNode *parse_asm_stmt(AstFile *f) { } - +AstNode *parse_type_decl(AstFile *f) { + Token token = expect_token(f, Token_type); + AstNode *name = parse_identifier(f); + AstNode *type = parse_type(f); + AstNode *decl = make_type_decl(f, token, name, type); + expect_semicolon(f, decl); + return decl; +} AstNode *parse_stmt(AstFile *f) { AstNode *s = NULL; @@ -2777,7 +2788,6 @@ AstNode *parse_stmt(AstFile *f) { case Token_Rune: case Token_String: case Token_OpenParen: - case Token_proc: // Unary Operators case Token_Add: case Token_Sub: @@ -2804,6 +2814,12 @@ AstNode *parse_stmt(AstFile *f) { expect_semicolon(f, s); return s; + case Token_proc: + return parse_proc_decl(f); + + case Token_type: + return parse_type_decl(f); + case Token_using: { AstNode *node = NULL; |