From 24e2a62b1ce6f86dd09c1cb436560eac795e4e7a Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 25 Sep 2014 21:23:46 +0200 Subject: [PATCH] fix parsing RealTimeHeightDeterministicNPDA --- .../src/automaton/AutomatonFromXMLParser.cpp | 13 ++- .../test-src/automaton/AutomatonTest.cpp | 17 +++- alib2data/test-src/automaton/AutomatonTest.h | 2 + examples2/automaton/NRHPDA.xml | 86 +++++++++++++++++++ 4 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 examples2/automaton/NRHPDA.xml diff --git a/alib2data/src/automaton/AutomatonFromXMLParser.cpp b/alib2data/src/automaton/AutomatonFromXMLParser.cpp index 59b733fef3..e7dacefed2 100644 --- a/alib2data/src/automaton/AutomatonFromXMLParser.cpp +++ b/alib2data/src/automaton/AutomatonFromXMLParser.cpp @@ -65,17 +65,26 @@ Automaton AutomatonFromXMLParser::parseAutomaton(std::list<sax::Token>& input, c if(!features.count(FEATURES::ONE_TAPE_DTM)) throw exception::AlibException(); return Automaton(parseOneTapeDTM(input)); } else - throw sax::ParserException(sax::Token("Automaton / EpsilonNFA / NFA / DFA / CompactNFA / ExtendedNFA / DPDA / SinglePopDPDA / NPDA / SinglePopNPDA / OneTapeDTM", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("Automaton / EpsilonNFA / NFA / DFA / CompactNFA / ExtendedNFA / DPDA / SinglePopDPDA / InputDrivenNPDA / VisiblyPushdownNPDA / RealTimeHeightDeterministicNPDA / NPDA / SinglePopNPDA / OneTapeDTM", sax::Token::TokenType::START_ELEMENT), input.front()); } bool AutomatonFromXMLParser::first(std::list<sax::Token>& input) const { - if(isToken(input, sax::Token::TokenType::START_ELEMENT, "automaton") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EpsilonNFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "NFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "DFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CompactNFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "ExtendedNFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "DPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopDPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "InputDrivenNPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "VisiblyPushdownNPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "NPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopNPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "OneTapeDTM")) { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "automaton") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EpsilonNFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "NFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "DFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CompactNFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "ExtendedNFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "DPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopDPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "InputDrivenNPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "VisiblyPushdownNPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RealTimeHeightDeterministicNPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "NPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopNPDA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "OneTapeDTM")) { return true; } else { return false; } } +template<> +void AutomatonFromXMLParser::parseTransitions(std::list<sax::Token> &input, RealTimeHeightDeterministicNPDA& automaton) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "transitions"); + while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + parseTransition(input, automaton); + } + popToken(input, sax::Token::TokenType::END_ELEMENT, "transitions"); +} + template<> void AutomatonFromXMLParser::parseTransitions(std::list<sax::Token> &input, VisiblyPushdownNPDA& automaton) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "transitions"); diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp index af25df7e30..856d67b0fb 100644 --- a/alib2data/test-src/automaton/AutomatonTest.cpp +++ b/alib2data/test-src/automaton/AutomatonTest.cpp @@ -255,7 +255,6 @@ void AutomatonTest::DPDATransitions() { ); automaton.addFinalState(automaton::State(3)); - } void AutomatonTest::testExtendedNFAAlphabet() { @@ -284,3 +283,19 @@ void AutomatonTest::testExtendedNFAAlphabet() { CPPUNIT_ASSERT_NO_THROW(automaton.addTransition(s0, regexp::RegExp{regexp::UnboundedRegExp(goodConcat2)}, s1)); CPPUNIT_ASSERT_NO_THROW(automaton.addTransition(s0, regexp::RegExp{regexp::UnboundedRegExp(regexp::UnboundedRegExpEpsilon())}, s1)); } + +void AutomatonTest::testRHPDATransitions() { + automaton::RealTimeHeightDeterministicNPDA automaton(alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK)); + automaton.setStates({automaton::State(1), automaton::State(2), automaton::State(3)}); + automaton.setInitialStates({automaton::State(1)}); + + automaton.setInputSymbols({alphabet::symbolFrom("a"), alphabet::symbolFrom("b")}); + automaton.setStackSymbols({alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK), alphabet::symbolFrom("X"), alphabet::symbolFrom("Y")}); + + automaton.addCallTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2), alphabet::symbolFrom("X")); + automaton.addCallTransition(automaton::State(2), automaton::State(3), alphabet::symbolFrom("X")); + automaton.addReturnTransition(automaton::State(3), alphabet::symbolFrom("Y"), automaton::State(1)); + + automaton.setFinalStates({automaton::State(3)}); + alib::DataFactory::toStdout(automaton); +} diff --git a/alib2data/test-src/automaton/AutomatonTest.h b/alib2data/test-src/automaton/AutomatonTest.h index 1891cdc6a6..c4c2a6ba30 100644 --- a/alib2data/test-src/automaton/AutomatonTest.h +++ b/alib2data/test-src/automaton/AutomatonTest.h @@ -12,6 +12,7 @@ class AutomatonTest : public CppUnit::TestFixture CPPUNIT_TEST( SinglePopDPDATransitions ); CPPUNIT_TEST( DPDATransitions ); CPPUNIT_TEST( testExtendedNFAAlphabet ); + CPPUNIT_TEST( testRHPDATransitions ); CPPUNIT_TEST_SUITE_END(); public: @@ -24,6 +25,7 @@ public: void SinglePopDPDATransitions(); void DPDATransitions(); void testExtendedNFAAlphabet(); + void testRHPDATransitions(); }; #endif // AUTOMATON_TEST_H_ diff --git a/examples2/automaton/NRHPDA.xml b/examples2/automaton/NRHPDA.xml new file mode 100644 index 0000000000..4906ee1414 --- /dev/null +++ b/examples2/automaton/NRHPDA.xml @@ -0,0 +1,86 @@ +<?xml version="1.0"?> +<RealTimeHeightDeterministicNPDA> + <states> + <IntegerLabel>1</IntegerLabel> + <IntegerLabel>2</IntegerLabel> + <IntegerLabel>3</IntegerLabel> + </states> + <inputAlphabet> + <LabeledSymbol> + <StringLabel>a</StringLabel> + </LabeledSymbol> + <LabeledSymbol> + <StringLabel>b</StringLabel> + </LabeledSymbol> + </inputAlphabet> + <stackAlphabet> + <LabeledSymbol> + <StringLabel>X</StringLabel> + </LabeledSymbol> + <LabeledSymbol> + <StringLabel>Y</StringLabel> + </LabeledSymbol> + <BottomOfTheStackSymbol/> + </stackAlphabet> + <initialStates> + <IntegerLabel>1</IntegerLabel> + </initialStates> + <bottomOfTheStackSymbol> + <BottomOfTheStackSymbol/> + </bottomOfTheStackSymbol> + <finalStates> + <IntegerLabel>3</IntegerLabel> + </finalStates> + <transitions> + <callTransition> + <from> + <IntegerLabel>1</IntegerLabel> + </from> + <input> + <LabeledSymbol> + <StringLabel>a</StringLabel> + </LabeledSymbol> + </input> + <to> + <IntegerLabel>2</IntegerLabel> + </to> + <push> + <LabeledSymbol> + <StringLabel>X</StringLabel> + </LabeledSymbol> + </push> + </callTransition> + <callTransition> + <from> + <IntegerLabel>2</IntegerLabel> + </from> + <input> + <epsilon/> + </input> + <to> + <IntegerLabel>3</IntegerLabel> + </to> + <push> + <LabeledSymbol> + <StringLabel>X</StringLabel> + </LabeledSymbol> + </push> + </callTransition> + <returnTransition> + <from> + <IntegerLabel>3</IntegerLabel> + </from> + <input> + <epsilon/> + </input> + <pop> + <LabeledSymbol> + <StringLabel>Y</StringLabel> + </LabeledSymbol> + </pop> + <to> + <IntegerLabel>1</IntegerLabel> + </to> + </returnTransition> + </transitions> +</RealTimeHeightDeterministicNPDA> -- GitLab