From 06ebf6a87ca1db975bdbf4f7f3126ea7c26ddde6 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 17 Aug 2019 11:34:48 -0400 Subject: Add basic type checking Squashed commit of WIP-type_check@5dadc4f5667ae69a709dd45c020780f2f424d67e --- tree.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) (limited to 'tree.c') diff --git a/tree.c b/tree.c index 71feb5b..7a8c458 100644 --- a/tree.c +++ b/tree.c @@ -83,6 +83,67 @@ ptree *list; } } +void set_ret_type(t) +ptree *t; +{ + if (!t){ + fprintf(stderr, "TEST\n"); + return; + } + + switch (t->type) { + + case ADDOP: + fprintf(stderr, "[ADDOP]"); + break; + case MULOP: + fprintf(stderr, "[MULOP]"); + break; + case RELOP: + fprintf(stderr, "[RELOP]"); + break; + case NOT: + fprintf(stderr, "[NOT]"); + break; + case ARRAY_ACCESS: + fprintf(stderr, "[ARRAY ACCESS]"); + break; + case LIST: + fprintf(stderr, "[LIST]"); + break; + case ID: + if (t->r && t->r->attr.nval) + fprintf(stderr, "[ID: %s %s]", + t->r->attr.nval->name, + pretty_type( + t->attr.nval->var_type)); + else + fprintf(stderr, "[ID: %s %s]", + t->attr.nval->name, + pretty_type( + t->attr.nval->var_type)); + break; + case INUM: + fprintf(stderr, "[INUM: %d]", t->attr.ival); + break; + case RNUM: + fprintf(stderr, "[RNUM: %f]", t->attr.rval); + break; + case ASSIGNOP: + fprintf(stderr, "[ASSIGN]"); + break; + default: + fprintf(stderr, "\t%d", t->type); + yyerror("Error in tree_print"); + } + fprintf(stderr, "\nWHAT: %d\n", t->type); + set_ret_type(t->l); + set_ret_type(t->r); + t->ret_type = check_ret_type(t); + + return; +} + /*PRINT FUNCS*/ @@ -150,7 +211,7 @@ int spaces; fprintf(stderr, "\t%d", t->type); yyerror("Error in tree_print"); } - fprintf(stderr,"\n"); + fprintf(stderr," %d\n", t->ret_type); aux_tree_print(t->l, spaces + 2); fprintf(stderr,"\n"); aux_tree_print(t->r, spaces + 2); -- cgit v1.1 From 190274a66622d65cd30726a8daf3edb02dfe009e Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Fri, 16 Aug 2019 22:06:54 -0400 Subject: Fix MULOP/ADDOP return BOOL in check_ret_type Removes some debug printing --- tree.c | 1 - 1 file changed, 1 deletion(-) (limited to 'tree.c') diff --git a/tree.c b/tree.c index 7a8c458..eead0e5 100644 --- a/tree.c +++ b/tree.c @@ -136,7 +136,6 @@ ptree *t; fprintf(stderr, "\t%d", t->type); yyerror("Error in tree_print"); } - fprintf(stderr, "\nWHAT: %d\n", t->type); set_ret_type(t->l); set_ret_type(t->r); t->ret_type = check_ret_type(t); -- cgit v1.1 From 7449656c35052b29c65f0b7b53895b22b958a259 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 17 Aug 2019 12:16:17 -0400 Subject: Fix error message for ADDOP/MULOP Removes some debugging prints --- tree.c | 1 - 1 file changed, 1 deletion(-) (limited to 'tree.c') diff --git a/tree.c b/tree.c index eead0e5..11c08d4 100644 --- a/tree.c +++ b/tree.c @@ -87,7 +87,6 @@ void set_ret_type(t) ptree *t; { if (!t){ - fprintf(stderr, "TEST\n"); return; } -- cgit v1.1 From 9508f73e75aa588e9639530c72e8f5ed2c02067c Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 17 Aug 2019 15:46:16 -0400 Subject: Add if statements to tree print Removes printing tree during return type setting --- tree.c | 116 +++++++++++++++++++++-------------------------------------------- 1 file changed, 38 insertions(+), 78 deletions(-) (limited to 'tree.c') diff --git a/tree.c b/tree.c index 11c08d4..ee4bb8e 100644 --- a/tree.c +++ b/tree.c @@ -86,12 +86,40 @@ ptree *list; void set_ret_type(t) ptree *t; { - if (!t){ + if (!t) return; - } - - switch (t->type) { + + set_ret_type(t->l); + set_ret_type(t->r); + t->ret_type = check_ret_type(t); + + return; +} + + +/*PRINT FUNCS*/ + +void print_tree(t) +ptree *t; +{ + fprintf(stderr, "\n\nTREE\n" + "==========================================================\n"); + aux_tree_print(t, 0); + fprintf(stderr, + "**********************************************************\n"); + return; +} + +void aux_tree_print(t, spaces) +ptree* t; +int spaces; +{ + int i; + if ( t ) { + for (i = 0; i < spaces; i++) + fprintf(stderr," "); + switch (t->type) { case ADDOP: fprintf(stderr, "[ADDOP]"); break; @@ -131,80 +159,12 @@ ptree *t; case ASSIGNOP: fprintf(stderr, "[ASSIGN]"); break; - default: - fprintf(stderr, "\t%d", t->type); - yyerror("Error in tree_print"); - } - set_ret_type(t->l); - set_ret_type(t->r); - t->ret_type = check_ret_type(t); - - return; -} - - -/*PRINT FUNCS*/ - -void print_tree(t) -ptree *t; -{ - fprintf(stderr, "\n\nTREE\n" - "==========================================================\n"); - aux_tree_print(t, 0); - fprintf(stderr, - "**********************************************************\n"); - return; -} - -void aux_tree_print(t, spaces) -ptree* t; -int spaces; -{ - int i; - if ( t ) { - for (i = 0; i < spaces; i++) - fprintf(stderr," "); - switch (t->type) { - - case ADDOP: - fprintf(stderr, "[ADDOP]"); - break; - case MULOP: - fprintf(stderr, "[MULOP]"); - break; - case RELOP: - fprintf(stderr, "[RELOP]"); - break; - case NOT: - fprintf(stderr, "[NOT]"); - break; - case ARRAY_ACCESS: - fprintf(stderr, "[ARRAY ACCESS]"); - break; - case LIST: - fprintf(stderr, "[LIST]"); - break; - case ID: - if (t->r && t->r->attr.nval) - fprintf(stderr, "[ID: %s %s]", - t->r->attr.nval->name, - pretty_type( - t->attr.nval->var_type)); - else - fprintf(stderr, "[ID: %s %s]", - t->attr.nval->name, - pretty_type( - t->attr.nval->var_type)); - break; - case INUM: - fprintf(stderr, "[INUM: %d]", t->attr.ival); - break; - case RNUM: - fprintf(stderr, "[RNUM: %f]", t->attr.rval); - break; - case ASSIGNOP: - fprintf(stderr, "[ASSIGN]"); - break; + case IF: + fprintf(stderr, "[IF]"); + break; + case THEN: + fprintf(stderr, "[THEN]"); + break; default: fprintf(stderr, "\t%d", t->type); yyerror("Error in tree_print"); -- cgit v1.1 From e1d044ff79638cf781816e8723fa78f1e9a7b34e Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 17 Aug 2019 15:47:08 -0400 Subject: Add Type checking if statement condition --- tree.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tree.c') diff --git a/tree.c b/tree.c index ee4bb8e..de9a0f5 100644 --- a/tree.c +++ b/tree.c @@ -5,6 +5,8 @@ #include "node.h" #include "tree.h" +#include "scope.h" +#include "sem_check.h" #include "y.tab.h" #include "pc.h" -- cgit v1.1 From b4d095d8616c8a5f2d85f8dc91b8429b0a7108a3 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sun, 18 Aug 2019 18:31:19 -0400 Subject: Add WHILE to tree_print --- tree.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'tree.c') diff --git a/tree.c b/tree.c index de9a0f5..daad71f 100644 --- a/tree.c +++ b/tree.c @@ -164,6 +164,9 @@ int spaces; case IF: fprintf(stderr, "[IF]"); break; + case WHILE: + fprintf(stderr, "[WHILE]"); + break; case THEN: fprintf(stderr, "[THEN]"); break; -- cgit v1.1 From 3f1cee416602070225b81deb8c2222a5324f8204 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sun, 18 Aug 2019 18:31:36 -0400 Subject: Fix clean up header includes --- tree.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'tree.c') diff --git a/tree.c b/tree.c index daad71f..1874712 100644 --- a/tree.c +++ b/tree.c @@ -1,14 +1,14 @@ +#include "tree.h" + #include #include #include #include -#include "node.h" -#include "tree.h" -#include "scope.h" -#include "sem_check.h" #include "y.tab.h" +#include "scope.h" #include "pc.h" +#include "sem_check.h" /* parse tree funcs */ ptree* mktree(type, l, r) -- cgit v1.1 From dd07055aca1c45d147d773350e0c21930822a74f Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sun, 18 Aug 2019 22:27:52 -0400 Subject: Add for loop parsing Also fixes tree printing --- tree.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'tree.c') diff --git a/tree.c b/tree.c index 1874712..fd40781 100644 --- a/tree.c +++ b/tree.c @@ -164,15 +164,24 @@ int spaces; case IF: fprintf(stderr, "[IF]"); break; + case THEN: + fprintf(stderr, "[THEN]"); + break; case WHILE: fprintf(stderr, "[WHILE]"); break; - case THEN: - fprintf(stderr, "[THEN]"); + case FOR: + fprintf(stderr, "[FOR]"); + break; + case TO: + fprintf(stderr, "[TO]"); + break; + case DT: + fprintf(stderr, "[DOWN-TO]"); break; - default: - fprintf(stderr, "\t%d", t->type); - yyerror("Error in tree_print"); + default: + fprintf(stderr, "\t%d", t->type); + yyerror("Error in tree_print"); } fprintf(stderr," %d\n", t->ret_type); aux_tree_print(t->l, spaces + 2); -- cgit v1.1 From 227b13eccaecc05d76ca8dceb922a9d280ead0c4 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Thu, 29 Aug 2019 11:53:06 -0400 Subject: Fix return value for correctly typed statements Change okay return value to 1 so 0 can be used to denote an unset return type --- tree.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'tree.c') diff --git a/tree.c b/tree.c index fd40781..bb025f5 100644 --- a/tree.c +++ b/tree.c @@ -21,6 +21,7 @@ ptree *l, *r; t->type = type; t->l = l; t->r = r; + t->ret_type = 0; return t; } @@ -90,10 +91,12 @@ ptree *t; { if (!t) return; - - set_ret_type(t->l); - set_ret_type(t->r); + if (! (t->l && t->l->ret_type == 1)) + set_ret_type(t->l); + if (! (t->r && t->r->ret_type == 1)) + set_ret_type(t->r); + t->ret_type = check_ret_type(t); return; -- cgit v1.1 From 4fced0fc39d3aeacb3c6d434aeeb622468a857cc Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Mon, 2 Sep 2019 13:34:06 -0400 Subject: Add unary minus to parsing --- tree.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'tree.c') diff --git a/tree.c b/tree.c index bb025f5..2afdfa6 100644 --- a/tree.c +++ b/tree.c @@ -182,6 +182,9 @@ int spaces; case DT: fprintf(stderr, "[DOWN-TO]"); break; + case SUB: + fprintf(stderr, "[SUB]"); + break; default: fprintf(stderr, "\t%d", t->type); yyerror("Error in tree_print"); -- cgit v1.1