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); }