Exemple #1
0
 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);
Exemple #3
0
 public VoidNode(Ast.Node target)
     : base(NodeType.Void)
 {
     Target = target;
 }
 public abstract Query ApplyWhere(Ast.Node node);