Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
EpsilonRemover.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <ext/algorithm>
9
10#include <alib/map>
11
12#include <grammar/Grammar.h>
13
23
25
26#include <grammar/RawRules.h>
27
28namespace grammar {
29
30namespace simplify {
31
33 template < class TerminalSymbolType, class NonterminalSymbolType >
35
36 template<class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >
38
39public:
50 template < class TerminalSymbolType, class NonterminalSymbolType >
52
63 template < class TerminalSymbolType, class NonterminalSymbolType >
65
76 template < class TerminalSymbolType, class NonterminalSymbolType >
78
89 template < class TerminalSymbolType, class NonterminalSymbolType >
91
102 template < class TerminalSymbolType, class NonterminalSymbolType >
104
115 template < class TerminalSymbolType, class NonterminalSymbolType >
117
128 template < class TerminalSymbolType, class NonterminalSymbolType >
130
141 template < class TerminalSymbolType, class NonterminalSymbolType >
143
154 template < class TerminalSymbolType, class NonterminalSymbolType >
156};
157
158template < class TerminalSymbolType, class NonterminalSymbolType >
160 if(rhs.size() == i) {
161 if(clear.empty ( )) return;
162 grammar.addRule(lhs, clear);
163 } else if(rhs[i].template is < NonterminalSymbolType > ( ) && nullableNonterminals.find ( rhs [ i ].template get < NonterminalSymbolType > ( ) ) != nullableNonterminals.end()) {
164 removeNullableNonterminals(grammar, nullableNonterminals, lhs, rhs, i+1, clear);
165
166 clear.push_back ( rhs [ i ] );
167 removeNullableNonterminals(grammar, nullableNonterminals, lhs, rhs, i+1, clear);
168 } else {
169 clear.push_back ( rhs [ i ] );
170 removeNullableNonterminals(grammar, nullableNonterminals, lhs, rhs, i+1, clear);
171 }
172}
173
174template<class T, class TerminalSymbolType, class NonterminalSymbolType >
175grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > EpsilonRemover::removeInternal( const T & grammar ) {
177
178 for( const auto & symbol : grammar.getNonterminalAlphabet() )
179 result.addNonterminalSymbol( symbol );
180
181 for( const auto & symbol : grammar.getTerminalAlphabet() )
182 result.addTerminalSymbol( symbol );
183
185
186 auto rawRules = grammar::RawRules::getRawRules ( grammar );
187
188 for( const auto & rule : rawRules )
189 for(const auto & rhs : rule.second) {
190 if(rhs.empty ( )) continue;
191
192 EpsilonRemover::removeNullableNonterminals(result, nullableNonterminals, rule.first, rhs, 0, {});
193 }
194
195 if(nullableNonterminals.find(grammar.getInitialSymbol()) != nullableNonterminals.end())
196 result.setGeneratesEpsilon(true);
197
198 return result;
199}
200
201template < class TerminalSymbolType, class NonterminalSymbolType >
203 return EpsilonRemover::removeInternal(grammar);
204}
205
206template < class TerminalSymbolType, class NonterminalSymbolType >
208 return grammar;
209}
210
211template < class TerminalSymbolType, class NonterminalSymbolType >
213 return grammar;
214}
215
216template < class TerminalSymbolType, class NonterminalSymbolType >
218 return grammar;
219}
220
221template < class TerminalSymbolType, class NonterminalSymbolType >
223 return EpsilonRemover::removeInternal(grammar);
224}
225
226template < class TerminalSymbolType, class NonterminalSymbolType >
228 return EpsilonRemover::removeInternal(grammar);
229}
230
231template < class TerminalSymbolType, class NonterminalSymbolType >
233 return grammar;
234}
235
236template < class TerminalSymbolType, class NonterminalSymbolType >
238 return EpsilonRemover::removeInternal(grammar);
239}
240
241template < class TerminalSymbolType, class NonterminalSymbolType >
243 return grammar;
244}
245
246} /* namespace simplify */
247
248} /* namespace grammar */
249
Definition: set.hpp:44
auto end() &
Inherited behavior of end for non-const instance.
Definition: set.hpp:129
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
Context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy. Generates context free lang...
Definition: CFG.h:67
Chomsky normal form of a context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: CNF.h:66
Context free grammar without epsilon rules in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: EpsilonFreeCFG.h:65
Greibach normal form of a context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: GNF.h:65
Context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy. Generates context free lang...
Definition: LG.h:67
Left linear grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular languages.
Definition: LeftLG.h:66
Left regular grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular languages...
Definition: LeftRG.h:70
static ext::map< NonterminalSymbolType, ext::set< ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > > > getRawRules(const LG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: RawRules.h:92
Right linear grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular languages...
Definition: RightLG.h:65
Right regular grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular language...
Definition: RightRG.h:70
static ext::set< NonterminalSymbolType > getNullableNonterminals(const T &grammar)
Definition: NullableNonterminals.h:44
Definition: EpsilonRemover.h:32
static grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > remove(const grammar::CFG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: EpsilonRemover.h:202
return grammar
Definition: ToGrammarLeftRG.h:99
int i
Definition: AllEpsilonClosure.h:118
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
void clear(ext::vector< bool, Ts ... > &v)
Clears all bits in the vector of booleans.
Definition: vector.hpp:876
Definition: ToAutomaton.h:24