/// <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; }
/// <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; }
/// <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; }
/// <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; }
/// <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; }