From 57724905836699b31034fb83946f9f4a8b3b5f31 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Mon, 1 May 2023 18:33:52 -0400 Subject: [PATCH] tweak: delete old code + make format --- mumble | Bin 99456 -> 99416 bytes src/mumble.c | 459 +++++++++++++++++++++------------------------------ 2 files changed, 188 insertions(+), 271 deletions(-) diff --git a/mumble b/mumble index ba990f490e82cee04caac93ffcc96b233d450dd5..73d85916c731f2f1fa52d854140d39793bc0fc97 100755 GIT binary patch delta 24376 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 M;MTYanjyRV4@Gxbk^lez delta 24485 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 diff --git a/src/mumble.c b/src/mumble.c index bb63db8..26d6965 100644 --- a/src/mumble.c +++ b/src/mumble.c @@ -9,300 +9,215 @@ // Types typedef struct lispval { - int type; - long num; - char* err; - char* sym; - int count; - struct lispval** cell; // list of lisval* + int type; + long num; + char* err; + char* sym; + int count; + struct lispval** cell; // list of lisval* } lispval; -enum { LISPVAL_NUM, LISPVAL_ERR, LISPVAL_SYM, LISPVAL_SEXPR }; -enum { LISPERR_DIV_ZERO, LISPERR_BAD_OP, LISPERR_BAD_NUM }; +enum { + LISPVAL_NUM, + LISPVAL_ERR, + LISPVAL_SYM, + LISPVAL_SEXPR +}; + +enum { + LISPERR_DIV_ZERO, + LISPERR_BAD_OP, + LISPERR_BAD_NUM +}; // Constructors -lispval* lispval_num(long x){ - lispval* v = malloc(sizeof(lispval)); - v->type = LISPVAL_NUM; - v->num = x; - return v; -} -lispval* lispval_err(char* message){ - lispval* v = malloc(sizeof(lispval)); - v->type = LISPVAL_ERR; - v->err = malloc(strlen(message)+1); - strcpy(v->err, message); - return v; -} -lispval* lispval_sym(char* symbol){ - lispval* v = malloc(sizeof(lispval)); - v->type = LISPVAL_SYM; - v->sym = malloc(strlen(symbol)+1); - strcpy(v->sym, symbol); - return v; -} -lispval* lispval_sexpr(void){ - lispval* v = malloc(sizeof(lispval)); - v->type = LISPVAL_SEXPR; - v->count = 0; - v->cell = NULL; - return v; +lispval* +lispval_num(long x) +{ + lispval* v = malloc(sizeof(lispval)); + v->type = LISPVAL_NUM; + v->num = x; + return v; } -// Delete -void delete_lispval(lispval* v){ - switch(v->type){ - case LISPVAL_NUM: break; - case LISPVAL_ERR: free(v->err); break; - case LISPVAL_SYM: free(v->sym); break; - case LISPVAL_SEXPR: - for(int i=0; i< v->count; i++){ - delete_lispval(v->cell[i]); - } - free(v->cell); - break; - } - free(v); +lispval* +lispval_err(char* message) +{ + lispval* v = malloc(sizeof(lispval)); + v->type = LISPVAL_ERR; + v->err = malloc(strlen(message) + 1); + strcpy(v->err, message); + return v; +} + +lispval* +lispval_sym(char* symbol) +{ + lispval* v = malloc(sizeof(lispval)); + v->type = LISPVAL_SYM; + v->sym = malloc(strlen(symbol) + 1); + strcpy(v->sym, symbol); + return v; +} + +lispval* +lispval_sexpr(void) +{ + lispval* v = malloc(sizeof(lispval)); + v->type = LISPVAL_SEXPR; + v->count = 0; + v->cell = NULL; + return v; +} + +// Destructor +void delete_lispval(lispval* v) +{ + switch (v->type) { + case LISPVAL_NUM: + break; + case LISPVAL_ERR: + free(v->err); + break; + case LISPVAL_SYM: + free(v->sym); + break; + case LISPVAL_SEXPR: + for (int i = 0; i < v->count; i++) { + delete_lispval(v->cell[i]); + } + free(v->cell); + break; + } + free(v); } // Read ast into a lispval object -lispval* lispval_append_child(lispval* parent, lispval* child){ - parent->count = parent->count + 1; - parent->cell = realloc(parent->cell, sizeof(lispval) * parent->count); - parent->cell[parent->count -1] = child; - return parent; +lispval* +lispval_append_child(lispval* parent, lispval* child) +{ + parent->count = parent->count + 1; + parent->cell = realloc(parent->cell, sizeof(lispval) * parent->count); + parent->cell[parent->count - 1] = child; + return parent; } -lispval* read_lispval_num(mpc_ast_t* t){ - errno = 0; - long x = strtol(t->contents, NULL, 10); - return errno != ERANGE ? lispval_num(x) : lispval_err("Error: Invalid number."); +lispval* +read_lispval_num(mpc_ast_t* t) +{ + errno = 0; + long x = strtol(t->contents, NULL, 10); + return errno != ERANGE ? lispval_num(x) + : lispval_err("Error: Invalid number."); } -lispval* read_lispval(mpc_ast_t* t){ - if(strstr(t->tag, "number")){ - return read_lispval_num(t); - }else if(strstr(t->tag, "symbol")){ - return lispval_sym(t->contents); - } else if((strcmp(t->tag, ">") == 0) || strstr(t->tag, "sexpr")){ - lispval* x = lispval_sexpr(); - for(int i=0; i<(t->children_num); i++){ - if (strcmp(t->children[i]->contents, "(") == 0) { continue; } - if (strcmp(t->children[i]->contents, ")") == 0) { continue; } - if (strcmp(t->children[i]->tag, "regex") == 0) { continue; } - x = lispval_append_child(x, read_lispval(t->children[i])); - } - return x; - }else{ - lispval* err = lispval_err("Unknown ast type."); - return err; - } +lispval* +read_lispval(mpc_ast_t* t) +{ + if (strstr(t->tag, "number")) { + return read_lispval_num(t); + } else if (strstr(t->tag, "symbol")) { + return lispval_sym(t->contents); + } else if ((strcmp(t->tag, ">") == 0) || strstr(t->tag, "sexpr")) { + lispval* x = lispval_sexpr(); + for (int i = 0; i < (t->children_num); i++) { + if (strcmp(t->children[i]->contents, "(") == 0) { + continue; + } + if (strcmp(t->children[i]->contents, ")") == 0) { + continue; + } + if (strcmp(t->children[i]->tag, "regex") == 0) { + continue; + } + x = lispval_append_child(x, read_lispval(t->children[i])); + } + return x; + } else { + lispval* err = lispval_err("Unknown ast type."); + return err; + } } // Print void print_lispval_tree(lispval* v, int indent_level) { - char* indent = malloc(sizeof(char)*(indent_level+1)); // ""; - for(int i=0; itype){ - case LISPVAL_NUM: - printf("\n%sNumber: %li", indent, v->num); - break; - case LISPVAL_ERR: - printf("\n%sError: %s", indent, v->err); - break; - case LISPVAL_SYM: - printf("\n%sSymbol: %s", indent, v->sym); - break; - case LISPVAL_SEXPR: - printf("\n%sSExpr, with %d children:", indent, v->count); - for(int i=0; icount; i++){ - print_lispval_tree(v->cell[i], indent_level + 2); - } - break; - default: - printf("Error: unknown lispval type\n"); - printf("%s", v->sym); - } - free(indent); + char* indent = malloc(sizeof(char) * (indent_level + 1)); // ""; + for (int i = 0; i < indent_level; i++) { + indent[i] = ' '; + } + indent[indent_level] = '\0'; + + switch (v->type) { + case LISPVAL_NUM: + printf("\n%sNumber: %li", indent, v->num); + break; + case LISPVAL_ERR: + printf("\n%sError: %s", indent, v->err); + break; + case LISPVAL_SYM: + printf("\n%sSymbol: %s", indent, v->sym); + break; + case LISPVAL_SEXPR: + printf("\n%sSExpr, with %d children:", indent, v->count); + for (int i = 0; i < v->count; i++) { + print_lispval_tree(v->cell[i], indent_level + 2); + } + break; + default: + printf("Error: unknown lispval type\n"); + printf("%s", v->sym); + } + free(indent); } void print_lispval_parenthesis(lispval* v) { - switch(v->type){ - case LISPVAL_NUM: - printf("%li ", v->num); - break; - case LISPVAL_ERR: - printf("[Error: %s] ", v->err); - break; - case LISPVAL_SYM: - printf("%s ", v->sym); - break; - case LISPVAL_SEXPR: - printf("( "); - for(int i=0; icount; i++){ - print_lispval_parenthesis(v->cell[i]); - } - printf(") "); - break; - default: - printf("Error: unknown lispval type\n"); - printf("%s", v->sym); - } -} - -/* -void print_lispval(lispval l){ - switch(l.type){ - case LISPVAL_NUM: - printf("\n%li", l.num); - break; - case LISPVAL_ERR: - switch(l.err){ - case LISPERR_BAD_OP: - printf("\nError: Invalid operator"); - break; - case LISPERR_BAD_NUM: - printf("\nError: Invalid number"); - break; - case LISPERR_DIV_ZERO: - printf("\nError: Division by zero"); - break; - default: - printf("\nError: Unknown error"); - } - break; - default: - printf("\nUnknown lispval type"); - } -} -*/ -// Utils -int is_ignorable(mpc_ast_t* t){ - int is_regex = !strcmp(t->tag, "regex"); - int is_parenthesis = !strcmp(t->tag, "char") && !strcmp(t->contents, "("); - return is_regex || is_parenthesis; + switch (v->type) { + case LISPVAL_NUM: + printf("%li ", v->num); + break; + case LISPVAL_ERR: + printf("[Error: %s] ", v->err); + break; + case LISPVAL_SYM: + printf("%s ", v->sym); + break; + case LISPVAL_SEXPR: + printf("( "); + for (int i = 0; i < v->count; i++) { + print_lispval_parenthesis(v->cell[i]); + } + printf(") "); + break; + default: + printf("Error: unknown lispval type\n"); + printf("%s", v->sym); + } } void print_ast(mpc_ast_t* ast, int indent_level) { - char* indent = malloc(sizeof(char)*(indent_level+1)); // ""; - for(int i=0; itag); - printf("\n%sContents: %s", indent, strcmp(ast->contents, "") ? ast->contents : "None"); + printf("\n%sContents: %s", indent, + strcmp(ast->contents, "") ? ast->contents : "None"); printf("\n%sNumber of children: %i", indent, ast->children_num); /* Print the children */ for (int i = 0; i < ast->children_num; i++) { mpc_ast_t* child_i = ast->children[i]; printf("\n%sChild #%d", indent, i); - print_ast(child_i, indent_level + 2); + print_ast(child_i, indent_level + 2); } - free(indent); + free(indent); } -// Operations -/* -lispval evaluate_unary_operation(char* op, lispval x) -{ - if(x.type == LISPVAL_ERR) return x; - if (!strcmp(op, "+")) { - return lispval_num(x.num); - } else if (!strcmp(op, "-")) { - return lispval_num(-x.num); - } - return lispval_err(LISPERR_BAD_OP); -} -lispval evaluate_operation(char* op, lispval x, lispval y) -{ - if(x.type == LISPVAL_ERR) return x; - if(y.type == LISPVAL_ERR) return y; - if (!strcmp(op, "+")) { - return lispval_num(x.num + y.num); - } else if (!strcmp(op, "-")) { - return lispval_num(x.num - y.num); - } else if (!strcmp(op, "*")) { - return lispval_num(x.num * y.num); - } else if (!strcmp(op, "/")) { - if (y.num == 0) return lispval_err(LISPERR_DIV_ZERO); - return lispval_num(x.num / y.num); - } - return lispval_err(LISPERR_BAD_OP); -} - -// Evaluate the AST -lispval evaluate_ast(mpc_ast_t* t) -{ - // Base case #1: It's a number - if (strstr(t->tag, "number")) { - if (VERBOSE) - printf("\nCase #1, %s", t->contents); - errno = 0; - long x = strtol(t->contents, NULL, 10); - return errno != ERANGE ? lispval_num(x) : lispval_err(LISPERR_BAD_NUM); - } - - // 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, top level num"); - return evaluate_ast(t->children[0]); - } - - // Base case #3: Top level parenthesis - if (t->children_num == 2 && strstr(t->children[0]->tag, "expr|>") && !strcmp(t->children[1]->tag, "regex")) { - if (VERBOSE) - printf("\nCase #3, top level parenthesis"); - return evaluate_ast(t->children[0]); - } - - // "Real" cases - lispval x; - char* operation; - - // Case #4: Top level unary operation - if (t->children_num == 3 && is_ignorable(t->children[0]) && strstr(t->children[1]->tag, "operator")) { - operation = t->children[1]->contents; - if (VERBOSE) - printf("\nCase #4, unary operation %s", operation); - x = evaluate_ast(t->children[2]); - x = evaluate_unary_operation(operation, x); - } - - // Case #5: Binary (or more) operations case - if (t->children_num > 3 && is_ignorable(t->children[0]) && 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; - int is_unary = 1; - while ((i < t->children_num) && strstr(t->children[i]->tag, "expr")) { - // note that when reaching a closing parenthesis, ^ returns false - lispval y = evaluate_ast(t->children[i]); - x = evaluate_operation(operation, x, y); - i++; - is_unary = 0; - } - if(is_unary){ - printf("\nCase #5.b, unary operation %s", operation); - x = evaluate_unary_operation(operation, x); - } - } - - return x; -} -*/ // Main int main(int argc, char** argv) { - // Info + // Info puts("Mumble version 0.0.2\n"); puts("Press Ctrl+C/Ctrl+D to exit\n"); @@ -314,8 +229,7 @@ int main(int argc, char** argv) mpc_parser_t* Mumble = mpc_new("mumble"); /* Define them with the following Language */ - mpca_lang(MPCA_LANG_DEFAULT, - " \ + mpca_lang(MPCA_LANG_DEFAULT, " \ number : /-?[0-9]+/ ; \ symbol : '+' | '-' | '*' | '/' ; \ sexpr : '(' * ')' ; \ @@ -323,9 +237,8 @@ int main(int argc, char** argv) mumble : /^/ * /$/ ; \ ", Number, Symbol, Sexpr, Expr, Mumble); - - // Initialize a repl + // Initialize a repl int loop = 1; while (loop) { char* input = readline("mumble> "); @@ -342,16 +255,20 @@ int main(int argc, char** argv) mpc_ast_t* ast = result.output; // Print AST if VERBOSE - if(VERBOSE) print_ast(ast, 0); - - // Evaluate the AST - // if(VERBOSE) printf("\n\nEvaluating the AST"); - // lispval result = evaluate_ast(ast); - lispval* l = read_lispval(ast); - if(VERBOSE) printf("\n\nTree printing: "); print_lispval_tree(l, 0); - if(VERBOSE) printf("\nParenthesis printing: \n"); print_lispval_parenthesis(l); - delete_lispval(l); + if (VERBOSE) + print_ast(ast, 0); + // Evaluate the AST + // if(VERBOSE) printf("\n\nEvaluating the AST"); + // lispval result = evaluate_ast(ast); + lispval* l = read_lispval(ast); + if (VERBOSE) + printf("\n\nTree printing: "); + print_lispval_tree(l, 0); + if (VERBOSE) + printf("\nParenthesis printing: \n"); + print_lispval_parenthesis(l); + delete_lispval(l); } else { /* Otherwise Print the Error */ mpc_err_print(result.error);