Example #1
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);
            }
        }
Example #2
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);
            }
        }
Example #3
0
        public String Ejecutar()
        {
            FNodoExpresion aux = Condicion.ResolverExpresion();

            if (!TitusTools.HayErrores())
            {
                if (aux.Tipo.Equals(Constante.TBooleano))
                {
                    if (this.Tipo.Equals(Constante.TIf))
                    {
                        if (aux.Bool)
                        {
                            return(Etiqueta);
                        }
                    }
                    else
                    {
                        if (!aux.Bool)
                        {
                            return(Etiqueta);
                        }
                    }
                }
            }

            return("");
        }
Example #4
0
        static void Regla16(List <Simbolo> Mirilla)
        {
            foreach (Simbolo sim in Mirilla.ToList())
            {
                if (sim.Rol.Equals(Constante.ASIGNACION))
                {
                    FAsignacion3D asignacion = (FAsignacion3D)sim.Valor;

                    if (asignacion.Valor.Tipo.Equals(Constante.TPotenciaOCL))
                    {
                        FNodoExpresion izq = asignacion.Valor.Izquierda;
                        FNodoExpresion der = asignacion.Valor.Derecha;

                        if (der.Tipo.Equals(Constante.TEntero))
                        {
                            if (izq.Tipo == Constante.TP || izq.Tipo == Constante.Temporal || izq.Tipo == Constante.TH)
                            {
                                if (der.Entero == 2)
                                {
                                    asignacion.Valor = new FNodoExpresion(izq, izq, Constante.TPor, Constante.TPor, asignacion.Valor.Fila, asignacion.Valor.Columna, null);
                                    TitusTools.InsertarReporteOptimizacion("Regla 16", asignacion.Temporal + " = " + izq.Nombre + " ^ 2;", sim.Fila, sim.Columna);
                                    //Mirilla.Remove(sim);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #5
0
        static void Regla19(List <Simbolo> Mirilla)
        {
            foreach (Simbolo sim in Mirilla.ToList())
            {
                if (sim.Rol.Equals(Constante.ASIGNACION))
                {
                    FAsignacion3D asignacion = (FAsignacion3D)sim.Valor;

                    if (asignacion.Valor.Tipo.Equals(Constante.TDivision))
                    {
                        FNodoExpresion izq = asignacion.Valor.Izquierda;
                        FNodoExpresion der = asignacion.Valor.Derecha;

                        if (izq.Tipo.Equals(Constante.TEntero))
                        {
                            if (der.Tipo == Constante.TP || der.Tipo == Constante.Temporal || der.Tipo == Constante.TH)
                            {
                                if (izq.Entero == 0)
                                {
                                    asignacion.Valor = izq;
                                    TitusTools.InsertarReporteOptimizacion("Regla 19", asignacion.Temporal + " = 0 / " + der.Nombre + ";", sim.Fila, sim.Columna);
                                    //Mirilla.Remove(sim);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #6
0
        static void Regla11(List <Simbolo> Mirilla)
        {
            foreach (Simbolo sim in Mirilla.ToList())
            {
                if (sim.Rol.Equals(Constante.ASIGNACION))
                {
                    FAsignacion3D asignacion = (FAsignacion3D)sim.Valor;
                    if (asignacion.Tipo.Equals(Constante.Temporal))
                    {
                        if (asignacion.Valor.Tipo.Equals(Constante.TDivision))
                        {
                            FNodoExpresion izq = asignacion.Valor.Izquierda;
                            FNodoExpresion der = asignacion.Valor.Derecha;

                            if (izq != null)
                            {
                                if (izq.Tipo.Equals(Constante.TEntero) || der.Tipo.Equals(Constante.TEntero))
                                {
                                    if (izq.Tipo == Constante.Temporal && asignacion.Temporal.Equals(izq.Nombre))
                                    {
                                        if (der.Entero == 1)
                                        {
                                            TitusTools.InsertarReporteOptimizacion("Regla 11", asignacion.Temporal + " = " + izq.Nombre + " / 1;", sim.Fila, sim.Columna);
                                            Mirilla.Remove(sim);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Example #7
0
 public FX(FNodoExpresion Condicion1, FNodoExpresion Condicion2, Ambito Ambito)
 {
     this.Condicion1 = Condicion1;
     this.Condicion2 = Condicion2;
     this.Ambito     = Ambito;
     this.Padre      = null;
 }
Example #8
0
 public FPara(Simbolo AccionAnterior, FNodoExpresion Condicion, Simbolo AccionSiguiente, Ambito Ambito)
 {
     this.AccionAnterior  = AccionAnterior;
     this.Condicion       = Condicion;
     this.AccionSiguiente = AccionSiguiente;
     this.Ambito          = Ambito;
     this.Padre           = null;
 }
Example #9
0
 public FSi(FNodoExpresion condicion, Ambito ambito, List <FSinoSi> sinosi, FSino sino)
 {
     this.Condicion = condicion;
     this.Ambito    = ambito;
     this.SinoSi    = sinosi;
     this.Sino      = sino;
     this.Padre     = null;
 }
Example #10
0
 public FDeclaracion(String visibilidad, String tipo, String nombre, List <FNodoExpresion> dimensiones, Ambito ambito, int fila, int columna, Object valor)
 {
     this.Visibilidad = visibilidad;
     this.Tipo        = tipo;
     this.Nombre      = nombre;
     this.Dimensiones = dimensiones;
     this.Ambito      = ambito;
     this.Padre       = null;
     this.Fila        = fila;
     this.Columna     = columna;
     this.Valor       = (FNodoExpresion)valor;
 }
Example #11
0
        public FAsignacion3D(String tipo, FNodoExpresion acceso, FNodoExpresion valor, String tempo)
        {
            this.Tipo     = tipo;
            this.Acceso   = acceso;
            this.Valor    = valor;
            this.Temporal = tempo;

            if (Tipo.Equals(Constante.TH) || Tipo.Equals(Constante.TP))
            {
                this.Temporal = tipo;
            }
        }
Example #12
0
 public FAsignacion(String tipo, Ambito ambito, FNodoExpresion valor, Object nombre)
 {
     this.Tipo   = tipo;
     this.Ambito = ambito;
     this.Valor  = valor;
     if (this.Tipo.Equals(Constante.TAumento) || this.Tipo.Equals(Constante.TDecremento))
     {
         this.Operacion = (FNodoExpresion)nombre;
     }
     else
     {
         this.Nombre = (FLlamadaObjeto)nombre;
     }
     this.Padre = null;
 }
Example #13
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);
                }
            }
        }
Example #14
0
        public static void InsertarStack(int pos, FNodoExpresion valor)
        {
            if (Stack.Count - 1 >= pos)
            {
                Stack.RemoveAt(pos);
                Stack.Insert(pos, valor);
            }
            else
            {
                int aumento = pos - Stack.Count;

                for (int i = 0; i < aumento; i++)
                {
                    Stack.Add(null);
                }
                Stack.Insert(pos, valor);
            }
        }
Example #15
0
        public static void InsertarHeap(int pos, FNodoExpresion valor)
        {
            if (Heap.Count - 1 >= pos)
            {
                Heap.RemoveAt(pos);
                Heap.Insert(pos, valor);
            }
            else
            {
                int aumento = pos - Heap.Count;

                for (int i = 0; i < aumento; i++)
                {
                    Heap.Add(null);
                }
                Heap.Insert(pos, valor);
            }
        }
Example #16
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);
                }
            }
        }
Example #17
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);
            }
        }
Example #18
0
        public String Generar3D()
        {
            String cadena  = "\t\t//Comienza ciclo X\n";
            String retorno = TitusTools.GetEtq();


            FNodoExpresion or  = new FNodoExpresion(Condicion1, Condicion2, Constante.TOr, Constante.TOr, Condicion1.Fila, Condicion1.Columna, null);
            FNodoExpresion and = new FNodoExpresion(Condicion1, Condicion2, Constante.TAnd, Constante.TAnd, Condicion1.Fila, Condicion1.Columna, null);

            Nodo3D cond1 = or.Generar3D();
            Nodo3D cond2 = and.Generar3D();

            if (!TitusTools.HayErrores())
            {
                cadena += cond1.Codigo;
                cadena += "\t" + retorno + ":\n";
                cadena += cond2.Codigo;
                cadena += "\t" + cond1.V + ":\n";
                cadena += "\t" + cond2.V + ":\n";

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

                cadena += "\t\t" + "goto " + retorno + ";\n";
                cadena += "\t" + cond1.F + ":\n";
                cadena += "\t" + cond2.F + ":\n";
            }

            cadena += "\t\t//Termina ciclo X\n";

            cadena = cadena.Replace("§salir§;", "goto " + cond1.F + ";\n");
            cadena = cadena.Replace("§continuar§;", "goto " + retorno + ";\n");

            return(cadena);
        }
Example #19
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;
                }
            }
        }
        public static Object RecorrerArbol(ParseTreeNode Nodo)
        {
            switch (Nodo.Term.Name)
            {
            case Constante.INICIO:
            {
                //LISTA_CLASE;
                List <Simbolo> clases = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[0]);
                Ambito         ambito = new Ambito(Constante.ARCHIVO, clases);


                Ejecucion3D ArchivoEjecucion = new Ejecucion3D(ambito);
                return(ArchivoEjecucion);
            }

            case Constante.LISTA_SENTENCIAS:
            {
                List <Simbolo> tabla = new List <Simbolo>();
                if (Nodo.ChildNodes.Count > 0)
                {
                    tabla = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[0]);
                }
                return(tabla);
            }

            case Constante.LISTA_SENTENCIA:
            {
                List <Simbolo> tabla = new List <Simbolo>();
                foreach (ParseTreeNode nodo in Nodo.ChildNodes)
                {
                    foreach (Simbolo sim in (List <Simbolo>)RecorrerArbol(nodo))
                    {
                        tabla.Add(sim);
                    }
                }
                return(tabla);
            }

            case Constante.SENTENCIA:
            {
                List <Simbolo> lista = new List <Simbolo>();
                if (Nodo.ChildNodes.Count == 2)
                {
                    List <Simbolo> cuerpo = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[1]);
                    FMetodo        metodo = new FMetodo(Constante.TPublico, Constante.TMain, Constante.TMain, new List <Simbolo>(), new Ambito(Constante.TMain, cuerpo), Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1);
                    Simbolo        s      = new Simbolo(metodo.Visibilidad, metodo.Tipo, metodo.Nombre, Constante.TMain, metodo.Fila, metodo.Columna, metodo.Ambito, metodo);

                    Simbolo anterior = null;

                    foreach (Simbolo sim in metodo.Ambito.TablaSimbolo)
                    {
                        sim.Anterior = anterior;
                        if (anterior != null)
                        {
                            anterior.Siguiente = sim;
                            sim.Anterior       = anterior;
                        }

                        anterior = sim;
                    }

                    lista.Add(s);
                }
                else
                {
                    List <Simbolo> cuerpo = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[2]);
                    FMetodo        metodo = new FMetodo(Constante.TPublico, Constante.TVoid, Nodo.ChildNodes[1].Token.ValueString, new List <Simbolo>(), new Ambito(Constante.TMain, cuerpo), Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1);
                    Simbolo        s      = new Simbolo(metodo.Visibilidad, metodo.Tipo, metodo.Nombre, Constante.TMetodo, metodo.Fila, metodo.Columna, metodo.Ambito, metodo);

                    Simbolo anterior = null;

                    foreach (Simbolo sim in metodo.Ambito.TablaSimbolo)
                    {
                        sim.Anterior = anterior;
                        if (anterior != null)
                        {
                            anterior.Siguiente = sim;
                            sim.Anterior       = anterior;
                        }

                        anterior = sim;
                    }

                    lista.Add(s);
                }
                return(lista);
            }

            case Constante.LISTA_INSTRUCCIONES:
            {
                List <Simbolo> tabla = new List <Simbolo>();
                if (Nodo.ChildNodes.Count > 0)
                {
                    tabla = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[0]);
                }
                return(tabla);
            }

            case Constante.LISTA_INSTRUCCION:
            {
                List <Simbolo> tabla = new List <Simbolo>();
                foreach (ParseTreeNode nodo in Nodo.ChildNodes)
                {
                    Simbolo sim = (Simbolo)RecorrerArbol(nodo);

                    tabla.Add(sim);
                }
                return(tabla);
            }

            case Constante.INSTRUCCION:
            {
                if (Nodo.ChildNodes.Count == 1)
                {
                    switch (Nodo.ChildNodes[0].Term.Name)
                    {
                    case Constante.Etiqueta:
                        return(new Simbolo(Constante.TPublico, Constante.Etiqueta, Nodo.ChildNodes[0].Token.ValueString, Constante.Etiqueta, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.Etiqueta), null));

                    case Constante.Id:
                        return(new Simbolo(Constante.TPublico, Constante.LLAMADA_METODO, Nodo.ChildNodes[0].Token.ValueString, Constante.LLAMADA_METODO, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.LLAMADA_METODO), null));

                    default:
                        return(RecorrerArbol(Nodo.ChildNodes[0]));
                    }
                }
                else if (Nodo.ChildNodes.Count == 2)
                {
                    if (Nodo.ChildNodes[0].Token.ValueString.Equals(Constante.TGoto))
                    {
                        return(new Simbolo(Constante.TPublico, Constante.TGoto, Nodo.ChildNodes[1].Token.ValueString, Constante.TGoto, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TGoto), null));
                    }
                    else
                    {
                        return(new Simbolo(Constante.TPublico, Constante.TError, Nodo.ChildNodes[1].Token.ValueString, Constante.TError, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TError), null));
                    }
                }
                else if (Nodo.ChildNodes.Count == 3)
                {
                    String  tipo  = (String)RecorrerArbol(Nodo.ChildNodes[1]);
                    String  temp  = Nodo.ChildNodes[2].Token.ValueString;
                    FPrint  print = new FPrint(tipo, temp);
                    Simbolo sim   = new Simbolo(Constante.TPublico, Constante.TPrint, Constante.TPrint, Constante.TPrint, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TPrint), print);
                    print.Padre = sim;
                    return(sim);
                }
                else
                {
                    String Tipo = Constante.TIf;
                    if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.TIfFalse))
                    {
                        Tipo = Constante.TIfFalse;
                    }
                    FNodoExpresion cond = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]);
                    String         etq  = Nodo.ChildNodes[3].Token.ValueString;

                    FIf     si  = new FIf(Tipo, cond, etq);
                    Simbolo sim = new Simbolo(Constante.TPublico, Constante.TIf, Constante.TIf, Constante.TIf, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TIf), si);
                    si.Padre = sim;
                    return(sim);
                }
            }

            case Constante.ASIGNACION:
                if (Nodo.ChildNodes.Count == 2)
                {
                    if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.Temporal))
                    {
                        FNodoExpresion val = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]);
                        FAsignacion3D  asi = new FAsignacion3D(Constante.Temporal, null, val, Nodo.ChildNodes[0].Token.ValueString);
                        Simbolo        sim = new Simbolo(Constante.TPublico, Constante.ASIGNACION, Constante.ASIGNACION, Constante.ASIGNACION, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.ASIGNACION), asi);

                        return(sim);
                    }
                    else
                    {
                        FNodoExpresion val = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]);
                        FAsignacion3D  asi = new FAsignacion3D(Nodo.ChildNodes[0].Term.Name, null, val, "");
                        Simbolo        sim = new Simbolo(Constante.TPublico, Constante.ASIGNACION, Constante.ASIGNACION, Constante.ASIGNACION, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.ASIGNACION), asi);

                        return(sim);
                    }
                }
                else
                {
                    FNodoExpresion acceos = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]);
                    FNodoExpresion val    = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[2]);
                    FAsignacion3D  asi    = new FAsignacion3D(Nodo.ChildNodes[0].Token.ValueString, acceos, val, "");
                    Simbolo        sim    = new Simbolo(Constante.TPublico, Constante.ASIGNACION, Constante.ASIGNACION, Constante.ASIGNACION, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.ASIGNACION), asi);

                    return(sim);
                }

            case Constante.TPrint:
                return(Nodo.ChildNodes[0].Term.Name);


            case Constante.RELACIONAL:
            {
                FNodoExpresion izq = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[0]);
                FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[2]);
                return(new FNodoExpresion(izq, der, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.Location.Line + 1, Nodo.ChildNodes[1].Token.Location.Column + 1, null));
            }

            case Constante.ARITMETICA:

                if (Nodo.ChildNodes.Count == 3)
                {
                    FNodoExpresion izq = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[0]);
                    FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[2]);
                    return(new FNodoExpresion(izq, der, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.Location.Line + 1, Nodo.ChildNodes[1].Token.Location.Column + 1, null));
                }
                else
                {
                    if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.TMenos))
                    {
                        FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]);
                        return(new FNodoExpresion(null, der, Nodo.ChildNodes[0].Token.ValueString, Nodo.ChildNodes[0].Token.ValueString, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, null));
                    }
                    else if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.THeap))
                    {
                        FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]);
                        return(new FNodoExpresion(null, der, Constante.THeap, Constante.THeap, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, null));
                    }
                    else
                    {
                        FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]);
                        return(new FNodoExpresion(null, der, Constante.TStack, Constante.TStack, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, null));
                    }
                }

            case Constante.EXP:
            {
                return(RecorrerArbol(Nodo.ChildNodes[0]));
            }

            case Constante.Entero:
                return(new FNodoExpresion(null, null, Constante.TEntero, Constante.TEntero, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString));

            case Constante.Decimal:
                return(new FNodoExpresion(null, null, Constante.TDecimal, Constante.TDecimal, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString));

            case Constante.TH:
                return(new FNodoExpresion(null, null, Constante.TH, Constante.TH, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString));

            case Constante.TP:
                return(new FNodoExpresion(null, null, Constante.TP, Constante.TP, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString));

            case Constante.Temporal:
                return(new FNodoExpresion(null, null, Constante.Temporal, Nodo.Token.ValueString, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString));
            }
            return(null);
        }
Example #21
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);
        }
Example #22
0
 public FCaso(FNodoExpresion valor, Ambito ambito)
 {
     this.Valor  = valor;
     this.Ambito = ambito;
 }
Example #23
0
 public FMientras(FNodoExpresion Condicion, Ambito Ambito)
 {
     this.Condicion = Condicion;
     this.Ambito    = Ambito;
     this.Padre     = null;
 }
Example #24
0
 public FSinoSi(FNodoExpresion Condicion, Ambito Ambito)
 {
     this.Condicion = Condicion;
     this.Ambito    = Ambito;
     this.Padre     = null;
 }
Example #25
0
 public FIf(String tipo, FNodoExpresion condicion, String etiqueta)
 {
     this.Tipo      = tipo;
     this.Condicion = condicion;
     this.Etiqueta  = etiqueta;
 }
Example #26
0
 public FImprimir(FNodoExpresion Valor)
 {
     this.Valor = Valor;
 }