Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
SimpleRulesRemover.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <ext/algorithm>
9
19
21
22#include <grammar/Grammar.h>
23
24#include <grammar/RawRules.h>
25#include <grammar/AddRawRule.h>
26
27namespace grammar {
28
29namespace simplify {
30
32 template<class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >
33 static T removeNonEpsilonFree( const T & grammar );
34
35public:
46 template < class TerminalSymbolType, class NonterminalSymbolType >
48
59 template < class TerminalSymbolType, class NonterminalSymbolType >
61
72 template < class TerminalSymbolType, class NonterminalSymbolType >
74
85 template < class TerminalSymbolType, class NonterminalSymbolType >
87
98 template < class TerminalSymbolType, class NonterminalSymbolType >
100
111 template < class TerminalSymbolType, class NonterminalSymbolType >
113
124 template < class TerminalSymbolType, class NonterminalSymbolType >
126
137 template < class TerminalSymbolType, class NonterminalSymbolType >
139
150 template < class TerminalSymbolType, class NonterminalSymbolType >
152};
153
154template < class T, class TerminalSymbolType, class NonterminalSymbolType >
155T SimpleRulesRemover::removeNonEpsilonFree( const T & grammar ) {
156 T result(grammar.getInitialSymbol());
157
158 for( const auto & symbol : grammar.getNonterminalAlphabet() )
159 result.addNonterminalSymbol( symbol );
160
161 for( const auto & symbol : grammar.getTerminalAlphabet() )
162 result.addTerminalSymbol( symbol );
163
164 auto rawRules = grammar::RawRules::getRawRules ( grammar );
165
166 for( const auto & symbol : grammar.getNonterminalAlphabet() ) {
168 for( const auto & closureSymbol : simpleRulesClosure ) {
169 auto rules = rawRules.find(closureSymbol);
170 if(rules != rawRules.end()) for( const auto& rawRule : rules->second ) {
171 if(rawRule.empty ( ) || (rawRule.size() == 1 && !grammar.getNonterminalAlphabet().count(rawRule[0])) || rawRule.size() >= 2)
172 grammar::AddRawRule::addRawRule ( result, symbol, rawRule);
173 }
174 }
175 }
176
177 return result;
178}
179
180template < class TerminalSymbolType, class NonterminalSymbolType >
182 return removeNonEpsilonFree(grammar);
183}
184
185template < class TerminalSymbolType, class NonterminalSymbolType >
188
189 for( const auto & symbol : grammar.getNonterminalAlphabet() )
190 result.addNonterminalSymbol( symbol );
191
192 for( const auto & symbol : grammar.getTerminalAlphabet() )
193 result.addTerminalSymbol( symbol );
194
195 for( const auto & symbol : grammar.getNonterminalAlphabet() ) {
197 for( const auto & closureSymbol : simpleRulesClosure ) {
198 auto rules = grammar.getRules().find(closureSymbol);
199 if(rules != grammar.getRules().end()) for( const auto& rawRule : rules->second ) {
200 if(rawRule.empty ( ) || (rawRule.size() == 1 && !grammar.getNonterminalAlphabet().count(rawRule[0])) || rawRule.size() >= 2)
201 result.addRule(symbol, rawRule);
202 }
203 }
204 }
205
206 result.setGeneratesEpsilon(grammar.getGeneratesEpsilon());
207
208 return result;
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 removeNonEpsilonFree(grammar);
224}
225
226template < class TerminalSymbolType, class NonterminalSymbolType >
228 return removeNonEpsilonFree(grammar);
229}
230
231template < class TerminalSymbolType, class NonterminalSymbolType >
233 return grammar;
234}
235
236template < class TerminalSymbolType, class NonterminalSymbolType >
238 return removeNonEpsilonFree(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
static bool addRawRule(LG< TerminalSymbolType, NonterminalSymbolType > &grammar, NonterminalSymbolType leftHandSide, ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > rightHandSide)
Definition: AddRawRule.h:92
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 > getNonterminalUnitRuleCycle(const T &grammar, const NonterminalSymbolType &nonterminal)
Definition: NonterminalUnitRuleCycle.h:41
Definition: SimpleRulesRemover.h:31
static grammar::CFG< TerminalSymbolType, NonterminalSymbolType > remove(const grammar::CFG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: SimpleRulesRemover.h:181
return grammar
Definition: ToGrammarLeftRG.h:99
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
Definition: ToAutomaton.h:24