Exemple #1
0
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);
}
Exemple #2
0
//Prints out the AST after parsing it
int ast_print(){
	if(!parse()){
		decl_print(AST, 0);
		return 0;
	} else {
		return 1;
	}
}
Exemple #3
0
//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);
}
Exemple #4
0
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);	
}
Exemple #6
0
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);
}
Exemple #7
0
/**
 * 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;
  }
}
Exemple #8
0
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);
}