public Nodo3D Generar3D()
        {
            Nodo3D nodo = new Nodo3D();

            Simbolo sim = Padre.BuscarVariable(this.Nombre);

            if (sim != null)//es un arreglo
            {
                FLlamadaArreglo arr = new FLlamadaArreglo(this.Nombre, Parametros, Fila, Columna);
                arr.setPadre(Padre);

                nodo = arr.Generar3D();
            }
            else// es un metodo
            {
                FLlamadaMetodo metodo = new FLlamadaMetodo(this.Nombre, this.Parametros, Fila, Columna);
                metodo.setPadre(Padre);

                nodo = metodo.Generar3D();

                sim = metodo.Encontrado;
            }

            if (sim == null)
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro un arreglo o metodo para ejecutar", TitusTools.GetRuta(), Fila, Columna);
            }

            return(nodo);
        }
Ejemplo n.º 2
0
        public Nodo3D Generar3DHijoAsignacion(Simbolo padre, String temporal)
        {
            Nodo3D nodo = new Nodo3D();

            Simbolo sim = padre.BuscarVariable(this.Nombre);


            if (sim != null)
            {
                if (sim.Visibilidad.Equals(Constante.TPublico))
                {
                    if (sim.Rol.Equals(Constante.DECLARACION))
                    {
                        FDeclaracion decla = (FDeclaracion)sim.Valor;

                        if (decla.Dimensiones.Count == this.Dimensiones.Count)
                        {
                            nodo.Tipo = sim.Tipo;

                            if (sim.Ambito.Nombre.Equals("§global§"))
                            {
                                String heap = TitusTools.GetTemp();
                                nodo.Valor   = TitusTools.GetTemp();
                                nodo.Codigo += "\t\t" + heap + " = " + temporal + " + " + sim.Posicion.ToString() + ";//posicion de la variable " + sim.Nombre + "\n";
                                nodo.Codigo += "\t\t" + nodo.Valor + " = Heap[" + heap + "];\n";
                            }

                            String tempAcceso    = TitusTools.GetTemp();
                            String cadenaArreglo = "";
                            String etqError      = TitusTools.GetEtq();
                            String etqSalida     = TitusTools.GetEtq();
                            cadenaArreglo += "\t\t" + tempAcceso + " = Heap[" + nodo.Valor + "];//acceso a las dimensiones\n";
                            cadenaArreglo += "\t\t" + "ifFalse " + tempAcceso + " == " + this.Dimensiones.Count.ToString() + " goto " + etqError + ";\n";
                            cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + 1;\n";

                            String mapeo = TitusTools.GetTemp();

                            String dsize = TitusTools.GetTemp();

                            String indice = TitusTools.GetTemp();

                            cadenaArreglo += "\t\t" + mapeo + " = 0;\n";
                            int i = 0;
                            foreach (FNodoExpresion d in Dimensiones)
                            {
                                Nodo3D dtemp = d.Generar3D();
                                if (dtemp.Tipo.Equals(Constante.TEntero) && !TitusTools.HayErrores())
                                {
                                    cadenaArreglo += dtemp.Codigo;
                                    cadenaArreglo += "\t\t" + dsize + " = Heap[" + nodo.Valor + "];\n";
                                    cadenaArreglo += "\t\t" + indice + " = " + dsize + " - 1;\n";
                                    cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + 1;\n";
                                    cadenaArreglo += "\t\t" + "ifFalse " + dtemp.Valor + " >= 0 goto " + etqError + ";\n";
                                    cadenaArreglo += "\t\t" + "ifFalse " + dtemp.Valor + " <= " + indice + " goto " + etqError + ";\n";
                                    if (i > 0)
                                    {
                                        cadenaArreglo += "\t\t" + mapeo + " = " + mapeo + " * " + dsize + ";\n";
                                    }

                                    cadenaArreglo += "\t\t" + mapeo + " = " + mapeo + " + " + dtemp.Valor + ";\n";
                                }
                                else
                                {
                                    TitusTools.InsertarError(Constante.TErrorSemantico, "Solo se puede acceder al arreglo " + this.Nombre + " con un tipo entero no un tipo " + dtemp.Tipo, TitusTools.GetRuta(), this.Fila, this.Columna);
                                }

                                i++;
                            }

                            cadenaArreglo += "\t\t" + "goto " + etqSalida + ";\n";
                            cadenaArreglo += "\t" + etqError + ":\n";
                            cadenaArreglo += "\t\t" + "Error(1);\n";
                            cadenaArreglo += "\t" + etqSalida + ":\n";
                            cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + " + mapeo + ";//posicion lexicografica\n";

                            nodo.Valor = "Heap[" + nodo.Valor + "]";

                            nodo.Codigo += cadenaArreglo;
                        }
                        else
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "El arreglo " + this.Nombre + ", tiene " + decla.Dimensiones.Count.ToString() + " dimensiones no " + this.Dimensiones.Count.ToString(), TitusTools.GetRuta(), this.Fila, this.Columna);
                        }
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede acceder a una variable que no es publica " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna);
                }
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro la variable " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna);
            }

            return(nodo);
        }