예제 #1
0
        public override object Walk(LeftAssignmentExpression node)
        {
            // Identifier, resolve from scope
            if (node.Variable is Identifier)
            {
                var scope = Context.CurrentFrame;
                var var = ((Identifier)node.Variable);
                var suffix = new PropertyReferenceSuffix { Identifier = var };
                var lvThunk = (Func<object>)(() => var.Accept(this));
                var rvThunk = (Func<object>)(() => node.Operand.Accept(this));
                return AssignSwitch(node.Operator.Text, scope, suffix, lvThunk, rvThunk);
            }
            else
            {
                var suffixes = node.Variable is MemberExpression
                                           ? ((MemberExpression)node.Variable).Suffixes
                                           : ((CallExpression)node.Variable).Suffixes;
                var secondLastObject = node.Variable is MemberExpression
                                           ? Member((MemberExpression)node.Variable, suffixes.ExceptLast())
                                           : Call((CallExpression)node.Variable, suffixes.ExceptLast());
                var lvThunk = (Func<object>)(() =>
                    node.Variable is MemberExpression
                                           ? Member((MemberExpression)node.Variable, suffixes)
                                           : Call((CallExpression)node.Variable, suffixes));
                var rvThunk = (Func<object>) (() => node.Operand.Accept(this));
                var suffix = suffixes[suffixes.Count - 1];

                // Static .NET, Console.Out = ...)
                if (secondLastObject is Type)
                {
                    return AssignSwitch(node.Operator.Text, secondLastObject, suffix, lvThunk, rvThunk, true);
                }
                return AssignSwitch(node.Operator.Text, secondLastObject, suffix, lvThunk, rvThunk);
            }
        }
예제 #2
0
 public virtual object Walk(LeftAssignmentExpression node)
 {
     if (Enter(node))
     {
         node.Variable.Accept(this);
         node.Operand.Accept(this);
     }
     Exit(node);
     return(null);
 }
예제 #3
0
        private LeftAssignmentExpression ParseLeftAssignmentExpression()
        {
            var exp = new LeftAssignmentExpression
            {
                Token    = Next(),
                Variable = ParseLeftHandSideExpression(),
                Operator = Next()
            };

            Match(TokenType.OpAssign);
            exp.Operand = ParseAssignmentExpression();
            return(exp);
        }
        public override object Walk(LeftAssignmentExpression node)
        {
            // Identifier, resolve from scope
            if (node.Variable is Identifier)
            {
                var scope  = Context.CurrentFrame;
                var var    = ((Identifier)node.Variable);
                var suffix = new PropertyReferenceSuffix {
                    Identifier = var
                };
                var lvThunk = (Func <object>)(() => var.Accept(this));
                var rvThunk = (Func <object>)(() => node.Operand.Accept(this));
                return(AssignSwitch(node.Operator.Text, scope, suffix, lvThunk, rvThunk));
            }
            else
            {
                var suffixes = node.Variable is MemberExpression
                                           ? ((MemberExpression)node.Variable).Suffixes
                                           : ((CallExpression)node.Variable).Suffixes;
                var secondLastObject = node.Variable is MemberExpression
                                           ? Member((MemberExpression)node.Variable, suffixes.ExceptLast())
                                           : Call((CallExpression)node.Variable, suffixes.ExceptLast());

                var lvThunk = (Func <object>)(() =>
                                              node.Variable is MemberExpression
                                           ? Member((MemberExpression)node.Variable, suffixes)
                                           : Call((CallExpression)node.Variable, suffixes));
                var rvThunk = (Func <object>)(() => node.Operand.Accept(this));
                var suffix  = suffixes[suffixes.Count - 1];

                // Static .NET, Console.Out = ...)
                if (secondLastObject is Type)
                {
                    return(AssignSwitch(node.Operator.Text, secondLastObject, suffix, lvThunk, rvThunk, true));
                }
                return(AssignSwitch(node.Operator.Text, secondLastObject, suffix, lvThunk, rvThunk));
            }
        }
예제 #5
0
 public override void Exit(LeftAssignmentExpression node)
 {
     level--;
 }
예제 #6
0
 public override bool Enter(LeftAssignmentExpression node)
 {
     Print("LeftAssignmentExpression {0}", node.Operator);
     level++;
     return true;
 }
예제 #7
0
 public virtual bool Enter(LeftAssignmentExpression node)
 {
     return true;
 }
예제 #8
0
 public virtual void Exit(LeftAssignmentExpression node)
 {
 }
 public virtual void Exit(LeftAssignmentExpression node)
 {
 }
 public virtual bool Enter(LeftAssignmentExpression node)
 {
     return(true);
 }
예제 #11
0
 public override void Exit(LeftAssignmentExpression node)
 {
     level--;
 }
예제 #12
0
 public override bool Enter(LeftAssignmentExpression node)
 {
     Print("LeftAssignmentExpression {0}", node.Operator);
     level++;
     return(true);
 }
예제 #13
0
파일: Parser.cs 프로젝트: buunguyen/bike
 private LeftAssignmentExpression ParseLeftAssignmentExpression()
 {
     var exp = new LeftAssignmentExpression
                   {
                       Token = Next(),
                       Variable = ParseLeftHandSideExpression(),
                       Operator = Next()
                   };
     Match(TokenType.OpAssign);
     exp.Operand = ParseAssignmentExpression();
     return exp;
 }
예제 #14
0
 public virtual object Walk(LeftAssignmentExpression node)
 {
     if (Enter(node))
     {
         node.Variable.Accept(this);
         node.Operand.Accept(this);
     }
     Exit(node);
     return null;
 }