/// <summary> /// Recupera o enumerator das expressões. /// </summary> /// <param name="expression"></param> /// <param name="lexer"></param> /// <returns></returns> private static IEnumerator <Text.InterpreterExpression.Expression> GetExpressions(string expression, Text.InterpreterExpression.Lexer lexer) { var lexResult = lexer.Execute(expression); var source = new List <Text.InterpreterExpression.Expression>(lexResult.Expressions); var size = source.Count; var offset = 0; for (var i = 0; i < size; i++) { var current = source[i]; if (current.Token == (int)Text.InterpreterExpression.TokenID.Identifier && ((i + 2) < size) && source[i + 1].Token == (int)Text.InterpreterExpression.TokenID.Dot && source[i + 2].Token == (int)Text.InterpreterExpression.TokenID.Identifier) { var e2 = source[i + 2]; var ee = new Text.InterpreterExpression.Expression(current.Container, current.BeginPoint, current.Line, string.Format("{0}{1}{2}", current.Text, source[i + 1].Text, e2.Text)); lexResult.Expressions.RemoveAt(i - offset); lexResult.Expressions.RemoveAt(i - offset); lexResult.Expressions.RemoveAt(i - offset); lexResult.Expressions.Insert(i - offset, ee); offset += 2; } } IEnumerator <Text.InterpreterExpression.Expression> enumerator = ((IEnumerable <Text.InterpreterExpression.Expression>)lexResult.Expressions).GetEnumerator(); return(enumerator); }
/// <summary> /// Fixa o resultado do analizador lexo. /// </summary> /// <param name="lResult"></param> /// <returns></returns> internal static int FixLexerResult(Text.InterpreterExpression.LexerResult lResult) { var source = new List <Text.InterpreterExpression.Expression>(lResult.Expressions); var size = source.Count; var offset = 0; int i = 0; for (i = 0; i < size; i++) { var current = source[i]; if (current.Token == (int)Text.InterpreterExpression.TokenID.Identifier && ((i + 2) < size) && source[i + 1].Token == (int)Text.InterpreterExpression.TokenID.Dot && source[i + 2].Token == (int)Text.InterpreterExpression.TokenID.Identifier) { var e2 = source[i + 2]; var ee = new Text.InterpreterExpression.Expression(current.Container, current.BeginPoint, current.Line, string.Format("{0}{1}{2}", current.Text, source[i + 1].Text, e2.Text)); lResult.Expressions.RemoveAt(i - offset); lResult.Expressions.RemoveAt(i - offset); lResult.Expressions.RemoveAt(i - offset); lResult.Expressions.Insert(i - offset, ee); offset += 2; } } FixGroupExpressions(lResult.Expressions, (int)Parser.SqlTokenID.kCase, (int)Parser.SqlTokenID.kEnd, false); FixGroupExpressions(lResult.Expressions, (int)Parser.SqlTokenID.kWhen, (int)Parser.SqlTokenID.kThen, true); FixGroupExpressions(lResult.Expressions, (int)Parser.SqlTokenID.kThen, (int)Parser.SqlTokenID.kElse, true); FixGroupExpressions(lResult.Expressions, (int)Parser.SqlTokenID.kElse, (int)Parser.SqlTokenID.kEnd, true); return(i); }
/// <summary> /// Verifica se a expressão informada é um operador de /// </summary> /// <param name="expression"></param> /// <returns></returns> internal static bool IsArithmeticOperator(Text.InterpreterExpression.Expression expression) { var token = (Text.InterpreterExpression.TokenID)expression.Token; switch (token) { case Text.InterpreterExpression.TokenID.Plus: case Text.InterpreterExpression.TokenID.Minus: case Text.InterpreterExpression.TokenID.Star: case Text.InterpreterExpression.TokenID.Slash: case Text.InterpreterExpression.TokenID.Percent: return(true); } return(false); }
/// <summary> /// Recupera o operador matemático representado pela expressão informada. /// </summary> /// <param name="expression"></param> /// <returns></returns> internal static MathematicalOperator GetMathematicalOperator(Text.InterpreterExpression.Expression expression) { var token = (Text.InterpreterExpression.TokenID)expression.Token; switch (token) { case Text.InterpreterExpression.TokenID.Plus: return(MathematicalOperator.Addition); case Text.InterpreterExpression.TokenID.Minus: return(MathematicalOperator.Subtraction); case Text.InterpreterExpression.TokenID.Star: return(MathematicalOperator.Multiplication); case Text.InterpreterExpression.TokenID.Slash: return(MathematicalOperator.Division); case Text.InterpreterExpression.TokenID.Percent: return(MathematicalOperator.Module); } throw new InvalidOperationException("Invalid mathematical operator"); }
/// <summary> /// Verifica se a expressão informada é um operador /// </summary> /// <param name="expression"></param> /// <returns></returns> internal static bool IsConditionalOperator(Text.InterpreterExpression.Expression expression) { var token = (Text.InterpreterExpression.TokenID)expression.Token; switch (token) { case Text.InterpreterExpression.TokenID.Greater: case Text.InterpreterExpression.TokenID.GreaterEqual: case Text.InterpreterExpression.TokenID.Less: case Text.InterpreterExpression.TokenID.LessEqual: case Text.InterpreterExpression.TokenID.Equal: case Text.InterpreterExpression.TokenID.EqualEqual: case Text.InterpreterExpression.TokenID.NotEqual: return(true); } var token2 = (Colosoft.Query.Parser.SqlTokenID)expression.Token; switch (token2) { case Parser.SqlTokenID.kIs: return(true); } return(false); }