From 36367beb40b69d66ba866be31878097eed70b6be Mon Sep 17 00:00:00 2001 From: A404M Date: Sun, 23 Feb 2025 22:36:54 +0330 Subject: add more support for types --- src/main.c | 2 +- src/runner/runner.c | 25 +++++++++++++++++++++++++ src/utils/string.c | 8 ++++---- 3 files changed, 30 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index 71f6384..3513ff3 100644 --- a/src/main.c +++ b/src/main.c @@ -61,7 +61,7 @@ int main(int argc, char *argv[]) { return 1; } - const int ret = run(argv[1], true); + const int ret = run(argv[1], false); fileDelete(); return ret; } diff --git a/src/runner/runner.c b/src/runner/runner.c index 5362729..cb2dc8f 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -364,6 +364,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doLeftOperationFloat(operand, +, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } return operand; } @@ -395,6 +396,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doLeftOperationFloat(operand, -, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } return operand; } @@ -440,6 +442,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, +, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -486,6 +489,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, -, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -532,6 +536,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, *, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -578,6 +583,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, /, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -612,6 +618,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperation(left, right, %, AstTreeInt, i8); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -656,8 +663,15 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doOperationFloat(left, right, ==, AstTreeFloat, f16); + } else if (left->type == &AST_TREE_TYPE_TYPE) { + bool res = typeIsEqual(left, right); + astTreeDelete(left); + left = newAstTree(AST_TREE_TOKEN_VALUE_BOOL, (void *)(AstTreeBool)res, + &AST_TREE_BOOL_TYPE, NULL, NULL); + left->token = AST_TREE_TOKEN_VALUE_BOOL; } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -702,8 +716,15 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { } else if (left->type == &AST_TREE_F16_TYPE && right->type == &AST_TREE_F16_TYPE) { doOperationFloat(left, right, !=, AstTreeFloat, f16); + } else if (left->type == &AST_TREE_TYPE_TYPE) { + bool res = !typeIsEqual(left, right); + astTreeDelete(left); + left = newAstTree(AST_TREE_TOKEN_VALUE_BOOL, (void *)(AstTreeBool)res, + &AST_TREE_BOOL_TYPE, NULL, NULL); + left->token = AST_TREE_TOKEN_VALUE_BOOL; } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -750,6 +771,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, >, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -796,6 +818,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, <, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -842,6 +865,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, >=, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; @@ -888,6 +912,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { doOperationFloat(left, right, <=, AstTreeFloat, f16); } else { printError(expr->str_begin, expr->str_end, "Not supported"); + UNREACHABLE; } astTreeDelete(right); return left; diff --git a/src/utils/string.c b/src/utils/string.c index 17e27cd..16e9f9b 100644 --- a/src/utils/string.c +++ b/src/utils/string.c @@ -47,12 +47,12 @@ f128 numberToFloat(char *str_begin, char *str_end, bool *success) { c = *str_begin++; } if (c >= '0' && c <= '9') { - if (!isPastPoint) { - left *= 10; - left += c - '0'; - } else { + if (isPastPoint) { right += c - '0'; right /= 10; + } else { + left *= 10; + left += c - '0'; } } else if (c == '.' && !isPastPoint) { isPastPoint = true; -- cgit v1.2.3