Example #1
0
        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);
        }
Example #2
0
        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);
        }