_LR0ItemSet _FillLRMove(_LR0ItemSet itemSet, string input, IProgress <CfgLRProgress> progress, _LR0ItemSet result = null) { if (null == result) { result = new _LR0ItemSet(); } int i = 0; foreach (var item in itemSet.Items) { if (null != progress) { progress.Report(new CfgLRProgress(CfgLRStatus.ComputingMove, i)); } var next = item.Next; if (!item.IsEnd) { if (Equals(next, input)) { var lri = new _LR0Item(item.Left, item.Right, item.RightIndex + 1); result.AddItem(lri); } } ++i; } _FillLRClosureInPlace(progress, result); return(result); }
public bool AddItem(_LR0Item item) { if (Items.Add(item)) { _hashCode ^= item.GetHashCode(); return(true); } return(false); }
void _FillLRClosureInPlace(IProgress <CfgLRProgress> progress, _LR0ItemSet result) { var done = false; while (!done) { done = true; var l = new _LR0Item[result.Items.Count]; result.Items.CopyTo(l, 0); for (var i = 0; i < l.Length; i++) { if (null != progress) { progress.Report(new CfgLRProgress(CfgLRStatus.ComputingClosure, i)); } var item = l[i]; var next = item.Next; if (!item.IsEnd || item.IsNil) { if (IsNonTerminal(next)) { for (int jc = Rules.Count, j = 0; j < jc; ++j) { var r = Rules[j]; if (r.Left == next) { var lri = new _LR0Item(r, 0); if (result.AddItem(lri)) { done = false; } } } } } } } }