From: Brendan Hansen Date: Tue, 14 Jul 2020 22:42:44 +0000 (-0500) Subject: small bugfixes X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=67fac96f38fcbbb2b3f9b34f45155081874f279b;p=onyx.git small bugfixes --- diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index ae30f3ae..a39b876c 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -176,62 +176,34 @@ struct AstUse { AstNode base; OnyxToken *filename; }; typedef enum OnyxIntrinsic { ONYX_INTRINSIC_UNDEFINED, - ONYX_INTRINSIC_MEMORY_SIZE, - ONYX_INTRINSIC_MEMORY_GROW, - - ONYX_INTRINSIC_I32_CLZ, - ONYX_INTRINSIC_I32_CTZ, - ONYX_INTRINSIC_I32_POPCNT, - ONYX_INTRINSIC_I32_AND, - ONYX_INTRINSIC_I32_OR, - ONYX_INTRINSIC_I32_XOR, - ONYX_INTRINSIC_I32_SHL, - ONYX_INTRINSIC_I32_SLR, - ONYX_INTRINSIC_I32_SAR, - ONYX_INTRINSIC_I32_ROTL, - ONYX_INTRINSIC_I32_ROTR, - - ONYX_INTRINSIC_I64_CLZ, - ONYX_INTRINSIC_I64_CTZ, - ONYX_INTRINSIC_I64_POPCNT, - ONYX_INTRINSIC_I64_AND, - ONYX_INTRINSIC_I64_OR, - ONYX_INTRINSIC_I64_XOR, - ONYX_INTRINSIC_I64_SHL, - ONYX_INTRINSIC_I64_SLR, - ONYX_INTRINSIC_I64_SAR, - ONYX_INTRINSIC_I64_ROTL, - ONYX_INTRINSIC_I64_ROTR, - - ONYX_INTRINSIC_F32_ABS, - ONYX_INTRINSIC_F32_CEIL, - ONYX_INTRINSIC_F32_FLOOR, - ONYX_INTRINSIC_F32_TRUNC, - ONYX_INTRINSIC_F32_NEAREST, - ONYX_INTRINSIC_F32_SQRT, - ONYX_INTRINSIC_F32_MIN, - ONYX_INTRINSIC_F32_MAX, + ONYX_INTRINSIC_MEMORY_SIZE, ONYX_INTRINSIC_MEMORY_GROW, + + ONYX_INTRINSIC_I32_CLZ, ONYX_INTRINSIC_I32_CTZ, ONYX_INTRINSIC_I32_POPCNT, + ONYX_INTRINSIC_I32_AND, ONYX_INTRINSIC_I32_OR, ONYX_INTRINSIC_I32_XOR, + ONYX_INTRINSIC_I32_SHL, ONYX_INTRINSIC_I32_SLR, ONYX_INTRINSIC_I32_SAR, + ONYX_INTRINSIC_I32_ROTL, ONYX_INTRINSIC_I32_ROTR, + + ONYX_INTRINSIC_I64_CLZ, ONYX_INTRINSIC_I64_CTZ, ONYX_INTRINSIC_I64_POPCNT, + ONYX_INTRINSIC_I64_AND, ONYX_INTRINSIC_I64_OR, ONYX_INTRINSIC_I64_XOR, + ONYX_INTRINSIC_I64_SHL, ONYX_INTRINSIC_I64_SLR, ONYX_INTRINSIC_I64_SAR, + ONYX_INTRINSIC_I64_ROTL, ONYX_INTRINSIC_I64_ROTR, + + ONYX_INTRINSIC_F32_ABS, ONYX_INTRINSIC_F32_SQRT, + ONYX_INTRINSIC_F32_CEIL, ONYX_INTRINSIC_F32_FLOOR, + ONYX_INTRINSIC_F32_TRUNC, ONYX_INTRINSIC_F32_NEAREST, + ONYX_INTRINSIC_F32_MIN, ONYX_INTRINSIC_F32_MAX, ONYX_INTRINSIC_F32_COPYSIGN, - ONYX_INTRINSIC_F64_ABS, - ONYX_INTRINSIC_F64_CEIL, - ONYX_INTRINSIC_F64_FLOOR, - ONYX_INTRINSIC_F64_TRUNC, - ONYX_INTRINSIC_F64_NEAREST, - ONYX_INTRINSIC_F64_SQRT, - ONYX_INTRINSIC_F64_MIN, - ONYX_INTRINSIC_F64_MAX, + ONYX_INTRINSIC_F64_ABS, ONYX_INTRINSIC_F64_SQRT, + ONYX_INTRINSIC_F64_CEIL, ONYX_INTRINSIC_F64_FLOOR, + ONYX_INTRINSIC_F64_TRUNC, ONYX_INTRINSIC_F64_NEAREST, + ONYX_INTRINSIC_F64_MIN, ONYX_INTRINSIC_F64_MAX, ONYX_INTRINSIC_F64_COPYSIGN, } OnyxIntrinsic; // NOTE: This needs to have 'arguments' in the // same position as AstNodeCall -struct AstIntrinsicCall { - AstTyped base; - - AstArgument *arguments; - OnyxIntrinsic intrinsic; -}; +struct AstIntrinsicCall { AstTyped base; AstArgument *arguments; OnyxIntrinsic intrinsic; }; typedef struct OnyxProgram { bh_arr(AstGlobal *) globals; diff --git a/include/onyxlex.h b/include/onyxlex.h index d6b64092..9a6d407a 100644 --- a/include/onyxlex.h +++ b/include/onyxlex.h @@ -26,24 +26,25 @@ typedef enum TokenType { Token_Type_Right_Arrow = 272, Token_Type_Left_Arrow = 273, - - Token_Type_Greater_Equal = 274, - Token_Type_Less_Equal = 275, - Token_Type_Equal_Equal = 276, - Token_Type_Not_Equal = 277, - Token_Type_Plus_Equal = 278, - Token_Type_Minus_Equal = 279, - Token_Type_Star_Equal = 280, - Token_Type_Fslash_Equal = 281, - Token_Type_Percent_Equal = 282, - - Token_Type_Symbol = 283, - Token_Type_Literal_String = 284, - Token_Type_Literal_Numeric = 285, - Token_Type_Literal_True = 286, - Token_Type_Literal_False = 287, - - Token_Type_Count = 288 + Token_Type_Empty_Block = 274, + + Token_Type_Greater_Equal = 275, + Token_Type_Less_Equal = 276, + Token_Type_Equal_Equal = 277, + Token_Type_Not_Equal = 278, + Token_Type_Plus_Equal = 279, + Token_Type_Minus_Equal = 280, + Token_Type_Star_Equal = 281, + Token_Type_Fslash_Equal = 282, + Token_Type_Percent_Equal = 283, + + Token_Type_Symbol = 284, + Token_Type_Literal_String = 285, + Token_Type_Literal_Numeric = 286, + Token_Type_Literal_True = 287, + Token_Type_Literal_False = 288, + + Token_Type_Count = 289, } TokenType; typedef struct OnyxFilePos { diff --git a/onyx b/onyx index 30458373..be28846f 100755 Binary files a/onyx and b/onyx differ diff --git a/progs/basic.onyx b/progs/basic.onyx index f97d4cfd..d8e5bcb8 100644 --- a/progs/basic.onyx +++ b/progs/basic.onyx @@ -10,10 +10,25 @@ test :: proc (a: bool) -> bool { return !a; } +foo :: proc (n: i32) -> i32 { + a :: shl_i32(n, 1); + b :: shl_i32(n, 2); + return or_i32(a, b); +} + export main :: proc { - a : i32 = 0; + a := 16; + print(clz_i32(a)); - cond :: true; + b := 1 + foo(2); + print(b); + if b == 13 + --- + else { + print(1024); + } + + cond :: true; print(test(cond) as i32); } diff --git a/src/onyxlex.c b/src/onyxlex.c index 7d6eabaf..8368a011 100644 --- a/src/onyxlex.c +++ b/src/onyxlex.c @@ -8,32 +8,33 @@ static const char* token_type_names[] = { "TOKEN_TYPE_COMMENT", - "struct", //"TOKEN_TYPE_KEYWORD_STRUCT", - "use", //"TOKEN_TYPE_KEYWORD_USE", - "export", //"TOKEN_TYPE_KEYWORD_EXPORT", - "if", //"TOKEN_TYPE_KEYWORD_IF", - "else", //"TOKEN_TYPE_KEYWORD_ELSE", - "elseif", //"TOKEN_TYPE_KEYWORD_ELSEIF", - "return", //"TOKEN_TYPE_KEYWORD_RETURN", - "foreign", //"TOKEN_TYPE_KEYWORD_FOREIGN", - "proc", //"TOKEN_TYPE_KEYWORD_PROC", - "as", //"TOKEN_TYPE_KEYWORD_CAST", - "while", //"TOKEN_TYPE_KEYWORD_WHILE", - "break", //"TOKEN_TYPE_KEYWORD_BREAK", - "continue", //"TOKEN_TYPE_KEYWORD_CONTINUE, - - "->", //"TOKEN_TYPE_RIGHT_ARROW", - "<-", //"TOKEN_TYPE_LEFT_ARROW", - - ">=", // "TOKEN_TYPE_SYM_GREATER_EQUAL", - "<=", // "TOKEN_TYPE_SYM_LESS_EQUAL", - "==", // "TOKEN_TYPE_SYM_EQUALS_EQUALS", - "!=", // "TOKEN_TYPE_SYM_NOT_EQUAL", - "+=", // "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", + "struct", + "use", + "export", + "if", + "else", + "elseif", + "return", + "foreign", + "proc", + "as", + "while", + "break", + "continue", + + "->", + "<-", + "---", + + ">=", + "<=", + "==", + "!=", + "+=", + "-=", + "*=", + "/=", + "%=", "TOKEN_TYPE_SYMBOL", "TOKEN_TYPE_LITERAL_STRING", @@ -144,6 +145,7 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) { LITERAL_TOKEN("false", 1, Token_Type_Literal_False); LITERAL_TOKEN("->", 0, Token_Type_Right_Arrow); LITERAL_TOKEN("<-", 0, Token_Type_Right_Arrow); + LITERAL_TOKEN("---", 0, Token_Type_Empty_Block); LITERAL_TOKEN("<=", 0, Token_Type_Less_Equal); LITERAL_TOKEN(">=", 0, Token_Type_Greater_Equal); LITERAL_TOKEN("==", 0, Token_Type_Equal_Equal); diff --git a/src/onyxparser.c b/src/onyxparser.c index 978d17b1..3a0113ad 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -244,7 +244,7 @@ static AstTyped* parse_factor(OnyxParser* parser) { return NULL; } - if (parser->curr_token->type == Token_Type_Keyword_Cast) { + while (parser->curr_token->type == Token_Type_Keyword_Cast) { parser_next_token(parser); AstUnaryOp* cast_node = make_node(AstUnaryOp, Ast_Kind_Unary_Op); @@ -605,11 +605,9 @@ static AstBlock* parse_block(OnyxParser* parser) { AstLocalGroup* lg = make_node(AstLocalGroup, Ast_Kind_Local_Group); block->locals = lg; - // --- is for an empty block - if (parser->curr_token->type == '-') { - expect(parser, '-'); - expect(parser, '-'); - expect(parser, '-'); + // NOTE: --- is for an empty block + if (parser->curr_token->type == Token_Type_Empty_Block) { + expect(parser, Token_Type_Empty_Block); return block; } diff --git a/src/onyxsymres.c b/src/onyxsymres.c index ee1c7155..1460832f 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -242,7 +242,7 @@ static b32 symres_statement(OnyxSemPassState* state, AstNode* stmt) { case Ast_Kind_Assignment: symres_assignment(state, (AstAssign *) stmt); return 0; case Ast_Kind_Return: symres_return(state, (AstReturn *) stmt); return 0; case Ast_Kind_If: symres_if(state, (AstIf *) stmt); return 0; - case Ast_Kind_While: symres_while(state, (AstWhile *) stmt); return 0; + case Ast_Kind_While: symres_while(state, (AstWhile *) stmt); return 0; case Ast_Kind_Call: symres_call(state, (AstCall *) stmt); return 0; case Ast_Kind_Argument: symres_expression(state, (AstTyped **) &((AstArgument *)stmt)->value); return 0; case Ast_Kind_Block: symres_block(state, (AstBlock *) stmt); return 0;