diff --git a/CMakeLists.txt b/CMakeLists.txt index be9fbf8..79429ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,6 @@ include_directories(include) add_library(calculator_lib src/lexer.c src/parser.c - src/ast.c src/evaluator.c ) diff --git a/include/ast.h b/include/ast.h deleted file mode 100644 index e69de29..0000000 diff --git a/include/evaluator.h b/include/evaluator.h index 8e1ea47..78c5730 100644 --- a/include/evaluator.h +++ b/include/evaluator.h @@ -4,6 +4,6 @@ #include "lexer.h" #include -uint64_t evaluate(ASTNode *tree); +int64_t evaluate(ASTNode *tree); #endif // !EVALUATOR_H diff --git a/src/ast.c b/src/ast.c deleted file mode 100644 index e69de29..0000000 diff --git a/src/evaluator.c b/src/evaluator.c index fc0048d..cbaf776 100644 --- a/src/evaluator.c +++ b/src/evaluator.c @@ -2,17 +2,17 @@ #include "lexer.h" #include -uint64_t evaluate(ASTNode *tree) { +int64_t evaluate(ASTNode *tree) { if (tree->type == NODE_BINARY_OP) { switch (tree->data.binary.op) { case OP_ADD: - return evaluate(tree->data.binary.left) + evaluate(tree->data.binary.left); + return evaluate(tree->data.binary.left) + evaluate(tree->data.binary.right); case OP_SUB: - return evaluate(tree->data.binary.left) - evaluate(tree->data.binary.left); + return evaluate(tree->data.binary.left) - evaluate(tree->data.binary.right); case OP_MUL: - return evaluate(tree->data.binary.left) * evaluate(tree->data.binary.left); + return evaluate(tree->data.binary.left) * evaluate(tree->data.binary.right); case OP_DIV: - return evaluate(tree->data.binary.left) / evaluate(tree->data.binary.left); + return evaluate(tree->data.binary.left) / evaluate(tree->data.binary.right); } } else { diff --git a/src/main.c b/src/main.c index a18e12c..26053e9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,16 +1,30 @@ +#include "evaluator.h" #include "lexer.h" #include "parser.h" +#include +#include #include #include int main(void) { - ASTNodeArray context; + char buf[256]; + printf("Insert a valid mathematical expression: "); + + int c; + int pos = 0; + while ((c = getc(stdin)) != '\n' && c != EOF) { + buf[pos] = c; + pos++; + } + buf[pos] = '\0'; - tokenize("3 + 4 * 5", &context); + ASTNodeArray context; + tokenize(buf, &context); AST tree = parse(&context); + int64_t result = evaluate(tree.head); - printf("Hola\n"); + printf("El resultado es: %" PRIi64 "\n", result); return EXIT_SUCCESS; } diff --git a/src/parser.c b/src/parser.c index c348aac..c2ac315 100644 --- a/src/parser.c +++ b/src/parser.c @@ -17,7 +17,7 @@ uint8_t node_lbp(ASTNode node) { break; case OP_DIV: case OP_MUL: - return 30; + return 20; default: return 0; } @@ -31,11 +31,13 @@ uint8_t node_rbp(ASTNode node) { switch (node.data.binary.op) { case OP_ADD: case OP_SUB: - return 20; + return 11; break; case OP_DIV: case OP_MUL: - return 40; + return 21; + default: + return 0; } } @@ -51,7 +53,7 @@ bool ASTNodeSlice_is_valid(ASTNodeSlice *slice) { if (slice->arr->len < 1) { return false; } - if (slice->pos >= slice->arr->len - 1) { + if (slice->pos >= slice->arr->len) { return false; } @@ -78,7 +80,7 @@ ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp) { break; } - ASTNode operator = operator = ASTNodeSlice_peek(slice); + ASTNode operator = ASTNodeSlice_peek(slice); uint8_t rbp = node_rbp(operator); uint8_t lbp = node_lbp(operator);