コード例 #1
0
        public void Ejecutar()
        {
            reiniciarEjecucion();
            definirContextoGlobal();

            Contexto local = new Contexto();

            foreach (ParseTreeNode declaracion in variables)
            {
                Declaracion decla = new Declaracion(declaracion);
                decla.ejecutar(local, Constantes.GLOBAL);
            }
            Console.WriteLine("contexto global creado");
            if (Principal == null)
            {
                ListaErrores.getInstance().nuevoErrorGeneral("El metodo principal no ha sido definido", archivo);
                return;
            }
            Cuerpo _principal = new Cuerpo(Principal.ChildNodes[0], false);

            _principal.ejecutar(local, Constantes.GLOBAL + 1);
            Console.WriteLine("Ejecucion Exitosa");
            Console.WriteLine("Salida");
            Interprete.getContextoGlobal().reporte();
            local.reporte();
            Console.WriteLine(Interprete.Salida);
        }
コード例 #2
0
        /*
         * Metodo de la implementacion
         * @ts tabla de simbolos global
         * @user usuario que ejecuta la accion
         * @baseD base de datos donde estamos ejecutando todo
         * @mensajes linkedlist con la salida deseada
         */
        public object ejecutar(TablaDeSimbolos ts, Ambito ambito, TablaDeSimbolos tsT)
        {
            Mensaje         ms        = new Mensaje();
            TablaDeSimbolos newAmbito = new TablaDeSimbolos();

            foreach (Simbolo s in ambito.tablaPadre)
            {
                newAmbito.AddLast(s);
            }

            if (tamanioTotalParametros() == valores.Count())
            {
                int index = 0;
                //-------------------------------------------- CREACION Y ASIGNACION DE PARAMETROS --------------------------------------------------------------
                for (int i = 0; i < parametros.Count(); i++)
                {
                    LinkedList <InstruccionCQL> parametro = parametros.ElementAt(i).lista;

                    for (int j = 0; j < parametro.Count(); j++)
                    {
                        Declaracion d = (Declaracion)parametro.ElementAt(j);
                        d.parametro = true;
                        object rd = d.ejecutar(newAmbito, ambito, tsT);
                        if (rd == null)
                        {
                            return(null);
                        }
                        Asignacion a = new Asignacion(d.id, l, c, valores.ElementAt(index), "ASIGNACION");
                        a.tPadre = ts;
                        object ra = a.ejecutar(newAmbito, ambito, tsT);
                        if (ra == null)
                        {
                            return(null);
                        }
                        index++;
                    }
                }
                //--------------------------------------------------- INSTRUCCIONES DEL PROCEDURE ----------------------------------------------
                foreach (InstruccionCQL ins in cuerpo)
                {
                    object r = ins.ejecutar(newAmbito, ambito, tsT);
                    if (r == null)
                    {
                        return(null);
                    }
                    else if (r.GetType() == typeof(Retorno))
                    {
                        object re = ((Retorno)r).valor;
                        if (re != null)
                        {
                            LinkedList <object> temp;
                            if (re.GetType() == typeof(LinkedList <object>))
                            {
                                temp = (LinkedList <object>)re;
                            }
                            else
                            {
                                temp = new LinkedList <object>();
                                temp.AddLast(re);
                            }
                            string idGenerado = idOut(temp);
                            if (idGenerado == null)
                            {
                                return(null);
                            }
                            if (idGenerado.Equals(identificadorRetornos))
                            {
                                return(temp);
                            }
                            else
                            {
                                ambito.listadoExcepciones.AddLast(new Excepcion("numberreturnsexception", "La cantidad de valores retornados no concuerda con el valor de parametros se esperaba: " + identificadorRetornos + " se obtuvo " + idGenerado));
                                ambito.mensajes.AddLast(ms.error("La cantidad de valores retornados no concuerda con el valor de parametros se esperaba: " + identificadorRetornos + " se obtuvo " + idGenerado, l, c, "Semantico"));
                                return(null);
                            }
                        }
                        return(null);
                    }
                }
                if (identificadorRetornos.Equals(""))
                {
                    return("");
                }
                else
                {
                    ambito.listadoExcepciones.AddLast(new Excepcion("numberreturnsexception", "Se necesita retornar valores de tipo: " + identificadorRetornos));
                    ambito.mensajes.AddLast(ms.error("Se necesita retornar valores de tipo: " + identificadorRetornos, l, c, "Semantico"));
                    return(null);
                }
            }
            else
            {
                ambito.mensajes.AddLast(ms.error("La cantidad de valores no concuerda con la cantidad de parametros", l, c, "Semantico"));
            }

            return(null);
        }
コード例 #3
0
        public override Expresion getValor(Entorno ent)
        {
            //ent en este caso es el main
            LinkedList <Expresion> resueltos = new LinkedList <Expresion>();

            MasterClass.PilaMF.AddFirst(MasterClass.TipoMF.Metodo_Funcion);

            //Creamos un nuevo entorno para ejecutar el metodo
            Entorno nuevo = new Entorno(ent); //El global es el del objeto


            //creamos un literal para poder regresar
            Expresion retorno = null;

            //Modificamos el nombre
            String aux = "";
            String a2  = this.id;
            String a3  = a2.Substring(0, 1);

            if (!a3.Equals("#"))
            {
                aux = "#";
            }



            String nombreFuncion2 = this.id + aux;

            //ahora ejecutamos las expresiones -> parametros enviados si esque tiene
            if (this.enviados != null)
            {
                //recorremos los parametros enviados
                //Aqui se le puede enviar un id -> debemos ir a buscarlo
                foreach (Expresion parametro in this.enviados)
                {
                    var parametroType    = parametro.GetType();
                    var listaAccesosType = new Lista_Accesos().GetType();

                    if (typeof(Lista_Accesos).IsInstanceOfType(parametro))
                    {
                        Lista_Accesos a         = (Lista_Accesos)parametro;
                        Expresion     retAcceso = a.getValor(nuevo);

                        nombreFuncion2 += retAcceso.tipo.tipo.ToString();
                        resueltos.AddLast(retAcceso);

                        /*
                         * foreach (Id id in a.accesos)
                         * {
                         *  Variable sim = id.getSimbolo(nuevo);
                         *  Primitivo l = new Primitivo(sim.tipo, sim.valor);
                         *  nombreFuncion2 += l.tipo.tipo.ToString();
                         *  resueltos.AddLast(l);
                         * }
                         */
                    }
                    else
                    {
                        nombreFuncion2 += parametro.getValor(nuevo).tipo.tipo.ToString();
                        resueltos.AddLast(parametro.getValor(nuevo));
                    }
                }
            }

            //adjuntar el último valor modificado para el método

            /*
             * if (!aux.Equals("", StringComparison.InvariantCultureIgnoreCase))
             * {
             *
             *  Id id = acceso.accesos.Last.Value;
             *  acceso.accesos.RemoveLast();
             *  acceso.accesos.AddLast(new Id(nombreFuncion2, id.linea, id.columna));
             *
             * }
             */


            nuevo.global = ent.global;


            Variable f;

            //luego buscamos la funcion
            f = nuevo.buscar(nombreFuncion2, linea, columna, "La Funcion");
            //si lo encontro
            if (f != null)
            {
                //aqui pedimos el tipo
                //creamos una variable (exit)
                LinkedList <String> lista = new LinkedList <String>();
                lista.AddLast(id);
                Declaracion nombreFuncionDec = new Declaracion(f.tipo, lista, 0, 0);
                nombreFuncionDec.ejecutar(nuevo);

                //creamos un iterador
                int iterador = 0;
                //si tiene parametros y tambien tiene parametros enviados
                //transformamos el simbolo encontrado a un simbolo nuevo de tipo metodo_Funcion para obtener la lista de parametros

                if (enviados != null && ((Tipo_MF)f.valor).getparametros() != null)
                {
                    //resolvemos los parametros enviados para tener el valor
                    foreach (Expresion enviado in enviados)
                    {
                        resueltos.AddLast(enviado.getValor(ent));
                    }

                    int cont = 0;

                    //Ejecutamos la lista de declaraciones para crear las variables
                    //y le asignamos el valor del enviado correspondiente para que sea asignado de una vez
                    foreach (Instruccion declaracion in ((Tipo_MF)f.valor).getparametros())
                    {
                        //((Declaracion)declaracion).valor = resueltos.ElementAt(iterador);

                        Tipo tipe = new Tipo(((Declaracion)declaracion).tipo.tipo);

                        foreach (String identify in ((Declaracion)declaracion).IDS)
                        {//Identificador a,b:integer m:integer
                            if (((Declaracion)declaracion).PorReferencia)
                            {
                                if (typeof(Lista_Accesos).IsInstanceOfType(this.enviados.ElementAt(cont)))
                                {
                                    Lista_Accesos accesopos = (Lista_Accesos)this.enviados.ElementAt(cont);

                                    Entorno  temporal = nuevo;
                                    Variable sim      = null;

                                    for (var temp = accesopos.accesos.First; temp != null; temp = temp.Next)
                                    {
                                        sim = temporal.buscar(temp.Value.id, linea, columna, "La variable");

                                        if (sim != null)
                                        {
                                            if (temp.Next != null)
                                            {
                                                //esperamos un objeto
                                            }
                                        }
                                        else
                                        {
                                            //error no se encontro la variable
                                            return(null);
                                        }
                                    }

                                    if (tipe.tipo == sim.tipo.tipo && sim.tipo.referencia == tipe.referencia)
                                    {
                                        nuevo.insertar(identify, sim, linea, columna, "La variable");
                                    }
                                }
                                else
                                {
                                    //Se esperaba un valor por referencia
                                }
                            }
                            else
                            {
                                Declaracion temp = new Declaracion(tipe, identify, resueltos.ElementAt(iterador), 0, 0);

                                ((Declaracion)temp).valor = resueltos.ElementAt(iterador);//Expresion 1,2
                                temp.ejecutar(nuevo);
                                iterador++;
                            }

                            cont += 1;
                        }
                    }
                }

                /*
                 * Ejecucion como tal de la lista de declaraciones y de la lista de instrucciones (bloque)
                 */

                if (((Tipo_MF)f.valor).listaDeclaraciones != null)
                {
                    foreach (Instruccion declaration in ((Tipo_MF)f.valor).listaDeclaraciones)
                    {
                        declaration.ejecutar(nuevo);
                    }
                }

                if (((Tipo_MF)f.valor).getbloque() == null)
                {
                    foreach (Instruccion ins in ((Tipo_MF)f.valor).listaInstrucciones)
                    {
                        retorno = (Expresion)ins.ejecutar(nuevo);
                    }
                }
                else
                {
                    //ejecutamos el bloque de instrucciones
                    retorno = (Expresion)((Tipo_MF)f.valor).getbloque().ejecutar(nuevo);
                }



                //verificamos si enviaron un return
                if (retorno != null)
                {
                    Primitivo sim = (Primitivo)retorno;
                    //validamos el retorno dentro del metodo o funcion
                    if (f.tipo.tipo == Tipo.enumTipo.Void && ((Expresion)retorno).tipo.tipo != Tipo.enumTipo.Void)  //viene exit vacio
                    {
                        //error, porque si retorna algo no debe ser null
                        MasterClass.Instance.addError(new C_Error("Semantico", "No se esperaba retorno en metodo: " + nombreFuncion2, linea, columna));
                        retorno = new Primitivo(new Tipo(Tipo.enumTipo.error), "@error@");
                    }
                    else
                    {
                        //como no es void tiene tipo y verificamos que sea el mismo que la expresion recibida
                        if (f.tipo.tipo != sim.tipo.tipo)
                        {
                            //si no es el mismo entonces es un error
                            MasterClass.Instance.addError(new C_Error("Semantico", "El tipo de retorno y funcion no coinciden: " + sim.tipo.tipo + " = " + f.tipo.tipo, linea, columna));
                            retorno = new Primitivo(new Tipo(Tipo.enumTipo.error), "@error@");
                        }
                    }
                }
                else
                {
                    //buscamos la variable con el mismo de la funcion
                    Variable nombreFuncionVar = nuevo.buscar(id, linea, columna, "La variable");
                    retorno = new Primitivo(f.tipo, nombreFuncionVar.valor);
                }
            }
            else
            {
                MasterClass.Instance.addError(new C_Error("Semantico", "El metodo " + nombreFuncion2 + " no existe en el contexto", linea, columna));
            }

            MasterClass.PilaMF.RemoveLast();
            return(retorno);
        }
