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;
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 {
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);
}
"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",
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);
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);
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;
}
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;