public int Pos(TAlternativeParserEnlargerStep AStep)
        {
            int plen = AStep.Count;
            int slen = Count;
            int pindx;
            int cmppos;
            int endpos;

            for (endpos = plen - 1; endpos < slen;)
            {
                for (cmppos = endpos, pindx = (plen - 1); pindx >= 0; cmppos--, pindx--)
                {
                    if (GetItems(cmppos).TFS != AStep.GetItems(pindx).TFS)
                    {
                        endpos += 1;
                        break;
                    }
                }
                if (pindx < 0)
                {
                    return(endpos - (plen - 1));
                }
            }
            return(-1);
        }
        void DoEnlarge()
        {
            int m, cnt, index, r_f, r_pos, m_id;
            TAlternativeParserEnlargerStep MStep;
            TAlternativeParserEnlargerItem A, B;
            TDynamicArray DM = new TDynamicArray();

            MStep = new TAlternativeParserEnlargerStep();
            int  c_trash;
            bool go = true;

            while (go)
            {
                go      = false;
                m       = FindMax().Count;
                cnt     = Count;
                c_trash = 0;
                for (int i = m; i >= 1; i--)
                {
                    DM.Clear();
                    for (int j = 0; j <= cnt - 1; j++)
                    {
                        A = GetItems(j);
                        MStep.Clear();
                        index = 0;
                        r_f   = A.FillStep(MStep, index, i);
                        DM.Append(A);
                        while (r_f > 0)
                        {
                            m_id = SharedConst.NextTrashItemID();
                            for (int k = 0; k <= cnt - 1; k++)
                            {
                                B = GetItems(k);
                                if (DM.Find(B) == null)
                                {
                                    r_pos = B.Pos(MStep);
                                    if (r_pos >= 0)
                                    {
                                        CreateTrashItem(A.GetItems(index), i, A, m_id);
                                        CreateTrashItem(B.GetItems(r_pos), i, B, m_id);
                                        c_trash++;
                                    }
                                }
                            }
                            MStep.Clear();
                            r_f = A.FillStep(MStep, ++index, i);
                        }
                    }
                    if (c_trash > 0)
                    {
                        Restruct();
                        go = true;
                        break;
                    }
                }
            }
            MStep = null;
            DM    = null;
        }
        public int FillStep(TAlternativeParserEnlargerStep AStep, int APos, int ACount)
        {
            int res = -1;
            int d   = Count;

            if ((d - APos - ACount + 1) > 0)
            {
                for (res = APos; res <= APos + ACount - 1; res++)
                {
                    AStep.AddItem(GetItems(res));
                }
            }
            return(res);
        }