public void TipoResultante(Tipo op1, Tipo op2) { if (!op1.IsIndefinido() && !op2.IsIndefinido()) { if (Op == Operador.IGUAL || Op == Operador.DIFERENTE) { Tipo.Tip = Tipo.Type.BOOLEAN; return; } else { if ((op1.IsNumeric() || op1.IsBoolean()) && (op2.IsNumeric() || op2.IsBoolean())) { Tipo.Tip = Tipo.Type.BOOLEAN; return; } else if (op1.IsString() || op2.IsString()) { Tipo.Tip = Tipo.Type.BOOLEAN; return; } } } Tipo.Tip = Tipo.Type.INDEFINIDO; }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores) { Result result = new Result(); if (Tipo.IsInt() || Tipo.IsDouble() || Tipo.IsBoolean()) { result.Valor = Valor.ToString(); } else if (Tipo.IsNone()) { result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = 0 - 1;\n"; } else if (Tipo.IsString()) { /* * string tmp; * int cont = 0; * foreach (char c in Valor.ToString().Substring(1, Valor.ToString().Length - 2)) * { * tmp = NuevoTemporal(); * result.Codigo += tmp + " = H + " + cont++ + ";\n"; * result.Codigo += "heap[" + tmp + "] = " + (int)c + ";\n"; * * } * tmp = NuevoTemporal(); * result.Codigo += tmp + " = H + " + cont++ + ";\n"; * result.Codigo += "heap[" + tmp + "] = 0;\n"; * * result.Valor = NuevoTemporal(); * result.Codigo += result.Valor + " = H;\n"; * result.Codigo += "H = H + " + cont + ";\n"; */ result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = H;\n"; foreach (char c in Valor.ToString().Substring(1, Valor.ToString().Length - 2)) { result.Codigo += "heap[H] = " + (int)c + ";\n"; result.Codigo += "H = H + 1;\n"; } result.Codigo += "heap[H] = 0;\n"; result.Codigo += "H = H + 1;\n"; } return(result); }
private void TipoResultante(Tipo op1, Tipo op2) { if (!op1.IsIndefinido() && !op2.IsIndefinido()) { if (op1.IsBoolean() && op2.IsBoolean()) { Tipo.Tip = Tipo.Type.BOOLEAN; return; } else { Tipo.Tip = Tipo.Type.INT; return; } } Tipo.Tip = Tipo.Type.INDEFINIDO; }
public void TipoDominante(Tipo op1, Tipo op2) { if (!op1.IsIndefinido() && !op2.IsIndefinido()) { if (!op1.IsNone() && !op2.IsNone()) { if (op1.IsString() || op2.IsString()) { if (Op == Operador.SUMA) { Tipo.Tip = Tipo.Type.STRING; return; } } else //if (!op1.IsBoolean() && !op2.IsBoolean()) { if (op1.IsDouble() || op2.IsDouble()) { Tipo.Tip = Tipo.Type.DOUBLE; return; } else if (op1.IsInt() || op2.IsInt()) { Tipo.Tip = Tipo.Type.INT; return; } else if (op1.IsBoolean() || op2.IsBoolean()) { Tipo.Tip = Tipo.Type.INT; return; } } } } Tipo.Tip = Tipo.Type.INDEFINIDO; }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores) { Result result = new Result(); Result rsOp1 = Op1.GetC3D(e, funcion, ciclo, isObjeto, errores); if (Op2 != null) { Result rsOp2 = Op2.GetC3D(e, funcion, ciclo, isObjeto, errores); TipoDominante(Op1.GetTipo(), Op2.GetTipo()); if (!Tipo.IsIndefinido()) { result.Codigo += rsOp1.Codigo; result.Codigo += rsOp2.Codigo; if (Tipo.IsString()) { if (!Op1.GetTipo().IsString()) { ConvertirString(Op1, rsOp1, result); } if (!Op2.GetTipo().IsString()) { ConvertirString(Op2, rsOp2, result); } result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqCiclo = NuevaEtiqueta(); string tmpCiclo = NuevoTemporal(); result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = H;\n"; result.Codigo += tmpCiclo + " = heap[" + rsOp1.Valor + "];\n"; result.Codigo += etqCiclo + ":\n"; result.Codigo += "if (" + tmpCiclo + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += "heap[H] = " + tmpCiclo + ";\n"; result.Codigo += "H = H + 1;\n"; result.Codigo += rsOp1.Valor + " = " + rsOp1.Valor + " + 1;\n"; result.Codigo += tmpCiclo + " = heap[" + rsOp1.Valor + "];\n"; result.Codigo += "goto " + etqCiclo + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); etqCiclo = NuevaEtiqueta(); tmpCiclo = NuevoTemporal(); result.Codigo += tmpCiclo + " = heap[" + rsOp2.Valor + "];\n"; result.Codigo += etqCiclo + ":\n"; result.Codigo += "if (" + tmpCiclo + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += "heap[H] = " + tmpCiclo + ";\n"; result.Codigo += "H = H + 1;\n"; result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " + 1;\n"; result.Codigo += tmpCiclo + " = heap[" + rsOp2.Valor + "];\n"; result.Codigo += "goto " + etqCiclo + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += "heap[H] = 0;\n"; result.Codigo += "H = H + 1;\n"; } else { switch (Op) { case Operador.SUMA: result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp1.Valor + " + " + rsOp2.Valor + ";\n"; break; case Operador.RESTA: result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp1.Valor + " - " + rsOp2.Valor + ";\n"; break; case Operador.MULTIPLICACION: result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp1.Valor + " * " + rsOp2.Valor + ";\n"; break; case Operador.DIVISION: result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp1.Valor + " / " + rsOp2.Valor + ";\n"; break; case Operador.MODULO: result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp1.Valor + " % " + rsOp2.Valor + ";\n"; break; case Operador.FLOOR: result.EtiquetaV = NuevaEtiqueta(); string etqSalida = NuevaEtiqueta(); if (Op1 is Literal) { string tmpOp1 = NuevoTemporal(); result.Codigo += tmpOp1 + " = " + rsOp1.Valor + ";\n"; rsOp1.Valor = tmpOp1; } if (Op2 is Literal) { string tmpOp2 = NuevoTemporal(); result.Codigo += tmpOp2 + " = " + rsOp2.Valor + ";\n"; rsOp2.Valor = tmpOp2; } result.Valor = NuevoTemporal(); result.Codigo += "if (" + rsOp2.Valor + " != 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + etqSalida + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; string tmpCond = NuevoTemporal(); result.Codigo += tmpCond + " = 0;\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += "if (" + rsOp2.Valor + " > 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += tmpCond + " = 1;\n"; string menos = NuevoTemporal(); result.Codigo += menos + " = 0 - 1;\n"; result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " * " + menos + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; string tmpCond2 = NuevoTemporal(); result.Codigo += tmpCond2 + " = 0;\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += "if (" + rsOp1.Valor + " >= 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += tmpCond2 + " = 1;\n"; menos = NuevoTemporal(); result.Codigo += menos + " = 0 - 1;\n"; result.Codigo += rsOp1.Valor + " = " + rsOp1.Valor + " * " + menos + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += result.Valor + " = 1;\n"; result.Codigo += "if (" + rsOp2.Valor + " > " + rsOp1.Valor + ") goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += result.Valor + " = 0;\n"; result.Codigo += result.EtiquetaF + ":\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqCiclo = NuevaEtiqueta(); string tmp = NuevoTemporal(); result.Codigo += tmp + " = " + rsOp1.Valor + " - " + rsOp2.Valor + ";\n"; result.Codigo += etqCiclo + ":\n"; result.Codigo += tmp + " = " + tmp + " - " + rsOp2.Valor + ";\n"; result.Codigo += "if (" + tmp + " >= 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += result.Valor + " = " + result.Valor + " + 1;\n"; result.Codigo += "goto " + etqCiclo + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += "if (" + tmpCond + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; string etqVerd = result.EtiquetaV; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += "if (" + tmpCond2 + " == 1) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += result.Valor + " = " + result.Valor + " + 1;\n"; menos = NuevoTemporal(); result.Codigo += menos + " = 0 - 1;\n"; result.Codigo += result.Valor + " = " + result.Valor + " * " + menos + ";\n"; result.Codigo += etqVerd + ":\n"; result.Codigo += result.EtiquetaV + ":\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += "if (" + tmpCond2 + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; etqVerd = result.EtiquetaV; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += "if (" + tmpCond + " == 1) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += result.Valor + " = " + result.Valor + " + 1;\n"; menos = NuevoTemporal(); result.Codigo += menos + " = 0 - 1;\n"; result.Codigo += result.Valor + " = " + result.Valor + " * " + menos + ";\n"; result.Codigo += etqVerd + ":\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += etqSalida + ":\n"; break; case Operador.POTENCIA: if (Op1 is Literal) { string tmpOp1 = NuevoTemporal(); result.Codigo += tmpOp1 + " = " + rsOp1.Valor + ";\n"; rsOp1.Valor = tmpOp1; } if (Op2 is Literal) { string tmpOp2 = NuevoTemporal(); result.Codigo += tmpOp2 + " = " + rsOp2.Valor + ";\n"; rsOp2.Valor = tmpOp2; } else if (Op2 is Aritmetica) { if (((Aritmetica)Op2).Op2 == null && ((Aritmetica)Op2).Op == Operador.RESTA) { Tipo.Tip = Tipo.Type.DOUBLE; } } result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string factorNeg = NuevoTemporal(); string nuevoValor = NuevoTemporal(); string etqSalida2 = NuevaEtiqueta(); //string etqError = NuevaEtiqueta(); result.Codigo += "if (" + rsOp2.Valor + " >= 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += factorNeg + " = 0 - 1;\n"; result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " * " + factorNeg + ";\n"; //result.Codigo += "if (" + rsOp1.Valor + " == 0) goto " + etqError + ";\n";/*0**-num*/ result.Codigo += nuevoValor + " = 1.0 / " + rsOp1.Valor + ";\n"; result.Codigo += "goto " + etqSalida2 + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += nuevoValor + " = " + rsOp1.Valor + ";\n"; result.Codigo += etqSalida2 + ":\n"; result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqCiclo2 = NuevaEtiqueta(); result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = 1;\n"; result.Codigo += etqCiclo2 + ":\n"; result.Codigo += "if (" + rsOp2.Valor + " <= 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += result.Valor + " = " + result.Valor + " * " + nuevoValor + ";\n"; result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " - 1;\n"; result.Codigo += "goto " + etqCiclo2 + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; break; } } } else { errores.AddLast(new Error("Semántico", "Error de tipos en operación aritmética.", Linea, Columna)); } } else { Tipo tipOp1 = Op1.GetTipo(); if (tipOp1.IsNumeric() || tipOp1.IsBoolean()) { if (tipOp1.IsNumeric()) { Tipo = Op1.GetTipo(); } else { Tipo = new Tipo(Tipo.Type.INT); } result.Codigo += rsOp1.Codigo; result.Valor = NuevoTemporal(); switch (Op) { case Operador.SUMA: result.Codigo += result.Valor + " = " + rsOp1.Valor + " * 1;\n"; break; case Operador.RESTA: result.Codigo += result.Valor + " = 0 - 1;\n"; string tmp = result.Valor; result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp1.Valor + " * " + tmp + ";\n"; break; } } else { errores.AddLast(new Error("Semántico", "Error de tipos en operación aritmética.", Linea, Columna)); } } return(result); }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores) { Result result = new Result(); if (Op1 is Relacional) { ((Relacional)Op1).Cortocircuito = true; } else if (Op1 is Logica) { ((Logica)Op1).Evaluar = true; } Result rsOp1 = Op1.GetC3D(e, funcion, ciclo, isObjeto, errores); if (Op2 != null) { if (Op2 is Relacional) { ((Relacional)Op2).Cortocircuito = true; } else if (Op2 is Logica) { ((Logica)Op2).Evaluar = true; } Result rsOp2 = Op2.GetC3D(e, funcion, ciclo, isObjeto, errores); TipoResultante(Op1.GetTipo(), Op2.GetTipo()); if (!Tipo.IsIndefinido()) { if (Tipo.IsBoolean()) /*Si los dos son booleanos*/ { if (Op1 is Literal) { rsOp1.EtiquetaV = NuevaEtiqueta(); rsOp1.EtiquetaF = NuevaEtiqueta(); rsOp1.Codigo += "ifFalse (" + rsOp1.Valor + " == 1) goto " + rsOp1.EtiquetaV + ";\n"; rsOp1.Codigo += "goto " + rsOp1.EtiquetaF + ";\n"; rsOp1.EtiquetaV += ":\n"; rsOp1.EtiquetaF += ":\n"; } if (Op2 is Literal) { rsOp2.EtiquetaV = NuevaEtiqueta(); rsOp2.EtiquetaF = NuevaEtiqueta(); rsOp2.Codigo += "ifFalse (" + rsOp2.Valor + " == 1) goto " + rsOp2.EtiquetaV + ";\n"; rsOp2.Codigo += "goto " + rsOp2.EtiquetaF + ";\n"; rsOp2.EtiquetaV += ":\n"; rsOp2.EtiquetaF += ":\n"; } if (Op == Operador.AND) { result.Codigo += rsOp1.Codigo; if (Op1 is Relacional || Op1 is Literal) { result.Codigo += rsOp1.EtiquetaF; rsOp1.EtiquetaF = rsOp1.EtiquetaV; rsOp1.EtiquetaV = null; } else if (Op1 is Logica) { result.Codigo += rsOp1.EtiquetaV; rsOp1.EtiquetaV = null; } result.Codigo += rsOp2.Codigo; if (Op2 is Relacional || Op2 is Literal) { string copy = rsOp2.EtiquetaV; rsOp2.EtiquetaV = rsOp2.EtiquetaF; rsOp2.EtiquetaF = copy; } /* * if(Op2 is Relacional) * result.Codigo += rsOp2.EtiquetaF;*/ if (!Evaluar) { result.Valor = NuevoTemporal(); string etiquetaS = NuevaEtiqueta(); if (rsOp1.EtiquetaV != null) { result.Codigo += rsOp1.EtiquetaV; } if (rsOp2.EtiquetaV != null) { result.Codigo += rsOp2.EtiquetaV; } result.Codigo += result.Valor + " = 1;\n"; result.Codigo += "goto " + etiquetaS + ";\n"; if (rsOp1.EtiquetaF != null) { result.Codigo += rsOp1.EtiquetaF; } if (rsOp2.EtiquetaF != null) { result.Codigo += rsOp2.EtiquetaF; } result.Codigo += result.Valor + " = 0;\n"; result.Codigo += etiquetaS + ":\n"; } else { if (rsOp1.EtiquetaV != null) { result.EtiquetaV += rsOp1.EtiquetaV; } if (rsOp1.EtiquetaF != null) { result.EtiquetaF += rsOp1.EtiquetaF; } if (rsOp2.EtiquetaV != null) { result.EtiquetaV += rsOp2.EtiquetaV; } if (rsOp2.EtiquetaF != null) { result.EtiquetaF += rsOp2.EtiquetaF; } } } else { result.Codigo += rsOp1.Codigo; if (Op1 is Relacional || Op1 is Literal) { result.Codigo += rsOp1.EtiquetaV; rsOp1.EtiquetaV = rsOp1.EtiquetaF; rsOp1.EtiquetaF = null; } else if (Op1 is Logica) { result.Codigo += rsOp1.EtiquetaF; rsOp1.EtiquetaF = null; } result.Codigo += rsOp2.Codigo; if (Op2 is Relacional || Op2 is Literal) { string copy = rsOp2.EtiquetaV; rsOp2.EtiquetaV = rsOp2.EtiquetaF; rsOp2.EtiquetaF = copy; } if (!Evaluar) { result.Valor = NuevoTemporal(); string etiquetaS = NuevaEtiqueta(); if (rsOp1.EtiquetaV != null) { result.Codigo += rsOp1.EtiquetaV; } if (rsOp2.EtiquetaV != null) { result.Codigo += rsOp2.EtiquetaV; } result.Codigo += result.Valor + " = 1;\n"; result.Codigo += "goto " + etiquetaS + ";\n"; if (rsOp1.EtiquetaF != null) { result.Codigo += rsOp1.EtiquetaF; } if (rsOp2.EtiquetaF != null) { result.Codigo += rsOp2.EtiquetaF; } result.Codigo += result.Valor + " = 0;\n"; result.Codigo += etiquetaS + ":\n"; } else { if (rsOp1.EtiquetaV != null) { result.EtiquetaV += rsOp1.EtiquetaV; } if (rsOp1.EtiquetaF != null) { result.EtiquetaF += rsOp1.EtiquetaF; } if (rsOp2.EtiquetaV != null) { result.EtiquetaV += rsOp2.EtiquetaV; } if (rsOp2.EtiquetaF != null) { result.EtiquetaF += rsOp2.EtiquetaF; } } } } else { if (Op == Operador.AND) { if (Op2 is Literal && !Op2.GetTipo().IsNone()) { result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp2.Valor + ";\n"; } else { result.Codigo += rsOp2.Codigo; result.Valor = rsOp2.Valor; if (Op2 is Relacional || Op2 is Logica) { if (!Evaluar) { result.Valor = NuevoTemporal(); string etiquetaS = NuevaEtiqueta(); if (rsOp2.EtiquetaV != null) { result.Codigo += rsOp2.EtiquetaV; } result.Codigo += result.Valor + " = 1;\n"; result.Codigo += "goto " + etiquetaS + ";\n"; if (rsOp2.EtiquetaF != null) { result.Codigo += rsOp2.EtiquetaF; } result.Codigo += result.Valor + " = 0;\n"; result.Codigo += etiquetaS + ":\n"; } else { result.EtiquetaV = rsOp2.EtiquetaV; result.EtiquetaF = rsOp2.EtiquetaF; } } } Tipo = Op2.GetTipo(); } else { if (Op1 is Literal && !Op1.GetTipo().IsNone()) { result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = " + rsOp1.Valor + ";\n"; } else { result.Codigo += rsOp1.Codigo; result.Valor = rsOp1.Valor; if (Op1 is Relacional || Op1 is Logica) { if (!Evaluar) { result.Valor = NuevoTemporal(); string etiquetaS = NuevaEtiqueta(); if (rsOp1.EtiquetaV != null) { result.Codigo += rsOp1.EtiquetaV; } result.Codigo += result.Valor + " = 1;\n"; result.Codigo += "goto " + etiquetaS + ";\n"; if (rsOp1.EtiquetaF != null) { result.Codigo += rsOp1.EtiquetaF; } result.Codigo += result.Valor + " = 0;\n"; result.Codigo += etiquetaS + ":\n"; } else { result.EtiquetaV = rsOp1.EtiquetaV; result.EtiquetaF = rsOp1.EtiquetaF; } } } Tipo = Op1.GetTipo(); } } } else { errores.AddLast(new Error("Semántico", "Error de tipos en operación lógica.", Linea, Columna)); } } else /*NOT*/ { Tipo.Tip = Tipo.Type.BOOLEAN; if (Op1.GetTipo().IsBoolean()) /*Boolean, exp logica y relacional*/ { if (Op1 is Literal) { rsOp1.EtiquetaV = NuevaEtiqueta(); rsOp1.EtiquetaF = NuevaEtiqueta(); rsOp1.Codigo += "ifFalse (" + rsOp1.Valor + " == 1) goto " + rsOp1.EtiquetaV + ";\n"; rsOp1.Codigo += "goto " + rsOp1.EtiquetaF + ";\n"; rsOp1.EtiquetaV += ":\n"; rsOp1.EtiquetaF += ":\n"; } result.Codigo += rsOp1.Codigo; if (!Evaluar) { result.Valor = NuevoTemporal(); string etiquetaS = NuevaEtiqueta(); if (rsOp1.EtiquetaV != null) { result.Codigo += rsOp1.EtiquetaV; } result.Codigo += result.Valor + " = 1;\n"; result.Codigo += "goto " + etiquetaS + ";\n"; if (rsOp1.EtiquetaF != null) { result.Codigo += rsOp1.EtiquetaF; } result.Codigo += result.Valor + " = 0;\n"; result.Codigo += etiquetaS + ":\n"; } else { if (rsOp1.EtiquetaV != null) { result.EtiquetaF = rsOp1.EtiquetaV; } if (rsOp1.EtiquetaF != null) { result.EtiquetaV = rsOp1.EtiquetaF; } } } else { if (Op1 is Literal) { string tmp = NuevoTemporal(); rsOp1.Codigo += tmp + " = " + rsOp1.Valor + ";\n"; rsOp1.Valor = tmp; } if (Op1.GetTipo().IsString()) { rsOp1.Codigo += rsOp1.Valor + " = 0 - 1;\n"; } result.Codigo += rsOp1.Codigo; if (!Evaluar) { result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = 0;\n"; result.Codigo += "ifFalse (" + rsOp1.Valor + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += result.Valor + " = 1;\n"; result.Codigo += result.EtiquetaV + ":\n"; } else { result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); result.Codigo += "ifFalse (" + rsOp1.Valor + " == 0) goto " + result.EtiquetaF + ";\n"; result.Codigo += "goto " + result.EtiquetaV + ";\n"; result.EtiquetaV += ":\n"; result.EtiquetaF += ":\n"; } } } return(result); }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores) { if (!isDeclaracion) { Debugger(e, "Print"); } Result result = new Result(); if (!isDeclaracion) { Result rsExp = Expresion.GetC3D(e, funcion, ciclo, isObjeto, errores); Tipo tipoExp = Expresion.GetTipo(); if (!tipoExp.IsIndefinido()) { if (rsExp.Valor != null) { /*verificar objeto y todas las demas*/ result.Codigo += rsExp.Codigo; if (tipoExp.IsInt()) { if (Expresion is Literal) { string tmp = NuevoTemporal(); result.Codigo += tmp + " = " + rsExp.Valor + ";\n"; result.Codigo += "print(\"%i\"," + tmp + ");\n"; } else { result.Codigo += "print(\"%i\"," + rsExp.Valor + ");\n"; } } else if (tipoExp.IsDouble()) { if (Expresion is Literal) { string tmp = NuevoTemporal(); result.Codigo += tmp + " = " + rsExp.Valor + ";\n"; result.Codigo += "print(\"%f\"," + tmp + ");\n"; } else { result.Codigo += "print(\"%f\"," + rsExp.Valor + ");\n"; } } else if (tipoExp.IsBoolean()) { result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqSalida = NuevaEtiqueta(); string tmpCiclo = NuevoTemporal(); result.Codigo += "if (" + rsExp.Valor + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += tmpCiclo + " = 70;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 97;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 108;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 115;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 101;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += "goto " + etqSalida + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += tmpCiclo + " = 84;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 114;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 117;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 101;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += etqSalida + ":\n"; } else if (tipoExp.IsString()) { result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqCiclo = NuevaEtiqueta(); string tmpCiclo = NuevoTemporal(); result.Codigo += etqCiclo + ":\n"; result.Codigo += tmpCiclo + " = heap[" + rsExp.Valor + "];\n"; result.Codigo += "if (" + tmpCiclo + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += "print(\"%c\"," + tmpCiclo + ");\n"; result.Codigo += rsExp.Valor + " = " + rsExp.Valor + " + 1;\n"; result.Codigo += "goto " + etqCiclo + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; } string tmpSalto = NuevoTemporal(); result.Codigo += tmpSalto + " = 10;\n"; result.Codigo += "print(\"%c\"," + tmpSalto + ");\n"; } else { if (tipoExp.IsNone()) { string tmp = NuevoTemporal(); result.Codigo += tmp + " = 78;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; result.Codigo += tmp + " = 111;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; result.Codigo += tmp + " = 110;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; result.Codigo += tmp + " = 101;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; string tmpSalto = NuevoTemporal(); result.Codigo += tmpSalto + " = 10;\n"; result.Codigo += "print(\"%c\"," + tmpSalto + ");\n"; } else { errores.AddLast(new Error("Semantico", "Valor no encontrado en print", Linea, Columna)); } } } } return(result); }