Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
ToAutomaton.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <grammar/Grammar.h>
13
14#include <automaton/FSM/NFA.h>
15#include <automaton/PDA/NPDA.h>
16
18
21
23
24namespace grammar {
25
26namespace convert {
27
33public:
44 template < class TerminalSymbolType, class NonterminalSymbolType >
46
57 template < class TerminalSymbolType, class NonterminalSymbolType >
59
71 template < class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >
73};
74
75template < class TerminalSymbolType, class NonterminalSymbolType >
77 // step 1, 4
78 NonterminalSymbolType q0 = common::createUnique ( label::InitialStateLabel::instance < NonterminalSymbolType > ( ), grammar.getNonterminalAlphabet ( ) );
80 automaton.setInputAlphabet(grammar.getTerminalAlphabet());
81 for ( const NonterminalSymbolType & nonterminal : grammar.getNonterminalAlphabet ( ) )
82 automaton.addState ( nonterminal );
83
84 // step 3
85 for(const auto& rule : grammar.getRules()) {
86 const NonterminalSymbolType& lhs = rule.first;
87 for(const auto& ruleRHS : rule.second) {
88 if ( ruleRHS.template is < ext::pair < NonterminalSymbolType, TerminalSymbolType > > ( ) ) { // if B->Ca => \delta(C,a)=B
89 const ext::pair < NonterminalSymbolType, TerminalSymbolType > & rhs = ruleRHS.template get < ext::pair < NonterminalSymbolType, TerminalSymbolType > > ( );
90 automaton.addTransition(rhs.first, rhs.second, lhs);
91 }
92 else { // if B->a => \delta(StartState,a)=B
93 const TerminalSymbolType& rhs = ruleRHS.template get < TerminalSymbolType > ( );
94 automaton.addTransition(q0, rhs, lhs);
95 }
96 }
97 }
98
99 // step 5
100 automaton.addFinalState(grammar.getInitialSymbol());
101 if(grammar.getGeneratesEpsilon())
102 automaton.addFinalState(q0);
103
104 return automaton;
105}
106
107template < class TerminalSymbolType, class NonterminalSymbolType >
109 // step 1, 4
110 NonterminalSymbolType AState = common::createUnique(label::FinalStateLabel::instance < NonterminalSymbolType > ( ), grammar.getNonterminalAlphabet ( ) );
111 automaton::NFA < > automaton(grammar.getInitialSymbol());
112 for ( const NonterminalSymbolType & nonterminal : grammar.getNonterminalAlphabet ( ) )
113 automaton.addState ( nonterminal );
114 automaton.addState(AState);
115
116 automaton.setInputAlphabet(grammar.getTerminalAlphabet());
117
118 // step 3
119 for(const auto& rule : grammar.getRules()) {
120 const NonterminalSymbolType& lhs = rule.first;
121 for(const auto& ruleRHS : rule.second) {
122 if ( ruleRHS.template is < ext::pair < TerminalSymbolType, NonterminalSymbolType > > ( ) ) { // if B->aC => \delta(B,a)=C
123 const ext::pair < TerminalSymbolType, NonterminalSymbolType > & rhs = ruleRHS.template get < ext::pair < TerminalSymbolType, NonterminalSymbolType > > ( );
124 automaton.addTransition(lhs, rhs.first, rhs.second);
125 }
126 else { // if B->a => \delta(B,a)=AState
127 const TerminalSymbolType& rhs = ruleRHS.template get < TerminalSymbolType > ( );
128 automaton.addTransition(lhs, rhs, AState);
129 }
130 }
131 }
132
133 // step 5
134 automaton.addFinalState(AState);
135 if(grammar.getGeneratesEpsilon())
136 automaton.addFinalState(automaton.getInitialState());
137
138 return automaton;
139}
140
141template < class T, class TerminalSymbolType, class NonterminalSymbolType >
144}
145
146} /* namespace convert */
147
148} /* namespace grammar */
149
Nondeterministic finite automaton. Accepts regular languages.
Definition: NFA.h:66
Definition: NPDA.h:74
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Left regular grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular languages...
Definition: LeftRG.h:70
Right regular grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular language...
Definition: RightRG.h:70
static automaton::NPDA< TerminalSymbolType, ext::variant< TerminalSymbolType, NonterminalSymbolType >, unsigned > convert(const T &grammar)
Definition: ToAutomatonTopDown.h:41
Definition: ToAutomaton.h:32
static automaton::NFA< TerminalSymbolType, NonterminalSymbolType > convert(const grammar::LeftRG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: ToAutomaton.h:76
StateType q0
Definition: SingleInitialState.h:96
Definition: ToGrammar.h:31
T createUnique(T object, const Alphabets &... alphabets)
Definition: createUnique.hpp:46
Definition: converterCommon.hpp:8
Definition: ToAutomaton.h:24