Skip to content
Snippets Groups Projects
Commit 309e93a3 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

algo: extract the top down grammar to automaton algo to separate file

The ToAutomaton should be an aggregate/alias for the default algorithms.
parent 039d0418
No related branches found
No related tags found
1 merge request!169NPDA and NPDTA run
......@@ -22,6 +22,8 @@
#include <label/InitialStateLabel.h>
#include <label/FinalStateLabel.h>
 
#include <grammar/convert/ToAutomatonTopDown.h>
namespace grammar {
 
namespace convert {
......@@ -141,24 +143,7 @@ automaton::NFA < TerminalSymbolType, NonterminalSymbolType > ToAutomaton::conver
 
template < class T, class TerminalSymbolType, class NonterminalSymbolType >
automaton::NPDA < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > ToAutomaton::convert ( const T & grammar ) {
automaton::NPDA < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > automaton ( label::InitialStateLabel::instance < unsigned > ( ), grammar.getInitialSymbol());
automaton.setInputAlphabet(grammar.getTerminalAlphabet());
for ( const NonterminalSymbolType & nonterminal : grammar.getNonterminalAlphabet ( ) )
automaton.addPushdownStoreSymbol ( nonterminal );
for ( const TerminalSymbolType & terminal : grammar.getTerminalAlphabet ( ) )
automaton.addPushdownStoreSymbol ( terminal );
for(const std::pair<const NonterminalSymbolType, ext::set<ext::vector<ext::variant<TerminalSymbolType,NonterminalSymbolType>>>>& kv : grammar.getRules())
for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : kv.second ) {
automaton.addTransition ( automaton.getInitialState ( ), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { kv.first }, automaton.getInitialState ( ), rhs );
}
for(const TerminalSymbolType & symbol : grammar.getTerminalAlphabet())
automaton.addTransition ( automaton.getInitialState ( ), symbol, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { symbol }, automaton.getInitialState ( ), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { } );
return automaton;
return ToAutomatonTopDown::convert ( grammar );
}
 
} /* namespace convert */
......
/*
* ToAutomatonTopDown.cpp
*
* Created on: 23. 11. 2020
* Author: Jan Travnicek
*/
#include "ToAutomatonTopDown.h"
#include <registration/AlgoRegistration.hpp>
namespace {
auto ToAutomatonTopDownCFG = registration::AbstractRegister < grammar::convert::ToAutomatonTopDown, automaton::NPDA < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned >, const grammar::CFG < > & > ( grammar::convert::ToAutomatonTopDown::convert, "grammar" ).setDocumentation (
"Converts a context free grammar to a pushdown automaton by method of top down analysis.\n\
\n\
@param grammar the converted context free grammar\n\
@return pushdown automaton accepting the language generated by @p grammar");
auto ToAutomatonTopDownEpsilonFreeCFG = registration::AbstractRegister < grammar::convert::ToAutomatonTopDown, automaton::NPDA < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType >, unsigned >, const grammar::EpsilonFreeCFG < > & > ( grammar::convert::ToAutomatonTopDown::convert, "grammar" ).setDocumentation (
"Converts a context free grammar to a pushdown automaton by method of top down analysis.\n\
\n\
@param grammar the converted context free grammar\n\
@return pushdown automaton accepting the language generated by @p grammar");
} /* namespace */
/*
* ToAutomatonBototmUp.h
*
* Created on: 23. 11. 2020
* Author: Tomas Pecka
*/
#ifndef _GRAMMAR_TO_AUTOMATON_TOPDOWN_H_
#define _GRAMMAR_TO_AUTOMATON_TOPDOWN_H_
#include <grammar/Grammar.h>
#include <grammar/ContextFree/CFG.h>
#include <grammar/ContextFree/EpsilonFreeCFG.h>
#include <grammar/RawRules.h>
#include <automaton/PDA/NPDA.h>
#include <label/InitialStateLabel.h>
namespace grammar {
namespace convert {
/**
*/
class ToAutomatonTopDown {
public:
/**
* Converts a context free grammar to a pushdown automaton by method of bottom up analysis.
*
* \tparam T the type of converted grammar
* \tparam TerminalSymbolType the type of terminals in the converted grammar
* \tparam NonterminalSymbolType the type of nonterminals in the converted grammar
*
* \param grammar the converted context free grammar
*
* \return pushdown automaton accepting the language generated by @p grammar
*/
template < class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >
static automaton::NPDA < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > convert ( const T & grammar );
};
template < class T, class TerminalSymbolType, class NonterminalSymbolType >
automaton::NPDA < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > ToAutomatonTopDown::convert ( const T & grammar ) {
automaton::NPDA < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > automaton ( label::InitialStateLabel::instance < unsigned > ( ), grammar.getInitialSymbol ( ) );
automaton.setInputAlphabet ( grammar.getTerminalAlphabet ( ) );
for ( const NonterminalSymbolType & nonterminal : grammar.getNonterminalAlphabet ( ) )
automaton.addPushdownStoreSymbol ( nonterminal );
for ( const TerminalSymbolType & terminal : grammar.getTerminalAlphabet ( ) )
automaton.addPushdownStoreSymbol ( terminal );
for ( const std::pair < const NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & kv : grammar.getRules ( ) )
for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : kv.second )
automaton.addTransition ( automaton.getInitialState ( ), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { kv.first }, automaton.getInitialState ( ), rhs );
for ( const TerminalSymbolType & symbol : grammar.getTerminalAlphabet ( ) )
automaton.addTransition ( automaton.getInitialState ( ), symbol, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { symbol }, automaton.getInitialState ( ), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { } );
return automaton;
}
} /* namespace convert */
} /* namespace grammar */
#endif /* _GRAMMAR_TO_AUTOMATON_TOPDOWN_H_ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment