11#include <string/String.h>
31 template <
class FiniteAutomatonType >
34 template <
class FiniteAutomatonType >
39 template <
class FiniteAutomatonType >
48 template <
class TerminalSymbolType,
class NonterminalSymbolType >
51 template <
class TerminalSymbolType,
class NonterminalSymbolType >
54 template <
class GrammarType >
57 template <
class GrammarType >
65 template <
class SymbolType,
class StateType >
70 template <
class SymbolType,
class StateType >
75 template <
class SymbolType,
class StateType >
77 return "$\\varepsilon$-NFA";
80 template <
class SymbolType,
class StateType >
85 template <
class SymbolType,
class StateType >
87 return "$\\varepsilon$-NFA";
92 template <
class FiniteAutomatonType,
class StateType >
93 requires automaton::isMultiInitialStateNFA < FiniteAutomatonType > || automaton::isMultiInitialStateEpsilonNFA < FiniteAutomatonType >
94 static inline bool isInitialState (
const FiniteAutomatonType &
automaton,
const StateType & state ) {
95 return automaton.getInitialStates ( ).count ( state );
98 template <
class FiniteAutomatonType,
class StateType >
99 requires automaton::isDFA < FiniteAutomatonType > || automaton::isNFA < FiniteAutomatonType > || automaton::isEpsilonNFA < FiniteAutomatonType >
100 static inline bool isInitialState (
const FiniteAutomatonType &
automaton,
const StateType & state ) {
101 return automaton.getInitialState ( ) == state;
106 template <
class FiniteAutomatonType,
class StateType >
107 requires automaton::isDFA < FiniteAutomatonType >
109 for (
const auto & symbol :
automaton.getInputAlphabet ( ) ) {
113 if ( transition ==
automaton.getTransitions ( ).end ( ) )
120 template <
class FiniteAutomatonType,
class StateType >
121 requires automaton::isNFA < FiniteAutomatonType > || automaton::isMultiInitialStateNFA < FiniteAutomatonType >
123 for (
const auto & symbol :
automaton.getInputAlphabet ( ) ) {
128 for (
auto it = transitions.begin ( ); it != transitions.end ( ); ++ it ) {
129 if ( it != transitions.begin ( ) )
134 if ( transitions.empty ( ) )
139 template <
class FiniteAutomatonType,
class StateType >
140 requires automaton::isEpsilonNFA < FiniteAutomatonType > || automaton::isMultiInitialStateEpsilonNFA < FiniteAutomatonType >
142 const auto symTransitions =
automaton.getSymbolTransitions ( );
143 const auto epsTransitions =
automaton.getEpsilonTransitions ( );
146 for (
const auto & symbol :
automaton.getInputAlphabet ( ) ) {
149 auto tr = symTransitions.equal_range (
ext::make_pair ( state, symbol ) );
154 for (
auto it = tr.begin ( ); it != tr.end ( ); ++ it ) {
155 if ( it != tr.begin ( ) )
163 auto tr = epsTransitions.equal_range ( state );
168 for (
auto it = tr.begin ( ); it != tr.end ( ); ++ it ) {
169 if ( it != tr.begin ( ) )
177template <
class FiniteAutomatonType >
179 constexpr bool isEpsilonType = automaton::isMultiInitialStateEpsilonNFA < FiniteAutomatonType > || automaton::isEpsilonNFA < FiniteAutomatonType >;
182 out <<
"\\begin{tabular*}{\\textwidth}{|rl||";
184 out <<
"\\begin{tabular}{|rl||";
186 for (
size_t i = 0;
i <
automaton.getInputAlphabet ( ).size ( ) + isEpsilonType ; ++
i )
188 out <<
"}" << std::endl;
190 out <<
"\\hline" << std::endl;
191 out <<
"\\multicolumn{2}{|c||}{" << automatonType (
automaton ) <<
"}";
193 for (
const auto & symbol :
automaton.getInputAlphabet ( ) )
196 if constexpr ( isEpsilonType )
197 out <<
" & $\\varepsilon$";
200 out <<
"\\\\\\hline" << std::endl;
202 for (
const auto & state :
automaton.getStates ( ) ) {
203 if (
automaton.getFinalStates ( ).count ( state ) && isInitialState (
automaton, state ) )
204 out <<
"$\\leftrightarrow$ & ";
205 else if (
automaton.getFinalStates ( ).count ( state ) )
206 out <<
"$\\leftarrow$ & ";
207 else if ( isInitialState (
automaton, state ) )
208 out <<
"$\\rightarrow$ & ";
213 transitionsRow ( out,
automaton, state );
214 out <<
" \\\\\\hline" << std::endl;
218 out <<
"\\end{tabular*}" << std::endl;
220 out <<
"\\end{tabular}" << std::endl;
225template <
class TerminalSymbolType,
class NonterminalSymbolType >
227 for (
const auto & kv :
grammar.getRules ( ) ) {
228 const auto & lhs = kv.first;
230 if ( ! kv.second.empty ( ) )
233 for (
auto itRhs = kv.second.begin ( ); itRhs != kv.second.end ( ); ++ itRhs ) {
234 if ( itRhs != kv.second.begin ( ) )
237 for (
const auto & symb : *itRhs )
240 if ( itRhs -> empty ( ) )
241 out <<
"\\varepsilon";
243 out <<
"\\\\" << std::endl;
247template <
class TerminalSymbolType,
class NonterminalSymbolType >
249 for (
const auto & kv :
grammar.getRules ( ) ) {
250 const NonterminalSymbolType & lhs = kv.first;
252 if ( ! kv.second.empty ( ) )
255 for (
auto itRhs = kv.second.begin ( ); itRhs != kv.second.end ( ); ++ itRhs ) {
256 if ( itRhs != kv.second.begin ( ) )
259 if ( itRhs ->
template is < TerminalSymbolType > ( ) )
267 if ( lhs ==
grammar.getInitialSymbol ( ) &&
grammar.getGeneratesEpsilon ( ) )
268 out <<
" \\mid \\varepsilon";
269 out <<
"\\\\" << std::endl;
273template <
class GrammarType >
277 for (
auto it =
grammar.getNonterminalAlphabet ( ).begin ( ); it !=
grammar.getNonterminalAlphabet ( ).end ( ); ++ it ) {
278 if ( it !=
grammar.getNonterminalAlphabet ( ).begin ( ) )
283 for (
auto it =
grammar.getTerminalAlphabet ( ).begin ( ); it !=
grammar.getTerminalAlphabet ( ).end ( ); ++ it ) {
284 if ( it !=
grammar.getTerminalAlphabet ( ).begin ( ) )
290 out <<
")$$" << std::endl << std::endl;
292 out <<
"\\begin{eqnarray*}" << std::endl;
294 out <<
"\\end{eqnarray*}" << std::endl;
Deterministic finite automaton. Accepts regular languages.
Definition: DFA.h:71
Epsilon nondeterministic finite automaton. Accepts regular languages.
Definition: EpsilonNFA.h:74
Epsilon nondeterministic finite automaton. Accepts regular languages.
Definition: MultiInitialStateEpsilonNFA.h:75
Nondeterministic finite automaton with multiple initial states. Accepts regular languages.
Definition: MultiInitialStateNFA.h:69
Nondeterministic finite automaton. Accepts regular languages.
Definition: NFA.h:66
Definition: LatexConverter.h:29
static std::string convertFSM(const FiniteAutomatonType &automaton, bool wideTable)
Definition: LatexConverter.h:40
static std::string convertFSM(const FiniteAutomatonType &automaton)
Definition: LatexConverter.h:35
static std::string convertGrammar(const GrammarType &grammar)
Definition: LatexConverter.h:58
static void rules(ext::ostream &out, const grammar::CFG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: LatexConverter.h:226
static void convertFSM(ext::ostream &out, const FiniteAutomatonType &automaton, bool wideTable=false)
Definition: LatexConverter.h:178
static void convertGrammar(ext::ostream &out, const GrammarType &grammar)
Definition: LatexConverter.h:274
std::string str() const &
Definition: sstream.cpp:29
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
static std::string toString(const T &data)
Definition: StringDataFactory.hpp:89
Context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy. Generates context free lang...
Definition: CFG.h:67
Right regular grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular language...
Definition: RightRG.h:70
typename T::StateType StateType
Definition: ToGrammarLeftRG.h:64
p second
Definition: ToRegExpAlgebraic.h:126
int i
Definition: AllEpsilonClosure.h:118
Definition: ToGrammar.h:31
Definition: converterCommon.hpp:8
auto replace
Definition: converterCommon.hpp:19
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
Definition: ToAutomaton.h:24