diff --git a/aconvert2/src/DotConverter.cpp b/aconvert2/src/DotConverter.cpp index 1745ebd72cdc693777553b90c59267104d8cfe75..8ffa92711346f72100b2571521b0d94a2b6c040a 100644 --- a/aconvert2/src/DotConverter.cpp +++ b/aconvert2/src/DotConverter.cpp @@ -10,6 +10,7 @@ #include <automaton/FSM/NFA.h> #include <automaton/FSM/EpsilonNFA.h> +#include <automaton/FSM/MultiInitialStateNFA.h> #include <automaton/FSM/DFA.h> #include <automaton/FSM/ExtendedNFA.h> #include <automaton/FSM/CompactNFA.h> @@ -67,6 +68,39 @@ void DotConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out) { } } + //Mark initial states + out << "node [shape = plaintext, label=\"start\"]; 0; \n"; + out << "0 -> " << states.find(a.getInitialState())->second << ";\n"; + + transitions(a, states, out); + out << "}"; +} + +void DotConverter::convert(const automaton::MultiInitialStateNFA& a, std::ostream& out) { + label::LabelToStringComposer composer; + + out << "digraph automaton {\n"; + out << "rankdir=LR;\n"; + int cnt = 1; + + //Map states to indices + std::map<automaton::State, int> states; + for (const automaton::State& state : a.getStates()) { + states.insert(std::make_pair(state, cnt++)); + } + + //Print final states + for (const automaton::State& state : a.getFinalStates()) { + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; + } + + //Print nonfinal states + for (const auto& state : states) { + if (!a.getFinalStates().count(state.first)) { + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; + } + } + //Mark initial states out << "node [shape = plaintext, label=\"start\"]; 0; \n"; for (const automaton::State& state : a.getInitialStates()) { @@ -104,9 +138,7 @@ void DotConverter::convert(const automaton::NFA& a, std::ostream& out) { //Mark initial states out << "node [shape = plaintext, label=\"start\"]; 0; \n"; - for (const automaton::State& state : a.getInitialStates()) { - out << "0 -> " << states.find(state)->second << ";\n"; - } + out << "0 -> " << states.find(a.getInitialState())->second << ";\n"; transitions(a, states, out); out << "}"; @@ -172,9 +204,7 @@ void DotConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out) { //Mark initial states out << "node [shape = plaintext, label=\"start\"]; 0; \n"; - for (const automaton::State& state : a.getInitialStates()) { - out << "0 -> " << states.find(state)->second << ";\n"; - } + out << "0 -> " << states.find(a.getInitialState())->second << ";\n"; transitions(a, states, out); out << "}"; @@ -207,9 +237,7 @@ void DotConverter::convert(const automaton::CompactNFA& a, std::ostream& out) { //Mark initial states out << "node [shape = plaintext, label=\"start\"]; 0; \n"; - for (const automaton::State& state : a.getInitialStates()) { - out << "0 -> " << states.find(state)->second << ";\n"; - } + out << "0 -> " << states.find(a.getInitialState())->second << ";\n"; transitions(a, states, out); out << "}"; @@ -587,6 +615,33 @@ void DotConverter::transitions(const automaton::EpsilonNFA& fsm, const std::map< } } +void DotConverter::transitions(const automaton::MultiInitialStateNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) { + std::map<std::pair<int, int>, std::string> transitions; + + //put transitions from automaton to "transitions" + for (const auto& transition : fsm.getTransitions()) { + alphabet::SymbolToStringComposer composer; + std::string symbol = composer.compose(transition.first.second); + + for(const automaton::State& to : transition.second) { + std::pair<int, int> key(states.find(transition.first.first)->second, states.find(to)->second); + std::map<std::pair<int, int>, std::string>::iterator mapit = transitions.find(key); + + if (mapit == transitions.end()) { + transitions.insert(std::make_pair(key, symbol)); + } else { + mapit->second += ", " + symbol; + } + } + } + + //print the map + for (const std::pair<std::pair<int, int>, std::string>& transition : transitions) { + out << transition.first.first << " -> " << transition.first.second; + out << "[label=\"" << transition.second << "\"]\n"; + } +} + void DotConverter::transitions(const automaton::NFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) { std::map<std::pair<int, int>, std::string> transitions; @@ -1428,6 +1483,10 @@ void DotConverter::Visit(void* data, const automaton::EpsilonNFA& automaton) con DotConverter::convert(automaton, *((std::ostream*) data)); } +void DotConverter::Visit(void* data, const automaton::MultiInitialStateNFA& automaton) const { + DotConverter::convert(automaton, *((std::ostream*) data)); +} + void DotConverter::Visit(void* data, const automaton::NFA& automaton) const { DotConverter::convert(automaton, *((std::ostream*) data)); } diff --git a/aconvert2/src/DotConverter.h b/aconvert2/src/DotConverter.h index bdbfcf0c86ff4845e58b9a0a5491d3e4343dc110..256c0765829872adb38d763aada2c442a54a4abc 100644 --- a/aconvert2/src/DotConverter.h +++ b/aconvert2/src/DotConverter.h @@ -17,6 +17,7 @@ class DotConverter : public automaton::VisitableAutomatonBase::const_visitor_type { void Visit(void*, const automaton::EpsilonNFA& automaton) const; + void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const; void Visit(void*, const automaton::NFA& automaton) const; void Visit(void*, const automaton::DFA& automaton) const; void Visit(void*, const automaton::ExtendedNFA& automaton) const; @@ -33,6 +34,7 @@ class DotConverter : public automaton::VisitableAutomatonBase::const_visitor_typ void Visit(void*, const automaton::OneTapeDTM& automaton) const; static void transitions(const automaton::EpsilonNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out); + static void transitions(const automaton::MultiInitialStateNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out); static void transitions(const automaton::NFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out); static void transitions(const automaton::DFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out); static void transitions(const automaton::ExtendedNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out); @@ -53,6 +55,7 @@ public: static void convert(const automaton::Automaton& a, std::ostream& out); static void convert(const automaton::EpsilonNFA& a, std::ostream& out); + static void convert(const automaton::MultiInitialStateNFA& a, std::ostream& out); static void convert(const automaton::NFA& a, std::ostream& out); static void convert(const automaton::DFA& a, std::ostream& out); static void convert(const automaton::ExtendedNFA& a, std::ostream& out); diff --git a/aconvert2/src/GasTexConverter.cpp b/aconvert2/src/GasTexConverter.cpp index c9ea59df0bf1c062960d10ca32a17c5c5c8a3031..d02190f7c6cccf2ebe4559181af118cfb303fd81 100644 --- a/aconvert2/src/GasTexConverter.cpp +++ b/aconvert2/src/GasTexConverter.cpp @@ -8,6 +8,7 @@ #include "GasTexConverter.h" #include <automaton/FSM/NFA.h> +#include <automaton/FSM/MultiInitialStateNFA.h> #include <automaton/FSM/EpsilonNFA.h> #include <automaton/FSM/DFA.h> #include <automaton/FSM/ExtendedNFA.h> @@ -40,6 +41,45 @@ void GasTexConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out) out << "\\begin{center}\n"; out << "\\begin{picture}(,)(,)\n"; + for (auto& state : a.getStates()) { + bool initial = false; + bool final = false; + + if(a.getInitialState() == state){ + initial = true; + } + if(a.getFinalStates().count(state)){ + final = true; + } + + if(initial || final) { + out << "\\node[Nmarks="; + if(initial){ + out << "i"; + } + if(final){ + out << "r"; + } + out<<"]("; + } else { + out <<"\\node("; + } + + out << state.getName(); + out << ")(,){"; + out << state.getName(); + out << "}\n"; + } + + transitions(a, out); + out << "\\end{center}\n"; + out << "\\end{picture}\n"; +} + +void GasTexConverter::convert(const automaton::MultiInitialStateNFA& a, std::ostream& out) { + out << "\\begin{center}\n"; + out << "\\begin{picture}(,)(,)\n"; + for (auto& state : a.getStates()) { bool initial = false; bool final = false; @@ -83,7 +123,7 @@ void GasTexConverter::convert(const automaton::NFA& a, std::ostream& out) { bool initial = false; bool final = false; - if(a.getInitialStates().count(state)){ + if(a.getInitialState() == state){ initial = true; } if(a.getFinalStates().count(state)){ @@ -161,7 +201,7 @@ void GasTexConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out bool initial = false; bool final = false; - if(a.getInitialStates().count(state)){ + if(a.getInitialState() == state){ initial = true; } if(a.getFinalStates().count(state)){ @@ -200,7 +240,7 @@ void GasTexConverter::convert(const automaton::CompactNFA& a, std::ostream& out) bool initial = false; bool final = false; - if(a.getInitialStates().count(state)){ + if(a.getInitialState() == state){ initial = true; } if(a.getFinalStates().count(state)){ @@ -686,6 +726,25 @@ void GasTexConverter::transitions(const automaton::EpsilonNFA& fsm, std::ostream printTransitionMap(transitionMap, out); } +void GasTexConverter::transitions(const automaton::MultiInitialStateNFA& fsm, std::ostream& out) { + std::map<std::pair<std::string, std::string>, std::string> transitionMap; + for (const auto& transition : fsm.getTransitions()) { + for(const auto& to : transition.second) { + std::pair<std::string, std::string> key(transition.first.first.getName(), to.getName()); + + std::string symbol = (std::string) transition.first.second; + + auto mapIterator = transitionMap.find(key); + if (mapIterator == transitionMap.end()) { + transitionMap.insert(make_pair(key, symbol)); + } else { + mapIterator->second += ", " + symbol; + } + } + } + printTransitionMap(transitionMap, out); +} + void GasTexConverter::transitions(const automaton::NFA& fsm, std::ostream& out) { std::map<std::pair<std::string, std::string>, std::string> transitionMap; for (const auto& transition : fsm.getTransitions()) { @@ -1264,6 +1323,10 @@ void GasTexConverter::Visit(void* data, const automaton::EpsilonNFA& automaton) GasTexConverter::convert(automaton, *((std::ostream*) data)); } +void GasTexConverter::Visit(void* data, const automaton::MultiInitialStateNFA& automaton) const { + GasTexConverter::convert(automaton, *((std::ostream*) data)); +} + void GasTexConverter::Visit(void* data, const automaton::NFA& automaton) const { GasTexConverter::convert(automaton, *((std::ostream*) data)); } diff --git a/aconvert2/src/GasTexConverter.h b/aconvert2/src/GasTexConverter.h index 6d8032fbc834d5154f6b63486bdd29708b88075a..6f3f1f9192849bc76fd492449ae090993fde2f66 100644 --- a/aconvert2/src/GasTexConverter.h +++ b/aconvert2/src/GasTexConverter.h @@ -17,6 +17,7 @@ class GasTexConverter : public automaton::VisitableAutomatonBase::const_visitor_type { void Visit(void*, const automaton::EpsilonNFA& automaton) const; + void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const; void Visit(void*, const automaton::NFA& automaton) const; void Visit(void*, const automaton::DFA& automaton) const; void Visit(void*, const automaton::ExtendedNFA& automaton) const; @@ -36,6 +37,7 @@ class GasTexConverter : public automaton::VisitableAutomatonBase::const_visitor_ static std::string getStackSymbols(const std::vector<alphabet::Symbol>& stackSymbols); static void transitions(const automaton::EpsilonNFA& fsm, std::ostream& out); + static void transitions(const automaton::MultiInitialStateNFA& fsm, std::ostream& out); static void transitions(const automaton::NFA& fsm, std::ostream& out); static void transitions(const automaton::DFA& fsm, std::ostream& out); static void transitions(const automaton::ExtendedNFA& fsm, std::ostream& out); @@ -56,6 +58,7 @@ public: static void convert(const automaton::Automaton& a, std::ostream& out); static void convert(const automaton::EpsilonNFA& a, std::ostream& out); + static void convert(const automaton::MultiInitialStateNFA& a, std::ostream& out); static void convert(const automaton::NFA& a, std::ostream& out); static void convert(const automaton::DFA& a, std::ostream& out); static void convert(const automaton::ExtendedNFA& a, std::ostream& out); diff --git a/adiff2/src/AutomatonDiff.cpp b/adiff2/src/AutomatonDiff.cpp index a403c97be0e9c80dbe27367a5e0859625b769421..028602b3463b677d7945c069e23e0cbedb46eb8d 100644 --- a/adiff2/src/AutomatonDiff.cpp +++ b/adiff2/src/AutomatonDiff.cpp @@ -21,6 +21,7 @@ #include "automaton/FSM/DFA.h" #include "automaton/FSM/NFA.h" +#include "automaton/FSM/MultiInitialStateNFA.h" #include "automaton/FSM/EpsilonNFA.h" #include "automaton/FSM/ExtendedNFA.h" #include "automaton/FSM/CompactNFA.h" @@ -38,7 +39,7 @@ bool AutomatonDiff::testDiff(const automaton::DFA& a, const automaton::DFA& b) { a.getTransitions() == b.getTransitions() ; } -bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) { +bool AutomatonDiff::testDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) { return a.getFinalStates() == b.getFinalStates() && a.getInitialStates() == b.getInitialStates() && // a.getInputAlphabet() == b.getInputAlphabet() && @@ -46,9 +47,17 @@ bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) { a.getTransitions() == b.getTransitions() ; } +bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) { + return a.getFinalStates() == b.getFinalStates() && + a.getInitialState() == b.getInitialState() && +// a.getInputAlphabet() == b.getInputAlphabet() && + a.getStates() == b.getStates() && + a.getTransitions() == b.getTransitions() ; +} + bool AutomatonDiff::testDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) { return a.getFinalStates() == b.getFinalStates() && - a.getInitialStates() == b.getInitialStates() && + a.getInitialState() == b.getInitialState() && // a.getInputAlphabet() == b.getInputAlphabet() && a.getStates() == b.getStates() && a.getTransitions() == b.getTransitions() ; @@ -56,7 +65,7 @@ bool AutomatonDiff::testDiff(const automaton::EpsilonNFA& a, const automaton::Ep bool AutomatonDiff::testDiff(const automaton::ExtendedNFA& a, const automaton::ExtendedNFA& b) { return a.getFinalStates() == b.getFinalStates() && - a.getInitialStates() == b.getInitialStates() && + a.getInitialState() == b.getInitialState() && // a.getInputAlphabet() == b.getInputAlphabet() && a.getStates() == b.getStates() && a.getTransitions() == b.getTransitions() ; @@ -64,7 +73,7 @@ bool AutomatonDiff::testDiff(const automaton::ExtendedNFA& a, const automaton::E bool AutomatonDiff::testDiff(const automaton::CompactNFA& a, const automaton::CompactNFA& b) { return a.getFinalStates() == b.getFinalStates() && - a.getInitialStates() == b.getInitialStates() && + a.getInitialState() == b.getInitialState() && // a.getInputAlphabet() == b.getInputAlphabet() && a.getStates() == b.getStates() && a.getTransitions() == b.getTransitions() ; @@ -184,7 +193,7 @@ void AutomatonDiff::printDiff(const automaton::DFA& a, const automaton::DFA& b) } } -void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b) { +void AutomatonDiff::printDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) { std::cout << "AutomataDiffer" << std::endl; if(a.getFinalStates() != b.getFinalStates()){ @@ -218,6 +227,42 @@ void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b) } } +void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b) { + std::cout << "AutomataDiffer" << std::endl; + + if(a.getFinalStates() != b.getFinalStates()){ + std::cout << "FinalStates" << std::endl; + + AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates()); + } + + if(a.getInitialState() != b.getInitialState()) { + std::cout << "Initial state" << std::endl; + + std::cout << "< " << a.getInitialState() << std::endl; + std::cout << "---" << std::endl; + std::cout << "> " << b.getInitialState() << std::endl; + } + + if(a.getInputAlphabet() != b.getInputAlphabet()) { + std::cout << "InputAlphabet" << std::endl; + + AutomatonDiff::setDiff(a.getInputAlphabet(), b.getInputAlphabet()); + } + + if(a.getStates() != b.getStates()) { + std::cout << "States" << std::endl; + + AutomatonDiff::setDiff(a.getStates(), b.getStates()); + } + + if(a.getTransitions() != b.getTransitions()) { + std::cout << "Transitions" << std::endl; + + AutomatonDiff::mapDiff(a.getTransitions(), b.getTransitions()); + } +} + void AutomatonDiff::printDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) { std::cout << "AutomataDiffer" << std::endl; @@ -227,10 +272,12 @@ void AutomatonDiff::printDiff(const automaton::EpsilonNFA& a, const automaton::E AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates()); } - if(a.getInitialStates() != b.getInitialStates()) { - std::cout << "InitialStates" << std::endl; + if(a.getInitialState() != b.getInitialState()) { + std::cout << "Initial state" << std::endl; - AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates()); + std::cout << "< " << a.getInitialState() << std::endl; + std::cout << "---" << std::endl; + std::cout << "> " << b.getInitialState() << std::endl; } if(a.getInputAlphabet() != b.getInputAlphabet()) { @@ -261,10 +308,12 @@ void AutomatonDiff::printDiff(const automaton::ExtendedNFA& a, const automaton:: AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates()); } - if(a.getInitialStates() != b.getInitialStates()) { - std::cout << "InitialStates" << std::endl; + if(a.getInitialState() != b.getInitialState()) { + std::cout << "Initial state" << std::endl; - AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates()); + std::cout << "< " << a.getInitialState() << std::endl; + std::cout << "---" << std::endl; + std::cout << "> " << b.getInitialState() << std::endl; } if(a.getInputAlphabet() != b.getInputAlphabet()) { @@ -295,10 +344,12 @@ void AutomatonDiff::printDiff(const automaton::CompactNFA& a, const automaton::C AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates()); } - if(a.getInitialStates() != b.getInitialStates()) { - std::cout << "InitialStates" << std::endl; + if(a.getInitialState() != b.getInitialState()) { + std::cout << "Initial state" << std::endl; - AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates()); + std::cout << "< " << a.getInitialState() << std::endl; + std::cout << "---" << std::endl; + std::cout << "> " << b.getInitialState() << std::endl; } if(a.getInputAlphabet() != b.getInputAlphabet()) { @@ -480,6 +531,15 @@ int AutomatonDiff::diff(const automaton::NFA& a, const automaton::NFA& b) { } } +int AutomatonDiff::diff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) { + if(!AutomatonDiff::testDiff(a, b)) { + AutomatonDiff::printDiff(a, b); + return 1; + } else { + return 0; + } +} + int AutomatonDiff::diff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) { if(!AutomatonDiff::testDiff(a, b)) { AutomatonDiff::printDiff(a, b); @@ -561,6 +621,10 @@ int AutomatonDiff::diff(const automaton::Automaton& a, const automaton::Automato if(res == 0) return 0; if(res == 1) return 1; + res = dynamicDiff<automaton::MultiInitialStateNFA>(a, b); + if(res == 0) return 0; + if(res == 1) return 1; + res = dynamicDiff<automaton::EpsilonNFA>(a, b); if(res == 0) return 0; if(res == 1) return 1; diff --git a/adiff2/src/AutomatonDiff.h b/adiff2/src/AutomatonDiff.h index 2ef119b116feca89698429795c295a842908e4ba..e9a52c9a5256518edbe2c83311a1d34036352e0b 100644 --- a/adiff2/src/AutomatonDiff.h +++ b/adiff2/src/AutomatonDiff.h @@ -23,6 +23,9 @@ class AutomatonDiff { static bool testDiff(const automaton::NFA& a, const automaton::NFA& b); static void printDiff(const automaton::NFA& a, const automaton::NFA& b); + static bool testDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b); + static void printDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b); + static bool testDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b); static void printDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b); @@ -47,6 +50,7 @@ class AutomatonDiff { public: static int diff(const automaton::DFA& a, const automaton::DFA& b); static int diff(const automaton::NFA& a, const automaton::NFA& b); + static int diff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b); static int diff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b); static int diff(const automaton::ExtendedNFA& a, const automaton::ExtendedNFA& b); static int diff(const automaton::CompactNFA& a, const automaton::CompactNFA& b); diff --git a/alib2algo/src/conversions/rg2fa/RGtoFA.cpp b/alib2algo/src/conversions/rg2fa/RGtoFA.cpp index 30000b2512a1864c784cdd11c231672a82624653..48ca974f641b4356239007780d05bb313f7014ed 100644 --- a/alib2algo/src/conversions/rg2fa/RGtoFA.cpp +++ b/alib2algo/src/conversions/rg2fa/RGtoFA.cpp @@ -87,7 +87,7 @@ automaton::NFA RGtoFA::convert(const grammar::RightRG& grammar) // step 1, 4 const automaton::State AState = automaton::createUniqueState(automaton::State("A"), states); states.insert(AState); - automaton::NFA automaton(AState); + automaton::NFA automaton(stateMap.find(grammar.getInitialSymbol())->second); automaton.setStates(states); automaton.setInputSymbols(grammar.getTerminalAlphabet()); diff --git a/astat2/src/AutomataStat.cpp b/astat2/src/AutomataStat.cpp index 878c07bad497a6fe875981400b770394cb65ce95..64a10629b85a128ee53e0f3c17f65e61021729b7 100644 --- a/astat2/src/AutomataStat.cpp +++ b/astat2/src/AutomataStat.cpp @@ -51,14 +51,14 @@ void AutomataStat::stat(const automaton::NFA& automaton, const Settings& setting switch(settings.initialStates) { case PrintOptions::PRINT: - alib::DataFactory::toStdout(automaton.getInitialStates()); + alib::DataFactory::toStdout(automaton.getInitialState()); break; case PrintOptions::QUANTITY: - std::cout << automaton.getInitialStates().size() << std::endl; + std::cout << 1 << std::endl; break; case PrintOptions::BOTH: - std::cout << automaton.getInitialStates().size() << std::endl; - alib::DataFactory::toStdout(automaton.getInitialStates()); + std::cout << 1 << std::endl; + alib::DataFactory::toStdout(automaton.getInitialState()); break; case PrintOptions::NOOP: break; @@ -176,6 +176,10 @@ void AutomataStat::Visit(void*, const automaton::EpsilonNFA&) const { throw exception::AlibException("Unsupported automaton type EpsilonNFA"); } +void AutomataStat::Visit(void*, const automaton::MultiInitialStateNFA&) const { + throw exception::AlibException("Unsupported automaton type EpsilonNFA"); +} + void AutomataStat::Visit(void* data, const automaton::NFA& automaton) const { const Settings& in = *((const Settings*) data); this->stat(automaton, in); diff --git a/astat2/src/AutomataStat.h b/astat2/src/AutomataStat.h index 29bd64bb8c97578b6773043409fe9d2e9b9cd728..c481f06f59a44cc816230f6f8e74d9a0caae7bca 100644 --- a/astat2/src/AutomataStat.h +++ b/astat2/src/AutomataStat.h @@ -26,6 +26,7 @@ public: private: void Visit(void*, const automaton::EpsilonNFA& automaton) const; + void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const; void Visit(void*, const automaton::NFA& automaton) const; void Visit(void*, const automaton::DFA& automaton) const; void Visit(void*, const automaton::ExtendedNFA& automaton) const; diff --git a/examples2/automaton/aconversion.test.22.xml b/examples2/automaton/aconversion.test.22.xml index 0defdb8514db2b78e383c97ddab5042dcaf1148b..2debc8d58377d936fed10338343f70ca6d0e59bb 100644 --- a/examples2/automaton/aconversion.test.22.xml +++ b/examples2/automaton/aconversion.test.22.xml @@ -12,9 +12,9 @@ <LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol> <LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol> </inputAlphabet> - <initialStates> + <initialState> <PrimitiveLabel><String>0</String></PrimitiveLabel> - </initialStates> + </initialState> <finalStates> <PrimitiveLabel><String>1</String></PrimitiveLabel> <PrimitiveLabel><String>3</String></PrimitiveLabel>