From 2c6b2c41b8257b5a71e1a58a740ead1792f29a0e Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 21 Jun 2020 16:16:43 -0500 Subject: [PATCH] Removed need for semicolons after some statements --- docs/plan | 6 ++-- misc/onyx.vim | 14 ++-------- onyx | Bin 164888 -> 165088 bytes progs/minimal.onyx | 15 +++++----- src/onyx.c | 2 +- src/onyxparser.c | 67 +++++++++++++++++++++++++++------------------ 6 files changed, 55 insertions(+), 49 deletions(-) diff --git a/docs/plan b/docs/plan index bb41161e..fa9396ab 100644 --- a/docs/plan +++ b/docs/plan @@ -56,12 +56,12 @@ HOW: [X] Numeric literals are parsed [X] Numeric literals have the minimum type detected [X] Foreign imports (functions only) - [ ] Comparison operators + [X] Comparison operators [ ] Proper boolean type - [ ] Conditional branching works as expected + [X] Conditional branching works as expected [ ] Simple while loop is functioning as expected [ ] break and continue semantics - [ ] Function calling works for the builtin types + [X] Function calling works for the builtin types [ ] Function return values are type checked Stage 2: diff --git a/misc/onyx.vim b/misc/onyx.vim index 89d22c44..5b008a97 100644 --- a/misc/onyx.vim +++ b/misc/onyx.vim @@ -10,18 +10,10 @@ endif let s:cpo_save = &cpo set cpo&vim -syn keyword onyxKeyword struct -syn keyword onyxKeyword use -syn keyword onyxKeyword if -syn keyword onyxKeyword elseif -syn keyword onyxKeyword else -syn keyword onyxKeyword export -syn keyword onyxKeyword proc -syn keyword onyxKeyword foreign -syn keyword onyxKeyword for +syn keyword onyxKeyword struct proc use export foreign global +syn keyword onyxKeyword if elseif else +syn keyword onyxKeyword for return do syn keyword onyxKeyword return -syn keyword onyxKeyword do -syn keyword onyxKeyword global syn keyword onyxKeyword as syn keyword onyxType i32 diff --git a/onyx b/onyx index 7b7f254aa9559225a1e62fc185bd033150fc1f3a..cfd3f20a370ecf787b69acd09c5917471cdf4918 100755 GIT binary patch delta 40179 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
h{T6ZeieZ6te?oicZi#0^G+zUJkT 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 Ks)LCmGUI i32 { - return 10 as i32; + return 10; } add :: proc (a i32, b i32) -> i32 { @@ -16,7 +16,7 @@ add :: proc (a i32, b i32) -> i32 { // is possible that all code paths are covered with returning // an i32. This will need to be fixed. abs :: proc (val i32) -> i32 { - if val <= 0 { return -val; }; + if val <= 0 { return -val; } // else { return val; }; return val; } @@ -29,10 +29,9 @@ diff_square :: proc (a i32, b i32) -> i32 { return c * d; } -export do_stuff :: proc -> i32 { - res := diff_square((4 + 5) as i32, (2 + 3) as i32); +do_stuff :: proc -> i32 { + res := diff_square(4 + 5, 2 + 3); res = res + foo(); - // res should be -66 return res * -1; } @@ -47,10 +46,12 @@ export main :: proc { new_output :: abs(output) * 2; print(new_output); + } elseif output == -67 { + print(1234); + } else { print(-1); - - }; + } print(output); print_float(float_test()); diff --git a/src/onyx.c b/src/onyx.c index 816a38a7..2a57a80e 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -55,7 +55,7 @@ int main(int argc, char *argv[]) { onyx_message_print(&msgs); goto main_exit; } else { - // onyx_ast_print(program, 0); + onyx_ast_print(program, 0); bh_printf("\nNo errors.\n"); } diff --git a/src/onyxparser.c b/src/onyxparser.c index bfe4a3c6..0d0146ec 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -77,7 +77,7 @@ static OnyxAstNodeNumLit* parse_numeric_literal(OnyxParser* parser); static OnyxAstNode* parse_factor(OnyxParser* parser); static OnyxAstNode* parse_bin_op(OnyxParser* parser, OnyxAstNode* left); static OnyxAstNode* parse_expression(OnyxParser* parser); -static OnyxAstNode* parse_if_stmt(OnyxParser* parser); +static OnyxAstNodeIf* parse_if_stmt(OnyxParser* parser); static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret); static OnyxAstNode* parse_return_statement(OnyxParser* parser); static OnyxAstNodeBlock* parse_block(OnyxParser* parser, b32 belongs_to_function); @@ -430,7 +430,7 @@ expression_done: return root; } -static OnyxAstNode* parse_if_stmt(OnyxParser* parser) { +static OnyxAstNodeIf* parse_if_stmt(OnyxParser* parser) { expect(parser, TOKEN_TYPE_KEYWORD_IF); OnyxAstNode* cond = parse_expression(parser); @@ -440,7 +440,8 @@ static OnyxAstNode* parse_if_stmt(OnyxParser* parser) { OnyxAstNodeIf* root_if = if_node; if_node->cond = cond; - if_node->true_block = true_block->as_block.body; + if (true_block != NULL) + if_node->true_block = true_block->as_block.body; while (parser->curr_token->type == TOKEN_TYPE_KEYWORD_ELSEIF) { parser_next_token(parser); @@ -450,7 +451,8 @@ static OnyxAstNode* parse_if_stmt(OnyxParser* parser) { true_block = (OnyxAstNode *) parse_block(parser, 0); elseif_node->cond = cond; - elseif_node->true_block = true_block->as_block.body; + if (true_block != NULL) + elseif_node->true_block = true_block->as_block.body; if_node->false_block = (OnyxAstNode *) elseif_node; if_node = elseif_node; @@ -460,10 +462,11 @@ static OnyxAstNode* parse_if_stmt(OnyxParser* parser) { parser_next_token(parser); OnyxAstNode* false_block = (OnyxAstNode *) parse_block(parser, 0); - if_node->false_block = false_block->as_block.body; + if (false_block != NULL) + if_node->false_block = false_block->as_block.body; } - return (OnyxAstNode *) root_if; + return root_if; } // Returns 1 if the symbol was consumed. Returns 0 otherwise @@ -595,19 +598,22 @@ static OnyxAstNode* parse_return_statement(OnyxParser* parser) { } static OnyxAstNode* parse_statement(OnyxParser* parser) { + b32 needs_semicolon = 1; + OnyxAstNode* retval = NULL; + switch (parser->curr_token->type) { case TOKEN_TYPE_KEYWORD_RETURN: - return parse_return_statement(parser); + retval = parse_return_statement(parser); + break; case TOKEN_TYPE_OPEN_BRACE: - return (OnyxAstNode *) parse_block(parser, 0); + needs_semicolon = 0; + retval = (OnyxAstNode *) parse_block(parser, 0); + break; case TOKEN_TYPE_SYMBOL: - { - OnyxAstNode* ret = NULL; - if (parse_symbol_statement(parser, &ret)) return ret; - // fallthrough - } + if (parse_symbol_statement(parser, &retval)) break; + // fallthrough case TOKEN_TYPE_OPEN_PAREN: case TOKEN_TYPE_SYM_PLUS: @@ -615,14 +621,32 @@ static OnyxAstNode* parse_statement(OnyxParser* parser) { case TOKEN_TYPE_SYM_BANG: case TOKEN_TYPE_LITERAL_NUMERIC: case TOKEN_TYPE_LITERAL_STRING: - return parse_expression(parser); + retval = parse_expression(parser); + break; case TOKEN_TYPE_KEYWORD_IF: - return parse_if_stmt(parser); + needs_semicolon = 0; + retval = (OnyxAstNode *) parse_if_stmt(parser); + break; default: - return NULL; + break; } + + if (needs_semicolon) { + if (parser->curr_token->type != TOKEN_TYPE_SYM_SEMICOLON) { + onyx_message_add(parser->msgs, + ONYX_MESSAGE_TYPE_EXPECTED_TOKEN, + parser->curr_token->pos, + onyx_get_token_type_name(TOKEN_TYPE_SYM_SEMICOLON), + onyx_get_token_type_name(parser->curr_token->type)); + + find_token(parser, TOKEN_TYPE_SYM_SEMICOLON); + } + parser_next_token(parser); + } + + return retval; } static OnyxAstNodeBlock* parse_block(OnyxParser* parser, b32 belongs_to_function) { @@ -651,17 +675,6 @@ static OnyxAstNodeBlock* parse_block(OnyxParser* parser, b32 belongs_to_function *next = stmt; next = &stmt->next; } - - if (parser->curr_token->type != TOKEN_TYPE_SYM_SEMICOLON) { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_EXPECTED_TOKEN, - parser->curr_token->pos, - onyx_get_token_type_name(TOKEN_TYPE_SYM_SEMICOLON), - onyx_get_token_type_name(parser->curr_token->type)); - - find_token(parser, TOKEN_TYPE_SYM_SEMICOLON); - } - parser_next_token(parser); } expect(parser, TOKEN_TYPE_CLOSE_BRACE); -- 2.25.1