示例#1
0
        public Simbolo BuscarMetodoHerencia(String nombre, List <Nodo3D> parametros)
        {
            Simbolo var = null;
            Simbolo sim = BuscarClasePadre();

            FClase clase = (FClase)sim.Valor;

            if (!clase.Herencia.Equals(""))
            {
                Simbolo bc = BuscarClase(clase.Herencia, clase.ArchivoPadre);
                if (bc != null)
                {
                    var = bc.BuscarMetodo(nombre, parametros);
                    if (var != null)
                    {
                        if (!var.Visibilidad.Equals(Constante.TPublico) && !var.Visibilidad.Equals(Constante.TProtegido))
                        {
                            var = null;
                        }
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro una clase para herederar con el nombre " + clase.Herencia, TitusTools.GetRuta(), sim.Fila, sim.Columna);
                }
            }

            return(var);
        }
示例#2
0
        public String Generar3D()
        {
            String cadena = "";

            Nodo3D val = Valor.Generar3D();

            cadena += val.Codigo;
            switch (val.Tipo)
            {
            case Constante.TCadena:
            {
                String temp = TitusTools.GetTemp();
                String etq  = TitusTools.GetEtq();

                cadena += "\t" + etq + "://comienza imprimir\n";
                cadena += "\t\t" + temp + " = " + "Heap[" + val.Valor + "];\n";
                cadena += "\t\t" + "print(\"%c\", " + temp + ");\n";
                cadena += "\t\t" + val.Valor + " = " + val.Valor + " + 1 ;\n";
                cadena += "\t\t" + "if " + temp + " != 0 goto " + etq + ";//Termina imprimir\n";
            }
            break;

            case Constante.TCaracter:
            {
                cadena += "\t\t" + "print(\"%c\", " + val.Valor + ");//Termina imprimir\n";
            }
            break;

            case Constante.TEntero:
            {
                cadena += "\t\t" + "print(\"%d\", " + val.Valor + ");//Termina imprimir\n";
            }
            break;

            case Constante.TDecimal:
            {
                cadena += "\t\t" + "print(\"%f\", " + val.Valor + ");//Termina imprimir\n";
            }
            break;

            default:
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede imprimir un tipo " + val.Tipo, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                break;
            }

            return(cadena);
        }
示例#3
0
        private String GenerarRetornar()
        {
            String  cadena      = "";
            Nodo3D  val         = ((FNodoExpresion)Valor).Generar3D();
            Simbolo metodopadre = BuscarMetodoPadre();
            FMetodo met         = (FMetodo)metodopadre.Valor;
            String  tipometodo  = metodopadre.Tipo;

            if (met.Dimensiones > 0)
            {
                tipometodo = "arreglo " + tipometodo;
            }

            if (val.Tipo.Equals(Constante.TBooleano))
            {
                if (val.V == "" && val.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" + val.V + ":\n";
                    cad += "\t\t" + auxtemp + " = 1;\n";
                    cad += "\t\t" + "goto " + salida + ";\n";
                    cad += "\t" + val.F + ":\n";
                    cad += "\t\t" + auxtemp + " = 0;\n";
                    cad += "\t" + salida + ":\n";

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

            if (tipometodo.Equals(val.Tipo))
            {
                String retorno = TitusTools.GetTemp();
                cadena += val.Codigo;
                cadena += "\t\t" + retorno + " = P + 1;//Posicion de retorno\n";
                cadena += "\t\t" + "Stack[" + retorno + "] = " + val.Valor + ";//Asignacion de retorno\n";

                cadena += "\t\t§retornar§;\n";
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "El metodo " + met.Nombre + " solo puede retornar un tipo " + tipometodo + ", no un tipo " + val.Tipo, TitusTools.GetRuta(), Fila, Columna);
            }


            return(cadena);
        }
示例#4
0
        public String Generar3D(Nodo3D izq)
        {
            String cadena = "";

            cadena = "\t\t//Comienza caso " + Valor.Cadena + "\n";
            Nodo3D cond = Relacional3D(izq, Valor, Valor.Fila, Valor.Columna);

            if (!TitusTools.HayErrores())
            {
                if (cond.Tipo == Constante.TBooleano)
                {
                    if (cond.V != "" || cond.F != "")
                    {
                        cadena += cond.Codigo;
                        foreach (Simbolo sim in Ambito.TablaSimbolo)//cuerpo si es verdadero
                        {
                            cadena += sim.Generar3D();
                        }
                    }
                    else
                    {
                        cond.F  = TitusTools.GetEtq();
                        cadena += "\t\t" + "ifFalse " + cond.Valor + " == 1 goto " + cond.F + ";\n";

                        cadena += cond.Codigo;
                        foreach (Simbolo sim in Ambito.TablaSimbolo)//cuerpo si es verdadero
                        {
                            cadena += sim.Generar3D();
                        }
                    }

                    cadena += "\t" + cond.F + "://Termina caso " + Valor.Cadena + "\n";
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "La sentencia caso esperaba un tipo booleano no un tipo " + cond.Tipo, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                }
            }


            return(cadena);
        }
示例#5
0
        public FElegir(FNodoExpresion condicion, Ambito ambito, List <FCaso> casos, FCaso defecto)
        {
            this.Casos     = casos;
            this.Defecto   = defecto;
            this.Ambito    = ambito;
            this.Condicion = condicion;

            FNodoExpresion aux = null;

            foreach (FCaso caso in Casos)
            {
                if (aux != null)
                {
                    if (aux.Tipo != caso.Valor.Tipo)
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "Los valores de los casos de la sentencia elegir deben ser iguales", TitusTools.GetRuta(), caso.Valor.Fila, caso.Valor.Columna);
                    }
                }
                else
                {
                    aux = caso.Valor;
                }
            }
        }
