internal static bool TryParseExpression(IStatedTwoWayEnumerator<Token> enumerator, out MdxExpressionBase expression)
{
enumerator.SavePosition();
expression = null;
var mdxExpression = Mdx.Expression();
//TODO: Think how to apply NOT and -
do
{
MdxExpressionBase childExpression;
if (TryParseFunction(enumerator, out childExpression))
{
mdxExpression.WithOperand((MdxFunction) childExpression);
}
else if (TryParseTuple(enumerator, out childExpression))
{
mdxExpression.WithOperand((MdxTuple)childExpression);
}
else if (TryParseSet(enumerator, out childExpression))
{
mdxExpression.WithOperand((MdxSet)childExpression);
}
else if (TryParseRange(enumerator, out childExpression))
{
mdxExpression.WithOperand((MdxRange)childExpression);
}
else if (TryParseMember(enumerator, out childExpression))
{
mdxExpression.WithOperand((MdxMember)childExpression);
}
else if (TryParseConstantValue(enumerator, out childExpression))
{
mdxExpression.WithOperand((MdxConstantExpression)childExpression);
}
else if (IsNextTokenValid(enumerator, TokenType.NotOperator))
{
if (!TryParseExpression(enumerator, out childExpression))
{
enumerator.RestoreLastSavedPosition();
return false;
}
mdxExpression.WithOperand(((MdxExpression)childExpression).AsNegated());
}
else if (IsNextTokenValid(enumerator, TokenType.LeftRoundBracket))
{
if (!TryParseExpression(enumerator, out childExpression))
{
enumerator.RestoreLastSavedPosition();
return false;
}
mdxExpression.WithOperand((MdxExpression)childExpression);
if (!IsNextTokenValid(enumerator, TokenType.RightRoundBracket))
{
enumerator.RestoreLastSavedPosition();
return false;
}
}
else
{
enumerator.RestoreLastSavedPosition();
return false;
}
if (!IsNextTokenValid(enumerator, TokenType.MathsOperator) &&
!IsNextTokenValid(enumerator, TokenType.LogicsOperator))
break;
mdxExpression.WithOperator(enumerator.Current.Value);
} while (true);
expression = mdxExpression;
enumerator.RemoveLastSavedState();
return true;
}