diff --git a/alib2cli/src/ast/command/EvalCommand.h b/alib2cli/src/ast/command/EvalCommand.h index b7d561aa706e440ad322c23be567447efbade70c..079ea21598bd880dc26eeba05efde872f3e3a1ea 100644 --- a/alib2cli/src/ast/command/EvalCommand.h +++ b/alib2cli/src/ast/command/EvalCommand.h @@ -19,7 +19,7 @@ public: CommandResult run(Environment& environment) const override { - CommandResult state = environment.execute(std::make_shared<cli::StringLineInterface>(cli::StringLineInterface(m_code))); + CommandResult state = environment.execute(m_code); if (state != cli::CommandResult::QUIT) state = cli::CommandResult::OK; diff --git a/alib2cli/src/ast/command/InterpretCommand.h b/alib2cli/src/ast/command/InterpretCommand.h index 7a119ebe8df953c02e426ed2aa65d8b2e81318b6..35a29366607c7c0ba23d8c49bd723930bac914d1 100644 --- a/alib2cli/src/ast/command/InterpretCommand.h +++ b/alib2cli/src/ast/command/InterpretCommand.h @@ -24,7 +24,7 @@ public: if (!ifs.is_open()) throw exception::CommonException("File '" + m_fileName + "' not found."); - CommandResult state = environment.execute(std::make_shared<cli::IstreamLineInterface<std::ifstream>>(cli::IstreamLineInterface<std::ifstream>(std::move(ifs)))); + CommandResult state = environment.execute(ifs); if (state != cli::CommandResult::QUIT && state != cli::CommandResult::RETURN) state = cli::CommandResult::OK; diff --git a/alib2cli/src/environment/Environment.cpp b/alib2cli/src/environment/Environment.cpp index d40d5c1f7942e3450f7dadae51757d235ff1faeb..1217d2977ff14c3a780a891a3d9888356f482f9b 100644 --- a/alib2cli/src/environment/Environment.cpp +++ b/alib2cli/src/environment/Environment.cpp @@ -2,8 +2,7 @@ #include <ext/exception> -#include <lexer/Lexer.h> -#include <parser/Parser.h> +#include <parser/Parser2.h> #include <global/GlobalData.h> @@ -43,33 +42,6 @@ std::string Environment::getBinding(const std::string& name) const throw exception::CommonException("Binded value of name " + name + " not found."); } -cli::CommandResult Environment::execute(const std::shared_ptr<cli::LineInterface>& lineInterface) -{ - cli::CommandResult state = cli::CommandResult::OK; - - while (state == cli::CommandResult::OK || state == cli::CommandResult::ERROR) - state = execute_line(cli::CharSequence(lineInterface)); - - return state; -} - -cli::CommandResult Environment::execute_line(cli::CharSequence charSequence) -{ - try { - cli::Parser parser = cli::Parser(cli::Lexer(std::move(charSequence))); - std::unique_ptr<CommandList> command = parser.parse(); - cli::CommandResult res = command->run(*this); - - if (res == CommandResult::CONTINUE || res == CommandResult::BREAK) - throw std::logic_error("There is no loop to continue/break."); - - return res; - } catch (...) { - alib::ExceptionHandler::handle(common::Streams::err); - return cli::CommandResult::EXCEPTION; - } -} - Environment& Environment::getGlobalScope() { if (!static_cast<bool>(m_upper)) @@ -77,10 +49,10 @@ Environment& Environment::getGlobalScope() return m_upper->getGlobalScope(); } -cli::CommandResult Environment::execute(const std::unique_ptr<cli::Command>& ast) +cli::CommandResult Environment::execute(const std::unique_ptr<cli::Command>& command) { try { - cli::CommandResult res = ast->run(*this); + const CommandResult res = command->run(*this); if (res == CommandResult::CONTINUE || res == CommandResult::BREAK) throw std::logic_error("There is no loop to continue/break."); @@ -88,8 +60,16 @@ cli::CommandResult Environment::execute(const std::unique_ptr<cli::Command>& ast return res; } catch (...) { alib::ExceptionHandler::handle(common::Streams::err); - return cli::CommandResult::EXCEPTION; + return CommandResult::EXCEPTION; } } +cli::CommandResult Environment::execute(const std::string& input) +{ + return execute(Parser2::parseString(input)); +} +cli::CommandResult Environment::execute(std::istream& input) +{ + return execute(Parser2::parseStream(input)); +} } /* namespace cli */ diff --git a/alib2cli/src/environment/Environment.h b/alib2cli/src/environment/Environment.h index 0e2d90af5c87738a01eecd473cd77d6192547653..763b3db1264a54b19e85f1f0a065f66c5ba23759 100644 --- a/alib2cli/src/environment/Environment.h +++ b/alib2cli/src/environment/Environment.h @@ -1,5 +1,7 @@ #pragma once +#include <istream> + #include <ext/concepts> #include <ext/memory> #include <ext/typeinfo> @@ -119,10 +121,11 @@ public: return m_result; } - cli::CommandResult execute(const std::shared_ptr<cli::LineInterface>& lineInterface); - cli::CommandResult execute(const std::unique_ptr<cli::Command>& ast); + cli::CommandResult execute(const std::string& input); + + cli::CommandResult execute(std::istream& input); - cli::CommandResult execute_line(cli::CharSequence charSequence); + cli::CommandResult execute(const std::unique_ptr<cli::Command>& command); Environment& getGlobalScope(); }; diff --git a/alib2cli/test-src/aql/AntlrParserTest.cpp b/alib2cli/test-src/aql/AntlrParserTest.cpp index 147bbcf77ef5e923d28386b5af64d8069ca18937..eaa92aadb75bd4c9c051341d7fcf7c81c38cd65f 100644 --- a/alib2cli/test-src/aql/AntlrParserTest.cpp +++ b/alib2cli/test-src/aql/AntlrParserTest.cpp @@ -14,9 +14,7 @@ template <typename T> std::unique_ptr<cli::CommandList> oldParseFile(T&& stream, bool print) { try { - auto command = cli::Parser( - cli::Lexer(cli::CharSequence(cli::IstreamLineInterface<T>(std::forward<T>(stream))))) - .parse(); + auto command = cli::Parser::parse(cli::Lexer(cli::CharSequence(cli::IstreamLineInterface<T>(std::forward<T>(stream))))); if (print) { command->print(Catch::cout()); diff --git a/alib2cli/test-src/cli/TestUdfEval.cpp b/alib2cli/test-src/cli/TestUdfEval.cpp index 57d16a9ed9e11f602558bbf2cd109446bef9b983..9b6c087f56250ec150aef2ceed423428b10537d6 100644 --- a/alib2cli/test-src/cli/TestUdfEval.cpp +++ b/alib2cli/test-src/cli/TestUdfEval.cpp @@ -15,8 +15,9 @@ TEST_CASE("Udf eval", "[unit][cli]") { cli::Environment environment; - std::string foo("function mojeFunkce ( const auto & $mojepromenna ) returning auto begin\nreturn $mojepromenna;\nend"); - environment.execute(std::make_shared<cli::StringLineInterface>(cli::StringLineInterface(foo))); + environment.execute("function mojeFunkce ( const auto & $mojepromenna ) returning auto begin\n" + "return $mojepromenna;\n" + "end"); auto input = std::make_shared<abstraction::ValueHolder<std::string>>(std::string{"neco"}, true);