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); }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores) { if (!isDeclaracion) { Debugger(e, "For"); } Result result = new Result(); if (!isDeclaracion) { if (Objetivo.Count() > 0) { Expresion objetivo = Objetivo.ElementAt(0); /*Solo funciona con uno*/ Result rsObjetivo = null; Identificador idObjetivo = null; Referencia refObjetivo = null; AccesoLista listObjetivo = null; if (objetivo is Identificador) { idObjetivo = (Identificador)objetivo; idObjetivo.Acceso = false; idObjetivo.IsDeclaracion = isDeclaracion; rsObjetivo = idObjetivo.GetC3D(e, funcion, ciclo, isObjeto, errores); } if (objetivo is Referencia) { refObjetivo = (Referencia)objetivo; refObjetivo.Acceso = false; refObjetivo.ObtenerValor = true; rsObjetivo = refObjetivo.GetC3D(e, funcion, ciclo, isObjeto, errores); } if (objetivo is AccesoLista) { listObjetivo = (AccesoLista)objetivo; listObjetivo.Acceso = false; rsObjetivo = listObjetivo.GetC3D(e, funcion, ciclo, isObjeto, errores); } if (rsObjetivo != null) { if (rsObjetivo.Valor != null) { result.Codigo = rsObjetivo.Codigo; Result rsValor = Valor.GetC3D(e, funcion, ciclo, isObjeto, errores); if (rsValor != null) { if (Valor.GetTipo().IsList()) { if (rsValor != null) { result.Codigo += rsValor.Codigo; string ptr = NuevoTemporal(); result.Codigo += ptr + " = " + rsValor.Valor + ";\n"; result.EtiquetaF = NuevaEtiqueta(); result.EtiquetaV = NuevaEtiqueta(); string etqCiclo = NuevaEtiqueta(); string etqSalida = ""; if (BloqueElse != null) { etqSalida = NuevaEtiqueta(); } result.Codigo += etqCiclo + ":\n"; result.Codigo += "ifFalse (" + ptr + " >= 0 ) goto " + result.EtiquetaF + ";\n"; result.Codigo += "goto " + result.EtiquetaV + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += rsObjetivo.Valor + " = heap[" + ptr + "];\n"; result.Codigo += ptr + " = " + ptr + " + 1;\n"; result.Codigo += ptr + " = heap[" + ptr + "];\n"; Ent local = new Ent(e.Ambito + "_for", e); local.EtiquetaCiclo = etqCiclo; if (BloqueElse != null) { local.EtiquetaSalidaCiclo = etqSalida; } else { local.EtiquetaSalidaCiclo = result.EtiquetaF; } result.Codigo += Bloque.GetC3D(local, funcion, true, isDeclaracion, isObjeto, errores).Codigo; //arreglar result.Codigo += "goto " + etqCiclo + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; if (BloqueElse != null) { Ent local2 = new Ent(e.Ambito + "_for", e); result.Codigo += BloqueElse.GetC3D(local2, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo; result.Codigo += etqSalida + ":\n"; } } else { errores.AddLast(new Error("Semántico", "Error obteniendo el valor a iterar.", Linea, Columna)); } }/*buscar otras*/ } else { errores.AddLast(new Error("Semántico", "Error obteniendo el valor a iterar.", Linea, Columna)); } } else { errores.AddLast(new Error("Semántico", "Error obteniendo el target.", Linea, Columna)); } } else { errores.AddLast(new Error("Semántico", "Error obteniendo el target.", Linea, Columna)); } } } else { if (BloqueElse == null) { Ent local = new Ent(e.Ambito + "_for", e); local.Pos = e.Pos; result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo; e.Pos = local.Pos; } else { Ent local = new Ent(e.Ambito + "_for", e); local.Pos = e.Pos; result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo; e.Pos = local.Pos; Ent local2 = new Ent(e.Ambito + "_else", e); local2.Pos = e.Pos; result.Codigo += BloqueElse.GetC3D(local2, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo; e.Pos = local.Pos; } } return(result); }