From 39457b75c0923cf287c9145fd9c9a6ba4a86767b Mon Sep 17 00:00:00 2001 From: Li Jin Date: Sat, 22 Feb 2020 01:24:47 +0800 Subject: change some interfaces. --- src/MoonP/moon_compiler.cpp | 17 ++++++++++++----- src/MoonP/moon_compiler.h | 12 +++++++++++- src/MoonP/moon_parser.cpp | 6 +++--- src/MoonP/moon_parser.h | 6 +++--- src/moonp.cpp | 4 ++-- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index e6d010c..64152cf 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp @@ -35,9 +35,9 @@ const char* moonScriptVersion() { return "0.5.0-r0.1.3"; } -class MoonCompiler { +class MoonCompilerImpl { public: - std::tuple compile(const std::string& codes, const MoonConfig& config) { + std::tuple compile(std::string_view codes, const MoonConfig& config) { _config = config; _info = _parser.parse(codes); GlobalVars globals; @@ -4275,10 +4275,17 @@ private: } }; -const std::string MoonCompiler::Empty; +const std::string MoonCompilerImpl::Empty; -std::tuple moonCompile(const std::string& codes, const MoonConfig& config) { - return MoonCompiler{}.compile(codes, config); +MoonCompiler::MoonCompiler(): +_compiler(std::make_unique()) +{ } + +MoonCompiler::~MoonCompiler() +{ } + +std::tuple MoonCompiler::compile(std::string_view codes, const MoonConfig& config) { + return _compiler->compile(codes, config); } } // namespace MoonP diff --git a/src/MoonP/moon_compiler.h b/src/MoonP/moon_compiler.h index 0739a59..36fd77a 100644 --- a/src/MoonP/moon_compiler.h +++ b/src/MoonP/moon_compiler.h @@ -9,6 +9,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #pragma once #include +#include #include #include #include @@ -31,6 +32,15 @@ struct GlobalVar { using GlobalVars = std::unique_ptr>; -std::tuple moonCompile(const std::string& codes, const MoonConfig& config = {}); +class MoonCompilerImpl; + +class MoonCompiler { +public: + MoonCompiler(); + virtual ~MoonCompiler(); + std::tuple compile(std::string_view codes, const MoonConfig& config = {}); +private: + std::unique_ptr _compiler; +}; } // namespace MoonP diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp index 39551d2..1502f3c 100644 --- a/src/MoonP/moon_parser.cpp +++ b/src/MoonP/moon_parser.cpp @@ -493,11 +493,11 @@ MoonParser::MoonParser() { File = White >> -Shebang >> Block >> eof(); } -ParseInfo MoonParser::parse(const std::string& codes, rule& r) { +ParseInfo MoonParser::parse(std::string_view codes, rule& r) { ParseInfo res; try { res.codes = std::make_unique(); - *(res.codes) = _converter.from_bytes(codes); + *(res.codes) = _converter.from_bytes(codes.begin(), codes.end()); } catch (const std::range_error&) { res.error = "Invalid text encoding."sv; return res; @@ -537,7 +537,7 @@ std::string MoonParser::toString(input::iterator begin, input::iterator end) { } input MoonParser::encode(std::string_view codes) { - return _converter.from_bytes(std::string(codes)); + return _converter.from_bytes(codes.begin(), codes.end()); } std::string MoonParser::decode(const input& codes) { diff --git a/src/MoonP/moon_parser.h b/src/MoonP/moon_parser.h index 7a1a8a9..215c6a4 100644 --- a/src/MoonP/moon_parser.h +++ b/src/MoonP/moon_parser.h @@ -45,7 +45,7 @@ public: MoonParser(); template - ParseInfo parse(const std::string& codes) { + ParseInfo parse(std::string_view codes) { error_list errors; auto res = parse(codes, getRule()); if (res.node.template is()) { @@ -55,7 +55,7 @@ public: } template - bool match(const std::string& codes) { + bool match(std::string_view codes) { auto rEnd = rule(getRule() >> eof()); return parse(codes, rEnd).node; } @@ -67,7 +67,7 @@ public: std::string decode(const input& input); protected: - ParseInfo parse(const std::string& codes, rule& r); + ParseInfo parse(std::string_view codes, rule& r); struct State { State() { diff --git a/src/moonp.cpp b/src/moonp.cpp index be5f536..3f36d9d 100644 --- a/src/moonp.cpp +++ b/src/moonp.cpp @@ -91,7 +91,7 @@ int main(int narg, const char** args) { std::istreambuf_iterator()); if (dumpCompileTime) { auto start = std::chrono::high_resolution_clock::now(); - auto result = MoonP::moonCompile(s, config); + auto result = MoonP::MoonCompiler{}.compile(s, config); auto end = std::chrono::high_resolution_clock::now(); if (!std::get<0>(result).empty()) { std::chrono::duration diff = end - start; @@ -109,7 +109,7 @@ int main(int narg, const char** args) { return 1; } } - auto result = MoonP::moonCompile(s, config); + auto result = MoonP::MoonCompiler{}.compile(s, config); if (!std::get<0>(result).empty()) { if (!writeToFile) { std::cout << std::get<0>(result) << '\n'; -- cgit v1.2.3-55-g6feb