aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-25 01:38:01 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-25 01:38:01 +0330
commite55d45bac0bbd3039118bffa7e6aaf01c04b991a (patch)
tree111bf667a2786fd593d05f5e562e1edc87c343fc /src/compiler/ast-tree.c
parent81c83f4233dba3851333cb69ab9727659e253d1b (diff)
add bitwise not and xor or
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c191
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: