예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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");
        }
예제 #5
0
        /// <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);
        }