Ejemplo n.º 1
0
        /// <summary>
        /// Assign a value to an expression.
        /// </summary>
        /// <param name="expr">The assignment expressions</param>
        /// <returns></returns>
        public object VisitAssign(AssignExpr expr)
        {
            var ctx = expr.Ctx;
            var varExpr = expr.VarExp;
            var valueExpr = expr.ValueExp;
            var node = expr;
            var isDeclaration = expr.IsDeclaration;

            // CASE 1: Assign variable.  a = 1
            if (varExpr.IsNodeType(NodeTypes.SysVariable))
            {
                AssignHelper.SetVariableValue(ctx, this, node, isDeclaration, varExpr, valueExpr);
            }
            // CASE 2: Assign member.
            //      e.g. dictionary       :  user.name = 'kishore'
            //      e.g. property on class:  user.age  = 20
            else if (varExpr.IsNodeType(NodeTypes.SysMemberAccess))
            {
                AssignHelper.SetMemberValue(ctx, this, node, varExpr, valueExpr);
            }
            // Case 3: Assign value to index: "users[0]" = <expression>;
            else if (varExpr.IsNodeType(NodeTypes.SysIndex))
            {
                AssignHelper.SetIndexValue(ctx, this, node, varExpr, valueExpr);
            }
            return LObjects.Null;
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Visits the var statement tree.
 /// </summary>
 /// <param name="assignExpr"></param>
 public object VisitAssign(AssignExpr expr)
 {
     _callBackOnNodeStart(expr);
     expr.VarExp.Visit(this);
     if (expr.ValueExp != null)
         expr.ValueExp.Visit(this);
     return null;
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Creates a unary expression with symbol scope, context, script refernce set.
 /// </summary>
 /// <param name="name"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public static Expr Assign(bool declare, Expr left, Expr right, TokenData token)
 {
     var exp = new AssignExpr();
     exp.IsDeclaration = declare;
     exp.VarExp = left;
     exp.ValueExp = right;
     SetupContext(exp, token);
     return exp;
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Creates a unary expression with symbol scope, context, script refernce set.
 /// </summary>
 /// <param name="name"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public Expr ToAssignExpr(bool declare, Expr left, Expr right, TokenData token)
 {
     var exp = new AssignExpr(declare, left, right);
     this.SetupContext(exp, token);
     return exp;
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Parses unary
        /// 1. ndx++
        /// 2. ndx--
        /// 3. ndx += 2 
        /// 4. ndx -= 2
        /// 5. ndx *= 2
        /// 6. ndx /= 2
        /// </summary>
        /// <param name="name"></param>
        /// <param name="useSemicolonAsTerminator"></param>
        /// <returns></returns>
        public Expr ParseUnary(string name, bool useSemicolonAsTerminator = true)
        {
            var idToken = _tokenIt.LastToken;
            var opToken = _tokenIt.NextToken;
            var op = Operators.ToOp(_tokenIt.NextToken.Token.Text);
            AssignExpr stmt = null;
            _tokenIt.Advance();

            // 1. Create variable expression from the name
            var nameExpr = this.ToIdentExpr(name, idToken);

            // ++ --
            if (_tokenIt.IsEndOfStmtOrBlock())
            {
                var unaryVal = this.ToUnaryExpr(name, null, 1.0, op, opToken);
                stmt = new AssignExpr(false, nameExpr, unaryVal);
                _tokenIt.ExpectEndOfStmt();
            }
            else // += -= *= -=
            {
                var endTokens = useSemicolonAsTerminator ? Terminators.ExpStatementEnd : Terminators.ExpParenthesisEnd;
                var incExpr = ParseExpression(endTokens);
                var unaryVal = this.ToUnaryExpr(name, incExpr, -1, op, opToken);
                stmt = new AssignExpr(false, nameExpr, unaryVal);
            }
            this.SetupContext(stmt, idToken);
            return stmt;
        }