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