public MdxMember ParseMember(string source)
{
string trimmedSource = source.Trim();
var tokens = _lexer.Tokenize(trimmedSource);
var enumerator = tokens.GetStatedTwoWayEnumerator();
MdxExpressionBase expression;
if (!TryParseMember(enumerator, out expression))
{
var tokensLeft = new List<Token>();
while (enumerator.MoveNext())
tokensLeft.Add(enumerator.Current);
throw new ArgumentException(string.Format("Cannot parse the expression. There are no such rules. {0}.", string.Join(", ", tokensLeft)));
}
if (!IsNextTokenValid(enumerator, TokenType.LastToken))
{
var tokensLeft = new List<Token>();
while (enumerator.MoveNext())
tokensLeft.Add(enumerator.Current);
throw new ArgumentException(string.Format("There are tokens left in expression. {0}.", string.Join(", ", tokensLeft)));
}
return (MdxMember)expression;
}