diff options
-rw-r--r-- | main.c | 28 | ||||
-rw-r--r-- | pc.h | 3 | ||||
-rw-r--r-- | pc.y | 15 |
3 files changed, 41 insertions, 5 deletions
@@ -134,6 +134,34 @@ char* msg; return 0; } +int count_args(t) +ptree *t; +{ + int r, l; + + if (t->r && t->r->type == LIST) + r = count_args(t->r); + else if (t->r && t->r->type == ID) + r = 1; + else { + char buf[100]; + snprintf(buf, 100, "COUNT ARGS1: %d\n",(t->r)); + yyerror(buf); + } + + if (t->l && t->l->type == LIST) + l = count_args(t->l); + else if (t->l && t->l->type == ID) + l = 1; + else{ + char buf[100]; + snprintf(buf, 100, "COUNT ARGS2: %d\n", (t->l)); + yyerror(buf); + } + + return l + r; +} + int main() { #ifdef DEBUG_TYPES @@ -2,6 +2,7 @@ #define PC_H #include "y.tab.h" +#include "tree.h" char* pretty_type(int); @@ -10,4 +11,6 @@ void debug_print(int, union YYSTYPE*); int yyerror(char*); #endif +int count_args(ptree*); + #define DEBUG @@ -173,17 +173,22 @@ sub_prog_head :FUNC ID arguments ':' standard_type ';' { node *tmp; - int i = -1; + int i = 0; check_id(cur_scope->prev, $2); tmp = scope_insert(cur_scope->prev, $2); - assert(tmp->func_info = malloc(sizeof struct fi)); - /*TODO add count of parameters*/ + if ($3->type == ID) + i = 1; + else + i = count_args($3); + + tmp->func_info = malloc(sizeof(struct fi)); + assert(tmp->func_info); tmp->func_info->argc = i; - assert(tmp->func_info->argv = malloc(i * sizeof int)); + assert(tmp->func_info->argv = malloc(i * sizeof(int))); - tmp->var_type = $5 + tmp->var_type = $5; cur_scope->ret_var = scope_insert(cur_scope, $2); cur_scope->ret_var->var_type = $5; |