Ejemplo n.º 1
0
 public void AgregarArgumento(Expresion argumento)
 {
     //logger.Info("Inicio Agregar Argumento");
     this.argumentos.Add(argumento);
     //logger.Info("Fin Agregar Argumento");
 }
Ejemplo n.º 2
0
 public ExpresionNumerica(
     Expresion expresionMadre,
     string numero) : base(expresionMadre)
 {
     this.numero = numero;
 }
Ejemplo n.º 3
0
        private Expresion ConstruirExpresion(bool unaria, bool argumento)
        {
            try
            {
                //logger.Info("Inicio Construir Expresion");
                Elemento elemento;

                Expresion expresionMadre  = null;
                Expresion expresionActual = null;

                Estado estado = Estado.EsperandoTerminoIzquierdo;

                elemento = this.ProximoElemento();
                while (elemento != null)
                {
                    if (estado == Estado.EsperandoTerminoIzquierdo)
                    {
                        if (elemento.EsInicioDeAgrupacion())
                        {
                            expresionActual                = this.ConstruirExpresion();
                            expresionActual.Agrupada       = true;
                            expresionActual.ExpresionMadre = expresionMadre;
                        }
                        else if (elemento.DeterminaSigno())
                        {
                            expresionActual = new ExpresionUnaria(
                                expresionMadre,
                                this.ConstruirExpresion(true),
                                (ElementoOperador)elemento);
                        }
                        else if (elemento.EsNumerico())
                        {
                            expresionActual = new ExpresionNumerica(
                                expresionMadre,
                                elemento.Valor());
                        }
                        else if (elemento.EsFuncion())
                        {
                            ExpresionFuncion expresionFuncion = new ExpresionFuncion(
                                expresionMadre,
                                (ElementoFuncion)elemento);

                            elemento = this.ProximoElemento();
                            if (!elemento.EsInicioDeAgrupacion())
                            {
                                logger.Error("Estado EsperandoTerminoIzquierdo => Elemento Funcion => Se esperaba inicio de agrupación.");
                                throw new InvalidOperationException("Estado EsperandoTerminoIzquierdo => Elemento Funcion => Se esperaba inicio de agrupación.");
                            }

                            Expresion expresionArgumento = this.ConstruirExpresion(
                                unaria: false,
                                argumento: true);

                            while (expresionArgumento != null)
                            {
                                expresionArgumento.ExpresionMadre = expresionFuncion;
                                expresionFuncion.AgregarArgumento(expresionArgumento);

                                this.RetrocedecerElemento();

                                elemento = this.ProximoElemento();

                                if (elemento == null)
                                {
                                    expresionArgumento = null;
                                }
                                else
                                {
                                    if (elemento.EsFinDeAgrupacion())
                                    {
                                        expresionArgumento = null;
                                    }
                                    else if (elemento.EsSeparador())
                                    {
                                        expresionArgumento = this.ConstruirExpresion(
                                            unaria: false,
                                            argumento: true);
                                    }
                                    else
                                    {
                                        logger.Error("Estado EsperandoTerminoIzquierdo => Elemento Funcion => Se esperaba fin de agrupación o separador.");

                                        throw new InvalidOperationException("Estado EsperandoTerminoIzquierdo => Elemento Funcion => Se esperaba fin de agrupación o separador.");
                                    }
                                }
                            }

                            expresionActual = expresionFuncion;
                        }
                        else if (elemento.EsFinDeAgrupacion() && argumento)
                        {
                            break;
                        }
                        else
                        {
                            logger.Error("Estado EsperandoTerminoIzquierdo => Se esperaba inicio de agrupación, signo o valor numérico.");
                            throw new InvalidOperationException("Estado EsperandoTerminoIzquierdo => Se esperaba inicio de agrupación, signo o valor numérico.");
                        }

                        if (unaria)
                        {
                            break;
                        }
                        else
                        {
                            estado = Estado.EsperandoOperador;
                        }
                    }
                    else if (estado == Estado.EsperandoOperador)
                    {
                        if (elemento.EsFinDeAgrupacion())
                        {
                            break;
                        }
                        else if (elemento.EsOperador())
                        {
                            if (expresionActual.EsBinaria())
                            {
                                if (((ExpresionBinaria)expresionActual).Agrupada ||
                                    ((ExpresionBinaria)expresionActual).Operador.TienePrecedencia((ElementoOperador)elemento))
                                {
                                    while (expresionActual.ExpresionMadre != null &&
                                           !expresionActual.Agrupada &&
                                           expresionActual.ExpresionMadre.EsBinaria() &&
                                           ((ExpresionBinaria)expresionActual.ExpresionMadre).Operador.TienePrecedencia((ElementoOperador)elemento))
                                    {
                                        expresionActual = expresionActual.ExpresionMadre;
                                    }

                                    ExpresionBinaria expresionNueva = new ExpresionBinaria(
                                        expresionActual.ExpresionMadre,
                                        expresionActual,
                                        (ElementoOperador)elemento,
                                        null);

                                    if (expresionNueva.ExpresionMadre != null)
                                    {
                                        ((ExpresionBinaria)expresionNueva.ExpresionMadre).TerminoDerecho = expresionNueva;
                                    }

                                    expresionActual.ExpresionMadre = expresionNueva;
                                    expresionActual = expresionNueva;
                                }
                                else
                                {
                                    ExpresionBinaria nuevaExpresion = new ExpresionBinaria(
                                        expresionActual,
                                        ((ExpresionBinaria)expresionActual).TerminoDerecho,
                                        (ElementoOperador)elemento,
                                        null);

                                    ((ExpresionBinaria)expresionActual).TerminoDerecho.ExpresionMadre = nuevaExpresion;
                                    ((ExpresionBinaria)expresionActual).TerminoDerecho = nuevaExpresion;
                                    expresionActual = nuevaExpresion;
                                }
                            }
                            else
                            {
                                Expresion nuevaExpresion = new ExpresionBinaria(
                                    expresionActual.ExpresionMadre,
                                    expresionActual,
                                    (ElementoOperador)elemento,
                                    null);

                                expresionActual.ExpresionMadre = nuevaExpresion;
                                expresionActual = nuevaExpresion;
                            }

                            estado = Estado.EsperandoTerminoDerecho;
                        }
                        else if (elemento.EsSeparador() && argumento)
                        {
                            break;
                        }
                        else
                        {
                            logger.Error("Estado EsperandoOperador => Se esperaba un elemento fin de agrupacion u operador.");
                            throw new InvalidOperationException("Estado EsperandoOperador => Se esperaba un elemento fin de agrupacion u operador.");
                        }
                    }
                    else if (estado == Estado.EsperandoTerminoDerecho)
                    {
                        if (elemento.EsInicioDeAgrupacion())
                        {
                            ((ExpresionBinaria)expresionActual).TerminoDerecho = this.ConstruirExpresion();
                        }
                        else if (elemento.EsNumerico())
                        {
                            ((ExpresionBinaria)expresionActual).TerminoDerecho = new ExpresionNumerica(
                                expresionActual,
                                elemento.Valor());
                        }
                        else if (elemento.EsFuncion())
                        {
                            ExpresionFuncion expresionFuncion = new ExpresionFuncion(
                                expresionActual,
                                (ElementoFuncion)elemento);

                            elemento = this.ProximoElemento();
                            if (!elemento.EsInicioDeAgrupacion())
                            {
                                logger.Error("Estado EsperandoTerminoIzquierdo => Elemento Funcion => Se esperaba inicio de agrupación.");
                                throw new InvalidOperationException("Estado EsperandoTerminoIzquierdo => Elemento Funcion => Se esperaba inicio de agrupación.");
                            }

                            Expresion expresionArgumento = this.ConstruirExpresion(
                                unaria: false,
                                argumento: true);

                            while (expresionArgumento != null)
                            {
                                expresionArgumento.ExpresionMadre = expresionFuncion;
                                expresionFuncion.AgregarArgumento(expresionArgumento);

                                this.RetrocedecerElemento();

                                elemento = this.ProximoElemento();

                                if (elemento == null)
                                {
                                    expresionArgumento = null;
                                }
                                else
                                {
                                    if (elemento.EsFinDeAgrupacion())
                                    {
                                        expresionArgumento = null;
                                    }
                                    else if (elemento.EsSeparador())
                                    {
                                        expresionArgumento = this.ConstruirExpresion(
                                            unaria: false,
                                            argumento: true);
                                    }
                                    else
                                    {
                                        logger.Error("Estado EsperandoTerminoDerecho => Elemento Funcion => Se esperaba fin de agrupación o separador.");
                                        throw new InvalidOperationException("Estado EsperandoTerminoDerecho => Elemento Funcion => Se esperaba fin de agrupación o separador.");
                                    }
                                }
                            }

                            ((ExpresionBinaria)expresionActual).TerminoDerecho = expresionFuncion;
                        }
                        else
                        {
                            logger.Error("Estado EsperandoTerminoDerecho => Se esperaba inicio de agrupación o valor numérico.");
                            throw new InvalidOperationException("Estado EsperandoTerminoDerecho => Se esperaba inicio de agrupación o valor numérico.");
                        }

                        estado = Estado.EsperandoOperador;
                    }

                    elemento = this.ProximoElemento();
                }

                if (expresionActual == null && argumento)
                {
                    return(null);
                }

                //logger.Info("Fin Construir Expresion");
                return(expresionActual.PrimeraExpresion());
            }
            catch (Exception ex)
            {
                logger.Error(ex.Source + " - " + ex.Message + ": " + ex.StackTrace);
                throw ex;
            }
        }
Ejemplo n.º 4
0
 public Expresion(Expresion expresionMadre)
 {
     this.ExpresionMadre = expresionMadre;
     this.Agrupada       = false;
 }