Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
GrammarToXMLComposer.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <alib/deque>
9#include <alib/vector>
10#include <alib/tuple>
11#include <alib/set>
12#include <alib/variant>
13
14#include <sax/Token.h>
15#include <core/xmlApi.hpp>
16
17namespace grammar {
18
23public:
24 template < class SymbolType >
26 template < class SymbolType >
28 template < class SymbolType >
29 static void composeInitialSymbol(ext::deque<sax::Token>& out, const SymbolType& symbol);
30
31 static void composeGeneratesEpsilon(ext::deque<sax::Token>& out, bool generatesEpsilon) {
32 out.emplace_back("generatesEpsilon", sax::Token::TokenType::START_ELEMENT);
33 if(generatesEpsilon) {
34 out.emplace_back("true", sax::Token::TokenType::START_ELEMENT);
35 out.emplace_back("true", sax::Token::TokenType::END_ELEMENT);
36 } else {
37 out.emplace_back("false", sax::Token::TokenType::START_ELEMENT);
38 out.emplace_back("false", sax::Token::TokenType::END_ELEMENT);
39 }
40 out.emplace_back("generatesEpsilon", sax::Token::TokenType::END_ELEMENT);
41 }
42
43 template < class SymbolType >
45 template < class SymbolType >
46 static void composeRuleLHS(ext::deque<sax::Token>& out, const ext::vector<SymbolType>& symbols);
47 template < class SymbolType >
49 template < class SymbolType >
50 static void composeRuleSingleSymbolLHS(ext::deque<sax::Token>& out, const SymbolType& symbol);
51 template < class SymbolType >
52 static void composeRuleRHS(ext::deque<sax::Token>& out, const ext::vector<SymbolType>& symbols);
53 template < class T, class R, class S >
55 template < class TerminalSymbolType, class NonterminalSymbolType >
56 static void composeRuleGNFRHS(ext::deque<sax::Token>& out, const ext::pair<TerminalSymbolType, ext::vector<NonterminalSymbolType>>& symbols);
57 template < class TerminalSymbolType, class NonterminalSymbolType >
59 template < class TerminalSymbolType, class NonterminalSymbolType >
61 template < class TerminalSymbolType, class NonterminalSymbolType >
63};
64
65template < class SymbolType >
67 out.emplace_back("nonterminalAlphabet", sax::Token::TokenType::START_ELEMENT);
68 for (const auto& symbol : symbols) {
70 }
71 out.emplace_back("nonterminalAlphabet", sax::Token::TokenType::END_ELEMENT);
72}
73
74template < class SymbolType >
76 out.emplace_back("terminalAlphabet", sax::Token::TokenType::START_ELEMENT);
77 for (const auto& symbol : symbols) {
79 }
80 out.emplace_back("terminalAlphabet", sax::Token::TokenType::END_ELEMENT);
81}
82
83template < class SymbolType >
85 out.emplace_back("initialSymbol", sax::Token::TokenType::START_ELEMENT);
87 out.emplace_back("initialSymbol", sax::Token::TokenType::END_ELEMENT);
88}
89
90template < class SymbolType >
92 out.emplace_back("lContext", sax::Token::TokenType::START_ELEMENT);
93 if(symbols.empty ( )) {
94 out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT);
95 out.emplace_back("epsilon", sax::Token::TokenType::END_ELEMENT);
96 } else for (const auto& symbol : symbols) {
98 }
99 out.emplace_back("lContext", sax::Token::TokenType::END_ELEMENT);
100}
101
102template < class SymbolType >
104 out.emplace_back("lhs", sax::Token::TokenType::START_ELEMENT);
105 if(symbols.empty ( )) {
106 out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT);
107 out.emplace_back("epsilon", sax::Token::TokenType::END_ELEMENT);
108 } else for (const auto& symbol : symbols) {
110 }
111 out.emplace_back("lhs", sax::Token::TokenType::END_ELEMENT);
112}
113
114template < class SymbolType >
116 out.emplace_back("rContext", sax::Token::TokenType::START_ELEMENT);
117 if(symbols.empty ( )) {
118 out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT);
119 out.emplace_back("epsilon", sax::Token::TokenType::END_ELEMENT);
120 } else for (const auto& symbol : symbols) {
122 }
123 out.emplace_back("rContext", sax::Token::TokenType::END_ELEMENT);
124}
125
126template < class SymbolType >
128 out.emplace_back("lhs", sax::Token::TokenType::START_ELEMENT);
130 out.emplace_back("lhs", sax::Token::TokenType::END_ELEMENT);
131}
132
133template < class SymbolType >
135 out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT);
136 if(symbols.empty ( )) {
137 out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT);
138 out.emplace_back("epsilon", sax::Token::TokenType::END_ELEMENT);
139 } else for (const auto& symbol : symbols) {
141 }
142 out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
143}
144
145template < class T, class R, class S >
147 out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT);
148 if ( symbols.template is < T > ( ) ) {
149 core::xmlApi < T >::compose ( out, symbols.template get < T > ( ) );
150 } else {
151 const ext::pair < R, S > & rhs = symbols.template get < ext::pair < R, S > > ( );
152 core::xmlApi < R >::compose ( out, rhs.first );
153 core::xmlApi < S >::compose ( out, rhs.second );
154 }
155 out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
156}
157
158template < class TerminalSymbolType, class NonterminalSymbolType >
160 out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT);
161
163
164 for (const auto& symbol : symbols.second) {
166 }
167
168 out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
169}
170
171template < class TerminalSymbolType, class NonterminalSymbolType >
173 out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT);
174 if(symbols.template is<ext::vector<TerminalSymbolType>>()) {
175 const ext::vector<TerminalSymbolType>& rhs = symbols.template get<ext::vector<TerminalSymbolType>>();
176 if(rhs.empty ( )) {
177 out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT);
178 out.emplace_back("epsilon", sax::Token::TokenType::END_ELEMENT);
179 } else for (const auto& symbol : symbols.template get<ext::vector<TerminalSymbolType>>()) {
181 }
182 } else {
183 const ext::tuple<ext::vector<TerminalSymbolType>, NonterminalSymbolType, ext::vector<TerminalSymbolType>>& rhs = symbols.template get<ext::tuple<ext::vector<TerminalSymbolType>, NonterminalSymbolType, ext::vector<TerminalSymbolType>>>();
184 for (const auto& symbol : std::get<0>(rhs)) {
186 }
188 for (const auto& symbol : std::get<2>(rhs)) {
190 }
191 }
192 out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
193}
194
195template < class TerminalSymbolType, class NonterminalSymbolType >
197 out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT);
198 if(symbols.template is<ext::vector<TerminalSymbolType>>()) {
199 const ext::vector<TerminalSymbolType>& rhs = symbols.template get<ext::vector<TerminalSymbolType>>();
200 if(rhs.empty ( )) {
201 out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT);
202 out.emplace_back("epsilon", sax::Token::TokenType::END_ELEMENT);
203 } else for (const auto& symbol : symbols.template get<ext::vector<TerminalSymbolType>>()) {
205 }
206 } else {
207 const ext::pair<NonterminalSymbolType, ext::vector<TerminalSymbolType>>& rhs = symbols.template get<ext::pair<NonterminalSymbolType, ext::vector<TerminalSymbolType>>>();
209 for (const auto& symbol : rhs.second) {
211 }
212 }
213 out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
214}
215
216template < class TerminalSymbolType, class NonterminalSymbolType >
218 out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT);
219 if(symbols.template is<ext::vector<TerminalSymbolType>>()) {
220 const ext::vector<TerminalSymbolType>& rhs = symbols.template get<ext::vector<TerminalSymbolType>>();
221 if(rhs.empty ( )) {
222 out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT);
223 out.emplace_back("epsilon", sax::Token::TokenType::END_ELEMENT);
224 } else {
225 for (const auto& symbol : symbols.template get<ext::vector<TerminalSymbolType>>()) {
227 }
228 }
229 } else {
230 const ext::pair<ext::vector<TerminalSymbolType>, NonterminalSymbolType>& rhs = symbols.template get<ext::pair<ext::vector<TerminalSymbolType>, NonterminalSymbolType>>();
231 for (const auto& symbol : rhs.first) {
233 }
235 }
236 out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
237}
238
239} /* namespace grammar */
240
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Definition: set.hpp:44
Class extending the tuple class from the standard library. Original reason is to allow printing of th...
Definition: tuple.hpp:42
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
Definition: GrammarToXMLComposer.h:22
static void composeNonterminalAlphabet(ext::deque< sax::Token > &out, const ext::set< SymbolType > &symbols)
Definition: GrammarToXMLComposer.h:66
static void composeRuleLHS(ext::deque< sax::Token > &out, const ext::vector< SymbolType > &symbols)
Definition: GrammarToXMLComposer.h:103
static void composeTerminalAlphabet(ext::deque< sax::Token > &out, const ext::set< SymbolType > &symbols)
Definition: GrammarToXMLComposer.h:75
static void composeRuleGNFRHS(ext::deque< sax::Token > &out, const ext::pair< TerminalSymbolType, ext::vector< NonterminalSymbolType > > &symbols)
Definition: GrammarToXMLComposer.h:159
static void composeRuleRightLGRHS(ext::deque< sax::Token > &out, const ext::variant< ext::vector< TerminalSymbolType >, ext::pair< ext::vector< TerminalSymbolType >, NonterminalSymbolType > > &symbols)
Definition: GrammarToXMLComposer.h:217
static void composeRuleLContext(ext::deque< sax::Token > &out, const ext::vector< SymbolType > &symbols)
Definition: GrammarToXMLComposer.h:91
static void composeRuleSingleSymbolLHS(ext::deque< sax::Token > &out, const SymbolType &symbol)
Definition: GrammarToXMLComposer.h:127
static void composeInitialSymbol(ext::deque< sax::Token > &out, const SymbolType &symbol)
Definition: GrammarToXMLComposer.h:84
static void composeRuleLGRHS(ext::deque< sax::Token > &out, const ext::variant< ext::vector< TerminalSymbolType >, ext::tuple< ext::vector< TerminalSymbolType >, NonterminalSymbolType, ext::vector< TerminalSymbolType > > > &symbols)
Definition: GrammarToXMLComposer.h:172
static void composeRuleRContext(ext::deque< sax::Token > &out, const ext::vector< SymbolType > &symbols)
Definition: GrammarToXMLComposer.h:115
static void composeRuleOneOrTwoSymbolsRHS(ext::deque< sax::Token > &out, const ext::variant< T, ext::pair< R, S > > &symbols)
Definition: GrammarToXMLComposer.h:146
static void composeGeneratesEpsilon(ext::deque< sax::Token > &out, bool generatesEpsilon)
Definition: GrammarToXMLComposer.h:31
static void composeRuleRHS(ext::deque< sax::Token > &out, const ext::vector< SymbolType > &symbols)
Definition: GrammarToXMLComposer.h:134
static void composeRuleLeftLGRHS(ext::deque< sax::Token > &out, const ext::variant< ext::vector< TerminalSymbolType >, ext::pair< NonterminalSymbolType, ext::vector< TerminalSymbolType > > > &symbols)
Definition: GrammarToXMLComposer.h:196
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
Definition: ToAutomaton.h:24
auto & get(ext::ptr_array< Type, N > &tpl)
Specialisation of get function for pointer arrays.
Definition: ptr_array.hpp:693
Definition: xmlApi.hpp:27