Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- else if(program->type=="Input"){
- std::cout << "input " << destReg << std::endl;
- }
- else if(program->type=="Output"){
- std::string src = makeName("src");
- CompileRec (src, program->branches[0]);
- std::cout << "output " << src << std::endl;
- }
- else if(program->type=="LessThan"){
- std::string src1 = makeName("src");
- std::string src2 = makeName("src");
- CompileRec (src1, program->branches[0]);
- CompileRec (src2, program->branches[1]);
- std::cout << "lt " << destReg << " " << src1 << " " << src2 << std::endl;
- }
- else if(program->type=="Add"){
- std::string src1 = makeName("src");
- std::string src2 = makeName("src");
- CompileRec (src1, program->branches[0]);
- CompileRec (src2, program->branches[1]);
- std::cout << "add " << destReg << " " << src1 << " " << src2 << std::endl;
- }
- else if(program->type=="Sub"){
- std::string src1 = makeName("src");
- std::string src2 = makeName("src");
- CompileRec (src1, program->branches[0]);
- CompileRec (src2, program->branches[1]);
- std::cout << "sub " << destReg << " " << src1 << " " << src2 << std::endl;
- }
- else if(program->type=="Assign"){
- std::string src = makeName("src");
- CompileRec(src, program->branches[0]);
- std::cout << "const " << destReg << " " << src << std::endl;
- }
- else if(program->type=="If"){
- std::string src1 = makeName("src");
- std::string src2 = makeName("src");
- std::string else_lab = makeName("label");
- std::string end_lab = makeName("label");
- //check for true or false
- CompileRec(src1, program->branches[0]);
- std::cout << "beq " << src1 << "$0 " << else_lab << std::endl;
- //default case is to evaluate true case and then skip to end
- CompileRec(src2, program->branches[1]);
- std::cout << "beq $0 $0 " << end_lab << std::endl;
- //otherwise evaluate false case
- std::cout << ":" << else_lab << std::endl;
- CompileRec(src2, program->branches[1]);
- //endlabel for skipping false case
- std::cout << ":" << end_lab << std::endl;
- }
- else if(program->type=="While"){
- std::string condition = makeName("src");
- std::string src = makeName("src");
- std::string start_lab = makeName("lab");
- std::string end_lab = makeName("lab");
- //set start label to branch back to while condition == true
- std::cout << ":" << start_lab << std::endl;
- CompileRec(condition, program->branches[0]);
- //if condition false, branch to end
- std::cout << "beq " << condition << "$0 " << end_lab << std::endl;
- //execute main clause and branch back to checking condition again
- CompileRec(src, program->branches[1]);
- std::cout << "beq $0 $0 " << start_lab << std::endl;
- std::cout << ":" << end_lab << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement