Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Concepts
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