From 5e99afecd8673bb7b7d75161fd6a001300a32b58 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 9 Aug 2020 21:45:14 -0500 Subject: [PATCH] Code cleanup for numeric literals --- include/onyxastnodes.h | 2 + include/onyxlex.h | 3 +- onyx | Bin 136184 -> 136192 bytes src/onyxchecker.c | 7 ++ src/onyxlex.c | 30 +++++-- src/onyxparser.c | 83 ++++++++++-------- src/onyxutils.c | 193 +++-------------------------------------- 7 files changed, 94 insertions(+), 224 deletions(-) diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index 7844ecff..ab6f1c96 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -492,6 +492,8 @@ typedef struct BuiltinSymbol { extern const BuiltinSymbol builtin_symbols[]; +// NOTE: Useful not inlined functions +void promote_numlit_to_larger(AstNumLit* num); // NOTE: Useful inlined functions static inline b32 is_lval(AstNode* node) { diff --git a/include/onyxlex.h b/include/onyxlex.h index d7c4f468..e1c23c11 100644 --- a/include/onyxlex.h +++ b/include/onyxlex.h @@ -58,7 +58,8 @@ typedef enum TokenType { Token_Type_Symbol, Token_Type_Literal_String, - Token_Type_Literal_Numeric, + Token_Type_Literal_Integer, + Token_Type_Literal_Float, Token_Type_Literal_True, Token_Type_Literal_False, diff --git a/onyx b/onyx index ec5938bda814e7c885cc0be7a5d61d3c3786c68c..d9a0568bce2ba3eede60ebdac58bdc563d52ea72 100755 GIT binary patch delta 32050 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 L>@EgbGt`gkV9`u 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 == Ast_Kind_NumLit) { + fornode->step->type_node = fornode->start->type_node; + fornode->step->type = fornode->start->type; + promote_numlit_to_larger((AstNumLit *) fornode->step); + } + if (!types_are_compatible(fornode->end->type, fornode->start->type)) { onyx_message_add(Msg_Type_Literal, fornode->end->token->pos, diff --git a/src/onyxlex.c b/src/onyxlex.c index f5462d56..3f7fbe78 100644 --- a/src/onyxlex.c +++ b/src/onyxlex.c @@ -56,7 +56,8 @@ static const char* token_type_names[] = { "TOKEN_TYPE_SYMBOL", "TOKEN_TYPE_LITERAL_STRING", - "TOKEN_TYPE_LITERAL_NUMERIC", + "TOKEN_TYPE_LITERAL_INTEGER", + "TOKEN_TYPE_LITERAL_FLOAT", "true", "false", @@ -243,7 +244,7 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) { INCREMENT_CURR_TOKEN(tokenizer); } - tk.type = Token_Type_Literal_Numeric; + tk.type = Token_Type_Literal_Integer; tk.length = len; INCREMENT_CURR_TOKEN(tokenizer); @@ -251,19 +252,36 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) { } // Number literal - if (char_is_num(*tokenizer->curr)) { + if (char_is_num(*tokenizer->curr) + || (*(tokenizer->curr) == '.' && char_is_num(*(tokenizer->curr + 1)))) { + tk.type = Token_Type_Literal_Integer; + + b32 hit_decimal = 0; + if (*tokenizer->curr == '.') hit_decimal = 1; + u32 len = 1; - while (char_is_num(*(tokenizer->curr + 1)) || *(tokenizer->curr + 1) == '.') { + while (char_is_num(*(tokenizer->curr + 1)) || (!hit_decimal && *(tokenizer->curr + 1) == '.')) { len++; INCREMENT_CURR_TOKEN(tokenizer); + + if (*tokenizer->curr == '.') hit_decimal = 1; } - if (*(tokenizer->curr + 1) == 'f') { + if (!hit_decimal && *(tokenizer->curr + 1) == 'l') { + tk.type = Token_Type_Literal_Integer; + len++; INCREMENT_CURR_TOKEN(tokenizer); } + else if (*(tokenizer->curr + 1) == 'f') { + tk.type = Token_Type_Literal_Float; + + len++; + INCREMENT_CURR_TOKEN(tokenizer); + } + + if (hit_decimal) tk.type = Token_Type_Literal_Float; - tk.type = Token_Type_Literal_Numeric; tk.length = len; INCREMENT_CURR_TOKEN(tokenizer); diff --git a/src/onyxparser.c b/src/onyxparser.c index 5b0c3ffc..67749e1d 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -14,7 +14,8 @@ static void unconsume_token(OnyxParser* parser); static b32 is_terminating_token(TokenType token_type); static OnyxToken* expect_token(OnyxParser* parser, TokenType token_type); -static AstNumLit* parse_numeric_literal(OnyxParser* parser); +static AstNumLit* parse_int_literal(OnyxParser* parser); +static AstNumLit* parse_float_literal(OnyxParser* parser); static AstTyped* parse_factor(OnyxParser* parser); static AstTyped* parse_expression(OnyxParser* parser); static AstIf* parse_if_stmt(OnyxParser* parser); @@ -95,40 +96,49 @@ static void add_node_to_process(OnyxParser* parser, AstNode* node) { -static AstNumLit* parse_numeric_literal(OnyxParser* parser) { - AstNumLit* lit_node = make_node(AstNumLit, Ast_Kind_NumLit); - lit_node->token = expect_token(parser, Token_Type_Literal_Numeric); - lit_node->flags |= Ast_Flag_Comptime; - lit_node->value.l = 0ll; +static AstNumLit* parse_int_literal(OnyxParser* parser) { + AstNumLit* int_node = make_node(AstNumLit, Ast_Kind_NumLit); + int_node->token = expect_token(parser, Token_Type_Literal_Integer); + int_node->flags |= Ast_Flag_Comptime; + int_node->value.l = 0ll; - AstType* type; - token_toggle_end(lit_node->token); - char* tok = lit_node->token->text; + AstType* type = (AstType *) &basic_type_i32; + token_toggle_end(int_node->token); - // NOTE: charset_contains() behaves more like string_contains() - // so I'm using it in this case - if (charset_contains(tok, '.')) { - if (tok[lit_node->token->length - 1] == 'f') { - type = (AstType *) &basic_type_f32; - lit_node->value.f = strtof(tok, NULL); - } else { - type = (AstType *) &basic_type_f64; - lit_node->value.d = strtod(tok, NULL); - } - } else { - i64 value = strtoll(tok, NULL, 0); - if (bh_abs(value) < ((u64) 1 << 32)) { - type = (AstType *) &basic_type_i32; - } else { - type = (AstType *) &basic_type_i64; - } + char* first_invalid = NULL; + i64 value = strtoll(int_node->token->text, &first_invalid, 0); + if (bh_abs(value) > ((u64) 1 << 32) || *first_invalid == 'l') { + type = (AstType *) &basic_type_i64; + } - lit_node->value.l = value; + int_node->value.l = value; + int_node->type_node = type; + + token_toggle_end(int_node->token); + return int_node; +} + +static AstNumLit* parse_float_literal(OnyxParser* parser) { + AstNumLit* float_node = make_node(AstNumLit, Ast_Kind_NumLit); + float_node->token = expect_token(parser, Token_Type_Literal_Float); + float_node->flags |= Ast_Flag_Comptime; + float_node->value.d = 0.0; + + AstType* type = (AstType *) &basic_type_f64; + token_toggle_end(float_node->token); + + if (float_node->token->text[float_node->token->length - 1] == 'f') { + type = (AstType *) &basic_type_f32; + float_node->value.f = strtof(float_node->token->text, NULL); + } else { + type = (AstType *) &basic_type_f64; + float_node->value.d = strtod(float_node->token->text, NULL); } - lit_node->type_node = type; - token_toggle_end(lit_node->token); - return lit_node; + float_node->type_node = type; + + token_toggle_end(float_node->token); + return float_node; } // ( ) @@ -241,8 +251,12 @@ static AstTyped* parse_factor(OnyxParser* parser) { break; } - case Token_Type_Literal_Numeric: - retval = (AstTyped *) parse_numeric_literal(parser); + case Token_Type_Literal_Integer: + retval = (AstTyped *) parse_int_literal(parser); + break; + + case Token_Type_Literal_Float: + retval = (AstTyped *) parse_float_literal(parser); break; case Token_Type_Literal_String: { @@ -731,7 +745,8 @@ static AstNode* parse_statement(OnyxParser* parser) { case '-': case '!': case '*': - case Token_Type_Literal_Numeric: + case Token_Type_Literal_Integer: + case Token_Type_Literal_Float: case Token_Type_Literal_String: retval = (AstNode *) parse_expression(parser); break; @@ -1252,7 +1267,7 @@ static AstEnumType* parse_enum_declaration(OnyxParser* parser) { consume_token(parser); expect_token(parser, ':'); - evalue->value = parse_numeric_literal(parser); + evalue->value = parse_int_literal(parser); } expect_token(parser, ';'); diff --git a/src/onyxutils.c b/src/onyxutils.c index a8a4ec36..4a1c20fe 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -134,7 +134,6 @@ b32 symbol_introduce(Scope* scope, OnyxToken* tkn, AstNode* symbol) { } b32 symbol_raw_introduce(Scope* scope, char* name, OnyxFilePos pos, AstNode* symbol) { - if (bh_table_has(AstNode *, scope->symbols, name)) { onyx_message_add(Msg_Type_Redeclare_Symbol, pos, name); return 0; @@ -181,191 +180,19 @@ AstNode* symbol_resolve(Scope* start_scope, OnyxToken* tkn) { } -void onyx_ast_print(AstNode* node, i32 indent) { - assert(0); -} -#if 0 - -#define print_indent { if (indent > 0) bh_printf("\n"); for (int i = 0; i < indent; i++) bh_printf(" "); } - -void onyx_ast_print(AstNode* node, i32 indent) { - while (node) { - print_indent; - bh_printf("(%d) %s ", node->flags, onyx_ast_node_kind_string(node->kind)); - - switch (node->kind) { - case AST_NODE_KIND_USE: { - AstNodeUse* use_node = (AstNodeUse *) node; - bh_printf("%b", use_node->filename->token, use_node->filename->length); - - break; - } - - case AST_NODE_KIND_FUNCTION: { - if (node->token) - bh_printf("(%b) ", node->token->token, node->token->length); - AstNodeFunction* fd = (AstNodeFunction *) node; - - print_indent; - bh_printf("Params "); - if (fd->params) - onyx_ast_print((AstNode *) fd->params, 0); - - print_indent; - bh_printf("Returns %s", fd->base.type->name); - - print_indent; - bh_printf("Body"); - if (fd->body) - onyx_ast_print((AstNode *) fd->body, indent + 1); - - break; - } - - case AST_NODE_KIND_PARAM: { - AstNodeLocal* param = (AstNodeLocal *) node; - bh_printf("%b %s", param->base.token->token, param->base.token->length, param->base.type->name); - if (param->base.next && indent == 0) { - bh_printf(", "); - onyx_ast_print((AstNode *) param->base.next, 0); - } - - return; - } - - case AST_NODE_KIND_BLOCK: { - AstNodeBlock* block = (AstNodeBlock *) node; - if (block->scope) { - onyx_ast_print((AstNode *) block->scope, indent + 1); - } - - if (block->body) { - onyx_ast_print((AstNode *) block->body, indent + 1); - } - - break; - } - - case AST_NODE_KIND_SCOPE: { - AstNodeScope* scope = (AstNodeScope *) scope; - if (scope->last_local) { - onyx_ast_print((AstNode *) scope->last_local, 0); - } - - break; - } - - case AST_NODE_KIND_LOCAL: { - AstNodeLocal* local = (AstNodeLocal *) node; - bh_printf("%b %s", local->base.token->token, local->base.token->length, local->base.type->name); - if (local->prev_local && indent == 0) { - bh_printf(", "); - onyx_ast_print((AstNode *) local->prev_local, 0); - } - break; - } - - case AST_NODE_KIND_GLOBAL: { - AstNodeGlobal* global = (AstNodeGlobal *) node; - bh_printf("%b %s", global->base.token->token, global->base.token->length, global->base.type->name); - if (global->initial_value) { - onyx_ast_print((AstNode *) global->initial_value, indent + 1); - } - - if (node->next) { - onyx_ast_print(node->next, indent); - } - break; - } - - case AST_NODE_KIND_SYMBOL: { - bh_printf("%b", node->token->token, node->token->length); - if (node->next) { - onyx_ast_print(node->next, indent); - } - break; - } - - case AST_NODE_KIND_RETURN: { - AstNodeReturn* ret = (AstNodeReturn *) node; - if (ret->expr) { - onyx_ast_print((AstNode *) ret->expr, indent + 1); - } - - break; - } - - case AST_NODE_KIND_LITERAL: { - AstNodeNumLit* lit = (AstNodeNumLit *) node; - bh_printf("(%s) %b", lit->base.type->name, lit->base.token->token, lit->base.token->length); - - break; - } - case AST_NODE_KIND_CALL: { - AstNodeCall* call = (AstNodeCall *) node; - if (call->callee) { - if (call->callee->kind == AST_NODE_KIND_FUNCTION) { - bh_printf("function: %b", call->callee->token->token, call->callee->token->length); - } else { - onyx_ast_print(call->callee, indent + 1); - } - } - onyx_ast_print((AstNode *) call->arguments, indent + 1); - - break; - } - case AST_NODE_KIND_FOREIGN: { - AstNodeForeign* foreign = (AstNodeForeign *) node; - bh_printf("%b:%b", - foreign->mod_token->token, foreign->mod_token->length, - foreign->name_token->token, foreign->name_token->length); - if (foreign->import) { - onyx_ast_print(foreign->import, indent + 1); - } +void promote_numlit_to_larger(AstNumLit* num) { + assert(num->type != NULL); - break; - } - - case AST_NODE_KIND_IF: { - AstNodeIf* if_node = (AstNodeIf *) node; - if (if_node->cond) { - print_indent; - bh_printf("Condition:"); - onyx_ast_print((AstNode *) if_node->cond, indent + 1); - } - if (if_node->true_block.as_if) { - print_indent; - bh_printf("True block:"); - onyx_ast_print((AstNode *) if_node->true_block.as_if, indent + 1); - } - if (if_node->false_block.as_if) { - print_indent; - bh_printf("False block:"); - onyx_ast_print((AstNode *) if_node->false_block.as_if, indent + 1); - } - - break; - } - - case AST_NODE_KIND_BIN_OP: { - AstNodeBinOp* binop = (AstNodeBinOp *) node; - bh_printf("%b", binop->base.token->token, binop->base.token->length); - - onyx_ast_print((AstNode *) binop->left, indent + 1); - onyx_ast_print((AstNode *) binop->right, indent + 1); - - break; - } - - default: - break; - } - - node = node->next; + if (type_is_integer(num->type) && num->type->Basic.size <= 4) { + // NOTE: Int32, Int16, Int8 + i64 val = (i64) num->value.i; + num->value.l = val; + } else if (num->type->Basic.size <= 4) { + // NOTE: Float32 + f64 val = (f64) num->value.f; + num->value.d = val; } } - -#endif -- 2.25.1