Ejemplo n.º 1
0
        private LuryObject CallUnaryOperator(string op, LuryObject subject)
        {
            subject = Dereference(subject);

            var @operator = subject.GetMember(op, currentContext);

            return(LuryFunction.Call(@operator, subject));
        }
Ejemplo n.º 2
0
        public override LuryObject VisitUnary_expression(LuryParser.Unary_expressionContext context)
        {
            if (context.Op == null)
            {
                var obj = VisitPostfix_expression(context.RefRight);

                if (context.Ref != null)
                {
                    return(obj);
                }

                var testObj = Dereference(obj) as LuryFunction;

                return(testObj != null
                    ? LuryFunction.Call(testObj)
                    : obj);
            }

            var result    = VisitUnary_expression(context.Right);
            var reference = result as LuryReference;

            var op = context.Op;

            switch (op.Text)
            {
            case "++":
                if (reference == null)
                {
                    throw new InvalidOperationException();
                }

                return(reference.Assign(currentContext, CallUnaryOperator(IntrinsicConstants.OperatorInc, result)));

            case "--":
                if (reference == null)
                {
                    throw new InvalidOperationException();
                }

                return(reference.Assign(currentContext, CallUnaryOperator(IntrinsicConstants.OperatorDec, result)));

            case "+":
                return(CallUnaryOperator(IntrinsicConstants.OperatorPos, result));

            case "-":
                return(CallUnaryOperator(IntrinsicConstants.OperatorNeg, result));

            case "!":
                return(CallUnaryOperator(IntrinsicConstants.OperatorInv, result));

            default:
                throw new InvalidOperationException();
            }
        }
Ejemplo n.º 3
0
        public override LuryObject VisitPostfix_expression(LuryParser.Postfix_expressionContext context)
        {
            if (context.Left == null)
            {
                return(VisitChildren(context));
            }

            var left = VisitPostfix_expression(context.Left);

            if (context.Dot != null)
            {
                return(LuryReference.Create(Dereference(left), context.Dot.Text));
            }

            if (context.Op != null)
            {
                var result    = Dereference(left);
                var reference = left as LuryReference;

                if (reference == null)
                {
                    throw new InvalidOperationException();
                }

                reference.Assign(currentContext,
                                 context.Op.Text == "++"
                        ? CallUnaryOperator(IntrinsicConstants.OperatorInc, result)
                        : CallUnaryOperator(IntrinsicConstants.OperatorDec, result));

                return(result);
            }

            if (context.Key != null)
            {
                return(LuryReference.Create(Dereference(left), VisitKey(context.Key)));
            }

            if (context.Call != null)
            {
                if (context.Arguments == null)
                {
                    return(LuryFunction.Call(Dereference(left)));
                }

                var arguments = VisitArgument(context.Arguments);
                return(LuryFunction.Call(Dereference(left), ((List <LuryObject>)arguments.Value).ToArray()));
            }

            throw new InvalidOperationException();
        }
Ejemplo n.º 4
0
        public override LuryObject VisitFor_statement(LuryParser.For_statementContext context)
        {
            // for block
            var forCount = 0;

            currentContext = new LuryContext(currentContext);
            try
            {
                var        @object   = VisitExpression(context.Object);
                var        iterator  = LuryFunction.Call(@object.GetMember(IntrinsicConstants.FunctionIterate, currentContext), @object);
                var        moveNext  = LuryFunction.Call(iterator.GetMember(IntrinsicConstants.FunctionMoveNext, currentContext), iterator);
                var        variable  = context.Variable.Text;
                LuryObject forReturn = null;

                while (moveNext.Equals(LuryBoolean.True))
                {
                    forCount++;
                    var fetchedValue = LuryFunction.Call(iterator.GetMember(IntrinsicConstants.FunctionFetch, currentContext), iterator);
                    currentContext[variable] = fetchedValue;
                    forReturn = VisitSuite(context.ForSuite);
                    moveNext  = LuryFunction.Call(iterator.GetMember(IntrinsicConstants.FunctionMoveNext, currentContext), iterator);
                }

                if (forCount > 0)
                {
                    return(forReturn);
                }
            }
            finally { currentContext = currentContext.Parent; }

            // else block
            if (forCount <= 0 || context.ElseSuite == null)
            {
                return(null);
            }

            LuryObject elseReturn;

            currentContext = new LuryContext(currentContext);
            try
            {
                elseReturn = VisitSuite(context.ElseSuite);
            }
            finally { currentContext = currentContext.Parent; }

            return(elseReturn);
        }