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;
}