Beispiel #1
0
        public String Generar3DConstructor()
        {
            String cadena = "";

            Simbolo clase = Padre.BuscarClasePadre();

            cadena += "void " + clase.Nombre + "_constructor";

            foreach (Simbolo s in Parametros)
            {
                FParametro d = (FParametro)s.Valor;
                cadena += "_" + s.Tipo + d.Dimensiones.ToString();
            }

            cadena += "(){\n";

            foreach (Simbolo simbolo in Ambito.TablaSimbolo)
            {
                cadena += simbolo.Generar3D();
            }

            cadena += "}\n\n";

            return(cadena);
        }
Beispiel #2
0
        public String GetNombre3D()
        {
            String cadena = "";

            cadena += this.Padre.Padre.Nombre + "_" + this.Nombre + this.Dimensiones.ToString() + "_" + this.Tipo;

            foreach (Simbolo s in Parametros)
            {
                FParametro d = (FParametro)s.Valor;
                cadena += "_" + s.Tipo + d.Dimensiones.ToString();
            }

            return(cadena);
        }
Beispiel #3
0
        public String Generar3D()
        {
            String cadena = "";

            Simbolo simclasepadre = Padre.BuscarClasePadre();

            FClase clasepadre = (FClase)simclasepadre.Valor;

            if (!clasepadre.Herencia.Equals(""))
            {
                Simbolo simclasehere = simclasepadre.BuscarClase(clasepadre.Herencia, clasepadre.ArchivoPadre);
                if (simclasehere != null)
                {
                    Simbolo simulacion = Padre.BuscarMetodoPadre();

                    String tempsimulacion = TitusTools.GetTemp();

                    cadena += "\t\t" + tempsimulacion + " = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//simulacion de cambio de ambito \n";
                    String posstack = TitusTools.GetTemp();
                    cadena += "\t\t" + posstack + " = Stack[P];\n";
                    String nuevapos = TitusTools.GetTemp();
                    cadena += "\t\t" + nuevapos + " = " + posstack + " + " + clasepadre.Ambito.Tamaño.ToString() + ";//posicion en el this de la herencia\n";

                    List <Nodo3D> resueltas = new List <Nodo3D>();

                    int i = 2;
                    foreach (FNodoExpresion p in this.Parametros)
                    {
                        String temporalstack = TitusTools.GetTemp();

                        cadena += "\t\t" + temporalstack + " = " + tempsimulacion + " + " + i.ToString() + ";\n";
                        Nodo3D r = p.Generar3D();
                        if (r.Tipo.Equals(Constante.TBooleano))//conversion siviene de una relacional
                        {
                            if (r.V == "" && r.F == "")
                            {//si trae etiquetas viene de una relacional si no es un bool nativo
                            }
                            else
                            {
                                var cad = "";

                                var auxtemp = TitusTools.GetTemp();
                                var salida  = TitusTools.GetEtq();

                                cad += "\t" + r.V + ":\n";
                                cad += "\t\t" + auxtemp + " = 1;\n";
                                cad += "\t\t" + "goto " + salida + ";\n";
                                cad += "\t" + r.F + ":\n";
                                cad += "\t\t" + auxtemp + " = 0;\n";
                                cad += "\t" + salida + ":\n";

                                r.Valor  = auxtemp;
                                cad     += "\t\t" + r.Valor + " =  - " + auxtemp + ";\n";
                                r.Codigo = r.Codigo + cad;
                            }
                        }


                        cadena += r.Codigo;
                        resueltas.Add(r);

                        //ahora asignamos al stack el valor resuelto
                        cadena += "\t\t" + "Stack[" + temporalstack + "] = " + r.Valor + ";//Asignacino del parametro\n";

                        i++;
                    }



                    String este = TitusTools.GetTemp();

                    cadena += "\t\t" + este + " = " + tempsimulacion + " + 0;//metiendo el this\n";
                    cadena += "\t\t" + "Stack[" + este + "] = " + nuevapos + ";\n";


                    if (!TitusTools.HayErrores())
                    {
                        Simbolo constructor = simclasehere.BuscarConstructor(simclasehere.Nombre, resueltas);

                        cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n";
                        if (constructor != null)
                        {
                            FMetodo m = (FMetodo)constructor.Valor;
                            if (m.Parametros.Count == this.Parametros.Count)
                            {
                                cadena += "\t\t" + simclasehere.Nombre + "_constructor";
                                foreach (Simbolo p in m.Parametros)
                                {
                                    FParametro parametro = (FParametro)p.Valor;
                                    cadena += "_" + parametro.Tipo + parametro.Dimensiones.ToString();
                                }

                                cadena += "();\n";
                            }
                            else
                            {
                                TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + constructor.Nombre, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                            }
                        }
                        else
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + simclasehere.Nombre, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                        }
                        cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n";
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "No existe ninguna clase " + clasepadre.Herencia, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                }
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede llamar la instruccion super porque no existe una herencia", TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
            }


            return(cadena);
        }
        //acceso a arreglos
        public Nodo3D Generar3D()
        {
            Nodo3D nodo = new Nodo3D();

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


            if (sim != null)
            {
                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 pos  = TitusTools.GetTemp();
                            String heap = TitusTools.GetTemp();
                            nodo.Valor   = TitusTools.GetTemp();
                            nodo.Codigo += "\t\t" + pos + " = Stack[P];\n";
                            nodo.Codigo += "\t\t" + heap + " = " + pos + " + " + sim.Posicion.ToString() + ";//posicion de la variable " + sim.Nombre + "\n";
                            nodo.Codigo += "\t\t" + nodo.Valor + " = Heap[" + heap + "];\n";
                        }
                        else
                        {
                            String pos = TitusTools.GetTemp();
                            nodo.Valor   = TitusTools.GetTemp();
                            nodo.Codigo += "\t\t" + pos + " = P + " + (sim.Posicion + 2).ToString() + ";//posicion de la variable " + sim.Nombre + "\n";
                            nodo.Codigo += "\t\t" + nodo.Valor + " = Stack[" + pos + "];\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";
                        String val = TitusTools.GetTemp();
                        cadenaArreglo += "\t\t" + val + " = Heap[" + nodo.Valor + "];\n";

                        nodo.Valor   = val;
                        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//si es parametro no trae tamaño en sus dimensiones solo dimensiones
                {
                    FParametro decla = (FParametro)sim.Valor;

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

                        String pos = TitusTools.GetTemp();
                        nodo.Valor   = TitusTools.GetTemp();
                        nodo.Codigo += "\t\t" + pos + " = P + " + (sim.Posicion + 2).ToString() + ";//posicion de la variable " + sim.Nombre + "\n";
                        nodo.Codigo += "\t\t" + nodo.Valor + " = Stack[" + pos + "];\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";
                        String val = TitusTools.GetTemp();
                        cadenaArreglo += "\t\t" + val + " = Heap[" + nodo.Valor + "];\n";

                        nodo.Valor   = val;
                        nodo.Codigo += cadenaArreglo;
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "El arreglo " + this.Nombre + ", tiene " + decla.Dimensiones.ToString() + " dimensiones no " + this.Dimensiones.Count.ToString(), 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);
        }
Beispiel #5
0
        public Nodo3D Generar3D()
        {
            Nodo3D nodo = new Nodo3D();

            String cadena = "";

            Simbolo simulacion = Padre.BuscarMetodoPadre();

            String tempsimulacion = TitusTools.GetTemp();

            cadena += "\t\t" + tempsimulacion + " = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//simulacion de cambio de ambito \n";

            nodo.Valor = TitusTools.GetTemp();

            nodo.Tipo = this.Nombre;
            String este = TitusTools.GetTemp();

            cadena += "\t\t" + nodo.Valor + " = H;//posicion del objeto\n";
            cadena += "\t\t" + este + " = " + tempsimulacion + " + 0;//metiendo el this\n";
            cadena += "\t\t" + "Stack[" + este + "] = " + nodo.Valor + ";\n";
            cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n";
            cadena += "\t\t" + "init_" + this.Nombre + "();\n";
            cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n";
            cadena += "\t\t" + "Stack[" + este + "] = " + nodo.Valor + ";\n";
            List <Nodo3D> resueltas = new List <Nodo3D>();

            int i = 2;

            foreach (FNodoExpresion p in this.Parametros)
            {
                String temporalstack = TitusTools.GetTemp();

                cadena += "\t\t" + temporalstack + " = " + tempsimulacion + " + " + i.ToString() + ";\n";
                Nodo3D r = p.Generar3D();
                if (r.Tipo.Equals(Constante.TBooleano))//conversion siviene de una relacional
                {
                    if (r.V == "" && r.F == "")
                    {//si trae etiquetas viene de una relacional si no es un bool nativo
                    }
                    else
                    {
                        var cad = "";

                        var auxtemp = TitusTools.GetTemp();
                        var salida  = TitusTools.GetEtq();

                        cad += "\t" + r.V + ":\n";
                        cad += "\t\t" + auxtemp + " = 1;\n";
                        cad += "\t\t" + "goto " + salida + ";\n";
                        cad += "\t" + r.F + ":\n";
                        cad += "\t\t" + auxtemp + " = 0;\n";
                        cad += "\t" + salida + ":\n";

                        r.Valor  = auxtemp;
                        cad     += "\t\t" + r.Valor + " =  - " + auxtemp + ";\n";
                        r.Codigo = r.Codigo + cad;
                    }
                }


                cadena += r.Codigo;
                resueltas.Add(r);

                //ahora asignamos al stack el valor resuelto
                cadena += "\t\t" + "Stack[" + temporalstack + "] = " + r.Valor + ";//Asignacino del parametro\n";

                i++;
            }

            if (!TitusTools.HayErrores())
            {
                Simbolo sim = Padre.BuscarConstructor(this.Nombre, resueltas);

                cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n";
                if (sim != null)
                {
                    FMetodo m = (FMetodo)sim.Valor;
                    if (m.Parametros.Count == this.Parametros.Count)
                    {
                        cadena += "\t\t" + this.Nombre + "_constructor";
                        foreach (Simbolo p in m.Parametros)
                        {
                            FParametro parametro = (FParametro)p.Valor;
                            cadena += "_" + parametro.Tipo + parametro.Dimensiones.ToString();
                        }

                        cadena += "();\n";
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna);
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna);
                }
                cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n";
            }

            nodo.Codigo = cadena;

            return(nodo);
        }