diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-09 17:52:34 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-09 17:52:34 +0330 |
commit | 9b355a18b14f2ece7707e6c5334124dcc0961e2d (patch) | |
tree | a14d72cfacb397ba00a5cc0b4813a02d6b3272a5 /src/runner | |
parent | 27ac6c6f9b7f108b8b0e91f6e45a95ecc218934f (diff) |
add logical and or not
Diffstat (limited to 'src/runner')
-rw-r--r-- | src/runner/runner.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 140e3f8..8746e7c 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -154,7 +154,7 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_KEYWORD_WHILE: { AstTreeWhile *metadata = expr->metadata; - AstTree *ret = NULL; + AstTree *ret = &AST_TREE_VOID_VALUE; while (!*shouldRet) { AstTree *tree = runExpression(metadata->condition, shouldRet, false); bool conti = *(AstTreeBool *)tree->metadata; @@ -251,6 +251,13 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } return operand; } + case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT: { + AstTreeSingleChild *operand = + runExpression(expr->metadata, shouldRet, false); + + *(AstTreeBool *)operand->metadata = !*((AstTreeBool *)operand->metadata); + return operand; + } case AST_TREE_TOKEN_OPERATOR_SUM: { AstTreeInfix *metadata = expr->metadata; AstTree *left = runExpression(&metadata->left, shouldRet, false); @@ -788,6 +795,28 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { astTreeDelete(right); return left; } + case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: { + AstTreeInfix *metadata = expr->metadata; + AstTree *left = runExpression(&metadata->left, shouldRet, false); + AstTree *right = runExpression(&metadata->right, shouldRet, false); + + *(AstTreeBool *)left->metadata = + *(AstTreeBool *)left->metadata && *(AstTreeBool *)right->metadata; + + astTreeDelete(right); + return left; + } + case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: { + AstTreeInfix *metadata = expr->metadata; + AstTree *left = runExpression(&metadata->left, shouldRet, false); + AstTree *right = runExpression(&metadata->right, shouldRet, false); + + *(AstTreeBool *)left->metadata = + *(AstTreeBool *)left->metadata || *(AstTreeBool *)right->metadata; + + astTreeDelete(right); + return left; + } case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: |