BalticAmadeus.FluentMdx.MdxParser.TryParseNavigationFunction C# (CSharp) Method

TryParseNavigationFunction() static private method

Performs navigation function syntactical analysis over collection of Token objects using IStatedTwoWayEnumerator{T}.
static private TryParseNavigationFunction ( IStatedTwoWayEnumerator enumerator, MdxExpressionBase &expression ) : bool
enumerator IStatedTwoWayEnumerator Extended enumerator of collection of objects.
expression MdxExpressionBase Output parsed navigation function if syntactic analysis was succeeded.
return bool
        internal static bool TryParseNavigationFunction(IStatedTwoWayEnumerator<Token> enumerator, out MdxExpressionBase expression)
        {
            enumerator.SavePosition();
            expression = null;

            var navigationFunction = Mdx.NavigationFunction();

            if (!IsNextTokenValid(enumerator, TokenType.TitleExpression) &&
                !IsNextTokenValid(enumerator, TokenType.DimensionProperty))
            {
                enumerator.RestoreLastSavedPosition();
                return false;
            }

            navigationFunction.Titled(enumerator.Current.Value);

            if (!IsNextTokenValid(enumerator, TokenType.LeftRoundBracket))
            {
                expression = navigationFunction;

                enumerator.RemoveLastSavedState();
                return true;
            }

            do
            {
                if (!IsNextTokenValid(enumerator, TokenType.LogicalExpression) &&
                    !IsNextTokenValid(enumerator, TokenType.DateExpression) &&
                    !IsNextTokenValid(enumerator, TokenType.NumberExpression) &&
                    !IsNextTokenValid(enumerator, TokenType.AnyExpression) &&
                    !IsNextTokenValid(enumerator, TokenType.MathsOperator))
                {
                    enumerator.RestoreLastSavedPosition();
                    return false;
                }

                var functionParametersValue = enumerator.Current.Value;

                if (IsNextTokenValid(enumerator, TokenType.AnyExpression))
                    functionParametersValue += enumerator.Current.Value;

                navigationFunction.WithParameters(functionParametersValue);

            } while (IsNextTokenValid(enumerator, TokenType.MemberSeparator));

            if (!IsNextTokenValid(enumerator, TokenType.RightRoundBracket))
            {
                enumerator.RestoreLastSavedPosition();
                return false;
            }

            expression = navigationFunction;

            enumerator.RemoveLastSavedState();
            return true;
        }