예제 #1
0
        /// <summary>
        /// Gera o fecho transitivo de um determinado estado. Realiza as inserções no hash.
        /// </summary>
        /// <param name="state">Estado do fecho transitivo</param>
        /// <param name="transictionList">Lista dos possíveis valores para a transição de estados</param>
        /// <param name="nullSymbol">Símbolo representando do nulo/vazio dos automatos</param>
        /// <param name="hash">Hash dos fechos já criados</param>
        /// <returns>Fecho transitivo do estado</returns>
        private static PowerSet <T, E> GeneratePowerSet(State <T, E> state, List <E> transictionList, E nullSymbol, Dictionary <State <T, E>, PowerSet <T, E> > hash)
        {
            PowerSet <T, E> powerSet = new PowerSet <T, E>(state);

            //List<State<T, E>> reachableState = state.ReachableStatesBy(nullSymbol);
            hash.Add(state, powerSet);

            //Itera sobre a lista de terminais
            foreach (E value in transictionList)
            {
                //Verifica se não é o valor nulo
                if (!value.Equals(nullSymbol))
                {
                    //Busca o estado que é alcançável a partir do terminal value
                    List <State <T, E> > reachable = state.ReachableStatesBy(value, nullSymbol);
                    if (reachable != null)
                    {
                        if (reachable.Count > 1)
                        {
                            //Adiciona transições de estados com recursão
                            if (!reachable[0].StateValue.Equals(reachable[1].StateValue))
                            {
                                powerSet.AddTransictionToPowerSet(value, reachable[0]);
                                powerSet.AddTransictionToPowerSet(value, reachable[1]);
                            }
                        }
                        else
                        {
                            //Adiciona transição no valor para o estaddo
                            powerSet.AddTransictionToPowerSet(value, reachable[0]);
                        }
                    }
                }
            }

            //Itera sobre os estados que não contém fecho e os gera
            foreach (StateTransiction <T, E> transiction in powerSet.Transictions)
            {
                State <T, E> nextState = transiction.NextState;
                if (!hash.ContainsKey(nextState))
                {
                    GeneratePowerSet(nextState, transictionList, nullSymbol, hash);
                }
            }

            return(powerSet);
        }