internal static bool TryParseFunction(IStatedTwoWayEnumerator<Token> enumerator, out MdxExpressionBase expression)
{
enumerator.SavePosition();
expression = null;
var function = Mdx.Function();
do
{
if (!IsNextTokenValid(enumerator, TokenType.TitleExpression))
{
enumerator.RestoreLastSavedPosition();
return false;
}
function.Titled(enumerator.Current.Value);
} while (IsNextTokenValid(enumerator, TokenType.IdentifierSeparator));
if (!IsNextTokenValid(enumerator, TokenType.LeftRoundBracket))
{
enumerator.RestoreLastSavedPosition();
return false;
}
if (IsNextTokenValid(enumerator, TokenType.RightRoundBracket))
{
expression = function;
enumerator.RemoveLastSavedState();
return true;
}
do
{
MdxExpressionBase childExpression;
if (!TryParseExpression(enumerator, out childExpression))
{
enumerator.RestoreLastSavedPosition();
return false;
}
function.WithParameters((MdxExpression)childExpression);
} while (IsNextTokenValid(enumerator, TokenType.MemberSeparator));
if (!IsNextTokenValid(enumerator, TokenType.RightRoundBracket))
{
enumerator.RestoreLastSavedPosition();
return false;
}
expression = function;
enumerator.RemoveLastSavedState();
return true;
}