From a0c8cd0ffe69a7b68772b836fb8575c0ab8c3a15 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 24 May 2018 08:36:18 +0200 Subject: [PATCH] file reading syntax gradual change --- aaccess2/src/aaccess.cpp | 4 +-- aarbology2/src/aarbology.cpp | 2 +- .../ast/statements/ContainerFileStatement.cpp | 24 -------------- .../ast/statements/ContainerFileStatement.h | 26 --------------- alib2cli/src/ast/statements/FileStatement.cpp | 18 ++++++++-- alib2cli/src/ast/statements/FileStatement.h | 4 ++- .../src/ast/statements/ResultFileStatement.h | 3 +- alib2cli/src/parser/Parser.cpp | 33 +++++++++++-------- alib2cli/test-src/cli/CliTest.cpp | 2 +- 9 files changed, 43 insertions(+), 73 deletions(-) delete mode 100644 alib2cli/src/ast/statements/ContainerFileStatement.cpp delete mode 100644 alib2cli/src/ast/statements/ContainerFileStatement.h diff --git a/aaccess2/src/aaccess.cpp b/aaccess2/src/aaccess.cpp index e159bceaea..963c26eb05 100644 --- a/aaccess2/src/aaccess.cpp +++ b/aaccess2/src/aaccess.cpp @@ -139,12 +139,12 @@ int main ( int argc, char * argv[] ) { if ( collection.isSet ( ) && ( operation.getValue ( ) == "set" || operation.getValue ( ) == "add" || operation.getValue ( ) == "remove" ) && ( automatonInput.isSet ( ) || grammarInput.isSet ( ) || regexpInput.isSet ( ) || stringInput.isSet ( ) ) ) { - parser = cli::Parser ( cli::Lexer ( "execute < { :Object } #collection > $argument" ) ); + parser = cli::Parser ( cli::Lexer ( "execute < :set @Object #collection > $argument" ) ); parser.parse ( )->run ( environment ); } if ( collection.isSet ( ) && ( operation.getValue ( ) == "add" || operation.getValue ( ) == "remove" ) && ( treeInput.isSet ( ) ) ) { - parser = cli::Parser ( cli::Lexer ( "execute < { :ranked_symbol } #collection > $argument" ) ); + parser = cli::Parser ( cli::Lexer ( "execute < :set @ranked_symbol #collection > $argument" ) ); parser.parse ( )->run ( environment ); } diff --git a/aarbology2/src/aarbology.cpp b/aarbology2/src/aarbology.cpp index c2a051b120..df3563e33c 100644 --- a/aarbology2/src/aarbology.cpp +++ b/aarbology2/src/aarbology.cpp @@ -163,7 +163,7 @@ int main ( int argc, char * argv[] ) { input = nonlinearVariablesInput.getValue ( ); environment.setBinding ( "inputNonlinearVariables", input ); - cli::Parser parser ( cli::Lexer ( "execute <{:ranked_symbol} #inputNonlinearVariables > $nonlinearVariables" ) ); + cli::Parser parser ( cli::Lexer ( "execute <:set @ranked_symbol #inputNonlinearVariables > $nonlinearVariables" ) ); parser.parse ( )->run ( environment ); } diff --git a/alib2cli/src/ast/statements/ContainerFileStatement.cpp b/alib2cli/src/ast/statements/ContainerFileStatement.cpp deleted file mode 100644 index 5cab407cb7..0000000000 --- a/alib2cli/src/ast/statements/ContainerFileStatement.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include <ast/statements/ContainerFileStatement.h> -#include <ast/Statement.h> -#include <ast/Option.h> -#include <ast/Arg.h> - -#include <registry/XmlRegistry.h> -#include <abstraction/ImmediateValueAbstraction.hpp> - -namespace cli { - -ContainerFileStatement::ContainerFileStatement ( std::string container, std::unique_ptr < TypeOption > type, std::unique_ptr < Arg > file ) : m_file ( std::move ( file ) ), m_container ( std::move ( container ) ), m_type ( std::move ( type ) ) { -} - -std::shared_ptr < abstraction::OperationAbstraction > ContainerFileStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const { - std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( m_file->eval ( environment )); - tokens->eval ( ); - - std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlContainerParserAbstraction ( m_container, m_type->getType ( ) ); - res->attachInput ( tokens, 0, true ); - res->eval ( ); - return res; -} - -} /* namespace cli */ diff --git a/alib2cli/src/ast/statements/ContainerFileStatement.h b/alib2cli/src/ast/statements/ContainerFileStatement.h deleted file mode 100644 index 4378836016..0000000000 --- a/alib2cli/src/ast/statements/ContainerFileStatement.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _CLI_CONTAINER_FILE_STATEMENT_H_ -#define _CLI_CONTAINER_FILE_STATEMENT_H_ - -#include <ast/Statement.h> -#include <ast/options/TypeOption.h> - -namespace cli { - -class ContainerFileStatement final : public Statement { - std::unique_ptr < cli::Arg > m_file; - std::string m_container; - std::unique_ptr < TypeOption > m_type; - -public: - ContainerFileStatement ( std::string container, std::unique_ptr < TypeOption > type, std::unique_ptr < Arg > file ); - - virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override; - - virtual bool getImplicitMove ( ) const override { - return true; - } -}; - -} /* namespace cli */ - -#endif /* _CLI_CONTAINER_FILE_STATEMENT_H_ */ diff --git a/alib2cli/src/ast/statements/FileStatement.cpp b/alib2cli/src/ast/statements/FileStatement.cpp index 317ff87fbe..8a125feadb 100644 --- a/alib2cli/src/ast/statements/FileStatement.cpp +++ b/alib2cli/src/ast/statements/FileStatement.cpp @@ -4,10 +4,11 @@ #include <ast/Arg.h> #include <common/XmlParserHelper.h> +#include <registry/XmlRegistry.h> namespace cli { -FileStatement::FileStatement ( std::unique_ptr < TypeOption > type, std::unique_ptr < Arg > file ) : m_file ( std::move ( file ) ), m_type ( std::move ( type ) ) { +FileStatement::FileStatement ( std::unique_ptr < Arg > file, std::unique_ptr < Arg > fileType, std::unique_ptr < TypeOption > type, ext::vector < std::unique_ptr < cli::Arg > > templateParams ) : m_file ( std::move ( file ) ), m_fileType ( std::move ( fileType ) ), m_type ( std::move ( type ) ), m_templateParams ( std::move ( templateParams ) ) { } std::shared_ptr < abstraction::OperationAbstraction > FileStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const { @@ -15,9 +16,20 @@ std::shared_ptr < abstraction::OperationAbstraction > FileStatement::translateAn if ( m_type ) type = m_type->getType ( ); - std::string file = m_file->eval ( environment ); + if ( type == "set" || type == "Set" ) { + std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( m_file->eval ( environment )); + tokens->eval ( ); + + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlContainerParserAbstraction ( "Set", m_templateParams [ 0 ]->eval ( environment ) ); + res->attachInput ( tokens, 0, true ); + res->eval ( ); + return res; + } else { + std::string file = m_file->eval ( environment ); + + return abstraction::XmlParserHelper::eval ( std::move ( type ), file ); + } - return abstraction::XmlParserHelper::eval ( std::move ( type ), file ); } } /* namespace cli */ diff --git a/alib2cli/src/ast/statements/FileStatement.h b/alib2cli/src/ast/statements/FileStatement.h index 4da12dae5c..b9268359a4 100644 --- a/alib2cli/src/ast/statements/FileStatement.h +++ b/alib2cli/src/ast/statements/FileStatement.h @@ -8,10 +8,12 @@ namespace cli { class FileStatement final : public Statement { std::unique_ptr < cli::Arg > m_file; + std::unique_ptr < Arg > m_fileType; std::unique_ptr < TypeOption > m_type; + ext::vector < std::unique_ptr < cli::Arg > > m_templateParams; public: - FileStatement ( std::unique_ptr < TypeOption > type, std::unique_ptr < Arg > file ); + FileStatement ( std::unique_ptr < Arg > file, std::unique_ptr < Arg > fileType, std::unique_ptr < TypeOption > type, ext::vector < std::unique_ptr < cli::Arg > > templateParams ); virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override; diff --git a/alib2cli/src/ast/statements/ResultFileStatement.h b/alib2cli/src/ast/statements/ResultFileStatement.h index 6f46bad023..ba0fe867b1 100644 --- a/alib2cli/src/ast/statements/ResultFileStatement.h +++ b/alib2cli/src/ast/statements/ResultFileStatement.h @@ -9,9 +9,10 @@ namespace cli { class ResultFileStatement final : public Statement { std::unique_ptr < cli::Arg > m_file; + std::unique_ptr < Arg > m_fileType; public: - ResultFileStatement ( std::unique_ptr < cli::Arg > file ) : m_file ( std::move ( file ) ) { + ResultFileStatement ( std::unique_ptr < cli::Arg > file, std::unique_ptr < Arg > fileType ) : m_file ( std::move ( file ) ), m_fileType ( std::move ( fileType ) ) { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override { diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp index af0085ea7d..db203ae77f 100644 --- a/alib2cli/src/parser/Parser.cpp +++ b/alib2cli/src/parser/Parser.cpp @@ -3,7 +3,6 @@ #include <ast/statements/CastStatement.h> #include <ast/statements/SingleStatement.h> #include <ast/statements/ContainerStatement.h> -#include <ast/statements/ContainerFileStatement.h> #include <ast/statements/ResultFileStatement.h> #include <ast/statements/ResultVariableStatement.h> #include <ast/statements/ResultPrintStatement.h> @@ -94,18 +93,22 @@ std::unique_ptr < Arg > Parser::template_arg ( ) { } std::shared_ptr < Statement > Parser::in_redirect_file ( ) { - if ( check ( cli::Lexer::TokenType::LEFT_BRACE ) ) { - match ( cli::Lexer::TokenType::LEFT_BRACE ); - std::unique_ptr < TypeOption > type = type_option ( ); - match ( cli::Lexer::TokenType::RIGHT_BRACE ); - std::unique_ptr < Arg > file = arg ( ); - return std::make_shared < ContainerFileStatement > ( "Set", std::move ( type ), std::move ( file ) ); - } else { - ext::vector < std::unique_ptr < Option > > options; - std::unique_ptr < TypeOption > type = type_option ( ); - std::unique_ptr < Arg > file = arg ( ); - return std::make_shared < FileStatement > ( std::move ( type ), std::move ( file ) ); + std::unique_ptr < Arg > fileType; + + if ( check ( cli::Lexer::TokenType::LEFT_BRACKET ) ) { + match ( cli::Lexer::TokenType::LEFT_BRACKET ); + fileType = arg ( ); + match ( cli::Lexer::TokenType::RIGHT_BRACKET ); + } + + std::unique_ptr < TypeOption > type = type_option ( ); + ext::vector < std::unique_ptr < cli::Arg > > templateArgs; + while ( check ( cli::Lexer::TokenType::AT_SIGN ) ) { + templateArgs.emplace_back ( template_arg ( ) ); } + + std::unique_ptr < Arg > file = arg ( ); + return std::make_shared < FileStatement > ( std::move ( file ), std::move ( fileType ), std::move ( type ), std::move ( templateArgs ) ); } std::shared_ptr < Statement > Parser::in_redirect ( ) { @@ -221,14 +224,16 @@ std::shared_ptr < StatementList > Parser::statement_list ( ) { } void Parser::out_redirect_file ( std::shared_ptr < StatementList > & list ) { + std::unique_ptr < Arg > fileType; + if ( check ( cli::Lexer::TokenType::LEFT_BRACKET ) ) { match ( cli::Lexer::TokenType::LEFT_BRACKET ); - std::unique_ptr < Arg > name = arg ( ); + fileType = arg ( ); match ( cli::Lexer::TokenType::RIGHT_BRACKET ); } std::unique_ptr < Arg > file = arg ( ); - list->append ( std::make_unique < ResultFileStatement > ( std::move ( file ) ) ); + list->append ( std::make_unique < ResultFileStatement > ( std::move ( file ), std::move ( fileType ) ) ); } void Parser::out_redirect ( std::shared_ptr < StatementList > & list ) { diff --git a/alib2cli/test-src/cli/CliTest.cpp b/alib2cli/test-src/cli/CliTest.cpp index d3c5484f8e..d7d5f403a6 100644 --- a/alib2cli/test-src/cli/CliTest.cpp +++ b/alib2cli/test-src/cli/CliTest.cpp @@ -262,7 +262,7 @@ void CliTest::testSetConstruction ( ) { parser = cli::Parser ( cli::Lexer ( "execute $set >local/yyy.xml" ) ); parser.parse ( )->run ( environment ); - parser = cli::Parser ( cli::Lexer ( "execute <{ :int }local/yyy.xml > $set2" ) ); + parser = cli::Parser ( cli::Lexer ( "execute < :set @int local/yyy.xml > $set2" ) ); parser.parse ( )->run ( environment ); std::cout << environment.getVariable ( "set2" )->getReturnType ( ) << std::endl; parser = cli::Parser ( cli::Lexer ( "execute $set2 | Print -" ) ); -- GitLab