示例#6
0
        public Nodo3D Generar3DSuperAsignacion(String temporal)
        {
            Nodo3D nodo = new Nodo3D();

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


            if (sim != null)
            {
                FDeclaracion decla = (FDeclaracion)sim.Valor;

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


                    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 encontro la variable " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna);
            }

            return(nodo);
        }
示例#7
0
        public Nodo3D Generar3DSuperAsignacion(String temporal)
        {
            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";


            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;
                        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.BuscarMetodo(this.Nombre, resueltas);

                if (sim != null)
                {
                    Encontrado = sim;
                    FMetodo m = (FMetodo)sim.Valor;
                    if (m.Parametros.Count == this.Parametros.Count)
                    {
                        String este = TitusTools.GetTemp();
                        cadena += "\t\t" + este + " = " + tempsimulacion + " + 0;//metiendo el this\n";

                        String here = TitusTools.GetTemp();
                        cadena += "\t\t" + here + " = " + temporal + " + " + (sim.este).ToString() + ";//calculo si hay herencia\n";//calculo de la herencia
                        cadena += "\t\t" + "Stack[" + este + "] = " + here + ";\n";
                        ////
                        cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al metodo\n";
                        cadena += "\t\t" + m.GetNombre3D() + "();\n";
                        cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//regresando al ambito actual\n";
                        if (!sim.Tipo.Equals(Constante.TVoid))
                        {
                            String retorno = TitusTools.GetTemp();
                            nodo.Valor = TitusTools.GetTemp();
                            cadena    += "\t\t" + retorno + " = " + tempsimulacion + " + 1;//Posicion del retorno\n";
                            cadena    += "\t\t" + nodo.Valor + " = Stack[" + retorno + "];//obteniendo el valor del retorno\n";
                            if (m.Dimensiones > 0)
                            {
                                nodo.Tipo = "arreglo " + m.Tipo;
                            }
                            else
                            {
                                nodo.Tipo = m.Tipo;
                            }
                        }
                        else
                        {
                            nodo.Tipo  = Constante.TVoid;
                            nodo.Valor = "";
                        }
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el metodo " + 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);
                }
            }

            nodo.Codigo = cadena;

            return(nodo);
        }
