public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores) { Result result = new Result(); Result rsVerdadera = Verdadera.GetC3D(e, funcion, ciclo, isObjeto, errores); Result rsFalsa = Falsa.GetC3D(e, funcion, ciclo, isObjeto, errores); if (Condicion is Relacional) { ((Relacional)Condicion).Cortocircuito = true; } else if (Condicion is Logica) { ((Logica)Condicion).Evaluar = true; } Result rsCondicion = Condicion.GetC3D(e, funcion, ciclo, isObjeto, errores); if (rsVerdadera != null && rsFalsa != null && rsCondicion != null) { if (Condicion is Literal) { rsCondicion.EtiquetaV = NuevaEtiqueta(); rsCondicion.EtiquetaF = NuevaEtiqueta(); rsCondicion.Codigo += "ifFalse (" + rsCondicion.Valor + " == 1) goto " + rsCondicion.EtiquetaV + ";\n"; rsCondicion.Codigo += "goto " + rsCondicion.EtiquetaF + ";\n"; rsCondicion.EtiquetaV += ":\n"; rsCondicion.EtiquetaF += ":\n"; } if (Condicion is Relacional || Condicion is Literal) { string copy = rsCondicion.EtiquetaF; rsCondicion.EtiquetaF = rsCondicion.EtiquetaV; rsCondicion.EtiquetaV = copy; } string etqSalida = NuevaEtiqueta(); result.Valor = NuevoTemporal(); result.Codigo += rsCondicion.Codigo; result.Codigo += rsCondicion.EtiquetaV; result.Codigo += rsVerdadera.Codigo; result.Codigo += result.Valor + " = " + rsVerdadera.Valor + ";\n"; result.Codigo += "goto " + etqSalida + ";\n"; result.Codigo += rsCondicion.EtiquetaF; result.Codigo += rsFalsa.Codigo; result.Codigo += result.Valor + " = " + rsFalsa.Valor + ";\n"; result.Codigo += etqSalida + ":\n"; Tipo = Verdadera.GetTipo(); } return(result); }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores) { if (!isDeclaracion) { Debugger(e, "If"); } Result result = new Result(); if (Condicion != null) { if (!isDeclaracion) { if (Condicion is Relacional) { ((Relacional)Condicion).Cortocircuito = true; } else if (Condicion is Logica) { ((Logica)Condicion).Evaluar = true; } Result rsCondicion = Condicion.GetC3D(e, funcion, ciclo, isObjeto, errores); if (Condicion is Literal) { rsCondicion.EtiquetaV = NuevaEtiqueta(); rsCondicion.EtiquetaF = NuevaEtiqueta(); rsCondicion.Codigo += "ifFalse (" + rsCondicion.Valor + " == 1) goto " + rsCondicion.EtiquetaV + ";\n"; rsCondicion.Codigo += "goto " + rsCondicion.EtiquetaF + ";\n"; rsCondicion.EtiquetaV += ":\n"; rsCondicion.EtiquetaF += ":\n"; } if (Condicion is Relacional || Condicion is Literal) { string copy = rsCondicion.EtiquetaF; rsCondicion.EtiquetaF = rsCondicion.EtiquetaV; rsCondicion.EtiquetaV = copy; } Ent local = new Ent(e.Ambito + "_if", e); local.EtiquetaCiclo = e.EtiquetaCiclo; local.EtiquetaSalida = e.EtiquetaSalida; local.EtiquetaSalidaCiclo = e.EtiquetaSalidaCiclo; local.Size = e.Size; local.Pos = e.Pos; result.Codigo += rsCondicion.Codigo; result.Codigo += rsCondicion.EtiquetaV; result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo; result.Codigo += "goto " + Salida + ";\n"; result.Codigo += rsCondicion.EtiquetaF; e.Pos = local.Pos; } else { Ent local = new Ent(e.Ambito + "_if", e); local.EtiquetaCiclo = e.EtiquetaCiclo; local.EtiquetaSalida = e.EtiquetaSalida; local.EtiquetaSalidaCiclo = e.EtiquetaSalidaCiclo; local.Size = e.Size; local.Pos = e.Pos; result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo; result.Codigo += "goto " + Salida + ";\n"; e.Pos = local.Pos; } } else { Ent local = new Ent(e.Ambito + "_else", e); local.EtiquetaCiclo = e.EtiquetaCiclo; local.EtiquetaSalida = e.EtiquetaSalida; local.EtiquetaSalidaCiclo = e.EtiquetaSalidaCiclo; local.Size = e.Size; local.Pos = e.Pos; result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo; result.Codigo += "goto " + Salida + ";\n"; e.Pos = local.Pos; } return(result); }