public object EvaluateSub(Environment env, int layer, int type) { if (HasSuffix(layer)) { if (layer > 65535) { throw new LepException("too much suffix", this); } object target = EvaluateSub(env, layer + 1, type); IAstNode current = Suffix(layer); ArgumentNode arg = current as ArgumentNode; if (arg != null) { return(arg.Evaluate(env, target)); } ExpressionArgumentNode exprArg = current as ExpressionArgumentNode; if (exprArg != null) { return(exprArg.Evaluate(env, target)); } ArrayReferenceNode arrRef = current as ArrayReferenceNode; if (arrRef != null) { return(arrRef.Evaluate(env, target)); } throw new LepException("bad suffix", this); } else if (Operand is NameNode) { return(((NameNode)Operand).Evaluate(env, type)); } else { return(Operand.Evaluate(env)); } }
private object Assign(Environment env, PrimaryNode left, string op, object rvalue, int type) { if (env == null) { throw new ArgumentNullException(nameof(env), "null environment"); } if (left == null) { throw new ArgumentNullException(nameof(left), "null left name"); } if (op == null) { throw new ArgumentNullException(nameof(op), "null operator"); } if (left.IsName) { NameNode var = (NameNode)left.Operand; if (op == "=") { env.Set(var.Name, rvalue, type); return(rvalue); } else { object name = env.Get(var.Name, type); if (name == null) { throw new LepException("undefined name: " + var.Name, this); } else { object result = ComputeOperator(name, op.Substring(0, op.Length - 1), rvalue); env.Set(var.Name, result, type); return(result); } } } else { ArrayReferenceNode arrRef = left.Suffix(0) as ArrayReferenceNode; if (arrRef != null) { object lvalue = left.EvaluateSub(env, 1, type); object[] arr = lvalue as object[]; if (arr != null) { object index = arrRef.Index.Evaluate(env); if (index is int) { return(arr[(int)index] = rvalue); } } Dictionary <object, object> table = lvalue as Dictionary <object, object>; if (table != null) { object index = arrRef.Index.Evaluate(env); return(table[index] = rvalue); } } } throw new LepException("bad assignment", this); }