MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
yaml_parser.hpp
1#ifndef MSTL_CORE_FILE_YAML_YAML_PARSER_HPP__
2#define MSTL_CORE_FILE_YAML_YAML_PARSER_HPP__
4#include "yaml_value.hpp"
6
7class MSTL_API yaml_parser {
8private:
9 struct indent_context {
10 size_t level;
11 yaml_mapping* mapping;
12 yaml_sequence* sequence;
13 string key;
14 bool is_sequence;
15 };
16
17 string yaml_;
18 size_t len_;
19 size_t pos_ = 0;
20 size_t line_ = 1;
21 size_t column_ = 1;
22
23 vector<indent_context> indent_stack_;
24 yaml_ptr root_;
25 size_t current_indent_ = 0;
26 bool in_flow_context_ = false;
27
28 unordered_map<string, yaml_ptr> anchors_;
29
30 char current() const noexcept;
31 char peek(size_t offset = 1) const noexcept;
32 bool eof() const noexcept;
33 void advance() noexcept;
34 bool match(char ch) noexcept;
35 bool expect(char ch);
36
37 void skip_whitespace_inline() noexcept;
38 void skip_comment() noexcept;
39 void skip_to_next_line() noexcept;
40 void skip_blank_lines() noexcept;
41 void skip_whitespace_and_comments();
42 bool is_whitespace(char ch) const noexcept;
43 bool is_newline(char ch) const noexcept;
44
45 size_t peek_indent() const noexcept;
46 size_t skip_indent();
47 void handle_indent_change(size_t new_indent);
48
49 void parse_directive();
50
51 string parse_anchor();
52 void register_anchor(const string& anchor, const shared_ptr<yaml_value>& value);
53 yaml_ptr parse_alias();
54 void skip_tag() noexcept;
55 string parse_tag();
56 bool has_anchor() const noexcept;
57 bool has_alias() const noexcept;
58
59 shared_ptr<yaml_string> parse_plain_string();
60 shared_ptr<yaml_string> parse_single_quoted_string();
61 shared_ptr<yaml_string> parse_double_quoted_string();
62 shared_ptr<yaml_string> parse_literal_string();
63 shared_ptr<yaml_string> parse_folded_string();
64 string parse_multiline_string(bool is_literal);
65
66 shared_ptr<yaml_value> parse_scalar();
67 shared_ptr<yaml_value> parse_number();
68 shared_ptr<yaml_boolean> parse_boolean();
69 shared_ptr<yaml_null> parse_null();
70 shared_ptr<yaml_timestamp> parse_timestamp(string_view str) const;
71
72 shared_ptr<yaml_sequence> parse_flow_sequence();
73 shared_ptr<yaml_mapping> parse_flow_mapping();
74 shared_ptr<yaml_sequence> parse_block_sequence();
75 shared_ptr<yaml_mapping> parse_block_mapping(bool parent_skipped_indent);
76
77 string parse_key();
78 string parse_plain_key();
79 string parse_quoted_key();
80
81 shared_ptr<yaml_value> parse_value();
82 shared_ptr<yaml_value> parse_block_value();
83 shared_ptr<yaml_value> parse_inline_value();
84 shared_ptr<yaml_value> parse_single_document();
85
86 void parse_document_start();
87 void parse_document_end();
88 bool is_document_start() const noexcept;
89 bool is_document_end() const noexcept;
90
91 bool is_plain_safe(char ch) const noexcept;
92 bool is_key_char(char ch) const noexcept;
93 bool is_indicator(char ch) const noexcept;
94 bool is_flow_indicator(char ch) const noexcept;
95
96 char32_t parse_unicode_escape(size_t digits);
97 string unescape_string(const string& str) const;
98
99 void throw_parse_error(const string& message) const;
100
101public:
102 explicit yaml_parser(string yaml_str) noexcept
103 : yaml_(_MSTL move(yaml_str)), len_(yaml_.size()) {}
104
105 yaml_ptr parse();
106 optional<yaml_ptr> try_parse();
107
108 vector<yaml_ptr> parse_documents();
109 optional<vector<yaml_ptr>> try_parse_documents();
110};
111
113#endif // MSTL_CORE_FILE_YAML_YAML_PARSER_HPP__
constexpr void advance(Iterator &i, Distance n)
将迭代器前进指定距离
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
MSTL可选值类型