private LuryObject CallUnaryOperator(string op, LuryObject subject) { subject = Dereference(subject); var @operator = subject.GetMember(op, currentContext); return(LuryFunction.Call(@operator, subject)); }
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(); } }
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(); }
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); }