//////////////////////////////////////// // stm void Stm_print (Stm_t s) { switch (s->kind){ case STM_ASSIGN:{ Stm_Assign p = (Stm_Assign)s; printf ("%s = ", p->id); Exp_print (p->exp); printf (";"); break; } case STM_PRINTI:{ Stm_Printi p = (Stm_Printi)s; printf ("printi("); Exp_print (p->exp); printf (");"); break; } case STM_PRINTB:{ Stm_Printb p = (Stm_Printb)s; printf ("printb("); Exp_print (p->exp); printf (");"); break; } default: break; } return; }
////////////////////////////////////////////////// // program entry int main() { printf("Compile starting\n"); // build an expression tree: // + // / \ // + 4 // / \ // 2 3 struct Exp_t *exp = Exp_Sum_new (Exp_Sum_new(Exp_Int_new (2) , Exp_Int_new (3)) , Exp_Int_new (4)); // print out this tree: printf ("the expression is:\n"); Exp_print (exp); // compile this tree to Stack machine instructions compile (exp); // print out the generated Stack instructions: printf("\n\n"); List_reverse_print (all); printf("\nCompile finished\n"); return 0; }
int main(int argc,char **argv){ parser_init(argv[1]); parser(); Exp_print(exp); return 0; }
// "printer" void Exp_print (struct Exp_t *exp) { switch (exp->kind){ case EXP_INT:{ struct Exp_Int *p = (struct Exp_Int *)exp; printf ("%d", p->i); break; } case EXP_SUM:{ struct Exp_Sum *p = (struct Exp_Sum *)exp; Exp_print (p->left); printf ("+"); Exp_print (p->right); break; } default: break; } }
// all operations on "Exp" void Exp_print (Exp_t exp) { switch (exp->kind){ case EXP_INT:{ Exp_Int p = (Exp_Int)exp; printf ("%d", p->n); return; } case EXP_ADD:{ Exp_Add p = (Exp_Add)exp; printf ("("); Exp_print (p->left); printf (") + ("); Exp_print (p->right); printf (")"); return; } case EXP_MINUS:{ Exp_Minus p = (Exp_Minus)exp; printf ("("); Exp_print (p->left); printf (") - ("); Exp_print (p->right); printf (")"); return; } case EXP_TIMES:{ Exp_Times p = (Exp_Times)exp; printf ("("); Exp_print (p->left); printf (") * ("); Exp_print (p->right); printf (")"); return; } case EXP_DEVIDE:{ Exp_Devide p = (Exp_Devide)exp; printf ("("); Exp_print (p->left); printf (") / ("); Exp_print (p->right); printf (")"); return; } default: return; } }
int main (int argc, char **argv) { yyparse(); printf ("\n"); Exp_print (tree); // compile this tree to Stack machine instructions printf ("\n"); compile (tree); // print out the generated Stack instructions: printf("\n"); List_reverse_print (all); return 0; }
// all operations on "Exp" void Exp_print (Exp_t exp) { switch (exp->kind){ case EXP_INT:{ Exp_Int p = (Exp_Int)exp; printf ("%d", p->n); return; } case EXP_TRUE:{ printf ("true"); return; } case EXP_FALSE:{ printf ("false"); return; } case EXP_ID:{ Exp_Id p = (Exp_Id)exp; printf ("%s", p->id); return; } case EXP_ADD:{ Exp_Add p = (Exp_Add)exp; printf ("("); Exp_print (p->left); printf (") + ("); Exp_print (p->right); printf (")"); return; } case EXP_SUB:{ Exp_Sub p = (Exp_Sub)exp; printf ("("); Exp_print (p->left); printf (") - ("); Exp_print (p->right); printf (")"); return; } case EXP_TIMES:{ Exp_Times p = (Exp_Times)exp; printf ("("); Exp_print (p->left); printf (") * ("); Exp_print (p->right); printf (")"); return; } case EXP_DIVIDE:{ Exp_Divide p = (Exp_Divide)exp; printf ("("); Exp_print (p->left); printf (") / ("); Exp_print (p->right); printf (")"); return; } case EXP_AND:{ Exp_And p = (Exp_And)exp; printf ("("); Exp_print (p->left); printf (") && ("); Exp_print (p->right); printf (")"); return; } case EXP_OR:{ Exp_Or p = (Exp_Or)exp; printf ("("); Exp_print (p->left); printf (") || ("); Exp_print (p->right); printf (")"); return; } default: return; } }