public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores) { if (!isDeclaracion) { Debugger(e, "Asignacion"); } Result result = new Result(); if (!isDeclaracion) { Aritmetica operacion = new Aritmetica(Objetivo, Valor, Op, Linea, Columna); Result rsOperacion = operacion.GetC3D(e, funcion, ciclo, isObjeto, errores); if (rsOperacion != null) { if (!operacion.GetTipo().IsIndefinido()) { if (Objetivo is Identificador) { ((Identificador)Objetivo).Acceso = false; } else if (Objetivo is Referencia) { ((Referencia)Objetivo).Acceso = false; } Result rsObjetivo = Objetivo.GetC3D(e, funcion, ciclo, isObjeto, errores); if (operacion.GetTipo().Tip == Objetivo.GetTipo().Tip) { result.Codigo += rsOperacion.Codigo; result.Codigo += rsObjetivo.Codigo; result.Codigo += rsObjetivo.Valor + " = " + rsOperacion.Valor + ";\n"; } else { errores.AddLast(new Error("Semántico", "El valor a asignar no es del mismo tipo.", Linea, Columna)); return(null); } } } } return(result); }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores) { Result result = new Result(); Result rsObjetivo = Objetivo.GetC3D(e, funcion, ciclo, isObjeto, errores); if (rsObjetivo != null) { if (Objetivo.GetTipo().IsList()) { Result rsPosicion = Posicion.GetC3D(e, funcion, ciclo, isObjeto, errores); if (rsPosicion != null) { if (Posicion.GetTipo().IsInt()) { //Codigo de la posicion result.Codigo += rsPosicion.Codigo; string pos = NuevoTemporal(); result.Codigo += pos + " = " + rsPosicion.Valor + ";\n"; result.Codigo += rsObjetivo.Codigo; /*Verificar lista vacía -1*/ string ptr = NuevoTemporal(); result.Codigo += ptr + " = " + rsObjetivo.Valor + ";\n"; result.Valor = NuevoTemporal(); if (Acceso) { result.Codigo += result.Valor + " = heap[" + rsObjetivo.Valor + "];\n"; } else { result.Valor = "heap[" + rsObjetivo.Valor + "]"; } result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqCiclo = NuevaEtiqueta(); string tmpCiclo = NuevoTemporal(); result.Codigo += tmpCiclo + " = 0;\n"; result.Codigo += etqCiclo + ":\n"; result.Codigo += "if (" + tmpCiclo + " == " + pos + ") goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += ptr + " = " + ptr + " + 1;\n"; result.Codigo += ptr + " = heap[" + ptr + "];\n"; result.Codigo += "if (" + ptr + " < 0) goto " + result.EtiquetaV + ";\n"; if (Acceso) { result.Codigo += result.Valor + " = heap[" + ptr + "];\n"; } else { result.Valor = "heap[" + ptr + "]"; } result.Codigo += tmpCiclo + " = " + tmpCiclo + " + 1;\n"; result.Codigo += "goto " + etqCiclo + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; Tipo.Tip = Objetivo.GetTipo().SubTip; } else { errores.AddLast(new Error("Semántico", "La posición debe ser entero.", Linea, Columna)); return(null); } } } else { errores.AddLast(new Error("Semántico", "No es una lista.", Linea, Columna)); return(null); } } return(result); }