small bugfixes
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 14 Jul 2020 22:42:44 +0000 (17:42 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 14 Jul 2020 22:42:44 +0000 (17:42 -0500)
include/onyxastnodes.h
include/onyxlex.h
onyx
progs/basic.onyx
src/onyxlex.c
src/onyxparser.c
src/onyxsymres.c

index ae30f3ae944ad43251a3fd1a7ddb97e85e2c0b3c..a39b876cc7c1f6767ed813c99ec0c10f3f031fcd 100644 (file)
@@ -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;
index d6b640927f66f925534593d05d2bdf725b80926e..9a6d407a0a9156831de828fce5a409927544a868 100644 (file)
@@ -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 30458373b15b8e4ddb30ddc5489fd9034fdfc1cf..be28846fee968f54df9eca91182a3ede8434a47d 100755 (executable)
Binary files a/onyx and b/onyx differ
index f97d4cfd2be4d753712c638337922c62d8866031..d8e5bcb833851662b0433f1371f54b03a2dee5d2 100644 (file)
@@ -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);
 }
index 7d6eabafe8183708c956bbfe2163eaf56298886f..8368a011f53f9dcc8501b38cc092808fd15c218c 100644 (file)
@@ -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);
index 978d17b162b472b466b3add04026738481c0641d..3a0113ad1f5de5502f00834bc3c4d414521a6e0f 100644 (file)
@@ -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;
     }
 
index ee1c7155cebfca9a37e5fea3013bb28ba6a38881..1460832f5b8427cb36446e1ef9c2d634ef9b27bc 100644 (file)
@@ -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;