コード例 #1
0
        public void Optimizar()
        {
            if (GuardarArchivo())
            {
                if (this.Tipo == 2)
                {
                    TitusTools.Limpiar();
                    ParseTree arbol = parser.Parse(TBContenido.Text);

                    if (arbol.Root != null && arbol.ParserMessages.Count == 0)
                    {
                        //revisamos si es tipo .ddd
                        if (this.Tipo == 2)
                        {
                            TitusTools.Rutas.Add(this.Ruta);
                            Ejecucion3D Ejecucion = (Ejecucion3D)GenerarTablaSimbolo3D.RecorrerArbol(arbol.Root);

                            if (Ejecucion != null)
                            {
                                Ejecucion.Optimizar();
                            }
                            TitusTools.Rutas.RemoveAt(TitusTools.Rutas.Count - 1);
                            //ejecucion del primer archivo en la lista
                            if (TitusTools.Archivos_Importados.Count > 0 && !TitusTools.HayErrores())
                            {
                                TitusTools.Archivos_Importados[0].EjecutarConMain();
                            }
                            if (TitusTools.HayErrores())
                            {
                                MessageBox.Show("Se encontraron errores", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            else
                            {
                                MessageBox.Show("Generacion de codigo 3D finalizada con exito.", "Codigo 3D", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                        }
                    }
                    else
                    {
                        foreach (Irony.LogMessage error in arbol.ParserMessages)
                        {
                            if (error.Message.Contains("Syntax error,"))
                            {
                                TitusTools.InsertarError("Sintactico", error.Message.Replace("Syntax error", " "), this.Ruta, (error.Location.Line + 1), (error.Location.Column + 1));
                            }
                            else if (error.Message.Contains("Invalid character"))
                            {
                                TitusTools.InsertarError("Lexico", error.Message.Replace("Invalid character", "Caracter invalido"), Ruta, (error.Location.Line + 1), (error.Location.Column + 1));
                            }
                            else
                            {
                                TitusTools.InsertarError("Sintactico", error.Message.Replace("Unclosed cooment block", "Comentario de bloque sin cerrar"), Ruta, (error.Location.Line + 1), (error.Location.Column + 1));
                            }
                        }
                        MessageBox.Show("Se encontraron errores", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show("Solo de pueden optimizar archivos .ddd", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
コード例 #2
0
        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);
        }