コード例 #4
0
        /*
         * Metodo de la implementacion
         * @ts tabla de simbolos global
         * @user usuario que ejecuta la accion
         * @baseD base de datos donde estamos ejecutando todo
         * @mensajes linkedlist con la salida deseada
         */
        public object ejecutar(TablaDeSimbolos ts, Ambito ambito, TablaDeSimbolos tsT)
        {
            Mensaje ms  = new Mensaje();
            object  res = ts.getValor(id);

            if (!res.Equals("none"))
            {
                if (res.GetType() == typeof(TypeCursor))
                {
                    TypeCursor tabla = (TypeCursor)res;
                    if (tabla.tabla != null)
                    {
                        generarIdentificador(tabla.tabla);
                        if (tabla.tabla.columnas.Count() == parametros.Count())
                        {
                            string identificadorParametros = generarIdentificadorDeclaracion();
                            if (identificadorParametros.Equals(identificador))
                            {
                                foreach (Data data in tabla.tabla.datos)
                                {
                                    TablaDeSimbolos newAmbito = new TablaDeSimbolos();
                                    foreach (Simbolo s in ambito.tablaPadre)
                                    {
                                        newAmbito.AddLast(s);
                                    }
                                    //-------------------------------------- ASIGNARLE A LOS PARAMETROS LOS VALORES DE LA CONSULTA ----------------------------
                                    for (int i = 0; i < parametros.Count(); i++)
                                    {
                                        Declaracion d = (Declaracion)parametros.ElementAt(i);
                                        d.parametro = true;
                                        object rd = d.ejecutar(newAmbito, ambito, tsT);
                                        if (rd == null)
                                        {
                                            return(null);
                                        }
                                        Atributo atributo = data.valores.ElementAt(i);
                                        newAmbito.setValor(d.id, atributo.valor);
                                    }
                                    //---------------------------------------- EJECUTAR INSTRUCCIONES DENTRO DEL FOREACH -----------------------------------------
                                    foreach (InstruccionCQL i in cuerpo)
                                    {
                                        object resultado = i.ejecutar(newAmbito, ambito, tsT);
                                        if (resultado == null)
                                        {
                                            return(null);
                                        }
                                        else if (resultado.GetType() == typeof(Retorno))
                                        {
                                            return((Retorno)resultado);
                                        }
                                        else if (i.GetType() == typeof(Continue) || resultado.GetType() == typeof(Continue))
                                        {
                                            break;
                                        }
                                    }
                                }
                                return("");
                            }
                            else
                            {
                                ambito.mensajes.AddLast(ms.error("No coinciden el tipo de parametros con el tipo de columnas", l, c, "Semantico"));
                            }
                        }
                        else
                        {
                            ambito.mensajes.AddLast(ms.error("No coincide la cantidad de parametros con la cantidad de columnas", l, c, "Semantico"));
                        }
                    }
                    else
                    {
                        ambito.mensajes.AddLast(ms.error("El cursor: " + id + " no ha sido abierto", l, c, "Semantico"));
                    }
                }
                else
                {
                    ambito.mensajes.AddLast(ms.error("La variable tiene que ser de tipo Cursor  no se reconoce: " + res, l, c, "Semantico"));
                }
            }
            else
            {
                ambito.mensajes.AddLast(ms.error("La variable : " + id + " no existe en este ambito", l, c, "Semantico"));
            }
            return(null);
        }
