public object Ejecutar(Ambito ambito)
 {
     try
     {
         ClaveFuncion clave = new ClaveFuncion(this.clase.ToLower(), "vacio", this.parametros);
         if (!ambito.existeConstructor(clave))
         {
             Constructor c = new Constructor(this.parametros, instrucciones, this.linea, this.columna, this.clase);
             ambito.agregarConstructor(clave, c);
         }
         else
         {
             TError error = new TError("Semantico", "Ya existe una definicion de Constructor: " + this.clase + " con la misma cantidad de parametros y tipo | Clase: " + this.clase + " | Archivo: " + ambito.archivo, this.linea, this.columna, false);
             Estatico.errores.Add(error);
             Estatico.ColocaError(error);
         }
     }
     catch (Exception e)
     {
         TError error = new TError("Ejecucion", "Error en la ejecucion de Declaracion de Constructor: " + this.clase + " | Clase: " + this.clase + " | Archivo: " + ambito.archivo + " | Error: " + e.Message, this.linea, this.columna, false);
         Estatico.errores.Add(error);
         Estatico.ColocaError(error);
     }
     return(null);
 }
Ejemplo n.º 2
0
        public object Ejecutar(Ambito ambito)
        {
            /// YA QUE LO VOY A TRATAR COMO UN OBJETO:
            /// 1) DEBO DE COLOCARLE UN CONSTRUCTOR AL CUAL ME VA A SERVIR PARA PODER MANDARLE LOS PARAMETROS CUANDO ESTA SE LLAME
            /// 2) AL MOMENTO DE LLAMAR LA PREGUNTA DEBO DE MANDARLE LOS MISMOS PARAMETROS PARA INSTANCIAR LA PREGUNTA QUE EN TEORIA DEBERIAN SER LOS MISMOS
            /// 3) LA PREGUNTA LA VOY A GUARDAR COMO UN OBJETO DENTRO DEL AMBITO DE LA CLASE LA CUAL VA A GUARDAR COMO UNA VARIABLE QUE A GUARDAR COMO VALOR OBJETO DE TIPO
            /// PREGUNTA
            try
            {
                if (!ambito.existeVariable(this.identificador.ToLower()))
                {
                    Ambito amPregunta = new Ambito(ambito, this.identificador.ToLower(), ambito.archivo);

                    /*CREO EL CONSTRUCTOR DE LA PREGUNTA QUE ME VA A SERVIR PARA PODER DECLARAR EN EL AMBITO LAS VARIABLES*/
                    Constructor c = new Constructor(this.parametros, new List <Instruccion>(), linea, columna, clase);

                    /*AGREGO EL CONSTRUCTOR DE LA PREGUNTA AL AMBITO*/
                    amPregunta.agregarConstructor(new ClaveFuncion(this.identificador.ToLower(), "vacio", parametros), c);

                    /*VOY A A GREGAR UNA VARIABLE TEMPORAL PARA QUE ENTONCES PUEDA GUARDAR LAS INSTRUCCIONES :) */
                    Variable v = new Variable("instr", "vale", Estatico.Vibililidad.PRIVADO, this.declaraciones);

                    /*LA AGREGO AL AMBITO DE ESTA PREGUNTA :)*/
                    amPregunta.agregarVariableAlAmbito("instr", v);

                    /*CREO EL OBJETO DE TIPO PREGUNTA*/
                    Objeto pregunta = new Objeto("pregunta", amPregunta);

                    /*AGREGO LA VARIABLE AL AMBITO ACTUAL PARA PODER ACCERDER A LA PREGUNTA EN UN LLAMADO A LA MISMA*/
                    Variable p = new Variable(this.identificador.ToLower(), "pregunta", Estatico.Vibililidad.PRIVADO, pregunta);

                    /*AGREGO LA VARIABLE EN EL AMBITO Y TERMINA*/
                    ambito.agregarVariableAlAmbito(this.identificador.ToLower(), p);

                    return(new Nulo());
                }
                else
                {
                    TError error = new TError("Semantico", "Ya existe una definicion de un simbolo: \"" + identificador + "\", las preguntas se tratan como objetos por lo que no pueden haber multiples definiciones de un objeto con el mismo nombre | Clase"
                                              + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                    Estatico.ColocaError(error);
                    Estatico.errores.Add(error);
                }
            }
            catch (Exception e)
            {
                TError erro = new TError("Ejecucion", "Error al intentar ejecutar la declaracion de una pregunta | Clase: " + clase + " | Archivo: " + ambito.archivo + " | Mensaje: " + e.Message, linea, columna, false);
                Estatico.errores.Add(erro);
                Estatico.ColocaError(erro);
            }
            return(new Nulo());
        }
        public object Ejecutar(Ambito ambito)
        {
            try
            {
                Simbolo s = (Simbolo)ambito.getSimbolo(this.identificador.ToLower());
                if (s != null)
                {
                    if (s is Variable)
                    {
                        Variable v     = (Variable)s;
                        Object   valor = v.valor;
                        if (valor is Objeto)
                        {
                            Objeto ob = (Objeto)valor;

                            List <Object> valores = getValoresParams(ambito);

                            if (ob.idClase.ToLower().Equals("pregunta"))
                            {
                                Ambito ambitoPregunta = ob.ambito; // obtengo el ambito de la pregunta

                                /*obtendre el constructor de la pregunta para poder setear los parametros que hagan falta*/
                                ClaveFuncion clave       = new ClaveFuncion(this.identificador.ToLower(), "vacio", getNodosParametros(ambito));
                                Constructor  constructor = (Constructor)ambitoPregunta.getConstructor(clave);
                                if (constructor != null)
                                {
                                    Variable           instruc       = (Variable)ambitoPregunta.getSimbolo("instr");
                                    List <Instruccion> declaraciones = (List <Instruccion>)instruc.valor;/*ya tengo las instrucciones que hacen la ejecucion de delcaraciones*/

                                    if (existePropiedad("etiqueta", ambitoPregunta))
                                    {
                                        /*EN CASO QUE LA PROPIEDAD YA EXISTA EN LA PREGUNTA: RESETEO EL AMBITO*/
                                        ambitoPregunta = new Ambito(ambitoPregunta.Anterior, ambitoPregunta.idAmbito, ambitoPregunta.archivo);
                                        ambitoPregunta.agregarConstructor(clave, constructor);
                                        ambitoPregunta.agregarVariableAlAmbito("instr", instruc);
                                    }
                                    /*aqui ya setee los parametros que venian en la pregunta en el ambito global ahora voy a ejecutar las declaraciones sobre este ambito*/
                                    ambitoPregunta = constructor.seteaParametrosLocales(ambitoPregunta, valores);
                                    ejecutaLasDeclaracionesPregunta(ambitoPregunta, declaraciones);                       /*carga todo lo de la pregunta*/

                                    Pregunta p = new Pregunta(ambitoPregunta, this.identificador.ToLower(), this.numero); // formo la pregunta

                                    Nota n = new Nota(p);

                                    n.ShowDialog();

                                    if (llamaMostar)
                                    {
                                        Ambito aux = ambitoPregunta.Anterior;
                                        ambitoPregunta.Anterior = null;
                                        LLamadaFuncion l = new LLamadaFuncion(clase, linea, columna, new Llamada("mostrar", linea, columna, clase));
                                        l.Ejecutar(ambitoPregunta);
                                        ambitoPregunta.Anterior = aux;
                                    }

                                    ob.ambito = ambitoPregunta; /*ASIGNO EL NUEVO AMBITO A OB*/

                                    if (n.salir != null)
                                    {
                                        return(n.salir);
                                    }
                                }
                                else
                                {
                                    TError error = new TError("Semantico", "Para el simbolo: \"" + identificador + "\" No existe una pregunta de tipo Nota que rebiba los parametros especificados | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                                    Estatico.ColocaError(error);
                                    Estatico.errores.Add(error);
                                }
                            }
                            else
                            {
                                TError error = new TError("Semantico", "El simbolo: \"" + identificador + "\" No es un objeto de tipo Pregunta, por lo que no es aplicable la instrucccion | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                                Estatico.ColocaError(error);
                                Estatico.errores.Add(error);
                            }
                        }
                        else
                        {
                            TError error = new TError("Semantico", "El simbolo: \"" + identificador + "\" No es un objeto de tipo Nota, por lo que no es aplicable la instrucccion | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                            Estatico.ColocaError(error);
                            Estatico.errores.Add(error);
                        }
                    }
                    else
                    {
                        TError error = new TError("Semantico", "El simbolo: \"" + identificador + "\" No es un objeto de tipo Nota, por lo que no es aplicable la instrucccion | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                        Estatico.ColocaError(error);
                        Estatico.errores.Add(error);
                    }
                }
                else
                {
                    TError error = new TError("Semantico", "La referencia a la pregunta de tipo Nota: \"" + identificador + "\" es Nulo, no existe en este ambito | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                    Estatico.ColocaError(error);
                    Estatico.errores.Add(error);
                }
            }
            catch (Exception e)
            {
                TError error = new TError("Ejecucion", "Error al ejecutar la Instrccion Nota() | Clase: " + clase + " | Archivo: " + ambito.archivo + " | Mensaje: " + e.Message, linea, columna, false);
                Estatico.ColocaError(error);
                Estatico.errores.Add(error);
            }
            return(new Nulo());
        }
        public object Ejecutar(Ambito ambito)
        {
            try
            {
                Simbolo s = (Simbolo)ambito.getSimbolo(this.identificador.ToLower());
                if (s != null)
                {
                    if (s is Variable)
                    {
                        Variable v     = (Variable)s;
                        Object   valor = v.valor;
                        if (valor is Objeto)
                        {
                            Objeto ob = (Objeto)valor;

                            List <Object> valores = getValoresParams(ambito);

                            if (ob.idClase.ToLower().Equals("pregunta"))
                            {
                                Ambito ambitoPregunta = ob.ambito; /*oteniendo el ambito de la pregunta*/
                                /*obtendre el constructor de la pregunta para poder setear los parametros que hagan falta*/
                                ClaveFuncion clave       = new ClaveFuncion(this.identificador.ToLower(), "vacio", getNodosParametros(ambito));
                                Constructor  constructor = (Constructor)ambitoPregunta.getConstructor(clave);
                                if (constructor != null)
                                {
                                    Variable           instruc       = (Variable)ambitoPregunta.getSimbolo("instr");
                                    List <Instruccion> declaraciones = (List <Instruccion>)instruc.valor;/*ya tengo las instrucciones que hacen la ejecucion de delcaraciones*/
                                    if (existePropiedad("etiqueta", ambitoPregunta))
                                    {
                                        /*EN CASO QUE LA PROPIEDAD YA EXISTA EN LA PREGUNTA: RESETEO EL AMBITO*/
                                        ambitoPregunta = new Ambito(ambitoPregunta.Anterior, ambitoPregunta.idAmbito, ambitoPregunta.archivo);
                                        ambitoPregunta.agregarConstructor(clave, constructor);
                                        ambitoPregunta.agregarVariableAlAmbito("instr", instruc);
                                    }

                                    ambitoPregunta = constructor.seteaParametrosLocales(ambitoPregunta, valores);
                                    ejecutaLasDeclaracionesPregunta(ambitoPregunta, declaraciones);                       /*carga todo lo de la pregunta*/

                                    Pregunta p = new Pregunta(ambitoPregunta, this.identificador.ToLower(), this.numero); // formo la pregunta

                                    if (this.extensiones != null)
                                    {
                                        /*AQUI CUANDO ADMITEN SOLO CIERTAS EXTENSIONES*/
                                        Object ext = this.extensiones.getValor(ambito);
                                        if (ext is String)
                                        {
                                            this.numero = Estatico.numPregunta;
                                            Estatico.numPregunta++;
                                            Fichero f = new Fichero(p, (String)ext, linea, columna, clase, ambito.archivo);
                                            f.ShowDialog();
                                            String resp = f.rutaArchivo;
                                            if (resp.Equals(""))
                                            {
                                                resp = "No se subio ningun Archivo!";
                                            }

                                            PreguntaAlmacenada pr = new PreguntaAlmacenada(p.idPregunta, p.etiqueta, this.numero);
                                            pr.addAnswer(" Archivo Almacenado en: " + resp);
                                            Estatico.resps.Add(pr);

                                            ob.ambito = ambitoPregunta;/*ASIGNO EL NUEVO AMBITO A OB*/

                                            if (f.salir != null)
                                            {
                                                return(f.salir);
                                            }
                                        }
                                        else
                                        {
                                            TError error = new TError("Semantico", "Para el simbolo: \"" + identificador + "\", Se espera una cadena especificando el formato de las Extensiones de Archivos | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                                            Estatico.ColocaError(error);
                                            Estatico.errores.Add(error);
                                        }
                                    }
                                    else
                                    {
                                        /*AQUI CUANDO ADMITEN CUALQUIER EXTENSION*/
                                        this.numero = Estatico.numPregunta;
                                        Estatico.numPregunta++;

                                        Fichero f = new Fichero(p, "", linea, columna, clase, ambito.archivo);
                                        f.ShowDialog();
                                        String resp = f.rutaArchivo;
                                        if (resp.Equals(""))
                                        {
                                            resp = "No se subio ningun Archivo!";
                                        }

                                        PreguntaAlmacenada pr = new PreguntaAlmacenada(p.idPregunta, p.etiqueta, this.numero);
                                        pr.addAnswer(" Archivo Almacenado en: " + resp);
                                        Estatico.resps.Add(pr);

                                        ob.ambito = ambitoPregunta;/*ASIGNO EL NUEVO AMBITO A OB*/

                                        if (f.salir != null)
                                        {
                                            return(f.salir);
                                        }
                                    }
                                }
                                else
                                {
                                    TError error = new TError("Semantico", "Para el simbolo: \"" + identificador + "\" No existe una pregunta de tipo Fichero que rebiba los parametros especificados | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                                    Estatico.ColocaError(error);
                                    Estatico.errores.Add(error);
                                }
                            }
                            else
                            {
                                TError error = new TError("Semantico", "El simbolo: \"" + this.identificador + "\"  no es de tipo Pregunta | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                                Estatico.ColocaError(error);
                                Estatico.errores.Add(error);
                            }
                        }
                        else
                        {
                            TError error = new TError("Semantico", "El simbolo: \"" + this.identificador + "\"  no es de tipo Pregunta | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                            Estatico.ColocaError(error);
                            Estatico.errores.Add(error);
                        }
                    }
                    else
                    {
                        TError error = new TError("Semantico", "El simbolo: \"" + this.identificador + "\"  no es de tipo Pregunta | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                        Estatico.ColocaError(error);
                        Estatico.errores.Add(error);
                    }
                }
                else
                {
                    TError error = new TError("Semantico", "No existe la pregunta de tipo Fichero: \"" + this.identificador + "\" | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false);
                    Estatico.ColocaError(error);
                    Estatico.errores.Add(error);
                }
            }
            catch (Exception e)
            {
                TError error = new TError("Ejecucion", "Error al ejecutar el guardar un Fichero | Clase: " + clase + " | Archivo: " + ambito.archivo + " | Mensaje: " + e.Message, linea, columna, false);
                Estatico.ColocaError(error);
                Estatico.errores.Add(error);
            }
            return(new Nulo());
        }
Ejemplo n.º 5
0
        public Pregunta getPregunta(Ambito ambito)
        {
            try
            {
                Simbolo s = (Simbolo)ambito.getSimbolo(this.identificador.ToLower());
                if (s != null)
                {
                    if (s is Variable)
                    {
                        Variable v     = (Variable)s;
                        Object   valor = v.valor;
                        if (valor is Objeto)
                        {
                            Objeto        ob      = (Objeto)valor;
                            List <Object> valores = getValoresParams(ambito);
                            this.ob = ob;
                            if (ob.idClase.ToLower().Equals("pregunta"))
                            {
                                Ambito       ambitoPregunta = ob.ambito; /*oteniendo el ambito de la pregunta*/
                                ClaveFuncion clave          = new ClaveFuncion(this.identificador.ToLower(), "vacio", getNodosParametros(ambito));
                                Constructor  constructor    = (Constructor)ambitoPregunta.getConstructor(clave);
                                if (constructor != null)
                                {
                                    Variable           instruc       = (Variable)ambitoPregunta.getSimbolo("instr");
                                    List <Instruccion> declaraciones = (List <Instruccion>)instruc.valor;/*ya tengo las instrucciones que hacen la ejecucion de delcaraciones*/
                                    if (existePropiedad("etiqueta", ambitoPregunta))
                                    {
                                        /*EN CASO QUE LA PROPIEDAD YA EXISTA EN LA PREGUNTA: RESETEO EL AMBITO*/
                                        ambitoPregunta = new Ambito(ambitoPregunta.Anterior, ambitoPregunta.idAmbito, ambitoPregunta.archivo);
                                        ambitoPregunta.agregarConstructor(clave, constructor);
                                        ambitoPregunta.agregarVariableAlAmbito("instr", instruc);
                                    }

                                    ambitoPregunta = constructor.seteaParametrosLocales(ambitoPregunta, valores);
                                    ejecutaLasDeclaracionesPregunta(ambitoPregunta, declaraciones);                       /*carga todo lo de la pregunta*/

                                    Pregunta p = new Pregunta(ambitoPregunta, this.identificador.ToLower(), this.numero); // formo la pregunta

                                    this.ambPregu = ambitoPregunta;

                                    return(p);
                                }
                                else
                                {
                                    TError error = new TError("Semantico", "Para el simbolo: \"" + identificador + "\" No existe una pregunta de tipo " + this.tipoPregunta + " que rebiba los parametros especificados | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, col, false);
                                    Estatico.ColocaError(error);
                                    Estatico.errores.Add(error);
                                }
                            }
                            else
                            {
                                TError error = new TError("Semantico", "Error Al Mostrar Pregunta: \"" + this.identificador + "\" ya que El simbolo  no es de Tipo " + this.tipoPregunta + " | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, col, false);
                                Estatico.errores.Add(error);
                                Estatico.ColocaError(error);
                            }
                        }
                        else
                        {
                            TError error = new TError("Semantico", "Error Al Mostrar Pregunta: \"" + this.identificador + "\" ya que El simbolo  no es de Tipo " + this.tipoPregunta + " | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, col, false);
                            Estatico.errores.Add(error);
                            Estatico.ColocaError(error);
                        }
                    }
                    else
                    {
                        TError error = new TError("Semantico", "Error Al Mostrar Pregunta: \"" + this.identificador + "\" ya que El simbolo  no es de Tipo " + this.tipoPregunta + " | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, col, false);
                        Estatico.errores.Add(error);
                        Estatico.ColocaError(error);
                    }
                }
                else
                {
                    TError error = new TError("Semantico", "Error Al Mostrar Pregunta: \"" + this.identificador + "\" ya que este Simbolo no Existe en este Contexto | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, col, false);
                    Estatico.errores.Add(error);
                    Estatico.ColocaError(error);
                }
            }
            catch (Exception e)
            {
                TError error = new TError("Ejecucion", "Error al ejecutar Pregunta: " + this.identificador + " | Clase: " + clase + " | Archivo: " + ambito.archivo + " | Mensaje: " + e.Message, linea, col, false);
                Estatico.ColocaError(error);
                Estatico.errores.Add(error);
            }
            return(null);
        }