Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
ToAutomatonBottomUp.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <grammar/Grammar.h>
11#include <grammar/RawRules.h>
12
13#include <automaton/PDA/NPDA.h>
14
18
19namespace grammar {
20
21namespace convert {
22
26public:
39 template < class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >
41};
42
43template < class T, class TerminalSymbolType, class NonterminalSymbolType >
45 unsigned q = label::InitialStateLabel::instance < unsigned > ( );
46 unsigned r = label::FinalStateLabel::instance < unsigned > ( );
47
48 automaton::NPDA < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType >, unsigned > automaton ( q, alphabet::BottomOfTheStackSymbol::instance < NonterminalSymbolType > ( ) );
49 automaton.addState(r);
50 automaton.addFinalState(r);
51
52 automaton.setInputAlphabet(grammar.getTerminalAlphabet());
53
54 for(const NonterminalSymbolType& symbol : grammar.getNonterminalAlphabet())
55 automaton.addPushdownStoreSymbol(symbol);
56 for(const TerminalSymbolType& symbol : grammar.getTerminalAlphabet())
57 automaton.addPushdownStoreSymbol(symbol);
58
59 for(const TerminalSymbolType& symbol : grammar.getTerminalAlphabet())
61
62 auto rawRules = grammar::RawRules::getRawRules ( grammar );
63 for ( const auto & kv : rawRules )
65 automaton.addTransition ( automaton.getInitialState(), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > ( rhs.rbegin ( ), rhs.rend ( ) ), automaton.getInitialState(), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { kv.first } );
66 }
67
68 automaton.addTransition(automaton.getInitialState(), ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { grammar.getInitialSymbol ( ), alphabet::BottomOfTheStackSymbol::instance < NonterminalSymbolType > ( ) }, r, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { } );
69
70 return automaton;
71}
72
73} /* namespace convert */
74
75} /* namespace grammar */
76
Definition: NPDA.h:74
Implementation of the variant class allowing to store any type of those listed in the template parame...
Definition: variant.hpp:98
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
static ext::map< NonterminalSymbolType, ext::set< ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > > > getRawRules(const LG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: RawRules.h:92
Definition: ToAutomatonBottomUp.h:25
static automaton::NPDA< TerminalSymbolType, ext::variant< TerminalSymbolType, NonterminalSymbolType >, unsigned > convert(const T &grammar)
Definition: ToAutomatonBottomUp.h:44
q
Definition: SingleInitialStateEpsilonTransition.h:85
Definition: ToGrammar.h:31
Definition: converterCommon.hpp:8
Definition: ToAutomaton.h:24