public void AgregarArgumento(Expresion argumento) { //logger.Info("Inicio Agregar Argumento"); this.argumentos.Add(argumento); //logger.Info("Fin Agregar Argumento"); }
public ExpresionNumerica( Expresion expresionMadre, string numero) : base(expresionMadre) { this.numero = numero; }
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; } }
public Expresion(Expresion expresionMadre) { this.ExpresionMadre = expresionMadre; this.Agrupada = false; }