1#ifndef MSTL_CORE_FILE_YAML_YAML_PARSER_HPP__
2#define MSTL_CORE_FILE_YAML_YAML_PARSER_HPP__
4#include "yaml_value.hpp"
7class MSTL_API yaml_parser {
9 struct indent_context {
11 yaml_mapping* mapping;
12 yaml_sequence* sequence;
23 vector<indent_context> indent_stack_;
25 size_t current_indent_ = 0;
26 bool in_flow_context_ =
false;
28 unordered_map<string, yaml_ptr> anchors_;
30 char current() const noexcept;
31 char peek(
size_t offset = 1) const noexcept;
32 bool eof() const noexcept;
34 bool match(
char ch) noexcept;
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;
45 size_t peek_indent() const noexcept;
47 void handle_indent_change(
size_t new_indent);
49 void parse_directive();
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;
56 bool has_anchor() const noexcept;
57 bool has_alias() const noexcept;
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);
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;
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);
78 string parse_plain_key();
79 string parse_quoted_key();
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();
86 void parse_document_start();
87 void parse_document_end();
88 bool is_document_start() const noexcept;
89 bool is_document_end() const noexcept;
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;
96 char32_t parse_unicode_escape(
size_t digits);
97 string unescape_string(const
string& str) const;
99 void throw_parse_error(const
string& message) const;
102 explicit yaml_parser(
string yaml_str) noexcept
106 optional<yaml_ptr> try_parse();
108 vector<yaml_ptr> parse_documents();
109 optional<vector<yaml_ptr>> try_parse_documents();
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()))
获取容器的大小