예제 #1
0
        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);
        }
예제 #2
0
        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);
        }