From d84c2e3ba83f2da9a094313213b0ccfc2e9249d4 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 15 Aug 2014 21:32:15 +0200 Subject: [PATCH] Parsers and composers of base data object --- acat2/src/acat.cpp | 28 +-- alib2data/src/Api.cpp | 202 +++++++++++++++++- alib2data/src/Api.hpp | 22 +- alib2data/src/alphabet/SymbolBase.h | 2 +- .../src/alphabet/SymbolFromXMLParser.cpp | 8 + alib2data/src/alphabet/SymbolFromXMLParser.h | 9 + alib2data/src/automaton/AutomatonBase.h | 2 +- alib2data/src/automaton/AutomatonFeatures.h | 4 +- .../src/automaton/AutomatonFromXMLParser.cpp | 25 ++- .../src/automaton/AutomatonFromXMLParser.h | 2 + alib2data/src/exception/AlibException.cpp | 36 ++++ alib2data/src/exception/AlibException.h | 24 ++- .../src/exception/ExceptionFromXMLParser.h | 8 + alib2data/src/grammar/GrammarBase.h | 2 +- .../src/grammar/GrammarFromXMLParser.cpp | 8 + alib2data/src/grammar/GrammarFromXMLParser.h | 2 + alib2data/src/label/LabelBase.h | 2 +- alib2data/src/label/LabelFromXMLParser.cpp | 8 + alib2data/src/label/LabelFromXMLParser.h | 2 + alib2data/src/{ => object}/Object.h | 4 +- alib2data/src/{ => object}/ObjectBase.h | 12 +- alib2data/src/object/ObjectFromXMLParser.cpp | 38 ++++ alib2data/src/object/ObjectFromXMLParser.h | 39 ++++ alib2data/src/object/ObjectToXMLComposer.cpp | 26 +++ alib2data/src/object/ObjectToXMLComposer.h | 40 ++++ alib2data/src/regexp/RegExpBase.h | 2 +- alib2data/src/regexp/RegExpFromXMLParser.cpp | 8 + alib2data/src/regexp/RegExpFromXMLParser.h | 2 + alib2data/src/sax/Token.h | 5 + alib2data/src/string/StringBase.h | 2 +- alib2data/src/string/StringFromXMLParser.cpp | 8 + alib2data/src/string/StringFromXMLParser.h | 2 + alib2data/test-src/alphabet/SymbolTest.cpp | 4 +- .../test-src/automaton/AutomatonTest.cpp | 4 +- alib2data/test-src/grammar/GrammarTest.cpp | 41 ++-- alib2data/test-src/grammar/GrammarTest.h | 8 +- alib2data/test-src/label/LabelTest.cpp | 4 +- alib2data/test-src/regexp/RegExpTest.cpp | 4 +- alib2data/test-src/string/StringTest.cpp | 4 +- 39 files changed, 568 insertions(+), 85 deletions(-) rename alib2data/src/{ => object}/Object.h (85%) rename alib2data/src/{ => object}/ObjectBase.h (94%) create mode 100644 alib2data/src/object/ObjectFromXMLParser.cpp create mode 100644 alib2data/src/object/ObjectFromXMLParser.h create mode 100644 alib2data/src/object/ObjectToXMLComposer.cpp create mode 100644 alib2data/src/object/ObjectToXMLComposer.h diff --git a/acat2/src/acat.cpp b/acat2/src/acat.cpp index b436bbed84..4eb63f914e 100644 --- a/acat2/src/acat.cpp +++ b/acat2/src/acat.cpp @@ -10,13 +10,11 @@ #include <unistd.h> #include <exception> #include <exception/AlibException.h> -#include <factory/AutomatonFactory.h> -#include <factory/RegExpFactory.h> -#include <factory/StringFactory.h> -#include <factory/ExceptionFactory.h> +#include <factory/DataFactory.hpp> #include <sax/SaxParseInterface.h> -#include <FromXMLParsers.h> #include <sax/ParserException.h> +#include <object/Object.h> +#include <std/list.hpp> #define VERSION "0.0.1" @@ -49,23 +47,11 @@ int main(int argc, char** argv) { sax::SaxParseInterface::parseFile(argv[optind],tokens); } - if (alib::FromXMLParsers::automatonParser.first(tokens)) { - automaton::Automaton automaton = automaton::AutomatonFactory::fromTokens(tokens); - automaton::AutomatonFactory::toStdout(automaton); - } else if (alib::FromXMLParsers::regexpParser.first(tokens)) { - regexp::RegExp regexp = regexp::RegExpFactory::fromTokens(tokens); - regexp::RegExpFactory::toStdout(regexp); - } else if (alib::FromXMLParsers::stringParser.first(tokens)) { - string::String string = string::StringFactory::fromTokens(tokens); - string::StringFactory::StringFactory::toStdout(string); - } else if (alib::FromXMLParsers::exceptionParser.first(tokens)) { - exception::AlibException exception = exception::ExceptionFactory::fromTokens(tokens); - exception::ExceptionFactory::toStdout(exception); - } else { - throw exception::AlibException( "Expected root tag automaton, grammar, regexp, string or exception. Read: " + tokens.front().getData()); - } + alib::Object object = alib::DataFactory::fromTokens<alib::Object>(tokens); + alib::DataFactory::toStdout(object); + } catch(const exception::AlibException& exception) { - exception::ExceptionFactory::toStdout(exception); + alib::DataFactory::toStdout(exception); return 1; } catch(...) { return 127; diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index e1bddb7299..32660945af 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -16,186 +16,372 @@ const string::StringFromXMLParser FromXMLParsers::stringParser; const automaton::AutomatonFromXMLParser FromXMLParsers::automatonParser; const grammar::GrammarFromXMLParser FromXMLParsers::grammarParser; const exception::ExceptionFromXMLParser FromXMLParsers::exceptionParser; +const alib::ObjectFromXMLParser FromXMLParsers::objectParser; const container::ContainerFromXMLParser FromXMLParsers::containerParser; +const label::LabelToXMLComposer ToXMLComposers::labelComposer; +const alphabet::SymbolToXMLComposer ToXMLComposers::symbolComposer; +const regexp::RegExpToXMLComposer ToXMLComposers::regexpComposer; +const string::StringToXMLComposer ToXMLComposers::stringComposer; +const automaton::AutomatonToXMLComposer ToXMLComposers::automatonComposer; +const grammar::GrammarToXMLComposer ToXMLComposers::grammarComposer; +const alib::ObjectToXMLComposer ToXMLComposers::objectComposer; +const exception::ExceptionToXMLComposer ToXMLComposers::exceptionComposer; + +const ToXMLComposers ToXMLComposers::toXMLComposers; + +alib::Object api<alib::Object>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::objectParser.parseObject(input); +} + +std::list<sax::Token> api<alib::Object>::compose(const alib::Object& data) { + return ToXMLComposers::objectComposer.compose(data); +} + +exception::AlibException api<exception::AlibException>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::exceptionParser.parseException(input); +} + +std::list<sax::Token> api<exception::AlibException>::compose(const exception::AlibException& data) { + return ToXMLComposers::exceptionComposer.compose(data); +} + alphabet::Symbol api<alphabet::Symbol>::parse(std::list<sax::Token>& input) { return FromXMLParsers::symbolParser.parseSymbol(input); } +std::list<sax::Token> api<alphabet::Symbol>::compose(const alphabet::Symbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + alphabet::LabeledSymbol api<alphabet::LabeledSymbol>::parse(std::list<sax::Token>& input) { return FromXMLParsers::symbolParser.parseLabeledSymbol(input); } +std::list<sax::Token> api<alphabet::LabeledSymbol>::compose(const alphabet::LabeledSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + alphabet::BlankSymbol api<alphabet::BlankSymbol>::parse(std::list<sax::Token>& input) { return FromXMLParsers::symbolParser.parseBlankSymbol(input); } +std::list<sax::Token> api<alphabet::BlankSymbol>::compose(const alphabet::BlankSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + alphabet::BottomOfTheStackSymbol api<alphabet::BottomOfTheStackSymbol>::parse(std::list<sax::Token>& input) { return FromXMLParsers::symbolParser.parseBottomOfTheStackSymbol(input); } +std::list<sax::Token> api<alphabet::BottomOfTheStackSymbol>::compose(const alphabet::BottomOfTheStackSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + alphabet::EndSymbol api<alphabet::EndSymbol>::parse(std::list<sax::Token>& input) { return FromXMLParsers::symbolParser.parseEndSymbol(input); } +std::list<sax::Token> api<alphabet::EndSymbol>::compose(const alphabet::EndSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseAutomaton(input); } +std::list<sax::Token> api<automaton::Automaton>::compose(const automaton::Automaton& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::UnknownAutomaton api<automaton::UnknownAutomaton>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseUnknownAutomaton(input); } +std::list<sax::Token> api<automaton::UnknownAutomaton>::compose(const automaton::UnknownAutomaton& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::EpsilonNFA api<automaton::EpsilonNFA>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseEpsilonNFA(input); } +std::list<sax::Token> api<automaton::EpsilonNFA>::compose(const automaton::EpsilonNFA& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::NFA api<automaton::NFA>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseNFA(input); } +std::list<sax::Token> api<automaton::NFA>::compose(const automaton::NFA& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::DFA api<automaton::DFA>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseDFA(input); } +std::list<sax::Token> api<automaton::DFA>::compose(const automaton::DFA& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::ExtendedNFA api<automaton::ExtendedNFA>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseExtendedNFA(input); } +std::list<sax::Token> api<automaton::ExtendedNFA>::compose(const automaton::ExtendedNFA& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::CompactNFA api<automaton::CompactNFA>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseCompactNFA(input); } +std::list<sax::Token> api<automaton::CompactNFA>::compose(const automaton::CompactNFA& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::NPDA api<automaton::NPDA>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseNPDA(input); } +std::list<sax::Token> api<automaton::NPDA>::compose(const automaton::NPDA& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::SinglePopNPDA api<automaton::SinglePopNPDA>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseSinglePopNPDA(input); } +std::list<sax::Token> api<automaton::SinglePopNPDA>::compose(const automaton::SinglePopNPDA& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + automaton::OneTapeDTM api<automaton::OneTapeDTM>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseOneTapeDTM(input); } +std::list<sax::Token> api<automaton::OneTapeDTM>::compose(const automaton::OneTapeDTM& data) { + return ToXMLComposers::automatonComposer.compose(data); +} + grammar::Grammar api<grammar::Grammar>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseGrammar(input); } +std::list<sax::Token> api<grammar::Grammar>::compose(const grammar::Grammar& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::UnknownGrammar api<grammar::UnknownGrammar>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseUnknownGrammar(input); } +std::list<sax::Token> api<grammar::UnknownGrammar>::compose(const grammar::UnknownGrammar& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::LeftLG api<grammar::LeftLG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseLeftLG(input); } +std::list<sax::Token> api<grammar::LeftLG>::compose(const grammar::LeftLG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::LeftRG api<grammar::LeftRG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseLeftRG(input); } +std::list<sax::Token> api<grammar::LeftRG>::compose(const grammar::LeftRG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::RightLG api<grammar::RightLG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseRightLG(input); } +std::list<sax::Token> api<grammar::RightLG>::compose(const grammar::RightLG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::RightRG api<grammar::RightRG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseRightRG(input); } +std::list<sax::Token> api<grammar::RightRG>::compose(const grammar::RightRG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::LG api<grammar::LG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseLG(input); } +std::list<sax::Token> api<grammar::LG>::compose(const grammar::LG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::CFG api<grammar::CFG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseCFG(input); } +std::list<sax::Token> api<grammar::CFG>::compose(const grammar::CFG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::EpsilonFreeCFG api<grammar::EpsilonFreeCFG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseEpsilonFreeCFG(input); } +std::list<sax::Token> api<grammar::EpsilonFreeCFG>::compose(const grammar::EpsilonFreeCFG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::CNF api<grammar::CNF>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseCNF(input); } +std::list<sax::Token> api<grammar::CNF>::compose(const grammar::CNF& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::GNF api<grammar::GNF>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseGNF(input); } +std::list<sax::Token> api<grammar::GNF>::compose(const grammar::GNF& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::CSG api<grammar::CSG>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseCSG(input); } +std::list<sax::Token> api<grammar::CSG>::compose(const grammar::CSG& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::NonContractingGrammar api<grammar::NonContractingGrammar>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseNonContractingGrammar(input); } +std::list<sax::Token> api<grammar::NonContractingGrammar>::compose(const grammar::NonContractingGrammar& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::ContextPreservingUnrestrictedGrammar api<grammar::ContextPreservingUnrestrictedGrammar>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseContextPreservingUnrestrictedGrammar(input); } +std::list<sax::Token> api<grammar::ContextPreservingUnrestrictedGrammar>::compose(const grammar::ContextPreservingUnrestrictedGrammar& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + grammar::UnrestrictedGrammar api<grammar::UnrestrictedGrammar>::parse(std::list<sax::Token>& input) { return FromXMLParsers::grammarParser.parseUnrestrictedGrammar(input); } +std::list<sax::Token> api<grammar::UnrestrictedGrammar>::compose(const grammar::UnrestrictedGrammar& data) { + return ToXMLComposers::grammarComposer.compose(data); +} + label::Label api<label::Label>::parse(std::list<sax::Token>& input) { return FromXMLParsers::labelParser.parseLabel(input); } +std::list<sax::Token> api<label::Label>::compose(const label::Label& data) { + return ToXMLComposers::labelComposer.compose(data); +} + label::StringLabel api<label::StringLabel>::parse(std::list<sax::Token>& input) { return FromXMLParsers::labelParser.parseStringLabel(input); } +std::list<sax::Token> api<label::StringLabel>::compose(const label::StringLabel& data) { + return ToXMLComposers::labelComposer.compose(data); +} + label::IntegerLabel api<label::IntegerLabel>::parse(std::list<sax::Token>& input) { return FromXMLParsers::labelParser.parseIntegerLabel(input); } +std::list<sax::Token> api<label::IntegerLabel>::compose(const label::IntegerLabel& data) { + return ToXMLComposers::labelComposer.compose(data); +} + label::CharacterLabel api<label::CharacterLabel>::parse(std::list<sax::Token>& input) { return FromXMLParsers::labelParser.parseCharacterLabel(input); } +std::list<sax::Token> api<label::CharacterLabel>::compose(const label::CharacterLabel& data) { + return ToXMLComposers::labelComposer.compose(data); +} + regexp::RegExp api<regexp::RegExp>::parse(std::list<sax::Token>& input) { return FromXMLParsers::regexpParser.parseRegExp(input); } +std::list<sax::Token> api<regexp::RegExp>::compose(const regexp::RegExp& data) { + return ToXMLComposers::regexpComposer.compose(data); +} + regexp::UnboundedRegExp api<regexp::UnboundedRegExp>::parse(std::list<sax::Token>& input) { return FromXMLParsers::regexpParser.parseUnboundedRegExp(input); } +std::list<sax::Token> api<regexp::UnboundedRegExp>::compose(const regexp::UnboundedRegExp& data) { + return ToXMLComposers::regexpComposer.compose(data); +} + regexp::FormalRegExp api<regexp::FormalRegExp>::parse(std::list<sax::Token>& input) { return FromXMLParsers::regexpParser.parseFormalRegExp(input); } +std::list<sax::Token> api<regexp::FormalRegExp>::compose(const regexp::FormalRegExp& data) { + return ToXMLComposers::regexpComposer.compose(data); +} + string::String api<string::String>::parse(std::list<sax::Token>& input) { return FromXMLParsers::stringParser.parseString(input); } +std::list<sax::Token> api<string::String>::compose(const string::String& data) { + return ToXMLComposers::stringComposer.compose(data); +} + string::LinearString api<string::LinearString>::parse(std::list<sax::Token>& input) { return FromXMLParsers::stringParser.parseLinearString(input); } +std::list<sax::Token> api<string::LinearString>::compose(const string::LinearString& data) { + return ToXMLComposers::stringComposer.compose(data); +} + string::CyclicString api<string::CyclicString>::parse(std::list<sax::Token>& input) { return FromXMLParsers::stringParser.parseCyclicString(input); } +std::list<sax::Token> api<string::CyclicString>::compose(const string::CyclicString& data) { + return ToXMLComposers::stringComposer.compose(data); +} + string::Epsilon api<string::Epsilon>::parse(std::list<sax::Token>& input) { return FromXMLParsers::stringParser.parseEpsilon(input); } -const label::LabelToXMLComposer ToXMLComposers::labelComposer; -const alphabet::SymbolToXMLComposer ToXMLComposers::symbolComposer; -const regexp::RegExpToXMLComposer ToXMLComposers::regexpComposer; -const string::StringToXMLComposer ToXMLComposers::stringComposer; -const automaton::AutomatonToXMLComposer ToXMLComposers::automatonComposer; -const grammar::GrammarToXMLComposer ToXMLComposers::grammarComposer; -const exception::ExceptionToXMLComposer ToXMLComposers::exceptionComposer; +std::list<sax::Token> api<string::Epsilon>::compose(const string::Epsilon& data) { + return ToXMLComposers::stringComposer.compose(data); +} -const ToXMLComposers ToXMLComposers::toXMLComposers; +void ToXMLComposers::Visit(void* data, const exception::AlibException& symbol) const { + *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::exceptionComposer.compose(symbol)); +} void ToXMLComposers::Visit(void* data, const alphabet::BlankSymbol& symbol) const { *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::symbolComposer.compose(symbol)); diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index 93e8bea8bf..62d7caf187 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -14,6 +14,7 @@ #include "string/StringFromXMLParser.h" #include "automaton/AutomatonFromXMLParser.h" #include "grammar/GrammarFromXMLParser.h" +#include "object/ObjectFromXMLParser.h" #include "exception/ExceptionFromXMLParser.h" #include "label/LabelToXMLComposer.h" @@ -22,9 +23,10 @@ #include "string/StringToXMLComposer.h" #include "automaton/AutomatonToXMLComposer.h" #include "grammar/GrammarToXMLComposer.h" +#include "object/ObjectToXMLComposer.h" #include "exception/ExceptionToXMLComposer.h" -#include "ObjectBase.h" +#include "object/ObjectBase.h" namespace alib { @@ -41,6 +43,20 @@ struct api<std::set<T>> { }; +template<> +struct api<alib::Object> { + static alib::Object parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const alib::Object& data); +}; + + +template<> +struct api<exception::AlibException> { + static exception::AlibException parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const exception::AlibException& data); +}; + + template<> struct api<alphabet::Symbol> { static alphabet::Symbol parse(std::list<sax::Token>& input); @@ -313,11 +329,14 @@ public: static const automaton::AutomatonFromXMLParser automatonParser; static const grammar::GrammarFromXMLParser grammarParser; static const exception::ExceptionFromXMLParser exceptionParser; + static const alib::ObjectFromXMLParser objectParser; static const container::ContainerFromXMLParser containerParser; }; class ToXMLComposers : public ObjectBase::const_visitor_type { + void Visit(void*, const exception::AlibException& symbol) const; + void Visit(void*, const alphabet::LabeledSymbol& symbol) const; void Visit(void*, const alphabet::BlankSymbol& symbol) const; void Visit(void*, const alphabet::BottomOfTheStackSymbol& symbol) const; @@ -367,6 +386,7 @@ public: static const automaton::AutomatonToXMLComposer automatonComposer; static const grammar::GrammarToXMLComposer grammarComposer; static const exception::ExceptionToXMLComposer exceptionComposer; + static const alib::ObjectToXMLComposer objectComposer; static const container::ContainerToXMLComposer containerComposer; static const ToXMLComposers toXMLComposers; diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h index d02fa37079..6e3fd5987d 100644 --- a/alib2data/src/alphabet/SymbolBase.h +++ b/alib2data/src/alphabet/SymbolBase.h @@ -9,7 +9,7 @@ #define SYMBOL_BASE_H_ #include "../common/base.hpp" -#include "../ObjectBase.h" +#include "../object/ObjectBase.h" namespace alphabet { diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index f7818b4def..7a52c7f076 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp +++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp @@ -36,6 +36,14 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std: } } +bool SymbolFromXMLParser::first(std::list<sax::Token>& input) const { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol")) { + return true; + } else { + return false; + } +} + LabeledSymbol SymbolFromXMLParser::parseLabeledSymbol(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol"); label::Label data = alib::FromXMLParsers::labelParser.parseLabel(input); diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h index e737392965..3d337b147a 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.h +++ b/alib2data/src/alphabet/SymbolFromXMLParser.h @@ -52,6 +52,12 @@ class GrammarFromXMLParser; } /* namespace grammar */ +namespace alib { + +class ObjectFromXMLParser; + +} /* namespace grammar */ + namespace alphabet { /** @@ -70,8 +76,11 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper { friend class regexp::RegExpFromXMLParser; friend class automaton::AutomatonFromXMLParser; friend class grammar::GrammarFromXMLParser; + friend class alib::ObjectFromXMLParser; template<typename T> friend class alib::api; +public: + bool first(std::list<sax::Token>& input) const; }; } /* namespace alphabet */ diff --git a/alib2data/src/automaton/AutomatonBase.h b/alib2data/src/automaton/AutomatonBase.h index a971cf3ebc..813a874ce5 100644 --- a/alib2data/src/automaton/AutomatonBase.h +++ b/alib2data/src/automaton/AutomatonBase.h @@ -9,7 +9,7 @@ #define AUTOMATON_BASE_H_ #include "../common/base.hpp" -#include "../ObjectBase.h" +#include "../object/ObjectBase.h" namespace automaton { diff --git a/alib2data/src/automaton/AutomatonFeatures.h b/alib2data/src/automaton/AutomatonFeatures.h index 9d2b9f8751..cc71a8a1a5 100644 --- a/alib2data/src/automaton/AutomatonFeatures.h +++ b/alib2data/src/automaton/AutomatonFeatures.h @@ -18,8 +18,8 @@ enum class FEATURES { COMPACT_NFA, EXTENDED_NFA, NPDA, - SINGLE_POP_NDPA, - ONE_TAPE_TM + SINGLE_POP_NPDA, + ONE_TAPE_DTM }; } /* namespace automaton */ diff --git a/alib2data/src/automaton/AutomatonFromXMLParser.cpp b/alib2data/src/automaton/AutomatonFromXMLParser.cpp index 7a4291604b..44441c3784 100644 --- a/alib2data/src/automaton/AutomatonFromXMLParser.cpp +++ b/alib2data/src/automaton/AutomatonFromXMLParser.cpp @@ -18,7 +18,7 @@ namespace automaton { Automaton AutomatonFromXMLParser::parseAutomaton(std::list<sax::Token> &input) const { - return parseAutomaton(input, std::set<FEATURES>({FEATURES::AUTOMATON, FEATURES::EPSILON_NFA, FEATURES::NFA, FEATURES::DFA, FEATURES::COMPACT_NFA, FEATURES::EXTENDED_NFA, FEATURES::NPDA, FEATURES::SINGLE_POP_NDPA, FEATURES::ONE_TAPE_TM})); + return parseAutomaton(input, std::set<FEATURES>({FEATURES::AUTOMATON, FEATURES::EPSILON_NFA, FEATURES::NFA, FEATURES::DFA, FEATURES::COMPACT_NFA, FEATURES::EXTENDED_NFA, FEATURES::NPDA, FEATURES::SINGLE_POP_NPDA, FEATURES::ONE_TAPE_DTM})); } Automaton AutomatonFromXMLParser::parseAutomaton(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { @@ -34,10 +34,33 @@ Automaton AutomatonFromXMLParser::parseAutomaton(std::list<sax::Token>& input, c } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "DFA")) { if(!features.count(FEATURES::DFA)) throw exception::AlibException(); return Automaton(parseDFA(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CompactNFA")) { + if(!features.count(FEATURES::COMPACT_NFA)) throw exception::AlibException(); + return Automaton(parseCompactNFA(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "ExtendedNFA")) { + if(!features.count(FEATURES::EXTENDED_NFA)) throw exception::AlibException(); + return Automaton(parseExtendedNFA(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "NPDA")) { + if(!features.count(FEATURES::NPDA)) throw exception::AlibException(); + return Automaton(parseNPDA(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopNPDA")) { + if(!features.count(FEATURES::SINGLE_POP_NPDA)) throw exception::AlibException(); + return Automaton(parseSinglePopNPDA(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "OneTapeDTM")) { + if(!features.count(FEATURES::ONE_TAPE_DTM)) throw exception::AlibException(); + return Automaton(parseOneTapeDTM(input)); } else throw sax::ParserException(sax::Token("Automaton / EpsilonNFA / NFA / DFA", 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")) { + return true; + } else { + return false; + } +} + UnknownAutomaton AutomatonFromXMLParser::parseUnknownAutomaton(std::list<sax::Token> &input) const { UnknownAutomaton automaton; diff --git a/alib2data/src/automaton/AutomatonFromXMLParser.h b/alib2data/src/automaton/AutomatonFromXMLParser.h index 12faa322a5..58416fefb5 100644 --- a/alib2data/src/automaton/AutomatonFromXMLParser.h +++ b/alib2data/src/automaton/AutomatonFromXMLParser.h @@ -96,6 +96,8 @@ class AutomatonFromXMLParser : public sax::FromXMLParserHelper { OneTapeDTM parseOneTapeDTM(std::list<sax::Token>& input) const; template<typename T> friend class alib::api; +public: + bool first(std::list<sax::Token>& input) const; }; } /* namespace automaton */ diff --git a/alib2data/src/exception/AlibException.cpp b/alib2data/src/exception/AlibException.cpp index cd127dc59a..c2106dd6dc 100644 --- a/alib2data/src/exception/AlibException.cpp +++ b/alib2data/src/exception/AlibException.cpp @@ -33,6 +33,14 @@ AlibException::~AlibException ( ) noexcept { } +alib::ObjectBase* AlibException::clone() const { + return new AlibException(*this); +} + +alib::ObjectBase* AlibException::plunder() && { + return new AlibException(std::move(*this)); +} + const char * AlibException::what ( ) const noexcept { return whatMessage.c_str ( ); } @@ -45,4 +53,32 @@ const std::string & AlibException::getBacktrace ( ) const { return backtrace; } +bool AlibException::operator==(const ObjectBase& other) const { + return other == *this; +} + +bool AlibException::operator<(const ObjectBase& other) const { + return other > *this; +} + +bool AlibException::operator>(const ObjectBase& other) const { + return other < *this; +} + +bool AlibException::operator==(const AlibException& other) const { + return this->whatMessage == other.whatMessage; +} + +bool AlibException::operator<(const AlibException& other) const { + return this->whatMessage < other.whatMessage; +} + +void AlibException::operator>>(std::ostream& os) const { + os << this->whatMessage; +} + +AlibException::operator std::string() const { + return this->whatMessage; +} + } /* namespace exception */ diff --git a/alib2data/src/exception/AlibException.h b/alib2data/src/exception/AlibException.h index 919f889c92..99c8aacee3 100644 --- a/alib2data/src/exception/AlibException.h +++ b/alib2data/src/exception/AlibException.h @@ -11,13 +11,15 @@ #include <exception> #include <string> +#include "../object/ObjectBase.h" + namespace exception { /** * Basic exception from which are derived all other exceptions. * Contains reason why the exception occured. */ -class AlibException : public std::exception { +class AlibException : public std::exception, public std::element<AlibException, alib::ObjectBase> { protected: std::string cause; @@ -29,6 +31,10 @@ public: explicit AlibException ( const std::string & cause ); virtual ~AlibException ( ) noexcept; + virtual alib::ObjectBase* clone() const; + + virtual alib::ObjectBase* plunder() &&; + /** * @return reason why the exception occured */ @@ -43,7 +49,21 @@ public: * @return reason why the exception occured */ const std::string & getBacktrace ( ) const; - + + virtual bool operator>(const ObjectBase& other) const; + virtual bool operator==(const ObjectBase& other) const; + virtual bool operator<(const ObjectBase& other) const; + + virtual bool operator==(const AlibException& other) const; + virtual bool operator<(const AlibException& other) const; + + virtual void operator>>(std::ostream& os) const; + + virtual operator std::string() const; + + virtual int selfTypeId() const { + return typeId(*this); + } }; } /* namespace exception */ diff --git a/alib2data/src/exception/ExceptionFromXMLParser.h b/alib2data/src/exception/ExceptionFromXMLParser.h index ee94c2a235..ce3eb59114 100644 --- a/alib2data/src/exception/ExceptionFromXMLParser.h +++ b/alib2data/src/exception/ExceptionFromXMLParser.h @@ -21,6 +21,12 @@ struct api; } /* namespace alib */ +namespace alib { + +class ObjectFromXMLParser; + +} + namespace exception { /** @@ -33,6 +39,8 @@ class ExceptionFromXMLParser : public sax::FromXMLParserHelper { public: bool first(std::list<sax::Token>& input) const; + friend class alib::ObjectFromXMLParser; + template<typename T> friend class alib::api; }; diff --git a/alib2data/src/grammar/GrammarBase.h b/alib2data/src/grammar/GrammarBase.h index 05c981afd3..89e0d590ad 100644 --- a/alib2data/src/grammar/GrammarBase.h +++ b/alib2data/src/grammar/GrammarBase.h @@ -9,7 +9,7 @@ #define GRAMMAR_BASE_H_ #include "../common/base.hpp" -#include "../ObjectBase.h" +#include "../object/ObjectBase.h" namespace grammar { diff --git a/alib2data/src/grammar/GrammarFromXMLParser.cpp b/alib2data/src/grammar/GrammarFromXMLParser.cpp index 67c88b1626..55685e9d1c 100644 --- a/alib2data/src/grammar/GrammarFromXMLParser.cpp +++ b/alib2data/src/grammar/GrammarFromXMLParser.cpp @@ -65,6 +65,14 @@ Grammar GrammarFromXMLParser::parseGrammar(std::list<sax::Token>& input, const s throw sax::ParserException(sax::Token("Grammar / UnrestrictedGrammar", sax::Token::TokenType::START_ELEMENT), input.front()); } +bool GrammarFromXMLParser::first(std::list<sax::Token>& input) const { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "grammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "UnrestrictedGrammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "ContextPreservingUnrestrictedGrammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "NonContractingGrammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CSG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "GNF") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CNF") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EpsilonFreeCFG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CFG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RightRG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RightLG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LeftLG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LeftLG")) { + return true; + } else { + return false; + } +} + UnknownGrammar GrammarFromXMLParser::parseUnknownGrammar(std::list<sax::Token> &input) const { UnknownGrammar grammar; diff --git a/alib2data/src/grammar/GrammarFromXMLParser.h b/alib2data/src/grammar/GrammarFromXMLParser.h index 97d5423ef5..b0d63f7ad9 100644 --- a/alib2data/src/grammar/GrammarFromXMLParser.h +++ b/alib2data/src/grammar/GrammarFromXMLParser.h @@ -94,6 +94,8 @@ class GrammarFromXMLParser : public sax::FromXMLParserHelper { LeftLG parseLeftLG(std::list<sax::Token>& input) const; template<typename T> friend class alib::api; +public: + bool first(std::list<sax::Token>& input) const; }; } /* namespace grammar */ diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h index 30a9edc1b7..6e152e5bb0 100644 --- a/alib2data/src/label/LabelBase.h +++ b/alib2data/src/label/LabelBase.h @@ -9,7 +9,7 @@ #define LABEL_BASE_H_ #include "../common/base.hpp" -#include "../ObjectBase.h" +#include "../object/ObjectBase.h" namespace label { diff --git a/alib2data/src/label/LabelFromXMLParser.cpp b/alib2data/src/label/LabelFromXMLParser.cpp index 6934026a81..dd185a4a12 100644 --- a/alib2data/src/label/LabelFromXMLParser.cpp +++ b/alib2data/src/label/LabelFromXMLParser.cpp @@ -30,6 +30,14 @@ Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::se } } +bool LabelFromXMLParser::first(std::list<sax::Token>& input) const { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel")) { + return true; + } else { + return false; + } +} + IntegerLabel LabelFromXMLParser::parseIntegerLabel(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel"); IntegerLabel data(std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER))); diff --git a/alib2data/src/label/LabelFromXMLParser.h b/alib2data/src/label/LabelFromXMLParser.h index 87eb3e64cb..8f3f27c3d8 100644 --- a/alib2data/src/label/LabelFromXMLParser.h +++ b/alib2data/src/label/LabelFromXMLParser.h @@ -56,6 +56,8 @@ class LabelFromXMLParser : public sax::FromXMLParserHelper { friend class automaton::AutomatonFromXMLParser; template<typename T> friend class alib::api; +public: + bool first(std::list<sax::Token>& input) const; }; } /* namespace label */ diff --git a/alib2data/src/Object.h b/alib2data/src/object/Object.h similarity index 85% rename from alib2data/src/Object.h rename to alib2data/src/object/Object.h index f3259651bc..a41fa5c3f9 100644 --- a/alib2data/src/Object.h +++ b/alib2data/src/object/Object.h @@ -11,14 +11,14 @@ #include "ObjectBase.h" #include "../common/wrapper.hpp" -namespace grammar { +namespace alib { /** * Wrapper around object. */ typedef alib::wrapper<ObjectBase> Object; -} /* namespace grammar */ +} /* namespace alib */ #endif /* OBJECT_H_ */ diff --git a/alib2data/src/ObjectBase.h b/alib2data/src/object/ObjectBase.h similarity index 94% rename from alib2data/src/ObjectBase.h rename to alib2data/src/object/ObjectBase.h index e07509fe71..62015e9d53 100644 --- a/alib2data/src/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -8,8 +8,14 @@ #ifndef OBJECT_BASE_H_ #define OBJECT_BASE_H_ -#include "std/visitor.hpp" -#include "common/base.hpp" +#include "../std/visitor.hpp" +#include "../common/base.hpp" + +namespace exception { + +class AlibException; + +} namespace automaton { @@ -81,6 +87,7 @@ namespace alib { class ObjectBase : public alib::base< ObjectBase, + exception::AlibException, automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM, grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar, label::StringLabel, label::IntegerLabel, label::CharacterLabel, @@ -89,6 +96,7 @@ class ObjectBase : alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol >, public std::elementBase< + exception::AlibException, automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM, grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar, label::StringLabel, label::IntegerLabel, label::CharacterLabel, diff --git a/alib2data/src/object/ObjectFromXMLParser.cpp b/alib2data/src/object/ObjectFromXMLParser.cpp new file mode 100644 index 0000000000..07e5dab739 --- /dev/null +++ b/alib2data/src/object/ObjectFromXMLParser.cpp @@ -0,0 +1,38 @@ +/* + * ObjectFromXMLParser.cpp + * + * Created on: Nov 23, 2013 + * Author: Jan Travnicek + */ + +#include "ObjectFromXMLParser.h" + +#include "../sax/ParserException.h" + +#include "../Api.hpp" +#include <iostream> + +namespace alib { + +Object ObjectFromXMLParser::parseObject(std::list<sax::Token>& input) const { + ObjectBase* tmp; + + if(alib::FromXMLParsers::symbolParser.first(input)) { + alphabet::Symbol symbol = alib::FromXMLParsers::symbolParser.parseSymbol(input); + tmp = std::move(symbol.getData()).plunder(); + } else if(alib::FromXMLParsers::exceptionParser.first(input)) { + exception::AlibException exception = alib::FromXMLParsers::exceptionParser.parseException(input); + tmp = std::move(exception).plunder(); + } else { + throw exception::AlibException("Unknown element in xml"); + } + Object res {std::move(*tmp)}; + delete tmp; + return res; +} + +bool ObjectFromXMLParser::first(std::list<sax::Token>& input) { + return alib::FromXMLParsers::symbolParser.first(input) || alib::FromXMLParsers::exceptionParser.first(input); +} + +} /* namespace alib */ diff --git a/alib2data/src/object/ObjectFromXMLParser.h b/alib2data/src/object/ObjectFromXMLParser.h new file mode 100644 index 0000000000..6946756c2a --- /dev/null +++ b/alib2data/src/object/ObjectFromXMLParser.h @@ -0,0 +1,39 @@ +/* + * ObjectFromXMLParser.h + * + * Created on: Nov 23, 2013 + * Author: Jan Travnicek + */ + +#ifndef OBJECT_FROM_XML_PARSER_H_ +#define OBJECT_FROM_XML_PARSER_H_ + +#include "../sax/FromXMLParserHelper.h" +#include <set> +#include "Object.h" +#include "../sax/Token.h" +#include "../label/Label.h" + +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + +namespace alib { + +/** + * Parser used to get String from XML parsed into list of tokens. + */ +class ObjectFromXMLParser : public sax::FromXMLParserHelper { + Object parseObject(std::list<sax::Token>& input) const; + + template<typename T> friend class alib::api; +public: + static bool first(std::list<sax::Token>& input); +}; + +} /* namespace alib */ + +#endif /* OBJECT_FROM_XML_PARSER_H_ */ diff --git a/alib2data/src/object/ObjectToXMLComposer.cpp b/alib2data/src/object/ObjectToXMLComposer.cpp new file mode 100644 index 0000000000..97bedbf9af --- /dev/null +++ b/alib2data/src/object/ObjectToXMLComposer.cpp @@ -0,0 +1,26 @@ +/* + * ObjectToXMLComposer.cpp + * + * Created on: Nov 23, 2013 + * Author: Jan Travnicek + */ + +#include "ObjectToXMLComposer.h" + +#include "../Api.hpp" + +namespace alib { + +std::list<sax::Token> ObjectToXMLComposer::compose(const Object& object) const { + std::list<sax::Token> out; + object.getData().Accept((void*) &out, alib::ToXMLComposers::toXMLComposers); + return out; +} + +std::list<sax::Token> ObjectToXMLComposer::compose(const ObjectBase& object) const { + std::list<sax::Token> out; + object.Accept((void*) &out, alib::ToXMLComposers::toXMLComposers); + return out; +} + +} /* namespace alib */ diff --git a/alib2data/src/object/ObjectToXMLComposer.h b/alib2data/src/object/ObjectToXMLComposer.h new file mode 100644 index 0000000000..19716a87e5 --- /dev/null +++ b/alib2data/src/object/ObjectToXMLComposer.h @@ -0,0 +1,40 @@ +/* + * ObjectToXMLComposer.h + * + * Created on: Nov 23, 2013 + * Author: Jan Travnciek + */ + +#ifndef OBJECT_TO_XML_COMPOSER_H_ +#define OBJECT_TO_XML_COMPOSER_H_ + +#include <list> +#include "Object.h" +#include "../sax/Token.h" +#include "../label/Label.h" + +namespace alib { + +/** + * This class contains methods to print XML representation of string to the output stream. + */ +class ObjectToXMLComposer { +public: + /** + * Prints XML representation of UnknownAutomaton to the output stream. + * @param automaton automaton to print + * @return list of xml tokens representing the automaton + */ + std::list<sax::Token> compose(const ObjectBase& object) const; + + /** + * Prints XML representation of String to the output stream. + * @param string String to print + * @param out output stream to which print the String + */ + std::list<sax::Token> compose(const Object& object) const; +}; + +} /* namespace alib */ + +#endif /* OBJECT_TO_XML_COMPOSER_H_ */ diff --git a/alib2data/src/regexp/RegExpBase.h b/alib2data/src/regexp/RegExpBase.h index e6838c07f0..27579143a1 100644 --- a/alib2data/src/regexp/RegExpBase.h +++ b/alib2data/src/regexp/RegExpBase.h @@ -9,7 +9,7 @@ #define REG_EXP_BASE_H_ #include "../common/base.hpp" -#include "../ObjectBase.h" +#include "../object/ObjectBase.h" namespace regexp { diff --git a/alib2data/src/regexp/RegExpFromXMLParser.cpp b/alib2data/src/regexp/RegExpFromXMLParser.cpp index 93aa149743..c795da2147 100644 --- a/alib2data/src/regexp/RegExpFromXMLParser.cpp +++ b/alib2data/src/regexp/RegExpFromXMLParser.cpp @@ -28,6 +28,14 @@ RegExp RegExpFromXMLParser::parseRegExp(std::list<sax::Token>& input, const std: throw exception::AlibException(); } +bool RegExpFromXMLParser::first(std::list<sax::Token>& input) const { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "unboundedRegexp") || isToken(input, sax::Token::TokenType::START_ELEMENT, "formalRegexp")) { + return true; + } else { + return false; + } +} + UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "unboundedRegexp"); diff --git a/alib2data/src/regexp/RegExpFromXMLParser.h b/alib2data/src/regexp/RegExpFromXMLParser.h index c57f4c5569..90779c709c 100644 --- a/alib2data/src/regexp/RegExpFromXMLParser.h +++ b/alib2data/src/regexp/RegExpFromXMLParser.h @@ -63,6 +63,8 @@ class RegExpFromXMLParser : public sax::FromXMLParserHelper { friend class automaton::AutomatonFromXMLParser; template<typename T> friend class alib::api; +public: + bool first(std::list<sax::Token>& input) const; }; } /* namespace regexp */ diff --git a/alib2data/src/sax/Token.h b/alib2data/src/sax/Token.h index b0a88aed07..6987699f7f 100644 --- a/alib2data/src/sax/Token.h +++ b/alib2data/src/sax/Token.h @@ -43,6 +43,11 @@ public: TokenType getType() const; bool operator==(const Token& other) const; + + friend std::ostream& operator<<(std::ostream& os, const Token& token) { + os << token.data; //TODO + return os; + } }; } /* namespace sax */ diff --git a/alib2data/src/string/StringBase.h b/alib2data/src/string/StringBase.h index 0847a7cb05..f257a8f7e1 100644 --- a/alib2data/src/string/StringBase.h +++ b/alib2data/src/string/StringBase.h @@ -9,7 +9,7 @@ #define STRING_BASE_H_ #include "../std/visitor.hpp" -#include "../ObjectBase.h" +#include "../object/ObjectBase.h" namespace string { diff --git a/alib2data/src/string/StringFromXMLParser.cpp b/alib2data/src/string/StringFromXMLParser.cpp index 4f8fc8e267..6db03f225f 100644 --- a/alib2data/src/string/StringFromXMLParser.cpp +++ b/alib2data/src/string/StringFromXMLParser.cpp @@ -31,6 +31,14 @@ String StringFromXMLParser::parseString(std::list<sax::Token>& input, const std: } } +bool StringFromXMLParser::first(std::list<sax::Token>& input) const { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString")) { + return true; + } else { + return false; + } +} + LinearString StringFromXMLParser::parseLinearString(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString"); diff --git a/alib2data/src/string/StringFromXMLParser.h b/alib2data/src/string/StringFromXMLParser.h index c8b814d66d..9ccf9dbfbe 100644 --- a/alib2data/src/string/StringFromXMLParser.h +++ b/alib2data/src/string/StringFromXMLParser.h @@ -51,6 +51,8 @@ class StringFromXMLParser : public sax::FromXMLParserHelper { friend class automaton::AutomatonFromXMLParser; template<typename T> friend class alib::api; +public: + bool first(std::list<sax::Token>& input) const; }; } /* namespace string */ diff --git a/alib2data/test-src/alphabet/SymbolTest.cpp b/alib2data/test-src/alphabet/SymbolTest.cpp index e9032d9c4f..72453b6fc5 100644 --- a/alib2data/test-src/alphabet/SymbolTest.cpp +++ b/alib2data/test-src/alphabet/SymbolTest.cpp @@ -113,12 +113,12 @@ void SymbolTest::testXMLParser() { CPPUNIT_ASSERT( symbol == symbol2 ); } -/* { + { std::string tmp = alib::DataFactory::toString(symbol); alphabet::Symbol symbol2 = alib::DataFactory::fromString<alphabet::Symbol>(tmp); CPPUNIT_ASSERT( symbol == symbol2 ); - }*/ + } } void SymbolTest::testOrder() { diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp index 5c538988be..59661c2160 100644 --- a/alib2data/test-src/automaton/AutomatonTest.cpp +++ b/alib2data/test-src/automaton/AutomatonTest.cpp @@ -49,12 +49,12 @@ void AutomatonTest::testXMLParser() { CPPUNIT_ASSERT( automaton == automaton2 ); } -/* { + { std::string tmp = alib::DataFactory::toString(automaton); automaton::Automaton automaton2 = alib::DataFactory::fromString<automaton::Automaton>(tmp); CPPUNIT_ASSERT( automaton == automaton2.getData() ); - }*/ + } } void AutomatonTest::testDFAParser() { diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp index ffa3a22c18..784c7b2afa 100644 --- a/alib2data/test-src/grammar/GrammarTest.cpp +++ b/alib2data/test-src/grammar/GrammarTest.cpp @@ -46,14 +46,14 @@ void GrammarTest::testXMLParser() { CPPUNIT_ASSERT( grammar == grammar2 ); } -/* { + { std::string tmp = alib::DataFactory::toString(grammar); grammar::Grammar grammar2 = alib::DataFactory::fromString<grammar::Grammar>(tmp); CPPUNIT_ASSERT( grammar == grammar2.getData() ); - }*/ + } } -/* TODO uncomment + void GrammarTest::testUnrestrictedParser() { grammar::UnrestrictedGrammar grammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1))))); @@ -80,8 +80,7 @@ void GrammarTest::testUnrestrictedParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::UnrestrictedGrammar grammar2 = parser.parseUnrestrictedGrammar(tokens2); + grammar::UnrestrictedGrammar grammar2 = alib::DataFactory::fromTokens<grammar::UnrestrictedGrammar>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -108,8 +107,7 @@ void GrammarTest::testUnrestrictedParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::ContextPreservingUnrestrictedGrammar grammar2 = parser.parseContextPreservingUnrestrictedGrammar(tokens2); + grammar::ContextPreservingUnrestrictedGrammar grammar2 = alib::DataFactory::fromTokens<grammar::ContextPreservingUnrestrictedGrammar>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -138,8 +136,7 @@ void GrammarTest::testRegularParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::RightRG grammar2 = parser.parseRightRG(tokens2); + grammar::RightRG grammar2 = alib::DataFactory::fromTokens<grammar::RightRG>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -168,8 +165,7 @@ void GrammarTest::testRegularParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::RightLG grammar2 = parser.parseRightLG(tokens2); + grammar::RightLG grammar2 = alib::DataFactory::fromTokens<grammar::RightLG>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -200,8 +196,7 @@ void GrammarTest::testContextFreeParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::LG grammar2 = parser.parseLG(tokens2); + grammar::LG grammar2 = alib::DataFactory::fromTokens<grammar::LG>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -230,8 +225,7 @@ void GrammarTest::testContextFreeParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::EpsilonFreeCFG grammar2 = parser.parseEpsilonFreeCFG(tokens2); + grammar::EpsilonFreeCFG grammar2 = alib::DataFactory::fromTokens<grammar::EpsilonFreeCFG>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -260,8 +254,7 @@ void GrammarTest::testContextFreeParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::CFG grammar2 = parser.parseCFG(tokens2); + grammar::CFG grammar2 = alib::DataFactory::fromTokens<grammar::CFG>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -290,8 +283,7 @@ void GrammarTest::testContextFreeParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::CNF grammar2 = parser.parseCNF(tokens2); + grammar::CNF grammar2 = alib::DataFactory::fromTokens<grammar::CNF>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -320,8 +312,7 @@ void GrammarTest::testContextFreeParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::GNF grammar2 = parser.parseGNF(tokens2); + grammar::GNF grammar2 = alib::DataFactory::fromTokens<grammar::GNF>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -352,8 +343,7 @@ void GrammarTest::testContextSensitiveParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::CSG grammar2 = parser.parseCSG(tokens2); + grammar::CSG grammar2 = alib::DataFactory::fromTokens<grammar::CSG>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } @@ -381,10 +371,9 @@ void GrammarTest::testContextSensitiveParser() { std::list<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GrammarFromXMLParser parser; - grammar::NonContractingGrammar grammar2 = parser.parseNonContractingGrammar(tokens2); + grammar::NonContractingGrammar grammar2 = alib::DataFactory::fromTokens<grammar::NonContractingGrammar>(tokens2); CPPUNIT_ASSERT( grammar == grammar2 ); } } -} */ +} diff --git a/alib2data/test-src/grammar/GrammarTest.h b/alib2data/test-src/grammar/GrammarTest.h index 588ed8b057..6dcea84220 100644 --- a/alib2data/test-src/grammar/GrammarTest.h +++ b/alib2data/test-src/grammar/GrammarTest.h @@ -7,10 +7,10 @@ class GrammarTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( GrammarTest ); CPPUNIT_TEST( testXMLParser ); -/* CPPUNIT_TEST( testUnrestrictedParser ); + CPPUNIT_TEST( testUnrestrictedParser ); CPPUNIT_TEST( testContextSensitiveParser ); CPPUNIT_TEST( testContextFreeParser ); - CPPUNIT_TEST( testRegularParser );*/ + CPPUNIT_TEST( testRegularParser ); CPPUNIT_TEST_SUITE_END(); public: @@ -18,10 +18,10 @@ public: void tearDown(); void testXMLParser(); -/* void testUnrestrictedParser(); + void testUnrestrictedParser(); void testContextSensitiveParser(); void testContextFreeParser(); - void testRegularParser();*/ + void testRegularParser(); }; #endif // GRAMMAR_TEST_H_ diff --git a/alib2data/test-src/label/LabelTest.cpp b/alib2data/test-src/label/LabelTest.cpp index b5a6f52177..cc28609daa 100644 --- a/alib2data/test-src/label/LabelTest.cpp +++ b/alib2data/test-src/label/LabelTest.cpp @@ -92,12 +92,12 @@ void LabelTest::testXMLParser() { CPPUNIT_ASSERT( label == label2 ); } -/* { + { std::string tmp = alib::DataFactory::toString(label); label::Label label2 = alib::DataFactory::fromString<label::Label>(tmp); CPPUNIT_ASSERT( label == label2 ); - }*/ + } } void LabelTest::testOrder() { diff --git a/alib2data/test-src/regexp/RegExpTest.cpp b/alib2data/test-src/regexp/RegExpTest.cpp index 22452efe8d..eff762cff8 100644 --- a/alib2data/test-src/regexp/RegExpTest.cpp +++ b/alib2data/test-src/regexp/RegExpTest.cpp @@ -143,12 +143,12 @@ void RegExpTest::testXMLParser() { CPPUNIT_ASSERT( regexp == regexp2 ); } -/* { + { std::string tmp = alib::DataFactory::toString(regexp); regexp::RegExp regexp2 = alib::DataFactory::fromString<regexp::RegExp>(tmp); CPPUNIT_ASSERT( regexp == regexp2 ); - }*/ + } } void RegExpTest::testOrder() { diff --git a/alib2data/test-src/string/StringTest.cpp b/alib2data/test-src/string/StringTest.cpp index d277af2dee..ecb97ed6fd 100644 --- a/alib2data/test-src/string/StringTest.cpp +++ b/alib2data/test-src/string/StringTest.cpp @@ -129,12 +129,12 @@ void StringTest::testXMLParser() { CPPUNIT_ASSERT( string == string2 ); } -/* { + { std::string tmp = alib::DataFactory::toString(string); string::String string2 = alib::DataFactory::fromString<string::String>(tmp); CPPUNIT_ASSERT( string == string2 ); - }*/ + } } void StringTest::testCompare() { -- GitLab