Пример #1
0
        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));
            }
        }
Пример #2
0
        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);
        }