From 015ee9595f8a8d52e86825dc6fb5ceab7675c384 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Sun, 30 Apr 2023 11:35:20 -0400 Subject: [PATCH] feat: create print_ast function! --- mumble | Bin 100180 -> 102076 bytes src/mumble.c | 98 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 85 insertions(+), 13 deletions(-) diff --git a/mumble b/mumble index 914a2f7598d8eccdfa2d41ba53b743436fca65c5..638a2e10e88f35ebc47742d64cdaff0e49724a0b 100755 GIT binary patch delta 31544 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 delta 29562 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 #include #include +#include #include "mpc/mpc.h" +#define VERBOSE 1 + +long evaluate_operation(char* op, long x, long y) +{ + if (!strcmp(op, "+")) { + return x + y; + } else if (!strcmp(op, "-")) { + return x - y; + } else if (!strcmp(op, "*")) { + return x * y; + } else if (!strcmp(op, "/")) { + return x / y; + } else if (!strcmp(op, "^")) { + return 42; // to take care of later + } + return 0; +} + +long evaluate_ast(mpc_ast_t* t) +{ + // Base case #1: It's a number + if (VERBOSE) + printf("\n\nEvaluating the ast"); + if (strstr(t->tag, "number")) { + if (VERBOSE) + printf("\nCase #1, %s", t->contents); + return atoi(t->contents); + } + + // Base case #2: It's a number inputted into the REPL + // note: strcmp returns a 0 if both chars* have the same contents. + if (t->children_num == 2 && strstr(t->children[0]->tag, "number") && !strcmp(t->children[1]->tag, "regex")) { + if (VERBOSE) + printf("\nCase #2, %s", t->children[0]->contents); + return atoi(t->children[0]->contents); + } + + // Case #3: Parenthesis case + + if (t->children_num == 2 && !strcmp(t->children[0]->tag, "expr|>") && strstr(t->children[1]->tag, "regex")) { + return evaluate_ast(t->children[0]); + } + // Case #4: Unary operations case + + // Case #5: Binary (or more) operations case + long x; + char* operation; + if (t->children_num > 3 && !strcmp(t->children[0]->tag, "regex") && strstr(t->children[1]->tag, "operator")) { + operation = t->children[1]->contents; + if (VERBOSE) + printf("\nCase #5, %s", operation); + x = evaluate_ast(t->children[2]); + int i = 3; + while ((i < t->children_num) && strstr(t->children[i]->tag, "expr")) { + long y = evaluate_ast(t->children[i]); + x = evaluate_operation(operation, x, y); + i++; + } + } + + return x; +} + +void print_ast(mpc_ast_t* ast, int num_tabs) +{ + char tabs[100] = ""; + for(int i=0; itag); + printf("%sContents: %s\n", tabs, strcmp(ast->contents, "") ? ast->contents : "None"); + printf("%sNumber of children: %i\n", tabs, ast->children_num); + /* Print the children */ + for (int i = 0; i < ast->children_num; i++) { + mpc_ast_t* child_i = ast->children[i]; + printf("%sChild #%d\n", tabs, i); + print_ast(child_i, 1); + } +} int main(int argc, char** argv) { @@ -40,19 +120,11 @@ int main(int argc, char** argv) // mpc_ast_print(result.output); /* Load AST from output */ mpc_ast_t* ast = result.output; - char* no_contents = "None"; - printf("\n"); - printf("Tag: %s\n", ast->tag); - printf("Contents: %s\n", strcmp(ast->contents, "") ? ast->contents : no_contents); - printf("Number of children: %i\n", ast->children_num); - /* Print the children */ - for(int i=0; i < ast->children_num; i++){ - mpc_ast_t* child_i = ast->children[i]; - printf("Child #%d\n", i); - printf("\tTag: %s\n", child_i->tag); - printf("\tContents: %s\n", strcmp(child_i->contents, "") ? child_i->contents : no_contents); - printf("\tNumber of children: %i\n", child_i->children_num); - } + + // Print AST if VERBOSE + print_ast(ast, 0); + long result = evaluate_ast(ast); + printf("\nResult: %li\n", result); } else { /* Otherwise Print the Error */ mpc_err_print(result.error);