diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp index 5012256a8eb26df3a2946dcaddddc84f04f4b84b..a74aff1100f93ee36e9d333fdc3fb1784ffb2dd8 100644 --- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp +++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp @@ -11,8 +11,8 @@ namespace grammar { namespace convert { -auto ToAutomatonBottomUpCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < >, const grammar::CFG < > & > ( ToAutomatonBottomUp::convert ); -auto ToAutomatonBottomUpEpsilonFreeCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < >, const grammar::EpsilonFreeCFG < > & > ( ToAutomatonBottomUp::convert ); +auto ToAutomatonBottomUpCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < DefaultSymbolType, DefaultEpsilonType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned >, const grammar::CFG < > & > ( ToAutomatonBottomUp::convert ); +auto ToAutomatonBottomUpEpsilonFreeCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < DefaultSymbolType, DefaultEpsilonType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned >, const grammar::EpsilonFreeCFG < > & > ( ToAutomatonBottomUp::convert ); } /* namespace convert */ diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h index bcccf27e72a615cc842a23a94834713153497fa9..204d7fdc4a566c75c33fe9da02990f61e85aaf71 100644 --- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h +++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h @@ -11,6 +11,7 @@ #include <grammar/Grammar.h> #include <grammar/ContextFree/CFG.h> #include <grammar/ContextFree/EpsilonFreeCFG.h> +#include <grammar/RawRules.h> #include <automaton/PDA/NPDA.h> @@ -29,35 +30,36 @@ public: /** * Performs conversion. */ - template <class T, class SymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class EpsilonType = DefaultEpsilonType, class StateType = DefaultStateType > - static automaton::NPDA < SymbolType, EpsilonType, SymbolType, StateType > convert(const T& grammar); + template <class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class EpsilonType = DefaultEpsilonType, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > > + static automaton::NPDA < TerminalSymbolType, EpsilonType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > convert(const T& grammar); }; -template <class T, class SymbolType, class EpsilonType, class StateType > -automaton::NPDA < SymbolType, EpsilonType, SymbolType, StateType > ToAutomatonBottomUp::convert(const T& grammar) { - StateType q = label::InitialStateLabel::instance < StateType > ( ); - StateType r = label::FinalStateLabel::instance < StateType > ( ); +template <class T, class TerminalSymbolType, class EpsilonType, class NonterminalSymbolType > +automaton::NPDA < TerminalSymbolType, EpsilonType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > ToAutomatonBottomUp::convert ( const T & grammar ) { + unsigned q = label::InitialStateLabel::instance < unsigned > ( ); + unsigned r = label::FinalStateLabel::instance < unsigned > ( ); - automaton::NPDA < SymbolType, EpsilonType, SymbolType, StateType > automaton(q, alphabet::BottomOfTheStackSymbol::instance < SymbolType > ( ) ); + automaton::NPDA < TerminalSymbolType, EpsilonType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > automaton ( q, alphabet::BottomOfTheStackSymbol::instance < NonterminalSymbolType > ( ) ); automaton.addState(r); automaton.addFinalState(r); automaton.setInputAlphabet(grammar.getTerminalAlphabet()); - for(const SymbolType& symbol : grammar.getNonterminalAlphabet()) + for(const NonterminalSymbolType& symbol : grammar.getNonterminalAlphabet()) automaton.addPushdownStoreSymbol(symbol); - for(const SymbolType& symbol : grammar.getTerminalAlphabet()) + for(const TerminalSymbolType& symbol : grammar.getTerminalAlphabet()) automaton.addPushdownStoreSymbol(symbol); - for(const SymbolType& symbol : grammar.getTerminalAlphabet()) - automaton.addTransition(automaton.getInitialState(), symbol, ext::vector<SymbolType>{}, automaton.getInitialState(), ext::vector<SymbolType>{symbol}); + for(const TerminalSymbolType& symbol : grammar.getTerminalAlphabet()) + automaton.addTransition ( automaton.getInitialState ( ), symbol, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { }, automaton.getInitialState ( ), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { symbol } ); - //for(const ext::map<SymbolType, ext::set<ext::vector<SymbolType>>>& kv : grammar.getRules()) - for(const auto& kv : grammar.getRules()) - for(const ext::vector<SymbolType>& rhs : kv.second) - automaton.addTransition(automaton.getInitialState(), rhs, automaton.getInitialState(), ext::vector<SymbolType>{kv.first}); + auto rawRules = grammar::RawRules::getRawRules ( grammar ); + for ( const auto & kv : rawRules ) + for(const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : kv.second) { + automaton.addTransition ( automaton.getInitialState(), rhs, automaton.getInitialState(), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { kv.first } ); + } - automaton.addTransition(automaton.getInitialState(), ext::vector<SymbolType>{ alphabet::BottomOfTheStackSymbol::instance < SymbolType > ( ), grammar.getInitialSymbol()}, r, ext::vector<SymbolType>{}); + automaton.addTransition(automaton.getInitialState(), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { alphabet::BottomOfTheStackSymbol::instance < NonterminalSymbolType > ( ), grammar.getInitialSymbol ( ) }, r, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { } ); return automaton; } diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp index 8653e4ffe2a54ef4fa2c0d0a43346f293f35e01f..102175c865baa9bbf3a5688432ada38be993a603 100644 --- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp +++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp @@ -89,27 +89,27 @@ void GrammarCFGtoPDATest::testBottomUp() grammar.addRule(nF, ext::vector<DefaultSymbolType>{tA}); - DefaultStateType q = label::InitialStateLabel::instance < DefaultStateType > ( ); - DefaultStateType r = label::FinalStateLabel::instance < DefaultStateType > ( ); + unsigned q = label::InitialStateLabel::instance < unsigned > ( ); + unsigned r = label::FinalStateLabel::instance < unsigned > ( ); DefaultSymbolType bots( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) ); - automaton::NPDA < > pda(q, bots); + automaton::NPDA < DefaultStateType, DefaultEpsilonType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned > pda(q, bots); pda.addState(r); pda.addFinalState(r); pda.setInputAlphabet(ext::set<DefaultSymbolType>{tP, tS, tL, tR, tA}); - pda.setPushdownStoreAlphabet(ext::set<DefaultSymbolType>{tP, tS, tL, tR, tA, nE, nT, nF, bots}); + pda.setPushdownStoreAlphabet ( ext::set < ext::variant < DefaultSymbolType, DefaultSymbolType > > { tP, tS, tL, tR, tA, nE, nT, nF, bots } ); - pda.addTransition(q, ext::vector<DefaultSymbolType>{nE, tP, nT}, q, ext::vector<DefaultSymbolType>{nE}); - pda.addTransition(q, ext::vector<DefaultSymbolType>{nT}, q, ext::vector<DefaultSymbolType>{nE}); - pda.addTransition(q, ext::vector<DefaultSymbolType>{nT, tS, nF}, q, ext::vector<DefaultSymbolType>{nT}); - pda.addTransition(q, ext::vector<DefaultSymbolType>{nF}, q, ext::vector<DefaultSymbolType>{nT}); - pda.addTransition(q, ext::vector<DefaultSymbolType>{tL, nE, tR}, q, ext::vector<DefaultSymbolType>{nF}); - pda.addTransition(q, ext::vector<DefaultSymbolType>{tA}, q, ext::vector<DefaultSymbolType>{nF}); + pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nE, tP, nT}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nE}); + pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nE}); + pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT, tS, nF}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT}); + pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nF}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nT}); + pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{tL, nE, tR}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nF}); + pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{tA}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{nF}); for(const auto& symbol: pda.getInputAlphabet()) - pda.addTransition(q, symbol, ext::vector<DefaultSymbolType>{}, q, ext::vector<DefaultSymbolType>{symbol}); + pda.addTransition(q, symbol, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{}, q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{symbol}); - pda.addTransition(q, ext::vector<DefaultSymbolType>{bots, nE}, r, ext::vector<DefaultSymbolType>{}); + pda.addTransition(q, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{bots, nE}, r, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >{}); CPPUNIT_ASSERT(pda == grammar::convert::ToAutomatonBottomUp::convert(grammar)); }