diff options
Diffstat (limited to 'src/runner/runner.c')
-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: |