public IAutomatonTable <T> BuildAutomatonTable(ISituationCollectionFactory <T> SituationCollectionFactory, IDistinctInputFactory <T> DistinctInputFactory) { SituationDictionary <T> situationDictionary; IEnumerable <ISituation <T> > nextSituations; IAutomatonTable <T> automatonTable; IEnumerable <IActionInput <T> > nextInputs; IAutomatonTableTuple <T> currentTuple, nextTuple; Stack <IAutomatonTableTuple <T> > openList; Shift <T> action; if (SituationCollectionFactory == null) { throw new System.ArgumentNullException("SituationCollectionFactory"); } if (DistinctInputFactory == null) { throw new ArgumentNullException("DistinctInputFactory"); } automatonTable = new AutomatonTable <T>(); situationDictionary = new SituationDictionary <T>(); openList = new Stack <IAutomatonTableTuple <T> >(); nextSituations = SituationCollectionFactory.CreateAxiomSituations(); nextTuple = DevelopSituationsAndCreateTupleIfNotExists(automatonTable, SituationCollectionFactory, openList, situationDictionary, nextSituations); while (openList.Count > 0) { currentTuple = openList.Pop(); nextInputs = DistinctInputFactory.GetDistinctInputs(currentTuple.Situations.SelectMany(item => item.Predicate.GetInputs())); foreach (IActionInput <T> input in nextInputs) { nextSituations = SituationCollectionFactory.CreateNextSituations(currentTuple.Situations, input); nextTuple = DevelopSituationsAndCreateTupleIfNotExists(automatonTable, SituationCollectionFactory, openList, situationDictionary, nextSituations); action = new Shift <T>(input, automatonTable.IndexOf(nextTuple.State)); currentTuple.State.Add(action); } } return(automatonTable); }
private IAutomatonTableTuple <T> DevelopSituationsAndCreateTupleIfNotExists(IAutomatonTable <T> AutomatonTable, ISituationCollectionFactory <T> SituationCollectionFactory, Stack <IAutomatonTableTuple <T> > OpenList, ISituationDictionary <T> SituationDictionary, IEnumerable <ISituation <T> > Situations) { IAutomatonTableTuple <T> nextTuple; State <T> state; ISituationCollection <T> developpedSituations; developpedSituations = SituationCollectionFactory.Develop(Situations); nextTuple = SituationDictionary.GetTuple(developpedSituations); if (nextTuple == null) { state = new State <T>(); AddReductionsToState(state, developpedSituations); AutomatonTable.Add(state); nextTuple = SituationDictionary.CreateTuple(state, developpedSituations); OpenList.Push(nextTuple); } return(nextTuple); }