package zinara.ast.instructions; import zinara.ast.expression.Expression; import zinara.ast.expression.BooleanExp; import zinara.ast.expression.Identifier; import zinara.code_generator.*; import zinara.ast.type.Type; import zinara.ast.type.IntType; import zinara.ast.type.FloatType; import zinara.ast.type.CharType; import zinara.ast.type.BoolType; import zinara.ast.type.StringType; import zinara.ast.expression.LValue; import zinara.ast.expression.StringExp; import zinara.exceptions.InvalidCodeException; import zinara.exceptions.TypeClashException; import java.io.IOException; public class Print extends Instruction{ private Expression expr; public Print(Expression ex) throws TypeClashException { Type eType = ex.getType(); if (!(eType instanceof StringType) && !(eType instanceof CharType) && !(eType instanceof IntType) && !(eType instanceof FloatType) && !(eType instanceof BoolType)) throw new TypeClashException("La expresion " + ex + " no es imprimible"); this.expr = ex; } public Expression getExpression(){ return this.expr; } public String toString() { return "<Print " + expr + ">"; } public void tox86(Genx86 generate) throws IOException,InvalidCodeException{ expr.register = register; String expReg = generate.addrRegName(expr.register); String expRegBool = generate.boolRegName(expr.register); // if (expr.type.equals(new BoolType())){ // String ret = generate.newLabel(); // boolValue(generate,expr,ret,expRegBool); // generate.writeLabel(ret); // } if (expr instanceof BooleanExp){ String ret = generate.newLabel(); boolValue(generate,expr,ret,expRegBool); generate.writeLabel(ret); } else if (!(expr instanceof StringExp)&& (expr.type instanceof StringType)){ System.out.println("noasfa2"); ((LValue)expr).currentDirection(generate); } else{ expr.tox86(generate); } generate.write(generate.push("rdi")); generate.write(generate.push("rax")); generate.write(generate.push("rcx")); generate.write(generate.push("r11")); generate.write(generate.mov("rdi",expReg)); if (expr.type instanceof IntType){ generate.write("call print_int\n"); } else if (expr.type instanceof BoolType){ generate.write("call print_int\n"); } else if (expr.type instanceof FloatType){ generate.write("call print_float\n"); } else if (expr.type instanceof CharType){ generate.write("call print_char\n"); } else if (expr.type instanceof StringType){ generate.write("call print_string\n"); } else{ generate.write("print de "+expr.type+" no implementado"); System.out.println("===================="); System.out.println("print de "+expr.type+" no implementado"); System.out.println("===================="); } generate.write("call print_nl\n"); generate.write(generate.pop("r11")); generate.write(generate.pop("rcx")); generate.write(generate.pop("rax")); generate.write(generate.pop("rdi")); } }