private IExpression ParseSimpleTermExpression()
{
Token token = this.lexer.NextToken();
if (token == null)
return null;
if (token.TokenType == TokenType.Name && token.Value == "function")
return this.ParseFunctionExpression();
if (token.TokenType == TokenType.Name && token.Value == "typeof")
return new TypeOfExpression(this.ParseExpression());
switch (token.TokenType)
{
case TokenType.Delimiter:
if (token.Value == "(")
{
IExpression expression = this.ParseExpression();
this.Parse(TokenType.Delimiter, ")");
return expression;
}
if (token.Value == "{")
return this.ParseObjectExpression();
if (token.Value == "[")
return this.ParseArrayExpression();
break;
case TokenType.Integer:
int intValue = Int32.Parse(token.Value, System.Globalization.CultureInfo.InvariantCulture);
return new ConstantExpression(intValue);
case TokenType.Real:
double realValue = Double.Parse(token.Value, System.Globalization.CultureInfo.InvariantCulture);
return new ConstantExpression(realValue);
case TokenType.String:
return new ConstantExpression(token.Value);
case TokenType.Name:
if (token.Value == "null")
return new ConstantExpression(null);
if (token.Value == "undefined")
return new ConstantExpression(Undefined.Instance);
if (token.Value == "true")
return new ConstantExpression(true);
if (token.Value == "false")
return new ConstantExpression(false);
IExpression expr = null;
expr = new VariableExpression(token.Value);
if (this.TryParse(TokenType.Delimiter, "("))
{
IList<IExpression> arguments = this.ParseArgumentList();
expr = new InvokeExpression(expr, arguments);
}
return expr;
}
throw new ParserException(string.Format("Unexpected '{0}'", token.Value));
}