public static Object.Object Eval(Ast.Node node, Object.Environment env) { if (node is Ast.Program) { return(EvalProgram((Ast.Program)node, env)); } if (node is Ast.ExpressionStatement) { return(Eval(((Ast.ExpressionStatement)node).Expression, env)); } if (node is Ast.IntegerLiteral) { return(new Object.Integer { Value = ((Ast.IntegerLiteral)node).Value }); } if (node is Ast.Boolean) { return(NativeBoolToBooleanObject(((Ast.Boolean)node).Value)); } if (node is Ast.PrefixExpression) { Object.Object right = Eval(((Ast.PrefixExpression)node).Right, env); if (IsError(right)) { return(right); } return(EvalPrefixExpression(((Ast.PrefixExpression)node).Operator, right)); } if (node is Ast.InfixExpression) { Object.Object left = Eval(((Ast.InfixExpression)node).Left, env); if (IsError(left)) { return(left); } Object.Object right = Eval(((Ast.InfixExpression)node).Right, env); if (IsError(right)) { return(right); } return(EvalInfixExpression(((Ast.InfixExpression)node).Operator, left, right)); } if (node is Ast.BlockStatement) { return(EvalBlockStatement((Ast.BlockStatement)node, env)); } if (node is Ast.IfExpression) { return(EvalIfExpression((Ast.IfExpression)node, env)); } if (node is Ast.ReturnStatement) { Object.Object val = Eval(((Ast.ReturnStatement)node).ReturnValue, env); if (IsError(val)) { return(val); } return(new Object.ReturnValue { Value = val }); } if (node is Ast.LetStatement) { Object.Object val = Eval(((Ast.LetStatement)node).Value, env); if (IsError(val)) { return(val); } env.Set(((Ast.LetStatement)node).Name.Value, val); } if (node is Ast.Identifier) { return(EvalIdentifier((Ast.Identifier)node, env)); } if (node is Ast.FunctionLiteral) { Ast.FunctionLiteral func = node as Ast.FunctionLiteral; return(new Object.Function { Parameters = func.Parameters, Env = env, Body = func.Body }); } if (node is Ast.CallExpression) { Object.Object function = Eval(((Ast.CallExpression)node).Function, env); if (IsError(function)) { return(function); } var args = EvalExpressions(((Ast.CallExpression)node).Arguments, env); if (args.Count() == 1 && IsError(args.First())) { return(args.First()); } return(ApplyFunction(function, args)); } if (node is StringLiteral) { return(new Object.Strings { Value = ((StringLiteral)node).Value }); } if (node is ArrayLiteral) { var elements = EvalExpressions(((ArrayLiteral)node).Elements, env); if (elements.Count == 1 && IsError(elements[0])) { return(elements.First()); } return(new Object.Array { Elements = elements }); } if (node is IndexExpression) { Object.Object left = Eval(((IndexExpression)node).Left, env); if (IsError(left)) { return(left); } Object.Object index = Eval(((IndexExpression)node).Index, env); if (IsError(index)) { return(index); } return(EvalIndexExpression(left, index)); } if (node is HashLiteral) { return(EvalHashLiteral(node as HashLiteral, env)); } return(null); }
public abstract Query ApplyOrderBy(Ast.Node node, bool isDescending);
public VoidNode(Ast.Node target) : base(NodeType.Void) { Target = target; }
public abstract Query ApplyWhere(Ast.Node node);