summaryrefslogtreecommitdiff
path: root/src/runner
diff options
context:
space:
mode:
Diffstat (limited to 'src/runner')
-rw-r--r--src/runner/runner.c31
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: