ExpandAndAssignAll(this LanguageValueAccess valueAccess, IGMacBinding pattern)
        {
            valueAccess = ReduceMultivectorAccess(valueAccess);

            var accessStack = new Stack <LanguageValueAccess>();

            accessStack.Push(valueAccess);

            var valuesStack = new Stack <IGMacBinding>();

            valuesStack.Push(pattern);

            while (valuesStack.Count > 0)
            {
                var rootValueAccess = accessStack.Pop();
                var rootValue       = valuesStack.Pop();

                var scalarPattern = rootValue as GMacScalarBinding;

                if (scalarPattern != null)
                {
                    yield return
                        (new Tuple <LanguageValueAccess, GMacScalarBinding>(
                             rootValueAccess,
                             scalarPattern
                             ));

                    continue;
                }

                var mvPattern = rootValue as GMacMultivectorBinding;

                if (mvPattern != null)
                {
                    var scalarType = mvPattern.ScalarType;

                    var s = rootValueAccess.LastAccessStep as ValueAccessStepByKeyList <int>;

                    var partialMvFlag = !ReferenceEquals(s, null);

                    var idsList =
                        partialMvFlag
                            ? s.AccessKeyList
                            : null;

                    foreach (var pair in mvPattern)
                    {
                        var id = pair.Key;

                        if (!ReferenceEquals(idsList, null) && !idsList.Contains(id))
                        {
                            continue;
                        }

                        var childValueAccess =
                            partialMvFlag
                                ? rootValueAccess.DuplicateExceptLast().Append(id, scalarType.AssociatedPrimitiveType)
                                : rootValueAccess.Duplicate().Append(id, scalarType.AssociatedPrimitiveType);

                        yield return
                            (new Tuple <LanguageValueAccess, GMacScalarBinding>(
                                 childValueAccess,
                                 mvPattern[id]
                                 ));
                    }

                    continue;
                }

                var structPattern = rootValue as GMacStructureBinding;

                if (structPattern == null)
                {
                    continue;
                }

                foreach (var pair in structPattern)
                {
                    var dataMemberName = pair.Key;

                    var dataMember = structPattern.BaseStructure.AssociatedStructure.GetDataMember(dataMemberName);

                    var childValueAccess =
                        rootValueAccess
                        .Duplicate()
                        .Append(dataMember.ObjectName, dataMember.SymbolType);

                    var structMemberScalarPattern = pair.Value as GMacScalarBinding;

                    if (structMemberScalarPattern != null)
                    {
                        yield return
                            (new Tuple <LanguageValueAccess, GMacScalarBinding>(
                                 childValueAccess,
                                 structMemberScalarPattern
                                 ));
                    }

                    else
                    {
                        accessStack.Push(childValueAccess);
                        valuesStack.Push(pair.Value);
                    }
                }
            }
        }
 ExpandAndAssignAll(this SymbolLValue symbol, IGMacBinding pattern)
 {
     return(ExpandAndAssignAll(LanguageValueAccess.Create(symbol), pattern));
 }