コード例 #5
0
        public void codigoaEvaluar(string strCodigoaEvaluar)
        {
            //MessageBox.Show("" + codF);

            Analizadores.Analizador analizar = new Analizador(new Gramatica());
            ParseTree arbol = analizar.isValid(strCodigoaEvaluar);

            if (arbol != null)
            {
                ConstructorAst constAst = new ConstructorAst();
                AST            arbolAux = constAst.Analizar(arbol.Root);
                Ambito         global   = new Ambito(null);

                try {
                    if (arbolAux != null)
                    {
                        foreach (Instruccion inst in arbolAux.Instrucciones)
                        {
                            //if (inst is Funcion) {

                            //}
                            if (inst is Declaracion)
                            {
                                Declaracion declaracion = (Declaracion)inst;
                                declaracion.ejecutar(global, arbolAux);
                            }
                            //toca deficion clase
                        }

                        foreach (Instruccion ins in arbolAux.Instrucciones)
                        {
                            if (ins is Funcion)
                            {
                                Funcion funcion = (Funcion)ins;
                                global.agregar(funcion.Id, funcion);
                                foreach (NodoAST instruccion in funcion.LLInstrucciones)
                                {
                                    //if (instruccion is DefinicionStruct)
                                    //{
                                    //    DefinicionStruct crear = (DefinicionStruct)instruccion;
                                    //    crear.ejecutar(global, auxArbol);
                                    //}
                                }
                            }
                            if (ins is Declaracion)
                            {
                                Declaracion declaracion = (Declaracion)ins;
                                declaracion.ejecutar(global, arbolAux);
                            }
                            //if (ins is DefinicionStruct)
                            //{
                            //    DefinicionStruct crear = (DefinicionStruct)ins;
                            //    crear.ejecutar(global, auxArbol);
                            //}
                        }

                        foreach (Instruccion ins in arbolAux.Instrucciones)
                        {
                            if (ins is Principal)
                            {
                                Principal main = (Principal)ins;

                                Ambito local = new Ambito(global);

                                main.ejecutar(local, arbolAux);
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Cadena invalida");
                    }
                }
                catch (Exception ex) {
                    MessageBox.Show(ex.ToString());
                }

                //analizar.parse(arbol, new PrimeraPasada());
                MessageBox.Show("Cadena Valida");
            }
            else
            {
                MessageBox.Show("No Valida");
            }
        }
コード例 #6
0
 private void btnInterpretar_Click(object sender, EventArgs e)
 {
     if (!txtEntrada.Text.Equals(string.Empty))
     {
         Gramatica    grammar  = new Gramatica();
         LanguageData lenguaje = new LanguageData(grammar);
         Parser       parser   = new Parser(lenguaje);
         ParseTree    arbol    = parser.Parse(txtEntrada.Text);
         if (arbol.ParserMessages.Count == 0)
         {
             Graficador j = new Graficador();
             j.graficar(arbol.Root);
             ConstructorAST an       = new ConstructorAST();
             AST            auxArbol = an.Analizar(arbol.Root);
             Entorno        global   = new Entorno(null);
             try
             {
                 if (auxArbol != null)
                 {
                     foreach (Instruccion ins in auxArbol.Instrucciones)
                     {
                         if (ins is Funcion)
                         {
                             Funcion funcion = (Funcion)ins;
                             global.agregar(funcion.Identificador, funcion);
                             foreach (NodoAST instruccion in funcion.Instrucciones)
                             {
                                 if (instruccion is DefinicionStruct)
                                 {
                                     DefinicionStruct crear = (DefinicionStruct)instruccion;
                                     crear.ejecutar(global, auxArbol);
                                 }
                             }
                         }
                         if (ins is Declaracion)
                         {
                             Declaracion declaracion = (Declaracion)ins;
                             declaracion.ejecutar(global, auxArbol);
                         }
                         if (ins is DefinicionStruct)
                         {
                             DefinicionStruct crear = (DefinicionStruct)ins;
                             crear.ejecutar(global, auxArbol);
                         }
                     }
                     foreach (Instruccion ins in auxArbol.Instrucciones)
                     {
                         if (ins is Main)
                         {
                             Main main = (Main)ins;
                             foreach (NodoAST instruccion in main.Instrucciones)
                             {
                                 if (instruccion is DefinicionStruct)
                                 {
                                     DefinicionStruct crear = (DefinicionStruct)instruccion;
                                     crear.ejecutar(global, auxArbol);
                                 }
                             }
                             Entorno local = new Entorno(global);
                             main.ejecutar(local, auxArbol);
                         }
                     }
                 }
                 else
                 {
                     MessageBox.Show("El arbol de Irony no se construyo. Cadena invalida!\n");
                 }
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.ToString());
             }
         }
         else
         {
             // Aca deben gestionar esos errores :)
             MessageBox.Show("Hay errores lexicos o sintacticos\n El arbol de Irony no se construyo. Cadena invalida!\n");
         }
     }
 }