diff --git a/makefile b/makefile index 37e6df7..1058471 100644 --- a/makefile +++ b/makefile @@ -6,7 +6,7 @@ # make uninstall ## C compiler -CC=gcc # much faster compilation than gcc +CC=tcc # much faster compilation than gcc COMPILER_FLAGS=#-g3 -Wall -Wextra -Wconversion -Wdouble-promotion -Wno-unused-parameter -Wno-unused-function -Wno-sign-conversion -fsanitize=undefined # exclude: -fsanitize-trap, because I'm using an old version of gcc and couldn't bother getting a new one. ## ^ from diff --git a/mumble b/mumble index 07f1b53..d8ac684 100755 Binary files a/mumble and b/mumble differ diff --git a/src/mumble.c b/src/mumble.c index dbd8332..a9ec3d8 100644 --- a/src/mumble.c +++ b/src/mumble.c @@ -21,7 +21,8 @@ enum { LISPVAL_NUM, LISPVAL_ERR, LISPVAL_SYM, - LISPVAL_SEXPR + LISPVAL_SEXPR, + LISPVAL_QEXPR, }; enum { @@ -66,6 +67,15 @@ lispval* lispval_sexpr(void) return v; } +lispval* lispval_qexpr(void) +{ + lispval* v = malloc(sizeof(lispval)); + v->type = LISPVAL_QEXPR; + v->count = 0; + v->cell = NULL; + return v; +} + // Destructor void delete_lispval(lispval* v) { @@ -79,6 +89,7 @@ void delete_lispval(lispval* v) free(v->sym); break; case LISPVAL_SEXPR: + case LISPVAL_QEXPR: for (int i = 0; i < v->count; i++) { delete_lispval(v->cell[i]); } @@ -109,8 +120,17 @@ lispval* read_lispval(mpc_ast_t* t) 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(); + } else if ((strcmp(t->tag, ">") == 0) || strstr(t->tag, "sexpr") || strstr(t->tag, "qexpr")) { + + lispval* x; + if((strcmp(t->tag, ">") == 0) || strstr(t->tag, "sexpr")){ + x = lispval_sexpr(); + } else if(strstr(t->tag, "qexpr")){ + x = lispval_qexpr(); + } else { + return lispval_err("Error: Unreachable code state reached."); + } + for (int i = 0; i < (t->children_num); i++) { if (strcmp(t->children[i]->contents, "(") == 0) { continue; @@ -118,14 +138,20 @@ lispval* read_lispval(mpc_ast_t* t) if (strcmp(t->children[i]->contents, ")") == 0) { continue; } + 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."); + } else { + lispval* err = lispval_err("Unknown AST type."); return err; } } @@ -155,6 +181,12 @@ void print_lispval_tree(lispval* v, int indent_level) print_lispval_tree(v->cell[i], indent_level + 2); } break; + case LISPVAL_QEXPR: + printf("\n%sQExpr, 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); @@ -181,6 +213,13 @@ void print_lispval_parenthesis(lispval* v) } printf(") "); break; + case LISPVAL_QEXPR: + 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); @@ -316,18 +355,20 @@ int main(int argc, char** argv) mpc_parser_t* Number = mpc_new("number"); mpc_parser_t* Symbol = mpc_new("symbol"); mpc_parser_t* Sexpr = mpc_new("sexpr"); + mpc_parser_t* Qexpr = mpc_new("qexpr"); mpc_parser_t* Expr = mpc_new("expr"); 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]+\\.?([0-9]+)?/ ; \ - symbol : '+' | '-' | '*' | '/' ; \ - sexpr : '(' * ')' ; \ - expr : | | ; \ - mumble : /^/ * /$/ ; \ + symbol : '+' | '-' | '*' | '/' ; \ + sexpr : '(' * ')' ; \ + qexpr : '{' * '}' ; \ + expr : | | | ; \ + mumble : /^/ * /$/ ; \ ", - Number, Symbol, Sexpr, Expr, Mumble); + Number, Symbol, Sexpr, Qexpr, Expr, Mumble); // Initialize a repl int loop = 1; @@ -381,7 +422,7 @@ int main(int argc, char** argv) } /* Undefine and Delete our Parsers */ - mpc_cleanup(5, Number, Symbol, Sexpr, Expr, Mumble); + mpc_cleanup(6, Number, Symbol, Sexpr, Qexpr, Expr, Mumble); return 0; }