private Expression ParseIdentifier()
{
ValidateToken(TokenId.Identifier);
object value;
if (_keywords.TryGetValue(_token.Text, out value))
{
var type = value as Type;
if (type != null)
return ParseTypeAccess(type);
if (value == (object) KEYWORD_IT) return ParseIt();
if (value == (object) KEYWORD_IIF) return ParseIif();
if (value == (object) KEYWORD_NEW) return ParseNewObject();
if (value == (object) KEYWORD_IFNONE) return ParseIfNone();
NextToken();
return (Expression) value;
}
if (_symbols.TryGetValue(_token.Text, out value) ||
_externals != null && _externals.TryGetValue(_token.Text, out value))
{
var expr = value as Expression;
if (expr == null)
{
expr = Expression.Constant(value);
}
else
{
var lambda = expr as LambdaExpression;
if (lambda != null) return ParseLambdaInvocation(lambda);
}
NextToken();
return expr;
}
// Convert f(x) => x.f()
if (_it != null) return ParseMemberAccess(null, _it);
throw ParseError(Res.UnknownIdentifier(_token.Text));
}