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