Exemple #1
0
            static bool _SymEq(_LrtSymbol x, _LrtSymbol y)
            {
                if (ReferenceEquals(x, y))
                {
                    return(true);
                }
                else if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
                {
                    return(false);
                }
                var lhs = x;

                if (ReferenceEquals(lhs, null))
                {
                    return(false);
                }
                var rhs = y;

                if (ReferenceEquals(rhs, null))
                {
                    return(false);
                }

                return(Equals(lhs.Id, rhs.Id));
            }
Exemple #2
0
        static CfgDocument _ToLRTransitionGrammar(CfgDocument cfg, Lrfa lrfa, IProgress <CfgLalr1Progress> progress)
        {
            var result   = new CfgDocument();
            var closure  = new List <Lrfa>();
            var itemSets = new List <ICollection <LRItem> >();

            lrfa.FillClosure(closure);
            foreach (var p in closure)
            {
                itemSets.Add(p.AcceptSymbol);
            }

            _LrtSymbol start = null;
            int        j     = 0;

            foreach (var p in closure)
            {
                if (null != progress)
                {
                    progress.Report(new CfgLalr1Progress(CfgLalr1Status.CreatingLookaheadGrammar, j));
                }

                int si = itemSets.IndexOf(p.AcceptSymbol, _LRItemSetComparer.Default);

                foreach (var item in p.AcceptSymbol)
                {
                    if (0 == item.RightIndex)
                    {
                        var next = item.RightIndex < item.Rule.Right.Count ? item.Rule.Right[item.RightIndex] : null;
                        var rule = item.Rule;
                        if (item.RightIndex < item.Rule.Right.Count)
                        {
                            int  dst = -1;
                            Lrfa dsts;
                            if (p.Transitions.ContainsKey(rule.Left))
                            {
                                dsts = p.Transitions[rule.Left];
                                dst  = itemSets.IndexOf(dsts.AcceptSymbol, _LRItemSetComparer.Default);
                            }

                            _LrtSymbol left = new _LrtSymbol(si, rule.Left, dst);
                            if (null == start)
                            {
                                start = left;
                            }
                            var right = new List <string>();
                            var pc    = p;
                            foreach (var sym in rule.Right)
                            {
                                int        s1 = itemSets.IndexOf(pc.AcceptSymbol, _LRItemSetComparer.Default);
                                var        pt = pc.Transitions[sym];
                                int        s2 = itemSets.IndexOf(pt.AcceptSymbol, _LRItemSetComparer.Default);
                                _LrtSymbol n  = new _LrtSymbol(s1, sym, s2);
                                right.Add(n.ToString());
                                pc = pt;
                            }
                            result.Rules.Add(new CfgRule(left.ToString(), right));
                        }
                    }
                }
                ++j;
            }
            result.StartSymbol = start.ToString();
            return(result);
        }