From da39eeb748557dd9194185f38a659932bbed875b Mon Sep 17 00:00:00 2001 From: Tomas Pecka <peckato1@fit.cvut.cz> Date: Thu, 24 Mar 2016 21:07:30 +0100 Subject: [PATCH] RHDPDA run transition search --- alib2algo/src/automaton/run/Run.cpp | 56 +++++++++++++++-------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/alib2algo/src/automaton/run/Run.cpp b/alib2algo/src/automaton/run/Run.cpp index e4f02210fa..ed07148a2d 100644 --- a/alib2algo/src/automaton/run/Run.cpp +++ b/alib2algo/src/automaton/run/Run.cpp @@ -360,44 +360,48 @@ std::tuple < bool, State, std::set < unsigned >, std::deque < alphabet::Symbol > res = false; } - auto returnTransition = automaton.getReturnTransitions ( ).find ( std::make_tuple ( state, * symbolIter, pushdownStore.back ( ) ) ); + if ( !res ) { + auto returnTransition = automaton.getReturnTransitions ( ).find ( std::make_tuple ( state, * symbolIter, pushdownStore.back ( ) ) ); + + if ( returnTransition != automaton.getReturnTransitions ( ).end ( ) ) { + symbolIter++; + i++; + } else { + returnTransition = automaton.getReturnTransitions ( ).find ( std::make_tuple ( state, string::Epsilon::EPSILON, pushdownStore.back ( ) ) ); + } - if ( returnTransition != automaton.getReturnTransitions ( ).end ( ) ) { - symbolIter++; - i++; - } else { - returnTransition = automaton.getReturnTransitions ( ).find ( std::make_tuple ( state, string::Epsilon::EPSILON, pushdownStore.back ( ) ) ); + if ( returnTransition != automaton.getReturnTransitions ( ).end ( ) ) { + pushdownStore.pop_back ( ); + state = returnTransition->second; + } else { + res = false; + } } - if ( returnTransition != automaton.getReturnTransitions ( ).end ( ) ) { - pushdownStore.pop_back ( ); - state = returnTransition->second; - } else { - res = false; - } + if ( !res ) { + auto localTransition = automaton.getLocalTransitions ( ).find ( std::make_pair ( state, * symbolIter ) ); - auto localTransition = automaton.getLocalTransitions ( ).find ( std::make_pair ( state, * symbolIter ) ); + if ( localTransition != automaton.getLocalTransitions ( ).end ( ) ) { + symbolIter++; + i++; + } else { + localTransition = automaton.getLocalTransitions ( ).find ( std::make_pair ( state, string::Epsilon::EPSILON ) ); + } - if ( localTransition != automaton.getLocalTransitions ( ).end ( ) ) { - symbolIter++; - i++; - } else { - localTransition = automaton.getLocalTransitions ( ).find ( std::make_pair ( state, string::Epsilon::EPSILON ) ); + if ( localTransition != automaton.getLocalTransitions ( ).end ( ) ) + state = localTransition->second; + else + res = false; } - if ( localTransition != automaton.getLocalTransitions ( ).end ( ) ) - state = localTransition->second; - else - res = false; - - if ( res == false ) - break; - if ( automaton.getFinalStates ( ).count ( state ) ) occ.insert ( i ); if ( common::GlobalData::verbose ) std::clog << state << std::endl; + + if ( res == false ) + break; } return std::make_tuple ( res, state, occ, pushdownStore ); -- GitLab