Beispiel #1
0
        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();
        }
Beispiel #2
0
        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);
        }