void decl_print(struct decl *d, int indent) { if (!d) return; int i; for (i=0; i<indent; i++) printf("\t"); printf("%s: ", d->name); type_print(d->type); if (d->code) { indent++; printf(" = \n"); for (i=0; i<indent-1; i++) printf("\t"); printf("{\n"); stmt_print(d->code, indent); indent--; for (i=0; i<indent; i++) printf("\t"); printf("}\n"); } else if (d->value) { printf(" = "); expr_print(d->value); printf(";\n"); } else printf(";\n"); decl_print(d->next, indent); }
//Prints out the AST after parsing it int ast_print(){ if(!parse()){ decl_print(AST, 0); return 0; } else { return 1; } }
//prints everything in a statement void stmt_print(struct stmt *s, int indent){ if(!s) return; int i = 0; switch(s->kind){ case STMT_DECL: decl_print(s->decl, indent); break; case STMT_EXPR: for(i=0; i<indent; i++) printf("\t"); expr_print(s->expr); printf(";\n"); break; case STMT_IF_ELSE: for(i=0; i<indent; i++) printf("\t"); printf("if ("); expr_print(s->expr); printf(") \n"); stmt_print(s->body, indent); if(s->else_body){ printf("else "); stmt_print(s->else_body, indent); } else { printf("\n"); } break; case STMT_FOR: for(i=0; i<indent; i++) printf("\t"); printf("for ("); expr_print(s->init_expr); printf("; "); expr_print(s->expr); printf("; "); expr_print(s->next_expr); printf(") "); stmt_print(s->body, indent); printf("\n"); break; case STMT_PRINT: for(i=0; i<indent; i++) printf("\t"); printf("print "); expr_print(s->expr); printf(";\n"); break; case STMT_RETURN: for(i=0; i<indent; i++) printf("\t"); printf("return "); expr_print(s->expr); printf(";\n"); break; case STMT_BLOCK: printf("{\n"); stmt_print(s->body, indent+1); printf("\n"); for(i=0; i<indent; i++) printf("\t"); printf("} "); break; } stmt_print(s->next, indent); }
int parse(char *filename) { yyin = fopen(filename,"r"); if (!yyin) { fprintf(stderr,"unable to open %s\n",filename); exit(1); } if (yyparse() == 0) { decl_print(parser_result,0); return 0; } else { printf("Parse Failed!\n"); return 1; } fclose(yyin); return 1; }
void decl_print( struct decl *d, int indent ) { if(d==NULL)return; identar(indent); printf("%s: ",d->name); type_print(d->type); if(d->code!=NULL) { printf("={\n"); stmt_print(d->code,indent+1); identar(indent); printf("}\n"); } else if(d->value!=NULL) { printf("="); expr_print(d->value); printf(";\n"); } else printf(";\n"); decl_print(d->next,indent); }
void stmt_print(struct stmt *s, int indent) { if(!s) return; if(s -> kind != STMT_BLOCK) print_indent(indent); switch(s -> kind) { case STMT_DECL: decl_print(s -> decl, indent - 1); /*don't print new line because decl always prints new lines*/ break; case STMT_EXPR: expr_print(s -> expr); printf(";\n"); break; case STMT_IF_ELSE: printf("if("); expr_print(s -> expr); printf(")"); stmt_print_body(s -> body, indent); if(s -> else_body) { print_indent(indent); printf("else"); stmt_print_body(s -> else_body, indent); } break; case STMT_FOR: printf("for("); expr_print(s -> init_expr); printf("; "); expr_print(s -> expr); printf("; "); expr_print(s -> next_expr); printf(")"); stmt_print_body(s -> body, indent); break; case STMT_WHILE: /* *while loops are not in the CMinor spec so this should not get called. *if it does, it breaks immediately */ break; case STMT_PRINT: printf("print"); if(s -> expr) { printf(" "); expr_print(s -> expr); } printf(";\n"); break; case STMT_RET: printf("return"); if(s -> expr) { printf(" "); expr_print(s -> expr); } printf(";\n"); break; case STMT_BLOCK: printf("{\n"); stmt_print(s -> body, indent + 1); print_indent(indent); printf("}\n"); break; } stmt_print(s -> next, indent); }
/** * Print a declaration list in human readable format to stderr. * @param l The parameter list to be printed. * @param indent The amount of indentation in spaces. */ void decl_list_print(decl_list *l, int indent) { while (l) { decl_print(l->first, indent); l = l->next; } }
void stmt_print( struct stmt *s, int indent ) { if(!s) { return; } printf("\n"); switch(s->kind) { case STMT_DECL: decl_print(s->decl, indent); break; case STMT_EXPR: printf("%*s", indent, ""); expr_print( s->expr ); printf(";"); break; case STMT_IF_ELSE: printf("%*sif (", indent, ""); expr_print(s->expr); if (s->body) { if (s->body->kind == STMT_BLOCK) { printf(") {"); if (s->body) { stmt_print(s->body->body, indent+4); } printf("\n%*s}", indent, ""); } else { printf(")"); stmt_print(s->body, indent+4); } } if (s->else_body) { if(s->else_body->kind == STMT_BLOCK) { printf("\n%*selse {", indent, ""); if (s->else_body) { stmt_print(s->else_body->body, indent+4); } printf("\n%*s}", indent, ""); } else { printf("\n%*selse ", indent, ""); stmt_print(s->else_body, indent+4); } } break; case STMT_FOR: printf("%*sfor(", indent, ""); expr_print(s->init_expr); printf(";"); expr_print(s->expr); printf(";"); expr_print(s->next_expr); printf(")"); if(s->body) if(s->body->kind == STMT_BLOCK) { printf(" {"); if(s->body) stmt_print(s->body->body, indent+4); printf("\n%*s}", indent, ""); } else { stmt_print(s->body, indent+4); } break; case STMT_PRINT: printf("%*sprint ", indent, ""); expr_print(s->expr); printf(";"); break; case STMT_RETURN: printf("%*sreturn ", indent, ""); expr_print(s->expr); printf(";"); break; case STMT_BLOCK: printf("%*s{", indent, ""); stmt_print(s->body,indent+4); printf("\n%*s}", indent, ""); break; case STMT_EMPTY: break; } stmt_print(s->next, indent); }