diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/ast-tree.c | 38 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 4 | ||||
-rw-r--r-- | src/compiler/lexer.c | 57 | ||||
-rw-r--r-- | src/compiler/lexer.h | 3 | ||||
-rw-r--r-- | src/compiler/parser.c | 34 | ||||
-rw-r--r-- | src/compiler/parser.h | 2 | ||||
-rw-r--r-- | src/runner/runner.c | 30 | ||||
-rw-r--r-- | src/utils/log.h | 6 | ||||
-rw-r--r-- | src/utils/type.c | 5 | ||||
-rw-r--r-- | src/utils/type.h | 12 |
10 files changed, 160 insertions, 31 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 2a11f58..239f9b4 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -74,11 +74,13 @@ AstTree AST_TREE_U64_TYPE = { .type = &AST_TREE_TYPE_TYPE, }; +#ifdef FLOAT_16_SUPPORT AstTree AST_TREE_F16_TYPE = { .token = AST_TREE_TOKEN_TYPE_F16, .metadata = NULL, .type = &AST_TREE_TYPE_TYPE, }; +#endif AstTree AST_TREE_F32_TYPE = { .token = AST_TREE_TOKEN_TYPE_F32, @@ -125,7 +127,9 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_TYPE_U32", "AST_TREE_TOKEN_TYPE_I64", "AST_TREE_TOKEN_TYPE_U64", +#ifdef FLOAT_16_SUPPORT "AST_TREE_TOKEN_TYPE_F16", +#endif "AST_TREE_TOKEN_TYPE_F32", "AST_TREE_TOKEN_TYPE_F64", "AST_TREE_TOKEN_TYPE_F128", @@ -218,7 +222,9 @@ void astTreePrint(const AstTree *tree, int indent) { case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -559,7 +565,9 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -771,7 +779,9 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -1170,7 +1180,7 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { root->trees.size = 0; AstTreeVariables *variables = &root->variables; - constexpr size_t variables_size = 1; + static const size_t variables_size = 1; AstTreeHelper helper = { .variables = &variables, @@ -1265,7 +1275,9 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -1432,8 +1444,10 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { return &AST_TREE_I64_TYPE; case PARSER_TOKEN_TYPE_U64: return &AST_TREE_U64_TYPE; +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: return &AST_TREE_F16_TYPE; +#endif case PARSER_TOKEN_TYPE_F32: return &AST_TREE_F32_TYPE; case PARSER_TOKEN_TYPE_F64: @@ -1654,7 +1668,9 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) { case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -2198,7 +2214,9 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode, case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -2393,7 +2411,9 @@ bool isConst(AstTree *tree) { case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -2489,7 +2509,9 @@ bool isConstByValue(AstTree *tree) { case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -2583,7 +2605,9 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -2764,7 +2788,9 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -2840,7 +2866,9 @@ AstTree *getValue(AstTree *tree) { case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -2921,7 +2949,9 @@ bool isCircularDependenciesBack(AstTreeHelper *helper, case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -3104,7 +3134,9 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: +#endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: @@ -3239,6 +3271,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); } tree->type = &AST_TREE_U8_TYPE; +#ifdef FLOAT_16_SUPPORT } else if (typeIsEqual(helper.lookingType, &AST_TREE_F16_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; AstTreeInt *value = tree->metadata; @@ -3250,6 +3283,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { } free(value); tree->type = &AST_TREE_F16_TYPE; +#endif } else if (typeIsEqual(helper.lookingType, &AST_TREE_F32_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; AstTreeInt *value = tree->metadata; @@ -3300,6 +3334,7 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) { printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); } tree->type = &AST_TREE_F64_TYPE; +#ifdef FLOAT_16_SUPPORT } else if (typeIsEqual(helper.lookingType, &AST_TREE_F16_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; AstTreeFloat value = *(AstTreeFloat *)tree->metadata; @@ -3309,6 +3344,7 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) { printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); } tree->type = &AST_TREE_F16_TYPE; + #endif } else if (typeIsEqual(helper.lookingType, &AST_TREE_F32_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; AstTreeFloat value = *(AstTreeFloat *)tree->metadata; diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 3692ead..4617ce4 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -27,7 +27,9 @@ typedef enum AstTreeToken { AST_TREE_TOKEN_TYPE_U32, AST_TREE_TOKEN_TYPE_I64, AST_TREE_TOKEN_TYPE_U64, +#ifdef FLOAT_16_SUPPORT AST_TREE_TOKEN_TYPE_F16, +#endif AST_TREE_TOKEN_TYPE_F32, AST_TREE_TOKEN_TYPE_F64, AST_TREE_TOKEN_TYPE_F128, @@ -90,7 +92,9 @@ extern AstTree AST_TREE_I32_TYPE; extern AstTree AST_TREE_U32_TYPE; extern AstTree AST_TREE_I64_TYPE; extern AstTree AST_TREE_U64_TYPE; +#ifdef FLOAT_16_SUPPORT extern AstTree AST_TREE_F16_TYPE; +#endif extern AstTree AST_TREE_F32_TYPE; extern AstTree AST_TREE_F64_TYPE; extern AstTree AST_TREE_F128_TYPE; diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index 6feb77e..0f971d7 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -4,7 +4,6 @@ #include "utils/memory.h" #include "utils/string.h" -#include <ctype.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> @@ -22,7 +21,9 @@ const char *LEXER_TOKEN_STRINGS[] = { "LEXER_TOKEN_KEYWORD_U32", "LEXER_TOKEN_KEYWORD_I64", "LEXER_TOKEN_KEYWORD_U64", +#ifdef FLOAT_16_SUPPORT "LEXER_TOKEN_KEYWORD_F16", +#endif "LEXER_TOKEN_KEYWORD_F32", "LEXER_TOKEN_KEYWORD_F64", "LEXER_TOKEN_KEYWORD_F128", @@ -115,25 +116,32 @@ const size_t LEXER_SYMBOL_SIZE = sizeof(LEXER_SYMBOL_TOKENS) / sizeof(*LEXER_SYMBOL_TOKENS); const char *LEXER_KEYWORD_STRINGS[] = { - "type", "void", "i8", "u8", "i16", "u16", "i32", - "u32", "i64", "u64", "f16", "f32", "f64", "f128", - "bool", "print_u64", "return", "true", "false", "if", "else", - "while", "comptime", "null", "struct", "undefined", + "type", "void", "i8", "u8", "i16", + "u16", "i32", "u32", "i64", "u64", +#ifdef FLOAT_16_SUPPORT + "f16", +#endif + "f32", "f64", "f128", "bool", "print_u64", + "return", "true", "false", "if", "else", + "while", "comptime", "null", "struct", "undefined", }; const LexerToken LEXER_KEYWORD_TOKENS[] = { - LEXER_TOKEN_KEYWORD_TYPE, LEXER_TOKEN_KEYWORD_VOID, - LEXER_TOKEN_KEYWORD_I8, LEXER_TOKEN_KEYWORD_U8, - LEXER_TOKEN_KEYWORD_I16, LEXER_TOKEN_KEYWORD_U16, - LEXER_TOKEN_KEYWORD_I32, LEXER_TOKEN_KEYWORD_U32, - LEXER_TOKEN_KEYWORD_I64, LEXER_TOKEN_KEYWORD_U64, - LEXER_TOKEN_KEYWORD_F16, LEXER_TOKEN_KEYWORD_F32, - LEXER_TOKEN_KEYWORD_F64, LEXER_TOKEN_KEYWORD_F128, - LEXER_TOKEN_KEYWORD_BOOL, LEXER_TOKEN_KEYWORD_PRINT_U64, - LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_TRUE, - LEXER_TOKEN_KEYWORD_FALSE, LEXER_TOKEN_KEYWORD_IF, - LEXER_TOKEN_KEYWORD_ELSE, LEXER_TOKEN_KEYWORD_WHILE, - LEXER_TOKEN_KEYWORD_COMPTIME, LEXER_TOKEN_KEYWORD_NULL, - LEXER_TOKEN_KEYWORD_STRUCT, LEXER_TOKEN_KEYWORD_UNDEFINED, + LEXER_TOKEN_KEYWORD_TYPE, LEXER_TOKEN_KEYWORD_VOID, + LEXER_TOKEN_KEYWORD_I8, LEXER_TOKEN_KEYWORD_U8, + LEXER_TOKEN_KEYWORD_I16, LEXER_TOKEN_KEYWORD_U16, + LEXER_TOKEN_KEYWORD_I32, LEXER_TOKEN_KEYWORD_U32, + LEXER_TOKEN_KEYWORD_I64, LEXER_TOKEN_KEYWORD_U64, +#ifdef FLOAT_16_SUPPORT + LEXER_TOKEN_KEYWORD_F16, +#endif + LEXER_TOKEN_KEYWORD_F32, LEXER_TOKEN_KEYWORD_F64, + LEXER_TOKEN_KEYWORD_F128, LEXER_TOKEN_KEYWORD_BOOL, + LEXER_TOKEN_KEYWORD_PRINT_U64, LEXER_TOKEN_KEYWORD_RETURN, + LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, + LEXER_TOKEN_KEYWORD_IF, LEXER_TOKEN_KEYWORD_ELSE, + LEXER_TOKEN_KEYWORD_WHILE, LEXER_TOKEN_KEYWORD_COMPTIME, + LEXER_TOKEN_KEYWORD_NULL, LEXER_TOKEN_KEYWORD_STRUCT, + LEXER_TOKEN_KEYWORD_UNDEFINED, }; const size_t LEXER_KEYWORD_SIZE = sizeof(LEXER_KEYWORD_TOKENS) / sizeof(*LEXER_KEYWORD_TOKENS); @@ -273,7 +281,9 @@ void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, case LEXER_TOKEN_KEYWORD_U32: case LEXER_TOKEN_KEYWORD_I64: case LEXER_TOKEN_KEYWORD_U64: +#ifdef FLOAT_16_SUPPORT case LEXER_TOKEN_KEYWORD_F16: +#endif case LEXER_TOKEN_KEYWORD_F32: case LEXER_TOKEN_KEYWORD_F64: case LEXER_TOKEN_KEYWORD_F128: @@ -382,4 +392,13 @@ bool isCompleteSymbol(char *str, size_t str_size) { str_size) != LEXER_SYMBOL_SIZE; } -bool isSpace(char c) { return isspace(c); } +bool isSpace(char c) { + switch (c) { + case ' ': + case '\n': + case '\t': + return true; + default: + return false; + } +} diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h index 4b59dff..8759e10 100644 --- a/src/compiler/lexer.h +++ b/src/compiler/lexer.h @@ -1,5 +1,6 @@ #pragma once +#include "utils/type.h" #include <stddef.h> typedef enum LexerToken { @@ -15,7 +16,9 @@ typedef enum LexerToken { LEXER_TOKEN_KEYWORD_U32, LEXER_TOKEN_KEYWORD_I64, LEXER_TOKEN_KEYWORD_U64, +#ifdef FLOAT_16_SUPPORT LEXER_TOKEN_KEYWORD_F16, +#endif LEXER_TOKEN_KEYWORD_F32, LEXER_TOKEN_KEYWORD_F64, LEXER_TOKEN_KEYWORD_F128, diff --git a/src/compiler/parser.c b/src/compiler/parser.c index ad06a7f..951d3b4 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -30,7 +30,9 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_TYPE_U32", "PARSER_TOKEN_TYPE_I64", "PARSER_TOKEN_TYPE_U64", +#ifdef FLOAT_16_SUPPORT "PARSER_TOKEN_TYPE_F16", +#endif "PARSER_TOKEN_TYPE_F32", "PARSER_TOKEN_TYPE_F64", "PARSER_TOKEN_TYPE_F128", @@ -87,7 +89,7 @@ const char *PARSER_TOKEN_STRINGS[] = { .size = sizeof((LexerToken[]){__VA_ARGS__}) / sizeof(LexerToken), \ .data = {__VA_ARGS__} -static constexpr ParserOrder PARSER_ORDER[] = { +static const ParserOrder PARSER_ORDER[] = { { .ltr = true, ORDER_ARRAY(LEXER_TOKEN_SYMBOL_CLOSE_CURLY_BRACKET, ), @@ -100,12 +102,14 @@ static constexpr ParserOrder PARSER_ORDER[] = { LEXER_TOKEN_KEYWORD_U8, LEXER_TOKEN_KEYWORD_I16, LEXER_TOKEN_KEYWORD_U16, LEXER_TOKEN_KEYWORD_I32, LEXER_TOKEN_KEYWORD_U32, LEXER_TOKEN_KEYWORD_I64, - LEXER_TOKEN_KEYWORD_F16, LEXER_TOKEN_KEYWORD_F32, - LEXER_TOKEN_KEYWORD_F64, LEXER_TOKEN_KEYWORD_F128, - LEXER_TOKEN_KEYWORD_U64, LEXER_TOKEN_KEYWORD_BOOL, - LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, - LEXER_TOKEN_KEYWORD_NULL, LEXER_TOKEN_NUMBER, - LEXER_TOKEN_KEYWORD_UNDEFINED, ), +#ifdef FLOAT_16_SUPPORT + LEXER_TOKEN_KEYWORD_F16, +#endif + LEXER_TOKEN_KEYWORD_F32, LEXER_TOKEN_KEYWORD_F64, + LEXER_TOKEN_KEYWORD_F128, LEXER_TOKEN_KEYWORD_U64, + LEXER_TOKEN_KEYWORD_BOOL, LEXER_TOKEN_KEYWORD_TRUE, + LEXER_TOKEN_KEYWORD_FALSE, LEXER_TOKEN_KEYWORD_NULL, + LEXER_TOKEN_NUMBER, LEXER_TOKEN_KEYWORD_UNDEFINED, ), }, { .ltr = false, @@ -165,7 +169,7 @@ static constexpr ParserOrder PARSER_ORDER[] = { }, }; -static constexpr size_t PARSER_ORDER_SIZE = +static const size_t PARSER_ORDER_SIZE = sizeof(PARSER_ORDER) / sizeof(*PARSER_ORDER); void parserNodePrint(const ParserNode *node, int indent) { @@ -206,7 +210,9 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -459,7 +465,9 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -706,8 +714,10 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_U64); case LEXER_TOKEN_KEYWORD_BOOL: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_BOOL); +#ifdef FLOAT_16_SUPPORT case LEXER_TOKEN_KEYWORD_F16: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F16); +#endif case LEXER_TOKEN_KEYWORD_F32: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F32); case LEXER_TOKEN_KEYWORD_F64: @@ -1220,7 +1230,9 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -1703,7 +1715,9 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -1734,7 +1748,9 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: @@ -1833,7 +1849,9 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case PARSER_TOKEN_TYPE_F16: +#endif case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: diff --git a/src/compiler/parser.h b/src/compiler/parser.h index 2df35b9..8eaea77 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -26,7 +26,9 @@ typedef enum ParserToken { PARSER_TOKEN_TYPE_U32, PARSER_TOKEN_TYPE_I64, PARSER_TOKEN_TYPE_U64, +#ifdef FLOAT_16_SUPPORT PARSER_TOKEN_TYPE_F16, + #endif PARSER_TOKEN_TYPE_F32, PARSER_TOKEN_TYPE_F64, PARSER_TOKEN_TYPE_F128, diff --git a/src/runner/runner.c b/src/runner/runner.c index a407204..516870d 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -42,8 +42,8 @@ void runnerVariableSetValueWihtoutConstCheck(AstTreeVariable *variable, } bool runAstTree(AstTreeRoot *root) { - constexpr char MAIN_STR[] = "main"; - constexpr size_t MAIN_STR_SIZE = + static const char MAIN_STR[] = "main"; + static const size_t MAIN_STR_SIZE = (sizeof(MAIN_STR) / sizeof(*MAIN_STR)) - sizeof(*MAIN_STR); for (size_t i = 0; i < root->variables.size; ++i) { @@ -206,8 +206,10 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { doLeftOperation(operand, +, AstTreeFloat, f64); } else if (operand->type == &AST_TREE_F32_TYPE) { doLeftOperation(operand, +, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (operand->type == &AST_TREE_F16_TYPE) { doLeftOperation(operand, +, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -239,8 +241,10 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { doLeftOperation(operand, -, AstTreeFloat, f64); } else if (operand->type == &AST_TREE_F32_TYPE) { doLeftOperation(operand, -, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (operand->type == &AST_TREE_F16_TYPE) { doLeftOperation(operand, -, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -284,9 +288,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doOperation(left, right, +, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doOperation(left, right, +, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -331,9 +337,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doOperation(left, right, -, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doOperation(left, right, -, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -378,9 +386,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doOperation(left, right, *, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doOperation(left, right, *, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -425,9 +435,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doOperation(left, right, /, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doOperation(left, right, /, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -507,9 +519,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doLogicalOperation(left, right, ==, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doLogicalOperation(left, right, ==, AstTreeFloat, f16); +#endif } else if (left->type == &AST_TREE_TYPE_TYPE) { bool *res = a404m_malloc(sizeof(*res)); *res = typeIsEqual(left, right); @@ -560,9 +574,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doLogicalOperation(left, right, !=, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doLogicalOperation(left, right, !=, AstTreeFloat, f16); +#endif } else if (left->type == &AST_TREE_TYPE_TYPE) { bool *res = a404m_malloc(sizeof(*res)); *res = !typeIsEqual(left, right); @@ -613,9 +629,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doLogicalOperation(left, right, >, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doLogicalOperation(left, right, >, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -660,9 +678,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doLogicalOperation(left, right, <, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doLogicalOperation(left, right, <, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -707,9 +727,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doLogicalOperation(left, right, >=, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doLogicalOperation(left, right, >=, AstTreeFloat, f16); +#endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -754,9 +776,11 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } else if (left->type == &AST_TREE_F32_TYPE && right->type == &AST_TREE_F32_TYPE) { doLogicalOperation(left, right, <=, AstTreeFloat, f32); +#ifdef FLOAT_16_SUPPORT } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doLogicalOperation(left, right, <=, AstTreeFloat, f16); + #endif } else { printError(expr->str_begin, expr->str_end, "Not supported"); UNREACHABLE; @@ -776,7 +800,9 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: +#ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: + #endif case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: diff --git a/src/utils/log.h b/src/utils/log.h index 510170f..eb9034f 100644 --- a/src/utils/log.h +++ b/src/utils/log.h @@ -1,5 +1,11 @@ #pragma once +#include "utils/type.h" + +#ifndef __FILE_NAME__ +#define __FILE_NAME__ __FILE__ +#endif + #define printLog(format,...) _printLogBack(format, __FILE_NAME__, __LINE__, ## __VA_ARGS__) #define printError(begin,end,format,...) _printErrorWarningBack(__FILE_NAME__, __LINE__, begin, end, true, format, ## __VA_ARGS__) #define printWarning(begin,end,format,...) _printErrorWarningBack(__FILE_NAME__, __LINE__, begin, end, false, format, ## __VA_ARGS__) diff --git a/src/utils/type.c b/src/utils/type.c index dea08ef..a46be5a 100644 --- a/src/utils/type.c +++ b/src/utils/type.c @@ -3,6 +3,8 @@ #include <assert.h> void checkTypes() { + assert(sizeof(bool) == (8 / 8)); + assert(sizeof(i8) == (8 / 8)); assert(sizeof(i16) == (16 / 8)); assert(sizeof(i32) == (32 / 8)); @@ -13,9 +15,10 @@ void checkTypes() { assert(sizeof(u32) == (32 / 8)); assert(sizeof(u64) == (64 / 8)); +#ifdef FLOAT_16_SUPPORT assert(sizeof(f16) == (16 / 8)); +#endif assert(sizeof(f32) == (32 / 8)); assert(sizeof(f64) == (64 / 8)); assert(sizeof(f128) == (128 / 8)); } - diff --git a/src/utils/type.h b/src/utils/type.h index aad46df..771837e 100644 --- a/src/utils/type.h +++ b/src/utils/type.h @@ -2,6 +2,8 @@ #include <stdint.h> +// #define FLOAT_16_SUPPORT + typedef int8_t i8; typedef int16_t i16; typedef int32_t i32; @@ -12,9 +14,19 @@ typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; +#ifdef FLOAT_16_SUPPORT typedef _Float16 f16; +#endif typedef float f32; typedef double f64; typedef long double f128; +#ifndef __cplusplus +#if (__STDC_VERSION__ < 202000L) +typedef u8 bool; +#define false (bool)0 +#define true (bool)1 +#endif +#endif + void checkTypes(); |