From 9dda59738846195f271e3a651f6afbd879836356 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Wed, 17 Sep 2014 09:26:32 +0200 Subject: [PATCH] idpda determinization --- .../determinize/idpda/IDPDADeterminizer.cpp | 81 +++++++++++++++++++ .../src/determinize/idpda/IDPDADeterminizer.h | 56 +++++++++++++ .../test-src/conversions/rg2rg/rg2rgTest.cpp | 74 ++++++++--------- .../test-src/determinize/determinizeTest.cpp | 65 +++++++++++++++ .../test-src/determinize/determinizeTest.h | 21 +++++ alib2algo/test-src/minimize/minimizeTest.cpp | 18 ++--- .../test-src/normalize/normalizeTest.cpp | 18 ++--- alib2algo/test-src/trim/trimTest.cpp | 56 ++++++------- 8 files changed, 306 insertions(+), 83 deletions(-) create mode 100644 alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp create mode 100644 alib2algo/src/determinize/idpda/IDPDADeterminizer.h create mode 100644 alib2algo/test-src/determinize/determinizeTest.cpp create mode 100644 alib2algo/test-src/determinize/determinizeTest.h diff --git a/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp b/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp new file mode 100644 index 0000000000..e307a3388e --- /dev/null +++ b/alib2algo/src/determinize/idpda/IDPDADeterminizer.cpp @@ -0,0 +1,81 @@ +/* + * IDPDADeterminizer.cpp + * + * Created on: 16. 1. 2014 + * Author: Jan Vesely + */ + +#include "IDPDADeterminizer.h" +#include "label/LabelSetLabel.h" + +#include <deque> +#include <algorithm> + +namespace determinize { + + +automaton::State IDPDADeterminizer::createDFAState(const std::set<automaton::State>& nfaStates) { + std::set<label::Label> labelSet; + for(const automaton::State& state : nfaStates) { + labelSet.insert(state.getName()); + } + return automaton::State(label::Label(label::LabelSetLabel(labelSet))); +} + +std::set<automaton::State> IDPDADeterminizer::recreateIDPDAStates(const automaton::State& dfaState) { + std::set<automaton::State> states; + for (const auto& label : static_cast<const label::LabelSetLabel&>(dfaState.getName().getData()).getData()) { + states.insert(automaton::State(label)); + } + return states; +} + +automaton::DPDA IDPDADeterminizer::determinize(const automaton::InputDrivenNPDA& nfa) { + // 1, 4 + automaton::State initialState(createDFAState(nfa.getInitialStates())); + automaton::DPDA res(initialState, nfa.getInitialSymbol()); + res.setInputSymbols(nfa.getInputAlphabet()); + + // 2 + std::deque<automaton::State> todo; + todo.push_back(initialState); + + do { + // 3a, c + automaton::State state = todo.front(); + todo.pop_front(); + + // 3b + for (const auto& input : nfa.getInputAlphabet()) { + std::set<automaton::State> targetIDPDAStates; + for(const auto& nfaState : recreateIDPDAStates(state)) { + auto iter = nfa.getTransitions().find(std::make_pair(nfaState, input)); + if(iter != nfa.getTransitions().end()) { + targetIDPDAStates.insert(iter->second.begin(), iter->second.end()); + } + } + automaton::State dfaState = createDFAState(targetIDPDAStates); + + // 4 + bool existed = !res.addState(dfaState); + + // 3b + const auto& pushdownOperation = nfa.getPushdownStoreOperations().find(input)->second; + res.addTransition(state, input, pushdownOperation.first, dfaState, pushdownOperation.second); + + if(!existed) todo.push_back(dfaState); + } + } while(!todo.empty()); + + // 5 + for (const auto& dfaState : res.getStates()) { + std::set<automaton::State> nfaStates = recreateIDPDAStates(dfaState); + if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) { + res.addFinalState(dfaState); + } + } + + return res; +} + +} diff --git a/alib2algo/src/determinize/idpda/IDPDADeterminizer.h b/alib2algo/src/determinize/idpda/IDPDADeterminizer.h new file mode 100644 index 0000000000..7d8d89cade --- /dev/null +++ b/alib2algo/src/determinize/idpda/IDPDADeterminizer.h @@ -0,0 +1,56 @@ +/* + * IDPDADeterminizer.h + * + * Created on: 16. 1. 2014 + * Author: Jan Vesely + */ + +#ifndef IDPDA_DETERMINIZER_H_ +#define IDPDA_DETERMINIZER_H_ + +#include <set> + +#include "automaton/common/State.h" +#include "automaton/PDA/InputDrivenNPDA.h" +#include "automaton/PDA/DPDA.h" + +namespace determinize { + +/** + * Class for running determinization algorithm on fsm. + */ +class IDPDADeterminizer { + +private: + + /** + * Returns existing state from the resulting automaton, if there is one, or creates new one and adds it into + * the resulting deterministic automaton. + * + * @param originalStates set of states from nondeterministic fsm which represents state of deterministic fsm + * @return state of deterministic fsm + */ + static automaton::State createDFAState(const std::set<automaton::State>& nfaStates); + + /** + * Finds states from nondeterministic fsm to which at least one state from given set of states have transition + * with given input. + * + * @param fromStates set of states from nondeterministic fsm + * @param input symbol from input alphabet + * @return set of states from nondeterministic fsm + */ + static std::set<automaton::State> recreateIDPDAStates(const automaton::State& dfaState); +public: + + /** + * @param nfsm nondeterministic final-state machine given for determinization + * Runs determinization algorithm on nondeterministic fsm given in constructor. + */ + static automaton::DPDA determinize(const automaton::InputDrivenNPDA& nfa); + +}; + +} /* namespace determinize */ + +#endif /* IDPDA_DETERMINIZER_H_ */ diff --git a/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp b/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp index 24b8c9772e..00105647fd 100644 --- a/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp +++ b/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp @@ -20,65 +20,65 @@ void rg2rgTest::tearDown() { } void rg2rgTest::testConversion() { - grammar::RightRG rrGrammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1))))); + grammar::RightRG rrGrammar(alphabet::symbolFrom(1)); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1))))); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))); - rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(1)); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(2)); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(3)); + rrGrammar.addTerminalSymbol(alphabet::symbolFrom("a")); + rrGrammar.addTerminalSymbol(alphabet::symbolFrom("b")); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))))); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))))); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); + rrGrammar.addRule(alphabet::symbolFrom(1), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(2))); + rrGrammar.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(3))); + rrGrammar.addRule(alphabet::symbolFrom(3), alphabet::symbolFrom("a")); rg2rg::RightToLeftRegularGrammar convertor;; grammar::LeftRG lrGrammar = convertor.convert(rrGrammar); - grammar::LeftRG lrGrammarRef(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4))))); + grammar::LeftRG lrGrammarRef(alphabet::symbolFrom(4)); - lrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1))))); - lrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))); - lrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))); - lrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - lrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + lrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(1)); + lrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(2)); + lrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(3)); + lrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("a")); + lrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("b")); - lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))))); - lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))))); - lrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))))); + lrGrammarRef.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom(1), alphabet::symbolFrom("a"))); + lrGrammarRef.addRule(alphabet::symbolFrom(2), alphabet::symbolFrom("a")); + lrGrammarRef.addRule(alphabet::symbolFrom(3), std::make_pair(alphabet::symbolFrom(2), alphabet::symbolFrom("b"))); + lrGrammarRef.addRule(alphabet::symbolFrom(4), std::make_pair(alphabet::symbolFrom(3), alphabet::symbolFrom("a"))); CPPUNIT_ASSERT(lrGrammarRef == lrGrammar); } void rg2rgTest::testConversion2() { - grammar::LeftRG lrGrammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4))))); + grammar::LeftRG lrGrammar(alphabet::symbolFrom(4)); - lrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))); - lrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))); - lrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4))))); - lrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - lrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + lrGrammar.addNonterminalSymbol(alphabet::symbolFrom(2)); + lrGrammar.addNonterminalSymbol(alphabet::symbolFrom(3)); + lrGrammar.addNonterminalSymbol(alphabet::symbolFrom(4)); + lrGrammar.addTerminalSymbol(alphabet::symbolFrom("a")); + lrGrammar.addTerminalSymbol(alphabet::symbolFrom("b")); - lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))))); - lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))))); + lrGrammar.addRule(alphabet::symbolFrom(2), alphabet::symbolFrom("a")); + lrGrammar.addRule(alphabet::symbolFrom(3), std::make_pair(alphabet::symbolFrom(2), alphabet::symbolFrom("b"))); + lrGrammar.addRule(alphabet::symbolFrom(4), std::make_pair(alphabet::symbolFrom(3), alphabet::symbolFrom("a"))); rg2rg::LeftToRightRegularGrammar convertor; grammar::RightRG rrGrammar = convertor.convert(lrGrammar); grammar::RightRG rrGrammarRef(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5))))); - rrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))); - rrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))); - rrGrammarRef.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4))))); - rrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - rrGrammarRef.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + rrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(2)); + rrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(3)); + rrGrammarRef.addNonterminalSymbol(alphabet::symbolFrom(4)); + rrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("a")); + rrGrammarRef.addTerminalSymbol(alphabet::symbolFrom("b")); - rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))))); - rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))))); - rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))))); + rrGrammarRef.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(2))); + rrGrammarRef.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(3))); + rrGrammarRef.addRule(alphabet::symbolFrom(3), alphabet::symbolFrom("a")); + rrGrammarRef.addRule(alphabet::symbolFrom(3), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(4))); CPPUNIT_ASSERT(rrGrammarRef == rrGrammar); } diff --git a/alib2algo/test-src/determinize/determinizeTest.cpp b/alib2algo/test-src/determinize/determinizeTest.cpp new file mode 100644 index 0000000000..0e7891b6ef --- /dev/null +++ b/alib2algo/test-src/determinize/determinizeTest.cpp @@ -0,0 +1,65 @@ +#include <list> +#include "determinizeTest.h" + +#include "label/StringLabel.h" +#include "label/CharacterLabel.h" +#include "label/IntegerLabel.h" +#include "label/Label.h" +#include "alphabet/LabeledSymbol.h" + +#include "determinize/nfa/NFADeterminizer.h" +#include "determinize/idpda/IDPDADeterminizer.h" + +#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y)) + +CPPUNIT_TEST_SUITE_REGISTRATION( determinizeTest ); + +void determinizeTest::setUp() { +} + +void determinizeTest::tearDown() { +} + +void determinizeTest::testDeterminizeNFA() { + automaton::NFA automaton; + + automaton.addState(automaton::State(1)); + automaton.addState(automaton::State(2)); + automaton.addState(automaton::State(3)); + automaton.addInputSymbol(alphabet::symbolFrom("a")); + automaton.addInputSymbol(alphabet::symbolFrom("b")); + + automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2)); + automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1)); + + automaton.addInitialState(automaton::State(1)); + automaton.addFinalState(automaton::State(3)); + + automaton::DFA determinized = determinize::NFADeterminizer::determinize(automaton); + + CPPUNIT_ASSERT(determinized.getStates().size() == 3); + +} + +void determinizeTest::testDeterminizeIDPDA() { + automaton::InputDrivenNPDA automaton(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::CharacterLabel('S'))))); + + automaton.addInputSymbol(alphabet::symbolFrom("a")); + automaton.addInputSymbol(alphabet::symbolFrom("b")); + + automaton.setPushdownStoreOperation(alphabet::symbolFrom("a"), std::vector<alphabet::Symbol>{}, std::vector<alphabet::Symbol> {}); + automaton.setPushdownStoreOperation(alphabet::symbolFrom("b"), std::vector<alphabet::Symbol>{}, std::vector<alphabet::Symbol> {}); + + automaton.addState(automaton::State(1)); + automaton.addState(automaton::State(2)); + automaton.addState(automaton::State(3)); + automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2)); + automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1)); + + automaton.addInitialState(automaton::State(1)); + automaton.addFinalState(automaton::State(3)); + + automaton::DPDA determinized = determinize::IDPDADeterminizer::determinize(automaton); + + CPPUNIT_ASSERT(determinized.getStates().size() == 3); +} diff --git a/alib2algo/test-src/determinize/determinizeTest.h b/alib2algo/test-src/determinize/determinizeTest.h new file mode 100644 index 0000000000..0d2d93e80b --- /dev/null +++ b/alib2algo/test-src/determinize/determinizeTest.h @@ -0,0 +1,21 @@ +#ifndef DETERMINIZE_TEST_H_ +#define DETERMINIZE_TEST_H_ + +#include <cppunit/extensions/HelperMacros.h> + +class determinizeTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( determinizeTest ); + CPPUNIT_TEST( testDeterminizeNFA ); + CPPUNIT_TEST( testDeterminizeIDPDA ); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp(); + void tearDown(); + + void testDeterminizeNFA(); + void testDeterminizeIDPDA(); +}; + +#endif // DETERMINIZE_TEST_H_ diff --git a/alib2algo/test-src/minimize/minimizeTest.cpp b/alib2algo/test-src/minimize/minimizeTest.cpp index 4c07b83590..7c7624514d 100644 --- a/alib2algo/test-src/minimize/minimizeTest.cpp +++ b/alib2algo/test-src/minimize/minimizeTest.cpp @@ -19,18 +19,18 @@ void minimizeTest::tearDown() { } void minimizeTest::testMinimize() { - automaton::DFA automaton(automaton::State(label::Label(label::IntegerLabel(1)))); + automaton::DFA automaton(automaton::State(1)); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(1)))); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(2)))); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(3)))); - automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + automaton.addState(automaton::State(1)); + automaton.addState(automaton::State(2)); + automaton.addState(automaton::State(3)); + automaton.addInputSymbol(alphabet::symbolFrom("a")); + automaton.addInputSymbol(alphabet::symbolFrom("b")); - automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(1))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), automaton::State(label::Label(label::IntegerLabel(2)))); - automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(2))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1)))); + automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2)); + automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1)); - automaton.addFinalState(automaton::State(label::Label(label::IntegerLabel(3)))); + automaton.addFinalState(automaton::State(3)); automaton::DFA minimized = minimize::MinimizeDFA::minimize(automaton); diff --git a/alib2algo/test-src/normalize/normalizeTest.cpp b/alib2algo/test-src/normalize/normalizeTest.cpp index 741f8bcaf3..3d0282cd4c 100644 --- a/alib2algo/test-src/normalize/normalizeTest.cpp +++ b/alib2algo/test-src/normalize/normalizeTest.cpp @@ -19,18 +19,18 @@ void normalizeTest::tearDown() { } void normalizeTest::testNormalize() { - automaton::DFA automaton(automaton::State(label::Label(label::IntegerLabel(0)))); + automaton::DFA automaton(automaton::State(0)); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(0)))); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(1)))); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(2)))); - automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + automaton.addState(automaton::State(0)); + automaton.addState(automaton::State(1)); + automaton.addState(automaton::State(2)); + automaton.addInputSymbol(alphabet::symbolFrom("a")); + automaton.addInputSymbol(alphabet::symbolFrom("b")); - automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(0))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), automaton::State(label::Label(label::IntegerLabel(1)))); - automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(1))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(2)))); + automaton.addTransition(automaton::State(0), alphabet::symbolFrom("a"), automaton::State(1)); + automaton.addTransition(automaton::State(1), alphabet::symbolFrom("b"), automaton::State(2)); - automaton.addFinalState(automaton::State(label::Label(label::IntegerLabel(2)))); + automaton.addFinalState(automaton::State(2)); automaton::DFA normalized = normalize::NormalizeDFA::normalize(automaton); diff --git a/alib2algo/test-src/trim/trimTest.cpp b/alib2algo/test-src/trim/trimTest.cpp index e416d5ea5c..dc256e5427 100644 --- a/alib2algo/test-src/trim/trimTest.cpp +++ b/alib2algo/test-src/trim/trimTest.cpp @@ -23,19 +23,19 @@ void trimTest::tearDown() { } void trimTest::testTrimAutomaton() { - automaton::DFA automaton(automaton::State(label::Label(label::IntegerLabel(1)))); + automaton::DFA automaton(automaton::State(1)); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(1)))); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(2)))); - automaton.addState(automaton::State(label::Label(label::IntegerLabel(3)))); - automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + automaton.addState(automaton::State(1)); + automaton.addState(automaton::State(2)); + automaton.addState(automaton::State(3)); + automaton.addInputSymbol(alphabet::symbolFrom("a")); + automaton.addInputSymbol(alphabet::symbolFrom("b")); - automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(1))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), automaton::State(label::Label(label::IntegerLabel(2)))); - automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(2))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1)))); - automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(3))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1)))); + automaton.addTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2)); + automaton.addTransition(automaton::State(2), alphabet::symbolFrom("b"), automaton::State(1)); + automaton.addTransition(automaton::State(3), alphabet::symbolFrom("b"), automaton::State(1)); - automaton.addFinalState(automaton::State(label::Label(label::IntegerLabel(1)))); + automaton.addFinalState(automaton::State(1)); automaton::DFA trimed = trim::TrimFSM::trim(automaton); @@ -43,25 +43,25 @@ void trimTest::testTrimAutomaton() { } void trimTest::testTrimGrammar() { - grammar::RightRG rrGrammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1))))); - - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1))))); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4))))); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5))))); - rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6))))); - rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))); + grammar::RightRG rrGrammar(alphabet::symbolFrom(1)); + + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(1)); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(2)); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(3)); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(4)); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(5)); + rrGrammar.addNonterminalSymbol(alphabet::symbolFrom(6)); + rrGrammar.addTerminalSymbol(alphabet::symbolFrom("a")); + rrGrammar.addTerminalSymbol(alphabet::symbolFrom("b")); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))))); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))))); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))))); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))))); - rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6)))))); + rrGrammar.addRule(alphabet::symbolFrom(1), std::make_pair(alphabet::symbolFrom("a"), alphabet::symbolFrom(2))); + rrGrammar.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(3))); + rrGrammar.addRule(alphabet::symbolFrom(3), alphabet::symbolFrom("a")); + + rrGrammar.addRule(alphabet::symbolFrom(4), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(5))); + rrGrammar.addRule(alphabet::symbolFrom(5), alphabet::symbolFrom("a")); + rrGrammar.addRule(alphabet::symbolFrom(5), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(2))); + rrGrammar.addRule(alphabet::symbolFrom(6), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(6))); grammar::RightRG trimed = trim::TrimCFG::trim(rrGrammar); -- GitLab