public override Expression VisitAssignment(AssignmentContext context) { var unaryExpression = Visit(context.unary_expression()); var expression = Visit(context.expression()); var op = context.assignment_operator().GetText(); if (op == "=") { return(Expression.Assign(unaryExpression, expression)); } if (op == "+=") { return(Expression.AddAssign(unaryExpression, expression)); } if (op == "-=") { return(Expression.SubtractAssign(unaryExpression, expression)); } if (op == "*=") { return(Expression.MultiplyAssign(unaryExpression, expression)); } if (op == "/=") { return(Expression.DivideAssign(unaryExpression, expression)); } if (op == "%=") { return(Expression.ModuloAssign(unaryExpression, expression)); } if (op == "&=") { return(Expression.AndAssign(unaryExpression, expression)); } if (op == "|=") { return(Expression.OrAssign(unaryExpression, expression)); } if (op == "^=") { return(Expression.ExclusiveOrAssign(unaryExpression, expression)); } if (op == "<<=") { return(Expression.LeftShiftAssign(unaryExpression, expression)); } if (op == ">>=") { return(Expression.RightShiftAssign(unaryExpression, expression)); } throw new CompilationException($"Unsupported operation. Operation={op}", context); }
public override SLValue VisitAssignment(AssignmentContext ctx) { SLValue newVal = this.Visit(ctx.expression()); if (ctx.indexes() != null) { SLValue val = _scope.resolve(ctx.Identifier().GetText()); List <ExpressionContext> exps = ctx.indexes().expression().ToList(); if (val == null) { throw new EvalException(ctx); } SetAtIndex(ctx, exps, val, newVal); } else { String id = ctx.Identifier().GetText(); _scope.GlobalAssign(id, newVal); } return(SLValue.VOID); }