/// <summary> /// Recupera o container condicional. /// </summary> /// <param name="enumerator"></param> /// <param name="containerInfo"></param> /// <returns></returns> public static ConditionalTerm GetContainer(ref IEnumerator <Text.InterpreterExpression.Expression> enumerator, Text.InterpreterExpression.ContainerChars containerInfo) { return(GetContainer(ref enumerator, ConditionalLexer.Configuration, containerInfo)); }
/// <summary> /// Recupera container condicional. /// </summary> /// <param name="enumerator">Enumerador dos items que serão analizados.</param> /// <param name="configuration"></param> /// <param name="containerInfo"></param> /// <returns></returns> private static ConditionalTerm GetContainer(ref IEnumerator <Text.InterpreterExpression.Expression> enumerator, Text.InterpreterExpression.ILexerConfiguration configuration, Text.InterpreterExpression.ContainerChars containerInfo) { ConditionalContainer container = null; var logical = Text.InterpreterExpression.TokenID.And; while (containerInfo == null || (string.IsNullOrEmpty(enumerator.Current.Text) || enumerator.Current.Text[0] != containerInfo.Stop)) { var conditional = GetConditional(ref enumerator, configuration, containerInfo != null ? (char?)containerInfo.Stop : null); if (((conditional is ValuesArray) || (conditional is FunctionCall)) && container == null) { return(conditional); } else if (container == null) { container = new ConditionalContainer(conditional); } else if (logical == Text.InterpreterExpression.TokenID.And) { container.And(conditional); } else if (logical == Text.InterpreterExpression.TokenID.Plus || logical == Text.InterpreterExpression.TokenID.Minus || logical == Text.InterpreterExpression.TokenID.Star || logical == Text.InterpreterExpression.TokenID.Slash) { Operator oper = null; switch (logical) { case Text.InterpreterExpression.TokenID.Plus: oper = new Operator("+"); break; case Text.InterpreterExpression.TokenID.Minus: oper = new Operator("-"); break; case Text.InterpreterExpression.TokenID.Star: oper = new Operator("*"); break; case Text.InterpreterExpression.TokenID.Slash: oper = new Operator("/"); break; } ConditionalTerm left = container; if (container.ConditionalsCount == 1) { left = container.Conditionals.First(); } container = new ConditionalContainer(new Conditional(left, oper, conditional)); } else { container.Or(conditional); } if (enumerator.Current == null || (containerInfo != null && enumerator.Current.Text[0] == containerInfo.Stop)) { return(container); } else if (enumerator.Current.Token == (int)Text.InterpreterExpression.TokenID.And || enumerator.Current.Token == (int)Query.Parser.SqlTokenID.kAnd) { logical = Text.InterpreterExpression.TokenID.And; } else if (enumerator.Current.Token == (int)Text.InterpreterExpression.TokenID.Or || enumerator.Current.Token == (int)Query.Parser.SqlTokenID.kOr) { logical = Text.InterpreterExpression.TokenID.Or; } else if (enumerator.Current.Token == (int)Text.InterpreterExpression.TokenID.Plus || enumerator.Current.Token == (int)Text.InterpreterExpression.TokenID.Minus || enumerator.Current.Token == (int)Text.InterpreterExpression.TokenID.Star || enumerator.Current.Token == (int)Text.InterpreterExpression.TokenID.Slash) { logical = (Text.InterpreterExpression.TokenID)enumerator.Current.Token; } if (!enumerator.MoveNext()) { break; } } return(container); }