internal static bool TryParseTuple(IStatedTwoWayEnumerator<Token> enumerator, out MdxExpressionBase expression)
{
enumerator.SavePosition();
expression = null;
if (!IsNextTokenValid(enumerator, TokenType.LeftCurlyBracket))
{
enumerator.RestoreLastSavedPosition();
return false;
}
var tuple = Mdx.Tuple();
if (IsNextTokenValid(enumerator, TokenType.RightCurlyBracket))
{
expression = tuple;
enumerator.RemoveLastSavedState();
return true;
}
do
{
MdxExpressionBase childExpression;
if (TryParseRange(enumerator, out childExpression))
{
tuple.With((MdxRange)childExpression);
}
else if (TryParseMember(enumerator, out childExpression))
{
tuple.With((MdxMember)childExpression);
}
else if (TryParseTuple(enumerator, out childExpression))
{
tuple.With((MdxTuple)childExpression);
}
else if (TryParseSet(enumerator, out childExpression))
{
tuple.With((MdxSet)childExpression);
}
else if (TryParseFunction(enumerator, out childExpression))
{
tuple.With((MdxFunction) childExpression);
}
else
{
enumerator.RestoreLastSavedPosition();
return false;
}
} while (IsNextTokenValid(enumerator, TokenType.MemberSeparator));
if (!IsNextTokenValid(enumerator, TokenType.RightCurlyBracket))
{
enumerator.RestoreLastSavedPosition();
return false;
}
expression = tuple;
enumerator.RemoveLastSavedState();
return true;
}