示例#1
0
        public override LuryObject VisitPrimary(LuryParser.PrimaryContext context)
        {
            if (context.True != null)
            {
                return(LuryBoolean.True);
            }

            if (context.False != null)
            {
                return(LuryBoolean.False);
            }

            if (context.Nil != null)
            {
                return(LuryNil.Nil);
            }

            if (context.Expression != null)
            {
                return(VisitExpression(context.Expression));
            }

            if (context.Name != null)
            {
                return(LuryReference.Create(context.Name.Text));
            }

            return(VisitLiteral(context.Literal));
        }
示例#2
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();
        }