コード例 #1
0
        private String GenerarMetodo()
        {
            String  cadena = "";
            FMetodo metodo = (FMetodo)Valor;

            cadena += metodo.Generar3D();
            return(cadena);
        }
コード例 #2
0
        private String GenerarConstructor()
        {
            String cadena = "";

            FMetodo constructor = (FMetodo)Valor;

            cadena += constructor.Generar3DConstructor();

            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 Simbolo BuscarMetodo(String nombre, List <Nodo3D> parametros)
        {
            Simbolo padreclase = BuscarClasePadre();

            Boolean encontrado = false;

            foreach (Simbolo sim in padreclase.Ambito.TablaSimbolo)
            {
                if ((sim.Rol.Equals(Constante.TMetodo) || sim.Rol.Equals(Constante.TFuncion)) && sim.Nombre.Equals(nombre))
                {
                    FMetodo metodo = (FMetodo)sim.Valor;
                    if (metodo.Parametros.Count == parametros.Count)
                    {
                        Boolean error = false;
                        for (int i = 0; i < metodo.Parametros.Count; i++)
                        {
                            FParametro p          = (FParametro)metodo.Parametros[i].Valor;
                            String     tipometodo = p.Tipo;

                            String tipoparametro = parametros[i].Tipo;
                            if (p.Dimensiones > 0)
                            {
                                tipometodo = "arreglo " + tipometodo;
                            }

                            if (!tipometodo.Equals(tipoparametro))
                            {
                                error = true;
                                break;
                            }
                        }
                        if (!error)
                        {
                            return(new Simbolo(sim));
                        }
                    }
                }
            }

            if (!encontrado)
            {
                Simbolo here = BuscarMetodoHerencia(nombre, parametros);

                if (here != null)
                {
                    Simbolo nuevo = new Simbolo(here);
                    nuevo.este += padreclase.Ambito.Tamaño;
                    here        = nuevo;
                }

                return(here);
            }
            return(null);
        }
コード例 #5
0
        public Simbolo BuscarConstructor(String nombreClase, List <Nodo3D> parametros)
        {
            Simbolo padreclase = BuscarClasePadre();

            FClase pc = (FClase)padreclase.Valor;

            Simbolo clase = BuscarClase(nombreClase, pc.ArchivoPadre);

            if (clase != null)
            {
                Boolean encontrado = false;
                foreach (Simbolo c in clase.Ambito.TablaSimbolo)
                {
                    if (c.Rol.Equals(Constante.TConstructor) && !encontrado)
                    {
                        FMetodo metodo = (FMetodo)c.Valor;
                        if (metodo.Parametros.Count == parametros.Count)
                        {
                            Boolean error = false;
                            for (int i = 0; i < metodo.Parametros.Count; i++)
                            {
                                FParametro p          = (FParametro)metodo.Parametros[i].Valor;
                                String     tipometodo = p.Tipo;

                                String tipoparametro = parametros[i].Tipo;
                                if (p.Dimensiones > 0)
                                {
                                    tipometodo = "arreglo " + tipometodo;
                                }

                                if (!tipometodo.Equals(tipoparametro))
                                {
                                    error = true;
                                    break;
                                }
                            }
                            if (!error)
                            {
                                return(c);
                            }
                        }
                    }
                }
                if (!encontrado)
                {
                    FMetodo m = new FMetodo(Constante.TPublico, Constante.TConstructor, 0, clase.Nombre, new List <Simbolo>(), new Ambito(clase.Nombre), clase.Fila, clase.Columna);
                    return(new Simbolo(m.Visibilidad, Constante.TConstructor, m.Nombre, Constante.TConstructor, m.Fila, m.Columna, m.Ambito, m));
                }
            }
            return(null);
        }
コード例 #6
0
ファイル: Ejecucion3D.cs プロジェクト: titus1993/C3DCombiner
        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();
                    }
                }
            }
        }
コード例 #7
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);
        }