示例#8
0
        public void ImprimirDecimal()
        {
            Variable v = Tabla3D.BuscarVariable(Temporal);

            if (v != null)
            {
                if (v.Valor != null)
                {
                    FNodoExpresion valor = (FNodoExpresion)v.Valor;
                    if (valor.Tipo.Equals(Constante.TDecimal))
                    {
                        TitusTools.ImprimirConsola(valor.Decimal.ToString());
                        TitusTools.ImprimirConsola("\n");
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede imprimir un decimal porque el valor no es decimal del temporal " + Temporal, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "No se ha asignado ningun valor al temporal " + Temporal, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                }
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No existe el temporal " + Temporal, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
            }
        }
示例#9
0
        public void ImprimirCaracter()
        {
            Variable v = Tabla3D.BuscarVariable(Temporal);

            if (v != null)
            {
                if (v.Valor != null)
                {
                    FNodoExpresion valor = (FNodoExpresion)v.Valor;
                    if (valor.Tipo.Equals(Constante.TEntero))
                    {
                        if (valor.Entero >= 0)
                        {
                            char c = (char)valor.Entero;
                            TitusTools.ImprimirConsola(c.ToString());
                            if (valor.Entero == 0)
                            {
                                TitusTools.ImprimirConsola("\n");
                            }
                        }
                        else
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se pueden imprimir un caracter con un ascii negativo en el temporal " + Temporal, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                        }
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede imprimir un caracter porque el valor no es entero del temporal " + Temporal, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "No se ha asignado ningun valor al temporal " + Temporal, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                }
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No existe el temporal " + Temporal, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
            }
        }
示例#10
0
        public int EjecutarGoTo(Simbolo sim)
        {
            Boolean estado   = false;
            int     i        = -1;
            Simbolo anterior = sim.Anterior;

            while (anterior != null)
            {
                if (anterior.Rol.Equals(Constante.Etiqueta) && anterior.Nombre.Equals(sim.Nombre))
                {
                    estado = true;

                    break;
                }
                i--;
                anterior = anterior.Anterior;
            }


            if (!estado)
            {
                i = 1;
                Simbolo siguiente = sim.Siguiente;
                while (siguiente != null)
                {
                    if (siguiente.Rol.Equals(Constante.Etiqueta) && siguiente.Nombre.Equals(sim.Nombre))
                    {
                        estado = true;
                        break;
                    }
                    i++;
                    siguiente = siguiente.Siguiente;
                }
            }


            if (estado)
            {
                return(i);
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se econtro la etiqueta " + sim.Nombre, TitusTools.GetRuta(), sim.Fila, sim.Columna);
                return(0);
            }
        }
示例#11
0
        public String Generar3DInit(String tempH, int nueva_pos)
        {
            int    pos    = Padre.Posicion + nueva_pos;//sumamos la posicion donde se van a generar las variables en el Heap
            String cadena = "";

            if (Dimensiones.Count == 0)//no es arreglo
            {
                if (Valor != null)
                {
                    Nodo3D val = Valor.Generar3D();
                    switch (Tipo)
                    {
                    case Constante.TEntero:    //asginacion a una variable de tipo entero
                        switch (val.Tipo)
                        {
                        case Constante.TEntero:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TCaracter:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TBooleano:
                        {
                            cadena += val.Codigo;
                            if (val.V == "" && val.F == "")
                            {            //si trae etiquetas viene de una relacional si no es un bool nativo
                                String temp = TitusTools.GetTemp();

                                cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                                cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                            }
                            else
                            {
                                var auxtemp = TitusTools.GetTemp();
                                var salida  = TitusTools.GetEtq();

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

                                String temp = TitusTools.GetTemp();

                                cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                                cadena += "\t\t" + "Heap[" + temp + "] = " + auxtemp + ";\n";
                            }
                        }
                        break;

                        default:
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar un tipo " + val.Tipo + " a una variable tipo " + this.Tipo, TitusTools.GetRuta(), Fila, Columna);
                            break;
                        }
                        break;

                    case Constante.TDecimal:    //asginacion a una variable de tipo decimal
                        switch (val.Tipo)
                        {
                        case Constante.TEntero:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TCaracter:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TBooleano:
                        {
                            cadena += val.Codigo;
                            if (val.V == "" && val.F == "")
                            {            //si trae etiquetas viene de una relacional si no es un bool nativo
                                String temp = TitusTools.GetTemp();

                                cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                                cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                            }
                            else
                            {
                                var auxtemp = TitusTools.GetTemp();
                                var salida  = TitusTools.GetEtq();

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

                                String temp = TitusTools.GetTemp();

                                cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                                cadena += "\t\t" + "Heap[" + temp + "] = " + auxtemp + ";\n";
                            }
                        }
                        break;

                        case Constante.TDecimal:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        default:
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar un tipo " + val.Tipo + " a una variable tipo " + this.Tipo, TitusTools.GetRuta(), Fila, Columna);
                            break;
                        }
                        break;

                    case Constante.TCaracter:    //asginacion a una variable de tipo caracter
                        switch (val.Tipo)
                        {
                        case Constante.TEntero:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TCaracter:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        default:
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar un tipo " + val.Tipo + " a una variable tipo " + this.Tipo, TitusTools.GetRuta(), Fila, Columna);
                            break;
                        }
                        break;

                    case Constante.TCadena:    //asginacion a una variable de tipo cadena
                        switch (val.Tipo)
                        {
                        case Constante.TCaracter:
                        {
                            cadena += val.Codigo;
                            String tem = TitusTools.GetTemp();
                            cadena += "\t\t" + tem + " = H;\n";
                            cadena += "\t\t" + "Heap[H] = " + val.Valor + ";\n";
                            cadena += "\t\t" + "H = H + 1;\n";
                            cadena += "\t\t" + "Heap[H] = 0;\n";
                            cadena += "\t\t" + "H = H + 1;\n";

                            String temp = TitusTools.GetTemp();
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TCadena:
                        {
                            String temp = TitusTools.GetTemp();
                            cadena += val.Codigo;
                            cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                        }
                        break;

                        default:
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar un tipo " + val.Tipo + " a una variable tipo " + this.Tipo, TitusTools.GetRuta(), Fila, Columna);
                            break;
                        }
                        break;

                    case Constante.TBooleano:    //asginacion a una variable de tipo booleano
                        switch (val.Tipo)
                        {
                        case Constante.TBooleano:
                        {
                            cadena += val.Codigo;
                            if (val.V == "" && val.F == "")
                            {            //si trae etiquetas viene de una relacional si no es un bool nativo
                                String temp = TitusTools.GetTemp();

                                cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                                cadena += "\t\t" + "Heap[" + temp + "] = " + val.Valor + ";\n";
                            }
                            else
                            {
                                var auxtemp = TitusTools.GetTemp();
                                var salida  = TitusTools.GetEtq();

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

                                String temp = TitusTools.GetTemp();

                                cadena += "\t\t" + temp + " = " + tempH + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                                cadena += "\t\t" + "Heap[" + temp + "] = " + auxtemp + ";\n";
                            }
                        }
                        break;

                        default:
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar un tipo " + val.Tipo + " a una variable tipo " + this.Tipo, TitusTools.GetRuta(), Fila, Columna);
                            break;
                        }
                        break;

                    default:    //asginacion a una variable de tipo objeto
                        if (Tipo == val.Tipo)
                        {
                            cadena += val.Codigo;
                            String temp    = TitusTools.GetTemp();
                            String heap    = TitusTools.GetTemp();
                            String posheap = TitusTools.GetTemp();
                            cadena += "\t\t" + temp + " = P + 0;//Posicion del this\n";
                            cadena += "\t\t" + heap + " = Stack[" + temp + "];\n";
                            cadena += "\t\t" + posheap + " = " + heap + " + " + pos.ToString() + ";//Declaracion de la variable " + this.Nombre + "\n";
                            cadena += "\t\t" + "Heap[" + posheap + "] = " + val.Valor + ";\n";
                        }
                        else
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar un tipo " + val.Tipo + " a una variable tipo " + this.Tipo, TitusTools.GetRuta(), Fila, Columna);
                        }
                        break;
                    }
                }
            }
            else//es arreglo
            {
                String stack   = TitusTools.GetTemp();
                String posheap = TitusTools.GetTemp();
                String arr     = TitusTools.GetTemp();
                String cont    = TitusTools.GetTemp();
                cadena += "\t\t" + stack + " = P + 0;\n";
                cadena += "\t\t" + posheap + " = Stack[" + stack + "];\n";
                cadena += "\t\t" + arr + " = " + posheap + " + " + pos.ToString() + ";//Declaracion de arreglo " + this.Nombre + "\n";
                cadena += "\t\t" + "Heap[" + arr + "]" + " = H;\n";
                cadena += "\t\t" + cont + "= 1;\n";
                cadena += "\t\t" + "Heap[H] = " + Dimensiones.Count.ToString() + ";//Guardamos dimensiones\n";
                cadena += "\t\t" + "H = H + 1;\n";
                int i = 1;
                foreach (FNodoExpresion dimension in Dimensiones)
                {
                    Nodo3D size = dimension.Generar3D();

                    if (!TitusTools.HayErrores())
                    {
                        if (size.Tipo == Constante.TEntero)
                        {
                            cadena += size.Codigo;
                            cadena += "\t\t" + cont + " = " + cont + " * " + size.Valor + ";\n";
                            cadena += "\t\t" + "Heap[H] = " + size.Valor + ";//Guardamos el tamaño de la dimension " + i.ToString() + "\n";
                            cadena += "\t\t" + "H = H + 1;\n";
                        }
                        else
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede iniciar una dimension de un arreglo con un tipo de dato  " + size.Tipo + ", se esperaba un valor entero.", TitusTools.GetRuta(), Fila, Columna);
                        }
                    }
                    i++;
                }
                cadena += "\t\t" + "H = H + " + cont + ";//termina declaracion de arreglo\n";
                if (Valor != null)
                {
                    Nodo3D val = Valor.Generar3D();

                    if (!TitusTools.HayErrores())
                    {
                        if (val.Tipo == "arreglo " + this.Tipo)
                        {
                            cadena += val.Codigo;
                            String etqerror  = TitusTools.GetEtq();
                            String etqsalida = TitusTools.GetEtq();

                            String contador  = TitusTools.GetTemp();
                            String contador2 = TitusTools.GetTemp();
                            String val1      = TitusTools.GetTemp();
                            String val2      = TitusTools.GetTemp();
                            cadena += "\t\t" + contador + " = Heap[" + arr + "];\n";
                            cadena += "\t\t" + contador2 + " = " + val.Valor + ";\n";
                            cadena += "\t\t" + val1 + " = Heap[" + contador + "];//acceso a la declaracion del arreglo\n";
                            cadena += "\t\t" + val2 + " = Heap[" + contador2 + "];\n";
                            cadena += "\t\t" + "ifFalse " + val1 + " == " + val2 + " goto " + etqerror + ";\n";
                            String ciclo = TitusTools.GetTemp();
                            String tope  = TitusTools.GetTemp();
                            cadena += "\t\t" + ciclo + " = 0;\n";
                            cadena += "\t\t" + tope + " = " + val1 + ";\n";
                            String recursivo = TitusTools.GetEtq();
                            cadena += "\t" + recursivo + ":\n";
                            cadena += "\t\t" + "ifFalse " + ciclo + " < " + tope + " goto " + etqsalida + ";\n";
                            cadena += "\t\t" + val1 + " = Heap[" + contador + "];//acceso a tamanio dimension\n";
                            cadena += "\t\t" + val2 + " = Heap[" + contador2 + "];//acceso a tamanio dimension 2\n";
                            cadena += "\t\t" + contador + " = " + contador + " + 1;\n";
                            cadena += "\t\t" + contador2 + " = " + contador2 + " + 1;\n";
                            cadena += "\t\t" + ciclo + " = " + ciclo + " + 1;\n";
                            cadena += "\t\t" + "if " + val1 + " == " + val2 + " goto " + recursivo + ";\n";
                            cadena += "\t\t" + "goto " + etqerror + ";\n";
                            cadena += "\t\t" + "goto " + etqsalida + ";\n";
                            cadena += "\t" + etqerror + ":\n";
                            cadena += "\t\t" + "Error(2);\n";
                            cadena += "\t" + etqsalida + ":\n";

                            //validacio de dimensiones
                            cadena += "\t\t" + "Heap[" + arr + "]" + " = " + val.Valor + ";//Declaracion de arreglo global" + this.Nombre + "\n";
                        }
                        else
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar un " + val.Tipo + " a un arreglo de tipo " + this.Tipo, TitusTools.GetRuta(), Fila, Columna);
                        }
                    }
                }
            }

            return(cadena);
        }
示例#12
0
        public void EjecutarLlamadaMetodo(Simbolo sim)
        {
            FMetodo metodo = Tabla3D.BuscarMetodo(sim.Nombre);

            if (metodo != null)
            {
                metodo.Ejecutar();
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el metodo " + sim.Nombre, TitusTools.GetRuta(), sim.Fila, sim.Columna);
            }
        }
示例#13
0
        public void EjecutarError(Simbolo sim)
        {
            switch (sim.Nombre)
            {
            case "1":
                TitusTools.InsertarError(Constante.TErrorSemantico, "Acceso fuera de los limites", TitusTools.GetRuta(), sim.Fila, sim.Columna);
                break;

            case "2":
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede asignar el arreglo por que las dimensiones y sus tamaños no son iguales", TitusTools.GetRuta(), sim.Fila, sim.Columna);
                break;

            case "3":
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se puedo convertir de cadena a entero", TitusTools.GetRuta(), sim.Fila, sim.Columna);
                break;

            case "4":
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede convertir de cadena a decimal", TitusTools.GetRuta(), sim.Fila, sim.Columna);
                break;

            default:
                TitusTools.InsertarError(Constante.TErrorSemantico, "Error desconocido", TitusTools.GetRuta(), sim.Fila, sim.Columna);
                break;
            }
        }
示例#14
0
        public String Generar3DInit()
        {
            String temp = TitusTools.GetTemp();
            String init = "void init_" + this.Nombre + "(){\n";

            init += "\t\t" + temp + " = H;\n";
            int sizeherencia = Ambito.Tamaño;

            String init3 = "";

            foreach (Simbolo sim in Ambito.TablaSimbolo)
            {
                if (sim.Rol.Equals(Constante.DECLARACION))
                {
                    FDeclaracion decla = (FDeclaracion)sim.Valor;
                    init3 += decla.Generar3DInit(temp, 0);
                }
            }

            //buscamos los init de los hereda

            if (!Herencia.Equals(""))
            {
                String herencia = Herencia;
                while (herencia != "")
                {
                    Simbolo clase = Padre.BuscarClase(herencia, ArchivoPadre);
                    if (clase != null)
                    {
                        FClase nuevaclase = (FClase)clase.Valor;
                        foreach (Simbolo sim in nuevaclase.Ambito.TablaSimbolo)
                        {
                            if (sim.Rol.Equals(Constante.DECLARACION))
                            {
                                FDeclaracion decla = (FDeclaracion)sim.Valor;
                                init3 += decla.Generar3DInit(temp, sizeherencia);
                            }
                        }
                        sizeherencia += nuevaclase.Ambito.Tamaño;
                        herencia      = nuevaclase.Herencia;
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro la clase para heredar " + herencia, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                        break;
                    }
                }
            }

            String init2 = "\t\t" + "H = H + " + sizeherencia.ToString() + ";\n";

            init += init2 + init3;

            init += "}\n\n";
            return(init);
        }
示例#15
0
        private Simbolo BuscarVariableHerencia(String nombre)
        {
            Simbolo var = null;
            Simbolo sim = BuscarClasePadre();

            FClase clase = (FClase)sim.Valor;

            if (!clase.Herencia.Equals(""))
            {
                Simbolo bc = BuscarClase(clase.Herencia, clase.ArchivoPadre);
                if (bc != null)
                {
                    var = bc.BuscarVariable(nombre);
                    if (var != null)
                    {
                        if (var.Visibilidad.Equals(Constante.TPublico) || var.Visibilidad.Equals(Constante.TProtegido))
                        {
                            var.Posicion += sim.Tamaño;
                        }
                        else
                        {
                            var = null;
                        }
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro una clase para herederar con el nombre " + clase.Herencia, TitusTools.GetRuta(), sim.Fila, sim.Columna);
                }
            }

            return(var);
        }
        //para asignacion
        public Nodo3D Generar3DAsignacion()
        {
            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.Generar3DAsignacion();
            }
            else// es un metodo
            {
                FLlamadaMetodo metodo = new FLlamadaMetodo(this.Nombre, this.Parametros, Fila, Columna);
                metodo.setPadre(Padre);

                nodo = metodo.Generar3DAsignacion();

                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);
        }
示例#17
0
        public String Generar3D()
        {
            String cadena  = "\t\t//Comienza mientras\n";
            String retorno = TitusTools.GetEtq();

            Nodo3D cond = Condicion.Generar3D();

            if (!TitusTools.HayErrores())
            {
                if (cond.Tipo == Constante.TBooleano)
                {
                    cadena += "\t" + retorno + ":\n";
                    cadena += cond.Codigo;
                    if (cond.V == "" && cond.F == "")
                    {
                        cond.V = TitusTools.GetEtq();
                        cond.F = TitusTools.GetEtq();

                        cadena += "\t\t" + "if " + cond.Valor + " == 1 goto " + cond.V + ";\n";
                        cadena += "\t\t" + "goto " + cond.F + ";\n";
                    }
                    cadena += "\t" + cond.V + ":\n";

                    foreach (Simbolo sim in Ambito.TablaSimbolo)//cuerpo si es verdadero
                    {
                        cadena += sim.Generar3D();
                    }

                    cadena += "\t\t" + "goto " + retorno + ";\n";
                    cadena += "\t" + cond.F + "://Termina mientras\n";

                    cadena = cadena.Replace("§salir§;", "goto " + cond.F + ";\n");
                    cadena = cadena.Replace("§continuar§;", "goto " + cond.V + ";\n");
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "El ciclo while esperaba un tipo booleano no un tipo " + cond.Tipo, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
                }
            }

            return(cadena);
        }
示例#18
0
        public void AsignarP()
        {
            FNodoExpresion valor = this.Valor.ResolverExpresion();

            if (!TitusTools.HayErrores())
            {
                if (valor.Tipo.Equals(Constante.TEntero))
                {
                    Tabla3D.P = valor.Entero;
                    Console.WriteLine("P = " + valor.Cadena);
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "Se esperaba un valor numerico.", TitusTools.GetRuta(), this.Valor.Fila, this.Valor.Columna);
                }
            }
        }
示例#19
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);
        }
