From f406ef842570f9ae10a72666e4741957ffda387b Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sat, 21 Oct 2017 10:52:09 +0200 Subject: [PATCH] make aconvert use cli --- aconvert2/makefile.conf | 6 +- aconvert2/src/aconvert.cpp | 212 ++++++----------------- alib2aux/src/convert/GasTexConverter.cpp | 20 +++ alib2aux/src/convert/GasTexConverter.h | 7 + alib2aux/src/convert/TikZConverter.cpp | 20 +++ alib2aux/src/convert/TikZConverter.h | 7 + 6 files changed, 111 insertions(+), 161 deletions(-) diff --git a/aconvert2/makefile.conf b/aconvert2/makefile.conf index 2d054d2226..58aebe62d2 100644 --- a/aconvert2/makefile.conf +++ b/aconvert2/makefile.conf @@ -1,4 +1,4 @@ EXECUTABLE:=aconvert2 -LINK_PATHS=../alib2aux/ ../alib2str/ ../alib2data/ ../alib2xml/ ../alib2measure/ ../alib2common/ ../alib2std/ -LINK_LIBRARIES=alib2aux alib2str alib2data alib2xml alib2measure alib2common alib2std xml2 -INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2aux/src/ \$$(SOURCES_BASE_DIR)/../../alib2str/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2xml/src/ \$$(SOURCES_BASE_DIR)/../../alib2measure/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/ +LINK_PATHS=../alib2cli/ ../alib2aux/ ../alib2str/ ../alib2data/ ../alib2xml/ ../alib2measure/ ../alib2common/ ../alib2std/ +LINK_LIBRARIES=alib2cli alib2aux alib2str alib2data alib2xml alib2measure alib2common alib2std xml2 +INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2cli/src/ \$$(SOURCES_BASE_DIR)/../../alib2xml/src/ \$$(SOURCES_BASE_DIR)/../../alib2measure/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/ diff --git a/aconvert2/src/aconvert.cpp b/aconvert2/src/aconvert.cpp index c4e0a286e6..89e2263f96 100644 --- a/aconvert2/src/aconvert.cpp +++ b/aconvert2/src/aconvert.cpp @@ -8,138 +8,12 @@ #include <tclap/CmdLine.h> #include <global/GlobalData.h> #include <measure> -#include <fstream> -#include "factory/XmlDataFactory.hpp" -#include "factory/StringDataFactory.hpp" -#include "exception/CommonException.h" +#include <exception/CommonException.h> +#include <lexer/Lexer.h> +#include <parser/Parser.h> -#include <convert/DotConverter.h> -#include <convert/GasTexConverter.h> -#include <convert/TikZConverter.h> - -#include <automaton/Automaton.h> -#include <grammar/Grammar.h> -#include <regexp/RegExp.h> -#include <tree/Tree.h> -#include <string/String.h> - -void automatonFromString ( std::istream & in, std::ostream & out ) { - automaton::Automaton automaton = alib::StringDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::XmlDataFactory::toStream ( automaton, out ); -} - -void grammarFromString ( std::istream & in, std::ostream & out ) { - grammar::Grammar grammar = alib::StringDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::XmlDataFactory::toStream ( grammar, out ); -} - -void regexpFromString ( std::istream & in, std::ostream & out ) { - regexp::RegExp regexp = alib::StringDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::XmlDataFactory::toStream ( regexp, out ); -} - -void stringFromString ( std::istream & in, std::ostream & out ) { - string::String string = alib::StringDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::XmlDataFactory::toStream ( string, out ); -} - -void treeFromString ( std::istream & in, std::ostream & out ) { - tree::Tree tree = alib::StringDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::XmlDataFactory::toStream ( tree, out ); -} - -void automatonToString ( std::istream & in, std::ostream & out ) { - automaton::Automaton automaton = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::StringDataFactory::toStream ( automaton, out ); -} - -void grammarToString ( std::istream & in, std::ostream & out ) { - grammar::Grammar grammar = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::StringDataFactory::toStream ( grammar, out ); -} - -void regexpToString ( std::istream & in, std::ostream & out ) { - regexp::RegExp regexp = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::StringDataFactory::toStream ( regexp, out ); -} - -void stringToString ( std::istream & in, std::ostream & out ) { - string::String string = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::StringDataFactory::toStream ( string, out ); -} - -void treeToString ( std::istream & in, std::ostream & out ) { - tree::Tree tree = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::StringDataFactory::toStream ( tree, out ); -} - -void automatonToDot ( std::istream & in, std::ostream & out ) { - automaton::Automaton automaton = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - convert::DotConverter::convert ( out, automaton ); -} - -void automatonToGasTex ( std::istream & in, std::ostream & out ) { - automaton::Automaton automaton = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - convert::GasTexConverter::convert ( out, automaton ); -} - -void automatonToTikZ ( std::istream & in, std::ostream & out ) { - automaton::Automaton automaton = alib::XmlDataFactory::fromStream ( in ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - convert::TikZConverter::convert ( out, automaton ); -} +#include <factory/XmlDataFactory.hpp> int main ( int argc, char * argv[] ) { try { @@ -204,51 +78,73 @@ int main ( int argc, char * argv[] ) { if ( measure.isSet ( ) ) common::GlobalData::measure = true; + cli::Environment environment; + environment.setBinding ( "stdin", input.getValue ( ) ); + environment.setBinding ( "stdout", "-" ); + measurements::start ( "Overal", measurements::Type::OVERALL ); measurements::start ( "Input read", measurements::Type::AUXILIARY ); - std::istream * in = NULL; + std::string inputCli; + if ( automaton_from_string.getValue ( ) || grammar_from_string.getValue ( ) || regexp_from_string.getValue ( ) || string_from_string.getValue ( ) || tree_from_string.getValue ( ) ) + inputCli = "execute cli::builtin::ReadFile #stdin > $input"; + else if ( automaton_to_string.getValue ( ) || automaton_to_dot.getValue ( ) || automaton_to_gastex.getValue ( ) || automaton_to_tikz.getValue ( ) || grammar_to_string.getValue ( ) || regexp_to_string.getValue ( ) || string_to_string.getValue ( ) || tree_to_string.getValue ( ) ) + inputCli = "execute <#stdin > $input"; + else + throw exception::CommonException("Invalid format specified"); - if ( input.isSet ( ) ) { - if ( input.getValue ( ) == "-" ) - in = & std::cin; - else - in = new std::ifstream ( input.getValue ( ) ); - } else { - in = & std::cin; - } + cli::Parser parser = cli::Parser ( cli::Lexer ( inputCli ) ); + parser.parse ( )->run ( environment ); + measurements::end ( ); + measurements::start ( "Algorithm", measurements::Type::MAIN ); + + std::string algoCli; if ( automaton_from_string.getValue ( ) ) - automatonFromString ( * in, std::cout ); + algoCli = "execute string::Parse automaton::Automaton ^ $input > $output"; + else if ( grammar_from_string.getValue ( ) ) + algoCli = "execute string::Parse grammar::Grammar ^ $input > $output"; + else if ( regexp_from_string.getValue ( ) ) + algoCli = "execute string::Parse regexp::RegExp ^ $input > $output"; + else if ( string_from_string.getValue ( ) ) + algoCli = "execute string::Parse string::String ^ $input > $output"; + else if ( tree_from_string.getValue ( ) ) + algoCli = "execute string::Parse tree::Tree ^ $input > $output"; else if ( automaton_to_string.getValue ( ) ) - automatonToString ( * in, std::cout ); + algoCli = "execute string::Compose $input > $output"; else if ( automaton_to_dot.getValue ( ) ) - automatonToDot ( * in, std::cout ); + algoCli = "execute convert::DotConverter $input > $output"; else if ( automaton_to_gastex.getValue ( ) ) - automatonToGasTex ( * in, std::cout ); + algoCli = "execute convert::GasTexConverter $input > $output"; else if ( automaton_to_tikz.getValue ( ) ) - automatonToTikZ ( * in, std::cout ); - else if ( grammar_from_string.getValue ( ) ) - grammarFromString ( * in, std::cout ); + algoCli = "execute convert::TikZConverter $input > $output"; else if ( grammar_to_string.getValue ( ) ) - grammarToString ( * in, std::cout ); - else if ( regexp_from_string.getValue ( ) ) - regexpFromString ( * in, std::cout ); + algoCli = "execute string::Compose $input > $output"; else if ( regexp_to_string.getValue ( ) ) - regexpToString ( * in, std::cout ); - else if ( string_from_string.getValue ( ) ) - stringFromString ( * in, std::cout ); + algoCli = "execute string::Compose $input > $output"; else if ( string_to_string.getValue ( ) ) - stringToString ( * in, std::cout ); - else if ( tree_from_string.getValue ( ) ) - treeFromString ( * in, std::cout ); + algoCli = "execute string::Compose $input > $output"; else if ( tree_to_string.getValue ( ) ) - treeToString ( * in, std::cout ); + algoCli = "execute string::Compose $input > $output"; + else + throw exception::CommonException("Invalid format specified"); + + parser = cli::Parser ( cli::Lexer ( algoCli ) ); + parser.parse ( )->run ( environment ); + + measurements::end ( ); + measurements::start ( "Output write", measurements::Type::AUXILIARY ); + + std::string outputCli; + if ( automaton_from_string.getValue ( ) || grammar_from_string.getValue ( ) || regexp_from_string.getValue ( ) || string_from_string.getValue ( ) || tree_from_string.getValue ( ) ) + outputCli = "execute $output >#stdout"; + else if ( automaton_to_string.getValue ( ) || automaton_to_dot.getValue ( ) || automaton_to_gastex.getValue ( ) || automaton_to_tikz.getValue ( ) || grammar_to_string.getValue ( ) || regexp_to_string.getValue ( ) || string_to_string.getValue ( ) || tree_to_string.getValue ( ) ) + outputCli = "execute cli::builtin::WriteFile #stdout $output"; else throw exception::CommonException("Invalid format specified"); - if ( input.isSet ( ) && ( input.getValue ( ) != "-" ) ) - delete in; + parser = cli::Parser ( cli::Lexer ( outputCli ) ); + parser.parse ( )->run ( environment ); measurements::end ( ); measurements::end ( ); diff --git a/alib2aux/src/convert/GasTexConverter.cpp b/alib2aux/src/convert/GasTexConverter.cpp index bca4fa3608..7d22497b86 100644 --- a/alib2aux/src/convert/GasTexConverter.cpp +++ b/alib2aux/src/convert/GasTexConverter.cpp @@ -59,4 +59,24 @@ auto GasTexConverterNPDA = registration::OverloadRegister < GasTexConverter, voi auto GasTexConverterSinglePopNPDA = registration::OverloadRegister < GasTexConverter, void, automaton::SinglePopNPDA < > > ( GasTexConverter::convert ); auto GasTexConverterOneTapeDTM = registration::OverloadRegister < GasTexConverter, void, automaton::OneTapeDTM < > > ( GasTexConverter::convert ); +auto GasTexConverterEpsilonNFA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::EpsilonNFA < > & > ( GasTexConverter::convert ); +auto GasTexConverterMultiInitialStateNFA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::MultiInitialStateNFA < > & > ( GasTexConverter::convert ); +auto GasTexConverterNFA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::NFA < > & > ( GasTexConverter::convert ); +auto GasTexConverterDFA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::DFA < > & > ( GasTexConverter::convert ); +auto GasTexConverterExtendedNFA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::ExtendedNFA < > & > ( GasTexConverter::convert ); +auto GasTexConverterCompactNFA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::CompactNFA < > & > ( GasTexConverter::convert ); +auto GasTexConverterNFTA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::NFTA < > & > ( GasTexConverter::convert ); +auto GasTexConverterDFTA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::DFTA < > & > ( GasTexConverter::convert ); +auto GasTexConverterDPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::DPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterSinglePopDPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::SinglePopDPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterInputDrivenDPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::InputDrivenDPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterInputDrivenNPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::InputDrivenNPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterVisiblyPushdownDPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::VisiblyPushdownDPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterVisiblyPushdownNPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::VisiblyPushdownNPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterRealTimeHeightDeterministicDPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::RealTimeHeightDeterministicDPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterRealTimeHeightDeterministicNPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::RealTimeHeightDeterministicNPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterNPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::NPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterSinglePopNPDA2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::SinglePopNPDA < > & > ( GasTexConverter::convert ); +auto GasTexConverterOneTapeDTM2 = registration::AbstractRegister < GasTexConverter, std::string, const automaton::OneTapeDTM < > & > ( GasTexConverter::convert ); + } /* namespace convert */ diff --git a/alib2aux/src/convert/GasTexConverter.h b/alib2aux/src/convert/GasTexConverter.h index f1c10ed0d7..b1a3901530 100644 --- a/alib2aux/src/convert/GasTexConverter.h +++ b/alib2aux/src/convert/GasTexConverter.h @@ -172,6 +172,13 @@ public: template < class SymbolType, class StateType > static void convert(std::ostream& out, const automaton::OneTapeDTM < SymbolType, StateType > & a); + + template < class T > + static std::string convert ( const T & automaton ) { + std::stringstream ss; + convert ( ss, automaton ); + return ss.str ( ); + } }; template < class SymbolType, class EpsilonType, class StateType > diff --git a/alib2aux/src/convert/TikZConverter.cpp b/alib2aux/src/convert/TikZConverter.cpp index ba641e8cb9..aa778bb2f1 100644 --- a/alib2aux/src/convert/TikZConverter.cpp +++ b/alib2aux/src/convert/TikZConverter.cpp @@ -34,4 +34,24 @@ auto TikZConverterNPDA = registration::OverloadRegister < TikZConverter, void, a auto TikZConverterSinglePopNPDA = registration::OverloadRegister < TikZConverter, void, automaton::SinglePopNPDA < > > ( TikZConverter::convert ); auto TikZConverterOneTapeDTM = registration::OverloadRegister < TikZConverter, void, automaton::OneTapeDTM < > > ( TikZConverter::convert ); +auto TikZConverterEpsilonNFA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::EpsilonNFA < > & > ( TikZConverter::convert ); +auto TikZConverterMultiInitialStateNFA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::MultiInitialStateNFA < > & > ( TikZConverter::convert ); +auto TikZConverterNFA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::NFA < > & > ( TikZConverter::convert ); +auto TikZConverterDFA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::DFA < > & > ( TikZConverter::convert ); +auto TikZConverterExtendedNFA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::ExtendedNFA < > & > ( TikZConverter::convert ); +auto TikZConverterCompactNFA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::CompactNFA < > & > ( TikZConverter::convert ); +auto TikZConverterNFTA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::NFTA < > & > ( TikZConverter::convert ); +auto TikZConverterDFTA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::DFTA < > & > ( TikZConverter::convert ); +auto TikZConverterDPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::DPDA < > & > ( TikZConverter::convert ); +auto TikZConverterSinglePopDPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::SinglePopDPDA < > & > ( TikZConverter::convert ); +auto TikZConverterInputDrivenDPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::InputDrivenDPDA < > & > ( TikZConverter::convert ); +auto TikZConverterInputDrivenNPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::InputDrivenNPDA < > & > ( TikZConverter::convert ); +auto TikZConverterVisiblyPushdownDPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::VisiblyPushdownDPDA < > & > ( TikZConverter::convert ); +auto TikZConverterVisiblyPushdownNPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::VisiblyPushdownNPDA < > & > ( TikZConverter::convert ); +auto TikZConverterRealTimeHeightDeterministicDPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::RealTimeHeightDeterministicDPDA < > & > ( TikZConverter::convert ); +auto TikZConverterRealTimeHeightDeterministicNPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::RealTimeHeightDeterministicNPDA < > & > ( TikZConverter::convert ); +auto TikZConverterNPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::NPDA < > & > ( TikZConverter::convert ); +auto TikZConverterSinglePopNPDA2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::SinglePopNPDA < > & > ( TikZConverter::convert ); +auto TikZConverterOneTapeDTM2 = registration::AbstractRegister < TikZConverter, std::string, const automaton::OneTapeDTM < > & > ( TikZConverter::convert ); + } /* namespace convert */ diff --git a/alib2aux/src/convert/TikZConverter.h b/alib2aux/src/convert/TikZConverter.h index 205678735c..f44f9145d2 100644 --- a/alib2aux/src/convert/TikZConverter.h +++ b/alib2aux/src/convert/TikZConverter.h @@ -168,6 +168,13 @@ public: template < class SymbolType, class StateType > static void convert(std::ostream& out, const automaton::OneTapeDTM < SymbolType, StateType > & a); + + template < class T > + static std::string convert ( const T & automaton ) { + std::stringstream ss; + convert ( ss, automaton ); + return ss.str ( ); + } }; template<class SymbolType, class EpsilonType, class StateType> -- GitLab