Newer
Older
/*
* IDPDADeterminizer.cpp
*
* Created on: 16. 1. 2014
* Author: Jan Vesely
*/
#include <alib/deque>
#include <alib/algorithm>
automaton::InputDrivenDPDA < > Determinize::determinize ( const automaton::InputDrivenNPDA < > & nfa ) {
DefaultStateType initialState ( createDFAState ( { nfa.getInitialState ( ) } ) );
automaton::InputDrivenDPDA < > res ( initialState, nfa.getInitialSymbol ( ) );
res.setPushdownStoreAlphabet ( nfa.getPushdownStoreAlphabet ( ) );
res.setPushdownStoreOperations ( nfa.getPushdownStoreOperations ( ) );
// 2
DefaultStateType state = std::move ( todo.front ( ) );
for ( const DefaultSymbolType & input : nfa.getInputAlphabet ( ) ) {
ext::set < DefaultStateType > targetIDPDAStates;
for ( DefaultStateType nfaState : recreateNFAStates ( state ) ) {
auto iter = nfa.getTransitions ( ).find ( ext::make_pair ( std::move ( nfaState ), input ) );
if ( iter != nfa.getTransitions ( ).end ( ) )
targetIDPDAStates.insert ( iter->second.begin ( ), iter->second.end ( ) );
DefaultStateType dfaState = createDFAState ( std::move ( targetIDPDAStates ) );
res.addTransition ( state, input, std::move ( dfaState ) );
const ext::set<DefaultStateType>& finalLabels = nfa.getFinalStates();
for ( const DefaultStateType & dfaState : res.getStates ( ) ) {
const ext::set < DefaultStateType > & nfaStates = recreateNFAStates ( dfaState );
if(!ext::excludes(finalLabels.begin(), finalLabels.end(), nfaStates.begin(), nfaStates.end()))
auto DeterminizeInputDrivenNPDA = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenNPDA < > & > ( Determinize::determinize );
} /* namespace determinize */
} /* namespace automaton */