diff options
-rw-r--r-- | src/compiler/ast-tree.c | 198 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 16 | ||||
-rw-r--r-- | src/compiler/lexer.c | 18 | ||||
-rw-r--r-- | src/compiler/lexer.h | 6 | ||||
-rw-r--r-- | src/compiler/parser.c | 72 | ||||
-rw-r--r-- | src/compiler/parser.h | 8 | ||||
-rw-r--r-- | src/runner/runner.c | 14 | ||||
-rw-r--r-- | src/utils/log.c | 15 | ||||
-rw-r--r-- | src/utils/log.h | 5 | ||||
-rw-r--r-- | test/main.felan | 19 |
10 files changed, 339 insertions, 32 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 3e01b0b..df00517 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -3,6 +3,7 @@ #include "compiler/parser.h" #include "utils/log.h" #include "utils/memory.h" +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -25,6 +26,42 @@ AstTree AST_TREE_BOOL_TYPE = { .type = &AST_TREE_TYPE_TYPE, }; +AstTree AST_TREE_I8_TYPE = { + .token = AST_TREE_TOKEN_TYPE_I8, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_U8_TYPE = { + .token = AST_TREE_TOKEN_TYPE_U8, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_I16_TYPE = { + .token = AST_TREE_TOKEN_TYPE_I16, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_U16_TYPE = { + .token = AST_TREE_TOKEN_TYPE_U16, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_I32_TYPE = { + .token = AST_TREE_TOKEN_TYPE_I32, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_U32_TYPE = { + .token = AST_TREE_TOKEN_TYPE_U32, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + AstTree AST_TREE_I64_TYPE = { .token = AST_TREE_TOKEN_TYPE_I64, .metadata = NULL, @@ -49,9 +86,16 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_KEYWORD_PRINT_U64", "AST_TREE_TOKEN_KEYWORD_RETURN", - "AST_TREE_TOKEN_TYPE_TYPE", "AST_TREE_TOKEN_TYPE_FUNCTION", + "AST_TREE_TOKEN_TYPE_TYPE", "AST_TREE_TOKEN_TYPE_VOID", + "AST_TREE_TOKEN_TYPE_I8", + "AST_TREE_TOKEN_TYPE_U8", + "AST_TREE_TOKEN_TYPE_I16", + "AST_TREE_TOKEN_TYPE_U16", + "AST_TREE_TOKEN_TYPE_I32", + "AST_TREE_TOKEN_TYPE_U32", + "AST_TREE_TOKEN_TYPE_I64", "AST_TREE_TOKEN_TYPE_U64", "AST_TREE_TOKEN_TYPE_BOOL", @@ -116,6 +160,12 @@ void astTreePrint(const AstTree *tree, int indent) { goto RETURN_SUCCESS; case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -307,6 +357,12 @@ void astTreeDestroy(AstTree tree) { return; case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -416,9 +472,8 @@ void astTreeVariableDelete(AstTreeVariable *variable) { } void astTreeDelete(AstTree *tree) { - if (tree != &AST_TREE_TYPE_TYPE && tree != &AST_TREE_VOID_TYPE && - tree != &AST_TREE_I64_TYPE && tree != &AST_TREE_U64_TYPE && - tree != &AST_TREE_BOOL_TYPE && tree != &AST_TREE_VOID_VALUE) { + if (AST_TREE_TOKEN_STATIC_VARS_BEGIN > tree->token || + tree->token > AST_TREE_TOKEN_STATIC_VARS_END) { astTreeDestroy(*tree); free(tree); } @@ -447,6 +502,12 @@ AstTree *copyAstTree(AstTree *tree) { switch (tree->token) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -661,7 +722,6 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { switch (node_metadata->value->token) { case PARSER_TOKEN_VALUE_BOOL: - case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_VALUE_INT: case PARSER_TOKEN_FUNCTION_DEFINITION: case PARSER_TOKEN_FUNCTION_CALL: @@ -687,6 +747,13 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: + case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_KEYWORD_PRINT_U64: @@ -817,6 +884,18 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { return astTreeParseTypeFunction(parserNode, helper); case PARSER_TOKEN_TYPE_VOID: return &AST_TREE_VOID_TYPE; + case PARSER_TOKEN_TYPE_I8: + return &AST_TREE_I8_TYPE; + case PARSER_TOKEN_TYPE_U8: + return &AST_TREE_U8_TYPE; + case PARSER_TOKEN_TYPE_I16: + return &AST_TREE_I16_TYPE; + case PARSER_TOKEN_TYPE_U16: + return &AST_TREE_U16_TYPE; + case PARSER_TOKEN_TYPE_I32: + return &AST_TREE_I32_TYPE; + case PARSER_TOKEN_TYPE_U32: + return &AST_TREE_U32_TYPE; case PARSER_TOKEN_TYPE_I64: return &AST_TREE_I64_TYPE; case PARSER_TOKEN_TYPE_U64: @@ -989,6 +1068,12 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1387,6 +1472,12 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode, case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1489,6 +1580,12 @@ AstTreeFunction *getFunction(AstTree *value) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1523,6 +1620,12 @@ bool isConst(AstTree *value) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1565,6 +1668,12 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1661,6 +1770,12 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) { return false; case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1698,6 +1813,12 @@ bool isCircularDependencies(AstTreeHelper *helper, AstTreeVariable *variable, case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1793,6 +1914,12 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, switch (tree->token) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1848,6 +1975,42 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { tree->type = &AST_TREE_I64_TYPE; } else if (helper.lookingType == &AST_TREE_U64_TYPE) { tree->type = &AST_TREE_U64_TYPE; + } else if (helper.lookingType == &AST_TREE_I32_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffff00000000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_I32_TYPE; + } else if (helper.lookingType == &AST_TREE_U32_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffff00000000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_U32_TYPE; + } else if (helper.lookingType == &AST_TREE_I16_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffff0000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_I16_TYPE; + } else if (helper.lookingType == &AST_TREE_U16_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffff0000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_U16_TYPE; + } else if (helper.lookingType == &AST_TREE_I8_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffffff00) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_I8_TYPE; + } else if (helper.lookingType == &AST_TREE_U8_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffffff00) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_U8_TYPE; } else { UNREACHABLE; } @@ -2118,8 +2281,14 @@ bool setTypesScope(AstTree *tree, AstTreeSetTypesHelper helper, } bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper helper) { - return setAllTypes(&infix->left, helper, NULL) && - setAllTypes(&infix->right, helper, NULL); + if (!setAllTypes(&infix->left, helper, NULL)) { + return false; + } + AstTreeSetTypesHelper newHelper = { + .lookingType = infix->left.type, + }; + + return setAllTypes(&infix->right, newHelper, NULL); } bool astTreeCleanRoot(AstTreeRoot *root) { @@ -2142,6 +2311,12 @@ bool astTreeClean(AstTree *tree) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -2234,6 +2409,15 @@ bool astTreeCleanAstVariable(AstTreeVariable *variable) { size_t astTreeTypeSize(AstTree tree) { switch (tree.token) { + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + return 1; + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + return 2; + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: + return 4; case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: return 8; diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 921bc89..c7253a0 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -11,12 +11,20 @@ typedef enum AstTreeToken { AST_TREE_TOKEN_KEYWORD_RETURN, AST_TREE_TOKEN_KEYWORD_IF, - AST_TREE_TOKEN_TYPE_TYPE, AST_TREE_TOKEN_TYPE_FUNCTION, + AST_TREE_TOKEN_TYPE_TYPE, + AST_TREE_TOKEN_STATIC_VARS_BEGIN = AST_TREE_TOKEN_TYPE_TYPE, AST_TREE_TOKEN_TYPE_VOID, + AST_TREE_TOKEN_TYPE_I8, + AST_TREE_TOKEN_TYPE_U8, + AST_TREE_TOKEN_TYPE_I16, + AST_TREE_TOKEN_TYPE_U16, + AST_TREE_TOKEN_TYPE_I32, + AST_TREE_TOKEN_TYPE_U32, AST_TREE_TOKEN_TYPE_I64, AST_TREE_TOKEN_TYPE_U64, AST_TREE_TOKEN_TYPE_BOOL, + AST_TREE_TOKEN_STATIC_VARS_END = AST_TREE_TOKEN_TYPE_BOOL, AST_TREE_TOKEN_FUNCTION_CALL, AST_TREE_TOKEN_VARIABLE, @@ -58,6 +66,12 @@ typedef struct AstTree { extern AstTree AST_TREE_TYPE_TYPE; extern AstTree AST_TREE_VOID_TYPE; extern AstTree AST_TREE_BOOL_TYPE; +extern AstTree AST_TREE_I8_TYPE; +extern AstTree AST_TREE_U8_TYPE; +extern AstTree AST_TREE_I16_TYPE; +extern AstTree AST_TREE_U16_TYPE; +extern AstTree AST_TREE_I32_TYPE; +extern AstTree AST_TREE_U32_TYPE; extern AstTree AST_TREE_I64_TYPE; extern AstTree AST_TREE_U64_TYPE; extern AstTree AST_TREE_VOID_VALUE; diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index 2e3090b..c740dd3 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -14,6 +14,12 @@ const char *LEXER_TOKEN_STRINGS[] = { "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_BOOL", @@ -83,11 +89,15 @@ const size_t LEXER_SYMBOL_SIZE = sizeof(LEXER_SYMBOL_TOKENS) / sizeof(*LEXER_SYMBOL_TOKENS); const char *LEXER_KEYWORD_STRINGS[] = { - "type", "void", "i64", "u64", "bool", "print_u64", + "type", "void", "i8", "u8", "i16", "u16", + "i32", "u32", "i64", "u64", "bool", "print_u64", "return", "true", "false", "if", "else", }; 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_BOOL, LEXER_TOKEN_KEYWORD_PRINT_U64, LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_TRUE, @@ -219,6 +229,12 @@ void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, PUSH: case LEXER_TOKEN_KEYWORD_TYPE: case LEXER_TOKEN_KEYWORD_VOID: + case LEXER_TOKEN_KEYWORD_I8: + case LEXER_TOKEN_KEYWORD_U8: + case LEXER_TOKEN_KEYWORD_I16: + case LEXER_TOKEN_KEYWORD_U16: + case LEXER_TOKEN_KEYWORD_I32: + case LEXER_TOKEN_KEYWORD_U32: case LEXER_TOKEN_KEYWORD_I64: case LEXER_TOKEN_KEYWORD_U64: case LEXER_TOKEN_KEYWORD_BOOL: diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h index f432c9d..af2e7a3 100644 --- a/src/compiler/lexer.h +++ b/src/compiler/lexer.h @@ -7,6 +7,12 @@ typedef enum LexerToken { 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_BOOL, diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 26d53fb..367c490 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -20,6 +20,13 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_TYPE_TYPE", "PARSER_TOKEN_TYPE_FUNCTION", "PARSER_TOKEN_TYPE_VOID", + "PARSER_TOKEN_TYPE_I8", + "PARSER_TOKEN_TYPE_U8", + "PARSER_TOKEN_TYPE_I16", + "PARSER_TOKEN_TYPE_U16", + "PARSER_TOKEN_TYPE_I32", + "PARSER_TOKEN_TYPE_U32", + "PARSER_TOKEN_TYPE_I64", "PARSER_TOKEN_TYPE_U64", "PARSER_TOKEN_TYPE_BOOL", @@ -64,7 +71,10 @@ static constexpr ParserOrder PARSER_ORDER[] = { .ltr = true, ORDER_ARRAY(LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS, LEXER_TOKEN_IDENTIFIER, LEXER_TOKEN_KEYWORD_TYPE, - LEXER_TOKEN_KEYWORD_VOID, LEXER_TOKEN_KEYWORD_I64, + 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_BOOL, LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, LEXER_TOKEN_NUMBER, ), @@ -148,6 +158,12 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_IDENTIFIER: case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -352,6 +368,12 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_IDENTIFIER: case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -546,6 +568,18 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_TYPE); case LEXER_TOKEN_KEYWORD_VOID: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_VOID); + case LEXER_TOKEN_KEYWORD_I8: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I8); + case LEXER_TOKEN_KEYWORD_U8: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_U8); + case LEXER_TOKEN_KEYWORD_I16: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I16); + case LEXER_TOKEN_KEYWORD_U16: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_U16); + case LEXER_TOKEN_KEYWORD_I32: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I32); + case LEXER_TOKEN_KEYWORD_U32: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_U32); case LEXER_TOKEN_KEYWORD_I64: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I64); case LEXER_TOKEN_KEYWORD_U64: @@ -990,6 +1024,12 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1008,12 +1048,12 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_OPERATOR_MULTIPLY: case PARSER_TOKEN_OPERATOR_DIVIDE: case PARSER_TOKEN_OPERATOR_MODULO: - case PARSER_TOKEN_OPERATOR_EQUAL: - case PARSER_TOKEN_OPERATOR_NOT_EQUAL: - case PARSER_TOKEN_OPERATOR_GREATER: - case PARSER_TOKEN_OPERATOR_SMALLER: - case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL: - case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL: + case PARSER_TOKEN_OPERATOR_EQUAL: + case PARSER_TOKEN_OPERATOR_NOT_EQUAL: + case PARSER_TOKEN_OPERATOR_GREATER: + case PARSER_TOKEN_OPERATOR_SMALLER: + case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL: + case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL: case PARSER_TOKEN_FUNCTION_DEFINITION: case PARSER_TOKEN_FUNCTION_CALL: printError(bodyArray->data[i]->str_begin, bodyArray->data[i]->str_end, @@ -1319,6 +1359,12 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1336,6 +1382,12 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1398,6 +1450,12 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL: case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: diff --git a/src/compiler/parser.h b/src/compiler/parser.h index a5378d7..4e8c298 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -15,6 +15,12 @@ typedef enum ParserToken { PARSER_TOKEN_TYPE_TYPE, PARSER_TOKEN_TYPE_FUNCTION, PARSER_TOKEN_TYPE_VOID, + PARSER_TOKEN_TYPE_I8, + PARSER_TOKEN_TYPE_U8, + PARSER_TOKEN_TYPE_I16, + PARSER_TOKEN_TYPE_U16, + PARSER_TOKEN_TYPE_I32, + PARSER_TOKEN_TYPE_U32, PARSER_TOKEN_TYPE_I64, PARSER_TOKEN_TYPE_U64, PARSER_TOKEN_TYPE_BOOL, @@ -58,7 +64,7 @@ extern const char *PARSER_TOKEN_STRINGS[]; typedef struct ParserOrder { bool ltr; size_t size; - LexerToken data[15]; + LexerToken data[20]; } ParserOrder; typedef struct ParserNode { diff --git a/src/runner/runner.c b/src/runner/runner.c index 2ab97a9..4f2a002 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -328,7 +328,19 @@ AstTree *calcAstTreeValue(AstTree *tree, RunnerVariablePages *pages) { if ((left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) || (left->type == &AST_TREE_I64_TYPE && - right->type == &AST_TREE_I64_TYPE)) { + right->type == &AST_TREE_I64_TYPE) || + (left->type == &AST_TREE_U32_TYPE && + right->type == &AST_TREE_U32_TYPE) || + (left->type == &AST_TREE_I32_TYPE && + right->type == &AST_TREE_I32_TYPE) || + (left->type == &AST_TREE_U16_TYPE && + right->type == &AST_TREE_U16_TYPE) || + (left->type == &AST_TREE_I16_TYPE && + right->type == &AST_TREE_I16_TYPE) || + (left->type == &AST_TREE_U8_TYPE && + right->type == &AST_TREE_U8_TYPE) || + (left->type == &AST_TREE_I8_TYPE && + right->type == &AST_TREE_I8_TYPE)) { if (left->token == AST_TREE_TOKEN_VALUE_INT && right->token == AST_TREE_TOKEN_VALUE_INT) { switch (tree->token) { diff --git a/src/utils/log.c b/src/utils/log.c index 3f73729..9b8f94f 100644 --- a/src/utils/log.c +++ b/src/utils/log.c @@ -17,8 +17,8 @@ void _printLogBack(const char *format, const char *file, int line, ...) { free(errorStr); } -void _printErrorBack(const char *file, int line, char *begin, char *end, - const char *format, ...) { +void _printErrorWarningBack(const char *file, int line, char *begin, char *end, + bool isError, const char *format, ...) { va_list args; va_start(args, end); char *errorStr; @@ -35,9 +35,14 @@ void _printErrorBack(const char *file, int line, char *begin, char *end, } const char firstColor[] = "\e[0;36m"; - const char secondColor[] = "\e[0;31m"; - fprintf(stderr, "%sError: %s at compiler %s:%d\e[0m\n", firstColor, errorStr, - file, line); + const char *secondColor = isError ? "\e[0;31m" : "\e[0;33m"; + if (isError) { + fprintf(stderr, "%sError: %s at compiler %s:%d\e[0m\n", firstColor, + errorStr, file, line); + } else { + fprintf(stderr, "%sWarning: %s at compiler %s:%d\e[0m\n", firstColor, + errorStr, file, line); + } free(errorStr); if (file_index == SIZE_MAX) { diff --git a/src/utils/log.h b/src/utils/log.h index 6cede24..a0d48a6 100644 --- a/src/utils/log.h +++ b/src/utils/log.h @@ -1,10 +1,11 @@ #pragma once #define printLog(format,...) _printLogBack(format, __FILE_NAME__, __LINE__, ## __VA_ARGS__) -#define printError(begin,end,format,...) _printErrorBack(__FILE_NAME__, __LINE__, begin, end, format, ## __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__) #define UNREACHABLE printLog("Unreachable");exit(1) extern void _printLogBack(const char *format, const char *file, int line, ...); -extern void _printErrorBack(const char *file, int line, char *begin, char *end,const char *format, ...); +extern void _printErrorWarningBack(const char *file, int line, char *begin, char *end,bool isError,const char *format, ...); diff --git a/test/main.felan b/test/main.felan index c0414ec..fb8e2e0 100644 --- a/test/main.felan +++ b/test/main.felan @@ -1,9 +1,14 @@ main :: () -> void { - a := 2; - b := a; - c : u64 = 5; - if a == b - print_u64 (2 + 4)*2; - else - print_u64 c; + a :i8 = 121312; + b :u8 = 1; + c :i16 = 1; + d :u16 = 1; + e :i32 = 1; + f :u32 = 1; + g :i64 = 1; + h :u64 = 1; + if a == 2 + print_u64 h; + else + print_u64 h+2; }; |