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)); }
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(); }