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