internal static bool TryParseAxis(IStatedTwoWayEnumerator<Token> enumerator, out MdxExpressionBase expression)
{
enumerator.SavePosition();
expression = null;
var axis = Mdx.Axis();
if (IsNextTokenValid(enumerator, TokenType.Non))
{
if (!IsNextTokenValid(enumerator, TokenType.Empty))
{
enumerator.RestoreLastSavedPosition();
return false;
}
axis.AsNonEmpty();
}
MdxExpressionBase slicer;
if (TryParseTuple(enumerator, out slicer))
{
axis.WithSlicer((MdxTuple)slicer);
}
else if (TryParseSet(enumerator, out slicer))
{
axis.WithSlicer(Mdx.Tuple().With((MdxSet)slicer));
}
else if (TryParseRange(enumerator, out slicer))
{
axis.WithSlicer(Mdx.Tuple().With((MdxRange)slicer));
}
else if (TryParseMember(enumerator, out slicer))
{
axis.WithSlicer(Mdx.Tuple().With((MdxMember)slicer));
}
else if (TryParseFunction(enumerator, out slicer))
{
axis.WithSlicer(Mdx.Tuple().With((MdxFunction)slicer));
}
else
{
enumerator.RestoreLastSavedPosition();
return false;
}
if (IsNextTokenValid(enumerator, TokenType.Dimension))
{
if (!IsNextTokenValid(enumerator, TokenType.Properties))
{
enumerator.RestoreLastSavedPosition();
return false;
}
do
{
if (!IsNextTokenValid(enumerator, TokenType.DimensionProperty))
{
enumerator.RestoreLastSavedPosition();
return false;
}
axis.WithProperties(enumerator.Current.Value);
} while (IsNextTokenValid(enumerator, TokenType.MemberSeparator));
}
else if (IsNextTokenValid(enumerator, TokenType.Properties))
{
do
{
if (!IsNextTokenValid(enumerator, TokenType.DimensionProperty))
{
enumerator.RestoreLastSavedPosition();
return false;
}
axis.WithProperties(enumerator.Current.Value);
} while (IsNextTokenValid(enumerator, TokenType.MemberSeparator));
}
if (!IsNextTokenValid(enumerator, TokenType.On))
{
enumerator.RestoreLastSavedPosition();
return false;
}
if (!IsNextTokenValid(enumerator, TokenType.AxisNameIdentifier) &&
!IsNextTokenValid(enumerator, TokenType.NumberExpression))
{
enumerator.RestoreLastSavedPosition();
return false;
}
string axisName = enumerator.Current.Value;
axis.Titled(axisName);
expression = axis;
enumerator.RemoveLastSavedState();
return true;
}