]> git.eli173.com Git - klapaucius/commitdiff
some cleanup, parenthesis balance in parser now master
authorElijah Cohen <eli@eli173.com>
Thu, 8 Aug 2024 21:10:27 +0000 (16:10 -0500)
committerElijah Cohen <eli@eli173.com>
Thu, 8 Aug 2024 21:10:27 +0000 (16:10 -0500)
src/builtins/core.c
src/eval.c
src/parser.c
src/repl.c
src/sexpr.c
src/test.c

index 9c4ebf8f76228b4c23904496e087d2a7fe0a37c9..98deab4cc9010a72507a3b08d06ceb617cce7246 100644 (file)
@@ -96,8 +96,6 @@ Sexpr* c_def(Sexpr* b, Sexpr* env) {
        Sexpr* args = b->value.b.args;
        Sexpr* val = eval(car(args), env);
        Sexpr* key = car(cdr(args));
-       printf("val: %s\n", sprint_sexpr(val));
-       printf("key: %s\n", sprint_sexpr(key));
        append_to_dict(env, key, val);
        return val;
 }
index b4a16183be0b18bdd2639a296f50bbfd58048461..ba3e7ca4f893e24d4c2a2bf536fa66535a3cd0ed 100644 (file)
@@ -10,7 +10,7 @@
 Sexpr* apply_builtin(Sexpr* func, Sexpr* arg, Sexpr* env);
 
 Sexpr* eval(Sexpr* s, Sexpr* dict) {
-       printf("s: %s\n", sprint_sexpr(s));
+       //printf("s: %s\n", sprint_sexpr(s));
        // non-null s
        // generally assumes that a sexpr passed to this is well-formed (ie no inapt NULLS)
        // question: does a completed builtin get evaluated here?
@@ -27,7 +27,6 @@ Sexpr* eval(Sexpr* s, Sexpr* dict) {
        if(s->type != CONS) {
                return s;
        } // from now on: type is cons
-       //printf("idk\n");
        Sexpr* curr = s;
        while(curr->type == CONS) {
                if(cdr(curr)->type == NIL)
index 55e8380141bbb2a75bcf8708ce3100a189e5b18b..edd166a5e3e5fdd5e5e2b916a1341b54c0a10d9f 100644 (file)
@@ -94,6 +94,24 @@ Sexpr* vals_parse(Sexpr* tokens) {
 }
 
 
+bool balance_checker(Sexpr* tokens) {
+       int balance = 0;
+       Sexpr* curr = tokens;
+       while(curr->type != NIL) {
+               Sexpr* h = car(curr);
+               if(h->type == SYM) {
+                       if(strcmp(h->value.s, "(")==0)
+                               balance++;
+                       if(strcmp(h->value.s, ")")==0)
+                               balance--;
+                       if(balance < 0) return false;
+               }
+               curr = cdr(curr);
+       }
+       //printf("b: %d\n", balance);
+       return balance == 0;
+}
+
 Sexpr* cons_parse(Sexpr* tokens) {
        Sexpr* reversed = reverse(tokens);
        // takes results from previous parsing ops, aka the forward-facing?
@@ -127,6 +145,10 @@ Sexpr* parse(char* s) {
        //printf("t: %s\n", sprint_sexpr(*tokens));
        Sexpr* vals = vals_parse(tokens);
        //printf("v: %s\n", sprint_sexpr(vals));
+       if(!balance_checker(vals)) {
+               printf("unbalanced parenthesis\n");
+               return NULL;
+       }
        Sexpr* done = cons_parse(vals);
        //printf("c: %s\n", sprint_sexpr(*done));
        return done;
index 5329ccd41c94af52ac5723de6f7f5d87b285f0d8..eec6619ef45cab8b3718c13a42ea320d07cae24e 100644 (file)
@@ -25,15 +25,15 @@ int main(int argc, char** argv) {
                if(input == NULL)
                        return 0;
                linenoiseHistoryAdd(input);
-               printf("asdf1\n");
                Sexpr* in = parse(input);
-               printf("asdf2\n");
                if(in == NULL) {
                        printf("bad input\n");
                }
-               printf("- -%s\n", sprint_sexpr(in));
-               Sexpr* out = eval(car(in), env);
-               printf(" - %s\n", sprint_sexpr(out));
+               else {
+                       //printf("- -%s\n", sprint_sexpr(in));
+                       Sexpr* out = eval(car(in), env);
+                       printf(" - %s\n", sprint_sexpr(out));
+               }
                linenoiseFree(input);
        }
        return 0;
index e2d4652825751f729d298f6a0f0c29bfccbd04f3..e68c2643fbfc8880ad56f6aa3e263fca0189b260 100644 (file)
@@ -110,7 +110,10 @@ Sexpr* reverse(Sexpr* s) {
 }
 
 char* sprint_sexpr(Sexpr* s) {
-       if(s == NULL) printf("SHIT IT'S NULL\n");
+       if(s == NULL) {
+               printf("UH OH IT'S NULL\n");
+               return NULL;
+       }
        // assumes not null
        size_t nbytes;
        char* out;
index f11ee3727eca2ca54d74518f59000503e5ef2552..52ade20370fd6e334348aa7b34436283c5d633a1 100644 (file)
@@ -62,10 +62,10 @@ void test_parsing() {
 void test_parser() {
        printf("parsing again...\n");
 
-       printf("_: %s\n", sprint_sexpr(parse("457")));
+       printf("_: %s\n", sprint_sexpr(parse("456")));
        printf("_: %s\n", sprint_sexpr(parse("a b c d e")));
        printf("_: %s\n", sprint_sexpr(parse("(a b (3 2 (5) c) d (e f) g)")));
-       //printf("_: %s\n", sprint_sexpr(parse("(457")));
+       printf("_: %s\n", sprint_sexpr(parse("(457")));
 }
 
 void test_eq() {