diff options
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r-- | src/compiler/ast-tree.c | 191 |
1 files changed, 187 insertions, 4 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 07ff036..de863c8 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -198,6 +198,10 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_BUILTIN_PUTC", "AST_TREE_TOKEN_BUILTIN_C_LIBRARY", "AST_TREE_TOKEN_BUILTIN_C_FUNCTION", + "AST_TREE_TOKEN_BUILTIN_BITWISE_NOT", + "AST_TREE_TOKEN_BUILTIN_BITWISE_AND", + "AST_TREE_TOKEN_BUILTIN_BITWISE_XOR", + "AST_TREE_TOKEN_BUILTIN_BITWISE_OR", "AST_TREE_TOKEN_KEYWORD_RETURN", "AST_TREE_TOKEN_KEYWORD_BREAK", @@ -273,6 +277,10 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_OPERATOR_LOGICAL_AND", "AST_TREE_TOKEN_OPERATOR_LOGICAL_OR", "AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS", + "AST_TREE_TOKEN_OPERATOR_BITWISE_NOT", + "AST_TREE_TOKEN_OPERATOR_BITWISE_AND", + "AST_TREE_TOKEN_OPERATOR_BITWISE_XOR", + "AST_TREE_TOKEN_OPERATOR_BITWISE_OR", "AST_TREE_TOKEN_SCOPE", @@ -349,6 +357,10 @@ void astTreePrint(const AstTree *tree, int indent) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: @@ -384,6 +396,7 @@ void astTreePrint(const AstTree *tree, int indent) { printf("count=%d", meatadata->count); } case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: { AstTreeUnary *metadata = tree->metadata; @@ -528,6 +541,9 @@ void astTreePrint(const AstTree *tree, int indent) { goto RETURN_SUCCESS; case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_SUM: case AST_TREE_TOKEN_OPERATOR_SUB: case AST_TREE_TOKEN_OPERATOR_MULTIPLY: @@ -789,6 +805,10 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: @@ -871,6 +891,7 @@ void astTreeDestroy(AstTree tree) { return; } case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: { AstTreeUnary *metadata = tree.metadata; @@ -921,6 +942,9 @@ void astTreeDestroy(AstTree tree) { return; case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_SUM: case AST_TREE_TOKEN_OPERATOR_SUB: case AST_TREE_TOKEN_OPERATOR_MULTIPLY: @@ -1167,6 +1191,10 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: return newAstTree(tree->token, NULL, copyAstTreeBack(tree->type, oldVariables, newVariables, variables_size, safetyCheck), @@ -1312,6 +1340,9 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], } case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_ASSIGN: case AST_TREE_TOKEN_OPERATOR_SUM: case AST_TREE_TOKEN_OPERATOR_SUB: @@ -1391,6 +1422,7 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], tree->str_begin, tree->str_end); } case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: { AstTreeUnary *metadata = tree->metadata; @@ -2132,6 +2164,10 @@ AstTreeRoot *makeAstRoot(const ParserNode *parsedRoot, char *filePath) { case PARSER_TOKEN_OPERATOR_LOGICAL_NOT: case PARSER_TOKEN_OPERATOR_LOGICAL_AND: case PARSER_TOKEN_OPERATOR_LOGICAL_OR: + case PARSER_TOKEN_OPERATOR_BITWISE_NOT: + case PARSER_TOKEN_OPERATOR_BITWISE_AND: + case PARSER_TOKEN_OPERATOR_BITWISE_XOR: + case PARSER_TOKEN_OPERATOR_BITWISE_OR: case PARSER_TOKEN_SYMBOL_PARENTHESIS: case PARSER_TOKEN_KEYWORD_IF: case PARSER_TOKEN_KEYWORD_WHILE: @@ -2185,6 +2221,10 @@ AstTreeRoot *makeAstRoot(const ParserNode *parsedRoot, char *filePath) { case PARSER_TOKEN_BUILTIN_PUTC: case PARSER_TOKEN_BUILTIN_C_LIBRARY: case PARSER_TOKEN_BUILTIN_C_FUNCTION: + case PARSER_TOKEN_BUILTIN_BITWISE_NOT: + case PARSER_TOKEN_BUILTIN_BITWISE_AND: + case PARSER_TOKEN_BUILTIN_BITWISE_XOR: + case PARSER_TOKEN_BUILTIN_BITWISE_OR: case PARSER_TOKEN_SYMBOL_BRACKET_LEFT: case PARSER_TOKEN_SYMBOL_BRACKET_RIGHT: goto AFTER_SWITCH; @@ -2314,6 +2354,14 @@ AstTree *astTreeParse(const ParserNode *parserNode) { return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_C_LIBRARY); case PARSER_TOKEN_BUILTIN_C_FUNCTION: return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_C_FUNCTION); + case PARSER_TOKEN_BUILTIN_BITWISE_NOT: + return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_BITWISE_NOT); + case PARSER_TOKEN_BUILTIN_BITWISE_AND: + return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_BITWISE_AND); + case PARSER_TOKEN_BUILTIN_BITWISE_XOR: + return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_BITWISE_XOR); + case PARSER_TOKEN_BUILTIN_BITWISE_OR: + return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_BITWISE_OR); case PARSER_TOKEN_TYPE_TYPE: return &AST_TREE_TYPE_TYPE; case PARSER_TOKEN_TYPE_FUNCTION: @@ -2447,6 +2495,18 @@ AstTree *astTreeParse(const ParserNode *parserNode) { case PARSER_TOKEN_OPERATOR_LOGICAL_NOT: return astTreeParseUnaryOperator(parserNode, AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT); + case PARSER_TOKEN_OPERATOR_BITWISE_AND: + return astTreeParseBinaryOperator(parserNode, + AST_TREE_TOKEN_OPERATOR_BITWISE_AND); + case PARSER_TOKEN_OPERATOR_BITWISE_XOR: + return astTreeParseBinaryOperator(parserNode, + AST_TREE_TOKEN_OPERATOR_BITWISE_XOR); + case PARSER_TOKEN_OPERATOR_BITWISE_OR: + return astTreeParseBinaryOperator(parserNode, + AST_TREE_TOKEN_OPERATOR_BITWISE_OR); + case PARSER_TOKEN_OPERATOR_BITWISE_NOT: + return astTreeParseUnaryOperator(parserNode, + AST_TREE_TOKEN_OPERATOR_BITWISE_NOT); case PARSER_TOKEN_OPERATOR_PLUS: return astTreeParseUnaryOperator(parserNode, AST_TREE_TOKEN_OPERATOR_PLUS); case PARSER_TOKEN_OPERATOR_MINUS: @@ -2626,6 +2686,10 @@ AstTree *astTreeParseFunction(const ParserNode *parserNode) { case PARSER_TOKEN_OPERATOR_LOGICAL_NOT: case PARSER_TOKEN_OPERATOR_LOGICAL_AND: case PARSER_TOKEN_OPERATOR_LOGICAL_OR: + case PARSER_TOKEN_OPERATOR_BITWISE_NOT: + case PARSER_TOKEN_OPERATOR_BITWISE_AND: + case PARSER_TOKEN_OPERATOR_BITWISE_XOR: + case PARSER_TOKEN_OPERATOR_BITWISE_OR: case PARSER_TOKEN_BUILTIN_CAST: case PARSER_TOKEN_BUILTIN_TYPE_OF: case PARSER_TOKEN_BUILTIN_SIZE_OF: @@ -2648,6 +2712,10 @@ AstTree *astTreeParseFunction(const ParserNode *parserNode) { case PARSER_TOKEN_BUILTIN_PUTC: case PARSER_TOKEN_BUILTIN_C_LIBRARY: case PARSER_TOKEN_BUILTIN_C_FUNCTION: + case PARSER_TOKEN_BUILTIN_BITWISE_NOT: + case PARSER_TOKEN_BUILTIN_BITWISE_AND: + case PARSER_TOKEN_BUILTIN_BITWISE_XOR: + case PARSER_TOKEN_BUILTIN_BITWISE_OR: case PARSER_TOKEN_SYMBOL_BRACKET_LEFT: case PARSER_TOKEN_SYMBOL_BRACKET_RIGHT: printError(node->str_begin, node->str_end, "Unexpected %s", @@ -3228,6 +3296,10 @@ AstTree *astTreeParseCurlyBracket(const ParserNode *parserNode) { case PARSER_TOKEN_OPERATOR_LOGICAL_NOT: case PARSER_TOKEN_OPERATOR_LOGICAL_AND: case PARSER_TOKEN_OPERATOR_LOGICAL_OR: + case PARSER_TOKEN_OPERATOR_BITWISE_NOT: + case PARSER_TOKEN_OPERATOR_BITWISE_AND: + case PARSER_TOKEN_OPERATOR_BITWISE_XOR: + case PARSER_TOKEN_OPERATOR_BITWISE_OR: case PARSER_TOKEN_BUILTIN_CAST: case PARSER_TOKEN_BUILTIN_TYPE_OF: case PARSER_TOKEN_BUILTIN_SIZE_OF: @@ -3250,6 +3322,10 @@ AstTree *astTreeParseCurlyBracket(const ParserNode *parserNode) { case PARSER_TOKEN_BUILTIN_PUTC: case PARSER_TOKEN_BUILTIN_C_LIBRARY: case PARSER_TOKEN_BUILTIN_C_FUNCTION: + case PARSER_TOKEN_BUILTIN_BITWISE_NOT: + case PARSER_TOKEN_BUILTIN_BITWISE_AND: + case PARSER_TOKEN_BUILTIN_BITWISE_XOR: + case PARSER_TOKEN_BUILTIN_BITWISE_OR: case PARSER_TOKEN_SYMBOL_BRACKET_LEFT: case PARSER_TOKEN_SYMBOL_BRACKET_RIGHT: printError(node->str_begin, node->str_end, "Unexpected %s", @@ -3475,6 +3551,10 @@ bool isConst(AstTree *tree) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: @@ -3558,7 +3638,8 @@ bool isConst(AstTree *tree) { return false; case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: - case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: { + case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: { AstTreeUnary *metadata = tree->metadata; return metadata->function->isConst && isConst(metadata->operand); } @@ -3574,7 +3655,10 @@ bool isConst(AstTree *tree) { case AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL: case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: - case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: { + case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: { AstTreeInfix *metadata = tree->metadata; return metadata->function->isConst && isConst(metadata->left) && isConst(metadata->right); @@ -3696,6 +3780,7 @@ AstTree *makeTypeOf(AstTree *value) { return copyAstTree(variable->type); } case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: { AstTreeUnary *metadata = value->metadata; @@ -3716,6 +3801,9 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_OPERATOR_MODULO: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_EQUAL: case AST_TREE_TOKEN_OPERATOR_NOT_EQUAL: case AST_TREE_TOKEN_OPERATOR_GREATER: @@ -3786,6 +3874,10 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_VARIABLE_DEFINE: case AST_TREE_TOKEN_KEYWORD_RETURN: @@ -3872,6 +3964,10 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_FUNCTION: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: @@ -3910,6 +4006,10 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_OPERATOR_DEREFERENCE: case AST_TREE_TOKEN_OPERATOR_ADDRESS: @@ -4057,6 +4157,10 @@ AstTree *getValue(AstTree *tree, bool copy) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: @@ -4113,6 +4217,10 @@ AstTree *getValue(AstTree *tree, bool copy) { case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_KEYWORD_IF: case AST_TREE_TOKEN_KEYWORD_WHILE: case AST_TREE_TOKEN_KEYWORD_COMPTIME: @@ -4205,6 +4313,10 @@ bool isIntType(AstTree *type) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -4265,6 +4377,10 @@ bool isIntType(AstTree *type) { case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: @@ -4314,6 +4430,10 @@ bool isFloatType(AstTree *type) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -4368,6 +4488,10 @@ bool isFloatType(AstTree *type) { case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: @@ -4458,6 +4582,10 @@ bool isEqual(AstTree *left, AstTree *right) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -4496,6 +4624,10 @@ bool isEqual(AstTree *left, AstTree *right) { case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: @@ -4609,10 +4741,15 @@ static const size_t STR_PLUS_SIZE = sizeof(STR_PLUS) / sizeof(*STR_PLUS) - sizeof(*STR_PLUS); static const char STR_MINUS[] = "__minus__"; static const size_t STR_MINUS_SIZE = - sizeof(STR_MINUS) / sizeof(*STR_MINUS) - sizeof(*STR_PLUS); + sizeof(STR_MINUS) / sizeof(*STR_MINUS) - sizeof(*STR_MINUS); static const char STR_LOGICAL_NOT[] = "__logical_not__"; static const size_t STR_LOGICAL_NOT_SIZE = - sizeof(STR_LOGICAL_NOT) / sizeof(*STR_LOGICAL_NOT) - sizeof(*STR_PLUS); + sizeof(STR_LOGICAL_NOT) / sizeof(*STR_LOGICAL_NOT) - + sizeof(*STR_LOGICAL_NOT); +static const char STR_BITWISE_NOT[] = "__bitwise_not__"; +static const size_t STR_BITWISE_NOT_SIZE = + sizeof(STR_BITWISE_NOT) / sizeof(*STR_BITWISE_NOT) - + sizeof(*STR_BITWISE_NOT); static const char STR_SUM[] = "__sum__"; static const size_t STR_SUM_SIZE = @@ -4636,6 +4773,17 @@ static const size_t STR_LOGICAL_AND_SIZE = static const char STR_LOGICAL_OR[] = "__logical_or__"; static const size_t STR_LOGICAL_OR_SIZE = sizeof(STR_LOGICAL_OR) / sizeof(*STR_LOGICAL_OR) - sizeof(*STR_LOGICAL_OR); +static const char STR_BITWISE_AND[] = "__bitwise_and__"; +static const size_t STR_BITWISE_AND_SIZE = + sizeof(STR_BITWISE_AND) / sizeof(*STR_BITWISE_AND) - + sizeof(*STR_BITWISE_AND); +static const char STR_BITWISE_XOR[] = "__bitwise_xor__"; +static const size_t STR_BITWISE_XOR_SIZE = + sizeof(STR_BITWISE_XOR) / sizeof(*STR_BITWISE_XOR) - + sizeof(*STR_BITWISE_XOR); +static const char STR_BITWISE_OR[] = "__bitwise_or__"; +static const size_t STR_BITWISE_OR_SIZE = + sizeof(STR_BITWISE_OR) / sizeof(*STR_BITWISE_OR) - sizeof(*STR_BITWISE_OR); static const char STR_EQUAL[] = "__equal__"; static const size_t STR_EQUAL_SIZE = sizeof(STR_EQUAL) / sizeof(*STR_EQUAL) - sizeof(*STR_EQUAL); @@ -4725,6 +4873,9 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: return setTypesOperatorUnary(tree, helper, STR_LOGICAL_NOT, STR_LOGICAL_NOT_SIZE); + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + return setTypesOperatorUnary(tree, helper, STR_BITWISE_NOT, + STR_BITWISE_NOT_SIZE); case AST_TREE_TOKEN_OPERATOR_SUM: return setTypesOperatorInfix(tree, helper, STR_SUM, STR_SUM_SIZE); case AST_TREE_TOKEN_OPERATOR_SUB: @@ -4756,6 +4907,15 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: return setTypesOperatorInfix(tree, helper, STR_LOGICAL_OR, STR_LOGICAL_OR_SIZE); + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + return setTypesOperatorInfix(tree, helper, STR_BITWISE_AND, + STR_BITWISE_AND_SIZE); + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + return setTypesOperatorInfix(tree, helper, STR_BITWISE_XOR, + STR_BITWISE_XOR_SIZE); + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: + return setTypesOperatorInfix(tree, helper, STR_BITWISE_OR, + STR_BITWISE_OR_SIZE); case AST_TREE_TOKEN_OPERATOR_POINTER: return setTypesOperatorPointer(tree, helper); case AST_TREE_TOKEN_OPERATOR_ADDRESS: @@ -4791,12 +4951,16 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_BUILTIN_HEAP_ALLOC: return setTypesBuiltinHeapAlloc(tree, helper, functionCall); case AST_TREE_TOKEN_BUILTIN_NEG: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: return setTypesBuiltinUnary(tree, helper, functionCall); case AST_TREE_TOKEN_BUILTIN_ADD: case AST_TREE_TOKEN_BUILTIN_SUB: case AST_TREE_TOKEN_BUILTIN_MUL: case AST_TREE_TOKEN_BUILTIN_DIV: case AST_TREE_TOKEN_BUILTIN_MOD: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: return setTypesBuiltinBinary(tree, helper, functionCall); case AST_TREE_TOKEN_BUILTIN_EQUAL: case AST_TREE_TOKEN_BUILTIN_NOT_EQUAL: @@ -6527,6 +6691,10 @@ bool setTypesBuiltinUnary(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -6578,6 +6746,10 @@ bool setTypesBuiltinUnary(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: @@ -6656,6 +6828,9 @@ bool setTypesBuiltinBinary(AstTree *tree, AstTreeSetTypesHelper helper, if (left == NULL || right == NULL) { return false; + } else if (!typeIsEqual(left->type, right->type)) { + printError(tree->str_begin, tree->str_end, "Type mismatch"); + return false; } AstTreeTypeFunction *type_metadata = a404m_malloc(sizeof(*type_metadata)); @@ -7597,6 +7772,10 @@ size_t getSizeOfType(AstTree *type) { case AST_TREE_TOKEN_BUILTIN_PUTC: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT: + case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: + case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: + case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -7640,6 +7819,10 @@ size_t getSizeOfType(AstTree *type) { case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT: + case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: + case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_NONE: |