public static void Closure(CachedGrammar inst, LinkedHashSet <LRxItem> items) { Grammar g = inst.m_value; IForwardIterator <LRxItem> e1 = items.Begin(); IForwardIterator <LRxItem> e2 = items.Begin(); for (; e1.IsAlive; e1.Add()) { LRxItem current = e1.Value; if (current.IsEnd) { continue; } int ms = current.MarkSymbol; if (!ms.IsTerminal()) { CHashSet <int> la = current.IsLast ? new CHashSet <int>(current.lookahead) : inst.GetFirst(current.express, current.index + 1); IForwardIterator <GItem> e3 = g.Find(ms); do { LRxItem newit = new LRxItem(e3.Value, la); for (; e2.IsAlive; e2.Add()) { if (newit.CoreEquals(e2.Value)) { CHashSet <int> ela = e2.Value.lookahead; if (!ela.IsSupersetOf(la)) { ela.UnionWith(la); } goto exit; } } items.Add(newit); exit: e2.Reset(); } while (e3.LazyAdd()); e3.Dispose(); } } e1.Dispose(); }
private List <LALRState> CreateLALRState(CachedGrammar cg) { List <LALRState> clr = CreateCLRState(cg); List <LALRState> lalr = new List <LALRState>(); int cnt = clr.Count; for (int x = 0; x < cnt; x++) { LALRState current_state = clr[x]; for (int z = x + 1; z < cnt;) { LinkedHashSet <LRxItem> xlist = current_state.items; LinkedHashSet <LRxItem> zlist = clr[z].items; IEqualityComparer <LRxItem> save = xlist.Comparer; xlist.Comparer = LRxItemComparerSlim.Instance; zlist.Comparer = LRxItemComparerSlim.Instance; if (xlist.SetEquals(zlist)) { IEnumerator <LRxItem> e1 = xlist.GetEnumerator(); while (e1.MoveNext()) { LRxItem now = e1.Current; IEnumerator <LRxItem> e2 = zlist.GetEnumerator(); while (e2.MoveNext()) { if (now.CoreEquals(e2.Current)) { now.lookahead.UnionWith(e2.Current.lookahead); break; } } e2.Dispose(); } e1.Dispose(); xlist.Comparer = save; zlist.Comparer = save; for (int a = 0; a < cnt; a++) { Map <LALRState> map = clr[a].map; KeyValuePair <int, LALRState>[] kvs = map.ToArray(); for (int b = 0, bm = kvs.Length; b < bm; b++) { if (kvs[b].Value.items.SetEquals(zlist)) { map.Add(kvs[b].Key, current_state); } } } clr.RemoveAt(z); cnt--; } else { xlist.Comparer = save; zlist.Comparer = save; z++; } } lalr.Add(current_state); } clr.Clear(); return(lalr); }