public LRItem FindByCore(LR0Item core) { foreach (LRItem item in this) { if (item.Core == core) { return(item); } } return(null); }
private static int CompareLR0Items(LR0Item x, LR0Item y) { if (x.ID < y.ID) { return(-1); } if (x.ID == y.ID) { return(0); } return(1); }
public void AddItem(LR0Item core) { //Check if a core had been already added. If yes, simply return if (!AllCores.Add(core)) { return; } //Create new item, add it to AllItems, InitialItems, ReduceItems or ShiftItems var item = new LRItem(State, core); AllItems.Add(item); if (item.Core.IsFinal) { ReduceItems.Add(item); } else { ShiftItems.Add(item); } if (item.Core.IsInitial) { InitialItems.Add(item); } if (core.IsFinal) { return; } //Add current term to ShiftTerms if (!ShiftTerms.Add(core.Current)) { return; } if (core.Current is Terminal) { ShiftTerminals.Add(core.Current as Terminal); } //If current term (core.Current) is a new non-terminal, expand it var currNt = core.Current as NonTerminal; if (currNt == null) { return; } foreach (var prod in currNt.Productions) { AddItem(prod.LR0Items[0]); } }//method
public LRItem(ParserState state, LR0Item core) { State = state; Core = core; _hashCode = unchecked (state.GetHashCode() + core.GetHashCode()); }