internal override int TryAddVariable(IEnumerable <Token> tokens, Token token, ICollection <Variable> variables, int i)
        {
            var branchVariable = new SwitchBranchVariable
            {
                Value = token.Flag
            };

            variables.Add(branchVariable);

            var nextToken = tokens.ElementAt(i + 1);

            if (nextToken.Flag != Strings.StartFlag1)
            {
                throw new ArgumentException(Tokens[0]);
            }

            var paramToken = tokens.ElementAt(i + 2);
            var variable   = new ConstVariable
            {
                Value = paramToken.Flag
            };

            branchVariable.Param = variable;

            var nextCloseToken = tokens.ElementAt(i + 3);

            if (nextCloseToken.Flag != Strings.EndFlag1)
            {
                throw new ArgumentException(Tokens[0]);
            }

            var n = tokens.Count();
            ICollection <Token> subTokens = new List <Token>();

            Util.CollectionTokens(tokens, subTokens, i + 4, Strings.StartFlag2, Strings.EndFlag2);
            branchVariable.Variables = GetCaseVariables(subTokens);
            return(i + 3 + subTokens.Count());
        }
示例#2
0
        internal override int BuilderExpression(Context context)
        {
            SwitchBranchVariable       switchBranch  = (SwitchBranchVariable)context.Variable;
            IEnumerable <CaseVariable> caseVariables = (IEnumerable <CaseVariable>)switchBranch.Variables;
            var cases = caseVariables.Where(v => !v.Default && v.Variables != null && v.Variables.Any()).Select(
                c => {
                ICollection <Expression> expressions = new List <Expression>();
                ExpressionBuilder.BuildExpression(expressions, c.Variables, context.ValuePairs, context.Datas);
                var values = c.ConstVariable.Select(v => ExpressionBuilder.GetExpression(v, context.ValuePairs, context.Datas));
                return(Expression.SwitchCase(Expression.Block(expressions), values));
            }
                ).ToArray();

            var        defaultCase = caseVariables.FirstOrDefault(c => c.Default);
            Expression defaultBody = null;

            if (defaultCase != null)
            {
                ICollection <Expression> expressions = new List <Expression>();
                ExpressionBuilder.BuildExpression(expressions, defaultCase.Variables, context.ValuePairs, context.Datas);
                var values = defaultCase.ConstVariable.Select(v => ExpressionBuilder.GetExpression(v, context.ValuePairs, context.Datas));
                defaultBody = Expression.Block(expressions);
            }
            else
            {
                var firstType = cases.First().Body.Type;
                defaultBody = Expression.Block(firstType, Expression.Constant(Activator.CreateInstance(firstType)));
            }

            var param = ExpressionBuilder.GetExpression(switchBranch.Param, context.ValuePairs, context.Datas);
            SwitchExpression switchExpression = Expression.Switch(param, defaultBody, cases);

            context.Expressions.Add(switchExpression);
            context.ExcuteParams.Clear();

            return(context.Index);
        }