3 namespace Mercury.Interpreting
15 internal sealed
class Evaluator<T> : Argument
19 private bool evaluated;
20 private Argument[] args;
23 private InterpreterAction<T> action;
24 private InterpreterContext<T> context;
28 public Evaluator(InterpreterAction<T> action, Argument[] args,
30 : base(action.ReturnType, null)
32 if (action == null)
throw new ArgumentNullException(
"action");
33 if (args == null)
throw new ArgumentNullException(
"args");
34 if (eval == null)
throw new ArgumentNullException(
"eval");
36 this.evaluated =
false;
40 this.context = context;
45 internal override object Data
49 if (evaluated)
return base.Data;
52 var type = context.reqtp;
54 for(
int argix = 0; argix < args.Length; ++argix)
60 context.reqtp = argtp;
61 if ((args[argix].Data == null) && (!argtp.HasFlag(ArgumentType.Null)))
64 tpix = Math.Min(action.ArgumentTypes.Length - 1, ++tpix);
68 context.action = action.Name;
69 context.LogEntryEx(
"(Evaluator)",
"invoking {0}", action.Name);
71 base.Data = action.Invoke(args, eval, context);
73 context.LogEntryEx(
"(Evaluator)",
"action {0} returned [{1}]",
74 action.Name, base.Data == null ?
"(null)" : base.Data.ToString());
delegate T RecursiveEval< T >(Tree< Symbol > tree, InterpreterContext< T > context)
Delegate type for recursive evaluation (interpretation)
ArgumentType
Defines argument types using in the Mercury library