Branch data Line data Source code
1 : : /*
2 : : * The MIT License (MIT)
3 : : *
4 : : * Copyright (c) 2024 Yaroslav Riabtsev <yaroslav.riabtsev@rwth-aachen.de>
5 : : *
6 : : * Permission is hereby granted, free of charge, to any person obtaining a copy
7 : : * of this software and associated documentation files (the "Software"), to deal
8 : : * in the Software without restriction, including without limitation the rights
9 : : * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 : : * copies of the Software, and to permit persons to whom the Software is
11 : : * furnished to do so, subject to the following conditions:
12 : : *
13 : : * The above copyright notice and this permission notice shall be included
14 : : * in all copies or substantial portions of the Software.
15 : : *
16 : : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 : : * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 : : * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
19 : : * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 : : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 : : * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 : : * SOFTWARE.
23 : : */
24 : :
25 : : #ifndef PARSER_HPP
26 : : #define PARSER_HPP
27 : : #include "reference.hpp"
28 : :
29 : : #include <filesystem>
30 : : #include <fstream>
31 : : #include <functional>
32 : :
33 : : namespace parser_lib {
34 : : class parser {
35 : : public:
36 : : explicit parser(std::string& buffer);
37 : : explicit parser(const std::stringstream& ss);
38 : : explicit parser(std::ifstream& is);
39 : : explicit parser(const std::filesystem::path& path);
40 : :
41 : : void completely_parse_json(
42 : : std::shared_ptr<json_lib::json>& result, bool dynamic = false
43 : : );
44 : :
45 : : private:
46 : : std::ifstream ifs;
47 : : std::string buffer;
48 : : int pos { -1 };
49 : : int line { -1 };
50 : :
51 : : size_t get_pos() const;
52 : : bool valid() const;
53 : : void next();
54 : : void read_line();
55 : : char peek() const;
56 : : char get();
57 : : bool check_ahead(char expected) const;
58 : : bool separator(char val = ',');
59 : :
60 : : void nonessential();
61 : : std::string parse_keyword();
62 : : std::string parse_string();
63 : : std::tuple<std::string, bool> parse_number();
64 : :
65 : : template <typename Container, typename ParseElement>
66 : : Container
67 : : parse_collection(bool dynamic, char halt, ParseElement parse_element);
68 : : void parse_array_item(
69 : : std::vector<std::shared_ptr<json_lib::json>>& children, bool dynamic
70 : : );
71 : : void parse_set_item(
72 : : std::vector<std::shared_ptr<reference_lib::json_reference>>& children,
73 : : bool dynamic
74 : : );
75 : : void parse_object_item(
76 : : std::vector<std::pair<std::string, std::shared_ptr<json_lib::json>>>&
77 : : children,
78 : : bool dynamic
79 : : );
80 : :
81 : : bool parse_accessor(std::shared_ptr<json_lib::json>& accessor);
82 : : void parse_tail(const std::shared_ptr<reference_lib::json_reference>& result
83 : : );
84 : : void parse_reference(std::shared_ptr<json_lib::json>& result);
85 : : void parse_json(std::shared_ptr<json_lib::json>& result, bool dynamic);
86 : :
87 : : std::runtime_error throw_message(
88 : : const std::string& message,
89 : : std::source_location location = std::source_location::current()
90 : : ) const;
91 : : };
92 : :
93 : : template <typename Container, typename ParseElement>
94 : 2452 : Container parser::parse_collection(
95 : : const bool dynamic, const char halt, ParseElement parse_element
96 : : ) {
97 : 2452 : Container children;
98 [ + - ]: 2452 : nonessential();
99 : 2452 : bool closed = true;
100 [ + + + + : 15598 : while (valid() && peek() != halt) {
+ + ]
101 [ + + ]: 13159 : std::invoke(parse_element, *this, children, dynamic);
102 [ + - ]: 13146 : closed = !separator();
103 : : }
104 [ + + ]: 2439 : if (!closed) {
105 [ + - + - ]: 6 : throw throw_message("expected one more item in enumerator");
106 : : }
107 [ + + - + : 2437 : if (!valid() || peek() != halt) {
+ + ]
108 [ + - + - ]: 18 : throw throw_message("enumerator-object is not closed");
109 : : }
110 [ + - ]: 2431 : next();
111 : 2431 : return children;
112 : 21 : }
113 : : }
114 : :
115 : : #endif // PARSER_HPP
|