Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }