private ExprParamPair GenChain(PhraseChain stmt, ParamList overlapCandidate)
            {
                Contract.Requires <ArgumentNullException>(stmt != null);
                Contract.Ensures(Contract.Result <ExprParamPair>() != null);
                Contract.Ensures(Contract.Result <ExprParamPair>().Expression != null);
                Contract.Ensures(Contract.Result <ExprParamPair>().Expression.Type != typeof(void));

                ParamList  assigned = null;
                Expression lastExpr = null;
                var        exprs    = new List <Expression>();
                var        local    = new List <ParameterExpression>();

                foreach (var ph in stmt.Phrases)
                {
                    ParameterExpression tmpVar = null;
                    if (lastExpr != null)
                    {
                        tmpVar = Expression.Parameter(lastExpr.Type);
                        exprs.Add(Expression.Assign(tmpVar, lastExpr));
                        local.Add(tmpVar);
                    }
                    exprs.Add(DebugInfo(ph.Range));
                    var pair = GenPhrase(ph, tmpVar, assigned, overlapCandidate);
                    assigned = ParamList.Merge(pair.Parameters, assigned);
                    lastExpr = pair.Expression;
                }
                exprs.Add(lastExpr);
                return(new ExprParamPair(Expression.Block(local, exprs), assigned));
            }
            private ExprParamPair GenChain(PhraseChain stmt, ParamList overlapCandidate)
            {
                Contract.Requires<ArgumentNullException>(stmt != null);
                Contract.Ensures(Contract.Result<ExprParamPair>() != null);
                Contract.Ensures(Contract.Result<ExprParamPair>().Expression != null);
                Contract.Ensures(Contract.Result<ExprParamPair>().Expression.Type != typeof(void));

                ParamList assigned = null;
                Expression lastExpr = null;
                var exprs = new List<Expression>();
                var local = new List<ParameterExpression>();
                foreach (var ph in stmt.Phrases) {
                    ParameterExpression tmpVar = null;
                    if (lastExpr != null) {
                        tmpVar = Expression.Parameter(lastExpr.Type);
                        exprs.Add(Expression.Assign(tmpVar, lastExpr));
                        local.Add(tmpVar);
                    }
                    exprs.Add(DebugInfo(ph.Range));
                    var pair = GenPhrase(ph, tmpVar, assigned, overlapCandidate);
                    assigned = ParamList.Merge(pair.Parameters, assigned);
                    lastExpr = pair.Expression;
                }
                exprs.Add(lastExpr);
                return new ExprParamPair(Expression.Block(local, exprs), assigned);
            }