From 9b355a18b14f2ece7707e6c5334124dcc0961e2d Mon Sep 17 00:00:00 2001 From: A404M Date: Wed, 9 Apr 2025 17:52:34 +0330 Subject: add logical and or not --- src/runner/runner.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'src/runner') 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: -- cgit v1.2.3