diff --git a/README.md b/README.md index 2cb863de..78d694c0 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,9 @@ - [`CSV Parsing`](modules/Language/CSV/Parsing.mpp) - Stream-based CSV line parser - [`CLikeCompiler`](modules/Language/CLikeCompiler.mpp) - Compiler for C-inspired language - [`GrammarParser`](modules/Language/GrammarParser.mpp) - A parser for defining and interpreting custom grammars, used for building language parsers +- [`JSON Lexer`](modules/Language/JSON/JsonLexer.mpp) - Grammar-based JSON lexer with compile-time AST generation +- [`JSON Mapping`](modules/Language/JSON/Mapping.mpp) - Type-safe bidirectional mapping between C++ structs and JSON with compile-time reflection +- [`JSON Parsing`](modules/Language/JSON/Parsing.mpp) - High-performance typed JSON parser - [`MetaCircularVirtualMachine`](modules/Language/MetaCircularVirtualMachine.mpp) - Homoiconic meta-circular virtual machine with extensible reflexivity - [`MetaCircularParser`](modules/Language/MetaCircularParser.mpp) - Extension of `MetaCircularVirtualMachine` for building parsers with input stream reading capabilities - [`ASTParser`](modules/Language/ASTParser.mpp) - AST parser (work in progress ) diff --git a/modules/Language/JSON/JsonLexer.mpp b/modules/Language/JSON/JsonLexer.mpp index c72e394f..f0659819 100644 --- a/modules/Language/JSON/JsonLexer.mpp +++ b/modules/Language/JSON/JsonLexer.mpp @@ -1,4 +1,4 @@ -export module CppUtils.Language.Json; +export module CppUtils.Language.JSON.JsonLexer; import std; import CppUtils.Type; @@ -6,7 +6,7 @@ import CppUtils.String; import CppUtils.Container.Tree; import CppUtils.Language.Lexer; -export namespace CppUtils::Language::Json +export namespace CppUtils::Language::JSON { class JsonLexer final { @@ -51,7 +51,7 @@ export namespace CppUtils::Language::Json Lexer::GrammarLexer m_grammarLexer; }; - [[nodiscard]] inline auto parse(std::string_view src) -> Container::Tree::VariantNode + [[nodiscard]] inline auto parseTree(std::string_view src) -> Container::Tree::VariantNode { static const auto jsonLexer = JsonLexer{}; return jsonLexer.parse(src); @@ -59,9 +59,9 @@ export namespace CppUtils::Language::Json namespace Literals { - [[nodiscard]] inline auto operator""_json(const char* cstring, std::size_t) -> Container::Tree::VariantNode + [[nodiscard]] inline auto operator""_json_tree(const char* cstring, std::size_t) -> Container::Tree::VariantNode { - return parse(cstring); + return parseTree(cstring); } } } diff --git a/modules/Language/Language.mpp b/modules/Language/Language.mpp index 8cf85925..c9291bfc 100644 --- a/modules/Language/Language.mpp +++ b/modules/Language/Language.mpp @@ -8,6 +8,7 @@ export import CppUtils.Language.MetaCircularVirtualMachine; export import CppUtils.Language.MetaCircularParser; export import CppUtils.Language.CSV.Mapping; export import CppUtils.Language.CSV.Parsing; +export import CppUtils.Language.JSON.JsonLexer; export import CppUtils.Language.JSON.Mapping; export import CppUtils.Language.JSON.Parsing; export import CppUtils.Language.Lexer; @@ -17,7 +18,6 @@ export import CppUtils.Language.Xml.Tags; export import CppUtils.Language.Xml.Flow; export import CppUtils.Language.Xml.FlowRunner; export import CppUtils.Language.Ini; -export import CppUtils.Language.Json; export import CppUtils.Language.Parameters; export import CppUtils.Language.Markdown; export import CppUtils.Language.Parser.AstParser; diff --git a/tests/Language/INI/IniLexer.mpp b/tests/Language/INI/IniLexer.mpp index 0570f7d0..fccdfa1a 100644 --- a/tests/Language/INI/IniLexer.mpp +++ b/tests/Language/INI/IniLexer.mpp @@ -7,10 +7,10 @@ namespace CppUtils::UnitTest::Language::Ini::IniLexer { using namespace CppUtils::String::Literals; - auto _ = TestSuite{"Language/Ini/IniLexer", {"Language/Json/JsonLexer"}, [](TestSuite& suite) { + auto _ = TestSuite{"Language/Ini/IniLexer", {"Language/JSON/JsonLexer"}, [](TestSuite& suite) { using namespace std::literals; using namespace CppUtils::Language::Ini::Literals; - using namespace CppUtils::Language::Json::Literals; + using namespace CppUtils::Language::JSON::Literals; suite.addTest("Minimalist", [&] { const auto iniTree = R"( @@ -27,7 +27,7 @@ namespace CppUtils::UnitTest::Language::Ini::IniLexer } } } - )"_json; + )"_json_tree; suite.expectEqual(iniTree, jsonTree); }); @@ -47,7 +47,7 @@ namespace CppUtils::UnitTest::Language::Ini::IniLexer } } } - )"_json; + )"_json_tree; suite.expectEqual(iniTree, jsonTree); }); @@ -69,7 +69,7 @@ namespace CppUtils::UnitTest::Language::Ini::IniLexer } } } - )"_json; + )"_json_tree; suite.expectEqual(iniTree, jsonTree); }); @@ -108,7 +108,7 @@ namespace CppUtils::UnitTest::Language::Ini::IniLexer } } } - )"_json; + )"_json_tree; suite.expectEqual(std::ranges::size(iniTree.nodes), 3uz); suite.expectEqual(iniTree.nodes.at(0), jsonTree.nodes.at(0)); diff --git a/tests/Language/JSON/JsonLexer.mpp b/tests/Language/JSON/JsonLexer.mpp index b7a22ae0..c508f622 100644 --- a/tests/Language/JSON/JsonLexer.mpp +++ b/tests/Language/JSON/JsonLexer.mpp @@ -1,20 +1,20 @@ -export module CppUtils.UnitTests.Language.Json.JsonLexer; +export module CppUtils.UnitTests.Language.JSON.JsonLexer; import std; import CppUtils; -namespace CppUtils::UnitTest::Language::Json::JsonLexer +namespace CppUtils::UnitTest::Language::JSON::JsonLexer { using namespace CppUtils::String::Literals; - auto _ = TestSuite{"Language/Json/JsonLexer", {}, [](TestSuite& suite) { + auto _ = TestSuite{"Language/JSON/JsonLexer", {}, [](TestSuite& suite) { using namespace std::literals; - using namespace CppUtils::Language::Json::Literals; + using namespace CppUtils::Language::JSON::Literals; suite.addTest("Empty json", [&] { const auto jsonTree = R"( {} - )"_json; + )"_json_tree; CppUtils::Log::TreeNodeLogger::log(jsonTree); suite.expect(std::ranges::empty(jsonTree.nodes)); @@ -25,7 +25,7 @@ namespace CppUtils::UnitTest::Language::Json::JsonLexer { "key": null } - )"_json; + )"_json_tree; CppUtils::Log::TreeNodeLogger::log(jsonTree); suite.expectEqual(std::ranges::size(jsonTree.nodes), 1uz); @@ -40,7 +40,7 @@ namespace CppUtils::UnitTest::Language::Json::JsonLexer "bool0": true, "bool1": false } - )"_json; + )"_json_tree; CppUtils::Log::TreeNodeLogger::log(jsonTree); suite.expectEqual(std::ranges::size(jsonTree.nodes), 2uz); @@ -61,7 +61,7 @@ namespace CppUtils::UnitTest::Language::Json::JsonLexer "number1": -21, "number2": 3.141592 } - )"_json; + )"_json_tree; CppUtils::Log::TreeNodeLogger::log(jsonTree); suite.expectEqual(std::ranges::size(jsonTree.nodes), 3uz); @@ -84,7 +84,7 @@ namespace CppUtils::UnitTest::Language::Json::JsonLexer { "key": "hello" } - )"_json; + )"_json_tree; CppUtils::Log::TreeNodeLogger::log(jsonTree); suite.expectEqual(std::ranges::size(jsonTree.nodes), 1uz); @@ -99,7 +99,7 @@ namespace CppUtils::UnitTest::Language::Json::JsonLexer { "key": [1, "abc", true] } - )"_json; + )"_json_tree; CppUtils::Log::TreeNodeLogger::log(jsonTree); suite.expectEqual(std::ranges::size(jsonTree.nodes), 1uz); @@ -124,7 +124,7 @@ namespace CppUtils::UnitTest::Language::Json::JsonLexer "number1": 1 } } - )"_json; + )"_json_tree; CppUtils::Log::TreeNodeLogger::log(jsonTree); suite.expectEqual(std::ranges::size(jsonTree.nodes), 1uz); diff --git a/tests/Language/JSON/Mapping.mpp b/tests/Language/JSON/Mapping.mpp index ce321d55..4a4a0009 100644 --- a/tests/Language/JSON/Mapping.mpp +++ b/tests/Language/JSON/Mapping.mpp @@ -48,7 +48,7 @@ namespace CppUtils::UnitTest::Language::JSON::Mapping using FunctionMapping = Type::Mapping<>; }; - auto _ = TestSuite{"Language/JSON/Mapping", {"Logger", "Language/Json/JsonLexer", "Language/JSON/Parsing"}, [](TestSuite& suite) { + auto _ = TestSuite{"Language/JSON/Mapping", {"Logger", "Language/JSON/JsonLexer", "Language/JSON/Parsing"}, [](TestSuite& suite) { using namespace CppUtils::Language::JSON::Literals; using Logger = TestSuite::Logger; diff --git a/tests/Language/JSON/Parsing.mpp b/tests/Language/JSON/Parsing.mpp index 94d1e606..1ed2a5bb 100644 --- a/tests/Language/JSON/Parsing.mpp +++ b/tests/Language/JSON/Parsing.mpp @@ -5,7 +5,7 @@ import CppUtils; namespace CppUtils::UnitTest::Language::JSON::Parsing { - auto _ = TestSuite{"Language/JSON/Parsing", {"Language/Json/JsonLexer"}, [](TestSuite& suite) { + auto _ = TestSuite{"Language/JSON/Parsing", {"Language/JSON/JsonLexer"}, [](TestSuite& suite) { using namespace std::literals; using namespace CppUtils::Language::JSON::Literals; diff --git a/tests/UnitTests.mpp b/tests/UnitTests.mpp index 5f874924..983f9b8a 100644 --- a/tests/UnitTests.mpp +++ b/tests/UnitTests.mpp @@ -45,7 +45,7 @@ export import CppUtils.UnitTests.Language.LabelsCompiler; export import CppUtils.UnitTests.Language.MetaCircularVirtualMachine; export import CppUtils.UnitTests.Language.MetaCircularParser; export import CppUtils.UnitTests.Language.Ini.IniLexer; -export import CppUtils.UnitTests.Language.Json.JsonLexer; +export import CppUtils.UnitTests.Language.JSON.JsonLexer; export import CppUtils.UnitTests.Language.Parameters.ParametersLexer; export import CppUtils.UnitTests.Language.Lexer.Grammar.LowLevelGrammar; export import CppUtils.UnitTests.Language.Lexer.Grammar.HighLevelGrammar;