示例#20
0
        public void AsignarStack()
        {
            FNodoExpresion acceso = this.Acceso.ResolverExpresion();
            FNodoExpresion valor  = this.Valor.ResolverExpresion();

            if (!TitusTools.HayErrores())
            {
                if (acceso.Tipo.Equals(Constante.TEntero))
                {
                    Tabla3D.InsertarStack(acceso.Entero, valor);
                    Console.WriteLine(Acceso.Fila.ToString() + " Stack[" + acceso.Cadena + "] = " + valor.Cadena);
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "Se esperaba un valor entero para acceder al heap.", TitusTools.GetRuta(), this.Acceso.Fila, this.Acceso.Columna);
                }
            }
        }
示例#21
0
        public String Generar3D()
        {
            String cadena = "\t\t//Comienza si\n";

            Nodo3D cond = Condicion.Generar3D();

            if (cond.Tipo == Constante.TBooleano)
            {
                String salida = TitusTools.GetEtq();
                //Parte del if
                cadena += cond.Codigo;
                if (cond.V != "" && cond.F != "")
                {
                    cadena += "\t" + cond.V + ":\n";
                    foreach (Simbolo sim in Ambito.TablaSimbolo)//cuerpo si es verdadero
                    {
                        cadena += sim.Generar3D();
                    }
                }
                else
                {
                    cond.V = TitusTools.GetEtq();
                    cond.F = TitusTools.GetEtq();

                    cadena += "\t\t" + "if " + cond.Valor + " == 1 goto " + cond.V + ";\n";
                    cadena += "\t\t" + "goto " + cond.F + ";\n";
                    cadena += "\t" + cond.V + ":\n";
                    foreach (Simbolo sim in Ambito.TablaSimbolo)//cuerpo si es verdadero
                    {
                        cadena += sim.Generar3D();
                    }
                }
                cadena += "\t\t" + "goto " + salida + ";\n";
                cadena += "\t" + cond.F + ":\n";

                //parte de los sinosi
                foreach (FSinoSi sinosi in SinoSi)
                {
                    cadena += sinosi.Generar3D(salida);
                }

                if (Sino != null)
                {
                    cadena += Sino.Generar3D(salida);
                }
                cadena += "\t" + salida + "://Termina si\n";
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "La sentencia si esperaba un tipo booleano no un tipo " + cond.Tipo, TitusTools.GetRuta(), Padre.Fila, Padre.Columna);
            }

            return(cadena);
        }
