From: Brendan Hansen Date: Fri, 3 Jul 2020 14:24:41 +0000 (-0500) Subject: Added +=, -=, *=, etc. operators X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=82e03cf9caf0530f69a35f37aa359304ba9500d9;p=onyx.git Added +=, -=, *=, etc. operators --- diff --git a/include/onyxlex.h b/include/onyxlex.h index ed65258e..6502862d 100644 --- a/include/onyxlex.h +++ b/include/onyxlex.h @@ -53,6 +53,11 @@ typedef enum TokenType { TOKEN_TYPE_SYM_BANG, TOKEN_TYPE_SYM_CARET, TOKEN_TYPE_SYM_AMPERSAND, + TOKEN_TYPE_SYM_PLUS_EQUAL, + TOKEN_TYPE_SYM_MINUS_EQUAL, + TOKEN_TYPE_SYM_STAR_EQUAL, + TOKEN_TYPE_SYM_FSLASH_EQUAL, + TOKEN_TYPE_SYM_PERCENT_EQUAL, TOKEN_TYPE_SYMBOL, TOKEN_TYPE_LITERAL_STRING, diff --git a/onyx b/onyx index ead39f24..abdad2c4 100755 Binary files a/onyx and b/onyx differ diff --git a/progs/other.onyx b/progs/other.onyx index db004617..7bab1efb 100644 --- a/progs/other.onyx +++ b/progs/other.onyx @@ -14,7 +14,7 @@ export fib :: proc (n: i32) -> i32 { count := n; while count >= 0 { - count = count - 1; + count -= 1; c :: a + b; b = a; @@ -31,8 +31,8 @@ export factorial :: proc (n: i32) -> i32 { i := 2; while i <= n { - f = f * i; - i = i + 1; + f *= i; + i += 1; } return f; diff --git a/progs/test.onyx b/progs/test.onyx index 6a227be4..4f0c08ef 100644 --- a/progs/test.onyx +++ b/progs/test.onyx @@ -17,14 +17,14 @@ export main2 :: proc { while i < 10 { res :: fib(i); print_i32(res); - i = i + 1; + i += 1; } i = 0; while i < 10 { res :: factorial(i); print_i32(res); - i = i + 1; + i += 1; } x : i32; @@ -34,17 +34,17 @@ export main2 :: proc { x = 0; while x < 5 { if x == 3 { - x = x + 1; + x += 1; continue; } print_i32((x + y * 5) % 10); - x = x + 1; + x += 1; } if y > 2 { break; } - y = y + 1; + y += 1; } } diff --git a/src/onyxlex.c b/src/onyxlex.c index b16d9736..a280e6a4 100644 --- a/src/onyxlex.c +++ b/src/onyxlex.c @@ -51,6 +51,11 @@ static const char* token_type_names[] = { "!", // "TOKEN_TYPE_SYM_BANG", "^", // "TOKEN_TYPE_SYM_CARET", "&", // "TOKEN_TYPE_SYM_AMPERSAND", + "+=", // "TOKEN_TYPE_SYM_PLUS_EQUAL", + "-=", // "TOKEN_TYPE_SYM_MINUS_EQUAL", + "*=", // "TOKEN_TYPE_SYM_STAR_EQUAL", + "/=", // "TOKEN_TYPE_SYM_FSLASH_EQUAL", + "%=", // "TOKEN_TYPE_SYM_PERCENT_EQUAL", "TOKEN_TYPE_SYMBOL", "TOKEN_TYPE_LITERAL_STRING", @@ -160,6 +165,11 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) { LITERAL_TOKEN(">=", 0, TOKEN_TYPE_SYM_GREATER_EQUAL); LITERAL_TOKEN("==", 0, TOKEN_TYPE_SYM_EQUAL_EQUAL); LITERAL_TOKEN("!=", 0, TOKEN_TYPE_SYM_NOT_EQUAL); + LITERAL_TOKEN("+=", 0, TOKEN_TYPE_SYM_PLUS_EQUAL); + LITERAL_TOKEN("-=", 0, TOKEN_TYPE_SYM_MINUS_EQUAL); + LITERAL_TOKEN("*=", 0, TOKEN_TYPE_SYM_STAR_EQUAL); + LITERAL_TOKEN("/=", 0, TOKEN_TYPE_SYM_FSLASH_EQUAL); + LITERAL_TOKEN("%=", 0, TOKEN_TYPE_SYM_PERCENT_EQUAL); LITERAL_TOKEN("(", 0, TOKEN_TYPE_OPEN_PAREN); LITERAL_TOKEN(")", 0, TOKEN_TYPE_CLOSE_PAREN); LITERAL_TOKEN("{", 0, TOKEN_TYPE_OPEN_BRACE); diff --git a/src/onyxparser.c b/src/onyxparser.c index 3bc38e8d..55d84acb 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -499,6 +499,43 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { return 1; } + case TOKEN_TYPE_SYM_PLUS_EQUAL: + case TOKEN_TYPE_SYM_MINUS_EQUAL: + case TOKEN_TYPE_SYM_STAR_EQUAL: + case TOKEN_TYPE_SYM_FSLASH_EQUAL: + case TOKEN_TYPE_SYM_PERCENT_EQUAL: + { + OnyxBinaryOp bin_op; + if (parser->curr_token->type == TOKEN_TYPE_SYM_PLUS_EQUAL) bin_op = ONYX_BINARY_OP_ADD; + else if (parser->curr_token->type == TOKEN_TYPE_SYM_MINUS_EQUAL) bin_op = ONYX_BINARY_OP_MINUS; + else if (parser->curr_token->type == TOKEN_TYPE_SYM_STAR_EQUAL) bin_op = ONYX_BINARY_OP_MULTIPLY; + else if (parser->curr_token->type == TOKEN_TYPE_SYM_FSLASH_EQUAL) bin_op = ONYX_BINARY_OP_DIVIDE; + else if (parser->curr_token->type == TOKEN_TYPE_SYM_PERCENT_EQUAL) bin_op = ONYX_BINARY_OP_MODULUS; + + parser_next_token(parser); + + AstNodeTyped* expr = parse_expression(parser); + + AstNodeBinOp* bin_op_node = make_node(AstNodeBinOp, AST_NODE_KIND_BIN_OP); + bin_op_node->operation = bin_op; + + AstNode* bin_op_left = make_node(AstNode, AST_NODE_KIND_SYMBOL); + bin_op_left->token = symbol; + bin_op_node->left = (AstNodeTyped *) bin_op_left; + bin_op_node->right = expr; + + AstNodeAssign* assign_node = make_node(AstNodeAssign, AST_NODE_KIND_ASSIGNMENT); + + AstNode* lval = make_node(AstNode, AST_NODE_KIND_SYMBOL); + lval->token = symbol; + assign_node->lval = (AstNodeTyped *) lval; + assign_node->expr = (AstNodeTyped *) bin_op_node; + + *ret = (AstNode *) assign_node; + + return 1; + } + default: parser_prev_token(parser); }