示例#22
0
        public void AsignarTemporal()
        {
            Variable variable = Tabla3D.BuscarVariable(Temporal);

            if (variable != null)
            {
                FNodoExpresion valor = this.Valor.ResolverExpresion();
                if (!TitusTools.HayErrores())
                {
                    if (valor.Tipo.Equals(Constante.TEntero) || valor.Tipo.Equals(Constante.TDecimal))
                    {
                        variable.Valor = valor;
                        Console.WriteLine(variable.Nombre + " = " + valor.Cadena);
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "Se esperaba un valor numerico.", TitusTools.GetRuta(), this.Valor.Fila, this.Valor.Columna);
                    }
                }
            }
            else
            {
                TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontroo el temporal " + this.Temporal, TitusTools.GetRuta(), this.Valor.Fila, this.Valor.Columna);
            }
        }
示例#23
0
        private Nodo3D Relacional3D(Nodo3D izq, FNodoExpresion der, int Fila, int Columna)
        {
            var codigo3d = new Nodo3D();
            var auxder   = der.Generar3D();

            if (!TitusTools.HayErrores())
            {
                switch (izq.Tipo)
                {
                case Constante.TEntero:
                {
                    switch (auxder.Tipo)
                    {
                    case Constante.TEntero:
                    {
                        String cad = "";
                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "ifFalse " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TDecimal:
                    {
                        String cad = "";
                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "ifFalse " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TCaracter:
                    {
                        String cad = "";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "ifFalse " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    default:
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede " + izq.Tipo + " " + "==" + " " + auxder.Tipo, TitusTools.GetRuta(), Fila, Columna);
                        break;
                    }
                }
                break;

                case Constante.TDecimal:
                {
                    switch (auxder.Tipo)
                    {
                    case Constante.TEntero:
                    {
                        String cad = "";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "ifFalse " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TDecimal:
                    {
                        String cad = "";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TCaracter:
                    {
                        String cad = "";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    default:
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede " + izq.Tipo + " " + "==" + " " + auxder.Tipo, TitusTools.GetRuta(), Fila, Columna);
                        break;
                    }
                }
                break;

                case Constante.TCaracter:
                {
                    switch (auxder.Tipo)
                    {
                    case Constante.TEntero:
                    {
                        String cad = "";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TDecimal:
                    {
                        String cad = "";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TCaracter:
                    {
                        String cad = "";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + izq.Valor + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TCadena:
                    {
                        String cad = "";

                        String etqcad1 = TitusTools.GetEtq();
                        String etqcad2 = TitusTools.GetEtq();

                        String tempascii2 = TitusTools.GetTemp();
                        String tempcad2   = TitusTools.GetTemp();

                        cad += "\t\t" + tempascii2 + " = 0 ;\n";
                        cad += "\t" + etqcad1 + ":\n";
                        cad += "\t\t" + tempcad2 + " = Heap[" + auxder.Valor + "];\n";
                        cad += "\t\t" + "if " + tempcad2 + " == 0 goto " + etqcad2 + ";\n";
                        cad += "\t\t" + tempascii2 + " = " + tempascii2 + " + " + tempcad2 + ";\n";
                        cad += "\t\t" + auxder.Valor + " = " + auxder.Valor + " + 1;\n";
                        cad += "\t\t" + "goto " + etqcad1 + ";\n";
                        cad += "\t" + etqcad2 + ":\n";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + izq.Valor + " " + "==" + " " + tempascii2 + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    default:
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede " + izq.Tipo + " " + "==" + " " + auxder.Tipo, TitusTools.GetRuta(), Fila, Columna);
                        break;
                    }
                }
                break;

                case Constante.TCadena:
                {
                    switch (auxder.Tipo)
                    {
                    case Constante.TCaracter:
                    {
                        String cad = "";

                        String tempascii1 = TitusTools.GetTemp();
                        String tempcad1   = TitusTools.GetTemp();
                        String etqcad1    = TitusTools.GetEtq();
                        String etqcad2    = TitusTools.GetEtq();

                        cad += "\t\t" + tempascii1 + " = 0 ;\n";
                        cad += "\t" + etqcad1 + ":\n";
                        cad += "\t\t" + tempcad1 + " = Heap[" + izq.Valor + "];\n";
                        cad += "\t\t" + "if " + tempcad1 + " == 0 goto " + etqcad2 + ";\n";
                        cad += "\t\t" + tempascii1 + " = " + tempascii1 + " + " + tempcad1 + ";\n";
                        cad += "\t\t" + izq.Valor + " = " + izq.Valor + " + 1;\n";
                        cad += "\t\t" + "goto " + etqcad1 + ";\n";
                        cad += "\t" + etqcad2 + ":\n";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + tempascii1 + " " + "==" + " " + auxder.Valor + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    case Constante.TCadena:
                    {
                        String cad = "";

                        String tempascii1 = TitusTools.GetTemp();
                        String tempcad1   = TitusTools.GetTemp();
                        String etqcad1    = TitusTools.GetEtq();
                        String etqcad2    = TitusTools.GetEtq();

                        cad += "\t\t" + tempascii1 + " = 0 ;\n";
                        cad += "\t" + etqcad1 + ":\n";
                        cad += "\t\t" + tempcad1 + " = Heap[" + izq.Valor + "];\n";
                        cad += "\t\t" + "if " + tempcad1 + " == 0 goto " + etqcad2 + ";\n";
                        cad += "\t\t" + tempascii1 + " = " + tempascii1 + " + " + tempcad1 + ";\n";
                        cad += "\t\t" + izq.Valor + " = " + izq.Valor + " + 1;\n";
                        cad += "\t\t" + "goto " + etqcad1 + ";\n";
                        cad += "\t" + etqcad2 + ":\n";

                        String tempascii2 = TitusTools.GetTemp();
                        String tempcad2   = TitusTools.GetTemp();
                        etqcad1 = TitusTools.GetEtq();
                        etqcad2 = TitusTools.GetEtq();

                        cad += "\t\t" + tempascii2 + " = 0 ;\n";
                        cad += "\t" + etqcad1 + ":\n";
                        cad += "\t\t" + tempcad2 + " = Heap[" + auxder.Valor + "];\n";
                        cad += "\t\t" + "if " + tempcad2 + " == 0 goto " + etqcad2 + ";\n";
                        cad += "\t\t" + tempascii2 + " = " + tempascii2 + " + " + tempcad2 + ";\n";
                        cad += "\t\t" + auxder.Valor + " = " + auxder.Valor + " + 1;\n";
                        cad += "\t\t" + "goto " + etqcad1 + ";\n";
                        cad += "\t" + etqcad2 + ":\n";

                        codigo3d.F = TitusTools.GetEtq();

                        cad += "\t\t" + "if " + tempascii1 + " " + "==" + " " + tempascii2 + " goto " + codigo3d.F + ";\n";

                        codigo3d.Codigo = auxder.Codigo + cad;

                        codigo3d.Tipo = Constante.TBooleano;
                    }
                    break;

                    default:
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede " + izq.Tipo + " " + "==" + " " + auxder.Tipo, TitusTools.GetRuta(), Fila, Columna);
                        break;
                    }
                }
                break;
                }
            }
            return(codigo3d);
        }
示例#24
0
        public void PrimerPasada()
        {
            //Limpiamos las variables que utilizamos para la ejecucion
            Tabla3D.IniciarTabla();

            //buscamos el main y apartamos la primera posicion de la tabla de variables


            foreach (Simbolo sim in Codigo3D.TablaSimbolo)
            {
                if (sim.Rol.Equals(Constante.TMain))
                {
                    if (Tabla3D.Tabla.Count == 0)
                    {
                        Tabla3D.Tabla.Insert(0, new Variable(sim.Nombre, sim.Rol, sim.Fila, sim.Columna, sim.Ambito, sim.Valor));
                    }
                    else
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "Exite mas de un metodo main", TitusTools.GetRuta(), 1, 1);
                    }
                }
            }

            foreach (Simbolo sim in Codigo3D.TablaSimbolo)
            {
                if (!sim.Rol.Equals(Constante.TMain))
                {
                    Tabla3D.Tabla.Add(new Variable(sim.Nombre, sim.Rol, sim.Fila, sim.Columna, sim.Ambito, sim.Valor));
                }
            }

            if (!TitusTools.HayErrores())
            {
                if (Tabla3D.Tabla.Count > 0)
                {
                    if (!Tabla3D.Tabla[0].Rol.Equals(Constante.TMain))
                    {
                        TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro un metodo main", TitusTools.GetRuta(), 1, 1);
                    }
                    else
                    {
                        FMetodo main = (FMetodo)Tabla3D.Tabla[0].Valor;
                        main.Ejecutar();
                    }
                }
            }
        }
示例#25
0
        public String Generar3D()
        {
            String cadena = "\t//comienza asignacion\n";

            if (Tipo.Equals(Constante.LLAMADA_OBJETO))
            {
                Nodo3D izq = Nombre.Generar3DAsginacion();
                Nodo3D val = Valor.Generar3D();
                cadena += izq.Codigo;
                cadena += val.Codigo;
                if (!TitusTools.HayErrores())
                {
                    switch (izq.Tipo)
                    {
                    case Constante.TEntero:
                    {
                        switch (val.Tipo)
                        {
                        case Constante.TEntero:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TCaracter:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TBooleano:
                        {
                            if (val.V == "" && val.F == "")
                            {                //si trae etiquetas viene de una relacional si no es un bool nativo
                                cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                            }
                            else
                            {
                                var auxtemp = TitusTools.GetTemp();
                                var salida  = TitusTools.GetEtq();

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

                                cadena += "\t\t" + izq.Valor + " = " + auxtemp + ";\n";
                            }
                        }
                        break;

                        default:
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede  asignar un valor " + val.Tipo + " a una variable " + izq.Tipo, TitusTools.GetRuta(), this.Padre.Fila, this.Padre.Columna);
                        }
                        break;
                        }
                    }
                    break;

                    case Constante.TDecimal:
                    {
                        switch (val.Tipo)
                        {
                        case Constante.TEntero:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TDecimal:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TCaracter:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TBooleano:
                        {
                            if (val.V == "" && val.F == "")
                            {                //si trae etiquetas viene de una relacional si no es un bool nativo
                                cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                            }
                            else
                            {
                                var auxtemp = TitusTools.GetTemp();
                                var salida  = TitusTools.GetEtq();

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

                                cadena += "\t\t" + izq.Valor + " = " + auxtemp + ";\n";
                            }
                        }
                        break;

                        default:
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede  asignar un valor " + val.Tipo + " a una variable " + izq.Tipo, TitusTools.GetRuta(), this.Padre.Fila, this.Padre.Columna);
                        }
                        break;
                        }
                    }
                    break;

                    case Constante.TCaracter:
                    {
                        switch (val.Tipo)
                        {
                        case Constante.TEntero:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        case Constante.TCaracter:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        default:
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede  asignar un valor " + val.Tipo + " a una variable " + izq.Tipo, TitusTools.GetRuta(), this.Padre.Fila, this.Padre.Columna);
                        }
                        break;
                        }
                    }
                    break;

                    case Constante.TCadena:
                    {
                        switch (val.Tipo)
                        {
                        case Constante.TCadena:
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        break;

                        default:
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede  asignar un valor " + val.Tipo + " a una variable " + izq.Tipo, TitusTools.GetRuta(), this.Padre.Fila, this.Padre.Columna);
                        }
                        break;
                        }
                    }
                    break;

                    case Constante.TBooleano:
                    {
                        switch (val.Tipo)
                        {
                        case Constante.TBooleano:
                        {
                            if (val.V == "" && val.F == "")
                            {                //si trae etiquetas viene de una relacional si no es un bool nativo
                                cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                            }
                            else
                            {
                                var auxtemp = TitusTools.GetTemp();
                                var salida  = TitusTools.GetEtq();

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

                                cadena += "\t\t" + izq.Valor + " = " + auxtemp + ";\n";
                            }
                        }
                        break;

                        default:
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede  asignar un valor " + val.Tipo + " a una variable " + izq.Tipo, TitusTools.GetRuta(), this.Padre.Fila, this.Padre.Columna);
                        }
                        break;
                        }
                    }
                    break;

                    default:
                    {
                        if (izq.Tipo.Equals(val.Tipo))
                        {
                            cadena += "\t\t" + izq.Valor + " = " + val.Valor + ";\n";
                        }
                        else
                        {
                            TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede  asignar un valor " + val.Tipo + " a una variable " + izq.Tipo, TitusTools.GetRuta(), this.Padre.Fila, this.Padre.Columna);
                        }
                    }
                    break;
                    }
                }
            }
            else
            {
                if (this.Operacion.Tipo.Equals(Constante.LLAMADA_OBJETO))
                {
                    Nodo3D nodo = this.Operacion.LlamadaObjeto.Generar3DAsginacion();
                    if (nodo.Tipo.Equals(Constante.TEntero) || nodo.Tipo.Equals(Constante.TDecimal) || nodo.Tipo.Equals(Constante.TCaracter))
                    {
                        cadena += nodo.Codigo;
                        String temp     = TitusTools.GetTemp();
                        String tempcosa = TitusTools.GetTemp();
                        cadena += "\t\t" + temp + " = " + nodo.Valor + ";\n";
                        if (Tipo.Equals(Constante.TAumento))
                        {
                            cadena += "\t\t" + tempcosa + " = " + temp + " + 1;\n";
                        }
                        else
                        {
                            cadena += "\t\t" + tempcosa + " = " + temp + " - 1;\n";
                        }
                        cadena += "\t\t" + nodo.Valor + " = " + tempcosa + ";\n";
                    }
                }
                else
                {
                    TitusTools.InsertarError(Constante.TErrorSemantico, "Solo se puede hacer aumento o decremento a una variable", TitusTools.GetRuta(), this.Padre.Fila, this.Padre.Columna);
                }
            }
            cadena += "\t//termina asignacion\n";
            return(cadena);
        }
示例#26
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);
        }