NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
yaml_parser类 参考

YAML 1.2 递归下降解析器 更多...

#include <yaml_parser.hpp>

Public 成员函数

 yaml_parser (string yaml_str)
 构造函数
shared_ptr< yaml_valueparse ()
 解析YAML文档
optional< shared_ptr< yaml_value > > try_parse ()
 尝试解析YAML文档(不抛出异常)
vector< shared_ptr< yaml_value > > parse_documents ()
 解析多个YAML文档
optional< vector< shared_ptr< yaml_value > > > try_parse_documents ()
 尝试解析多个YAML文档(不抛出异常)

详细描述

YAML 1.2 递归下降解析器

提供完整的YAML 1.2格式解析功能,将YAML文本转换为类型化值树(yaml_value层次结构)。

解析器架构

本解析器采用**递归下降**(Recursive Descent)算法,通过以下核心机制实现 对YAML 1.2完整语法的解析:

机制 说明
递归下降 每个语法结构对应一个解析方法,相互递归调用
缩进感知 通过 indent_stack_ 追踪嵌套层级
流上下文标志 in_flow_context_ 标志区分流样式与块样式
锚点注册表 anchors_ 哈希表存储锚点引用,支持别名解析
位置追踪 line_ / column_ 计数器支持精确定位错误

支持的YAML 1.2特性

特性 YAML 1.2 引用 说明
空值(Null) §10.2 null、Null、NULL、~
布尔值(Boolean) §10.3 true/false 及所有同义词(yes/no、on/off等)
整数(Integer) §10.4.1 十进制/十六进制(0x)/八进制(0o)/二进制(0b)
浮点数(Float) §10.4.1 含 .inf、-.inf、.nan 特殊值
字符串(String) §10.5 五种样式:Plain、SingleQuoted、DoubleQuoted、Literal、Folded
时间戳(Timestamp) §10.4.2 ISO 8601 / RFC 3339 格式
序列(Sequence) §10.1.1 块样式(- item)和流样式([item, ...])
映射(Mapping) §10.1.2 块样式(key: value)和流样式({key: value})
锚点与别名 §3.2.2 &anchor 和 *alias
标签(Tag) §3.2.3 !tag、!!type、!<verbatim>、!handle!suffix
复杂键(Complex Key) §3.2.1 ? 指示符,键可以是任意YAML节点
多文档 §9.2 — 文档分隔符,... 文档结束符
指令(Directive) §9.1 YAML 1.2、TAG
注释 §6.8 # 行注释
块标量吞食指示符 §8.2 保留(+)、剥离(-)换行符

使用示例

基本解析(单文档):

yaml_parser parser("key: value\nlist: [1, 2, 3]");
auto root = parser.parse();
if (auto* map = root->as_mapping()) {
auto* val = map->get_member("key");
}
映射容器
定义 map.hpp:37
yaml_parser(string yaml_str)
构造函数

带错误处理的解析:

yaml_parser parser(yaml_content);
auto result = parser.try_parse();
if (result.has_value()) {
// 解析成功,使用 result.value()
} else {
// 解析失败
}

多文档解析:

yaml_parser parser("---\ndoc1: value\n---\ndoc2: value\n");
auto docs = parser.parse_documents();
for (auto& doc : docs) {
// 处理每个文档
}

实现细节

特性 规范参数
编码 UTF-8(YAML 1.2 §5.1)
整数范围 -2^63 到 2^63-1(YAML 1.2 §10.4.1)
浮点数精度 IEEE 754-2019 双精度(YAML 1.2 §10.4.1)
映射键唯一性 YAML 1.2 §3.2.1(重复键不报错但行为未定义)
缩进要求 仅空格(YAML 1.2 §6.1),制表符不用于缩进
最大缩进深度 受栈大小限制(递归下降)
警告
根据 YAML 1.2 §6.1,制表符(tab)不应用于缩进。
流样式中的重复键名行为未定义,应避免使用。
解析器不验证映射中的键名唯一性(遵循YAML 1.2规范)。
参见
https://yaml.org/
https://yaml.org/spec/1.2.2/
yaml_value 解析结果的数据结构
yaml_builder YAML构建器

在文件 yaml_parser.hpp116 行定义.

构造及析构函数说明

◆ yaml_parser()

yaml_parser::yaml_parser ( string yaml_str)
inlineexplicit

构造函数

参数
yaml_str待解析的YAML字符串(将被移动)

构造后立即可以调用 parse()try_parse() 进行解析。

注解
解析器获取字符串的所有权,原字符串将被清空。

在文件 yaml_parser.hpp564 行定义.

引用了 move() , 以及 size().

成员函数说明

◆ parse()

shared_ptr< yaml_value > yaml_parser::parse ( )

解析YAML文档

返回
解析结果的根节点(yaml_value树)
异常
yaml_exception解析失败时抛出,包含行号和列号信息

解析单个YAML文档。如果输入包含多个文档(由 — 分隔), 仅返回第一个文档。使用 parse_documents() 解析所有文档。

注解
每次调用重新解析整个输入。

◆ parse_documents()

vector< shared_ptr< yaml_value > > yaml_parser::parse_documents ( )

解析多个YAML文档

返回
所有文档的根节点列表
异常
yaml_exception解析失败时抛出

解析由 — 分隔的多个YAML文档。如果只有单个文档, 返回包含一个元素的vector。

参见
parse() 单文档解析

◆ try_parse()

optional< shared_ptr< yaml_value > > yaml_parser::try_parse ( )

尝试解析YAML文档(不抛出异常)

返回
成功时返回包含根节点的 optional,失败时返回空 optional

parse() 功能相同,但解析失败时不抛出异常, 而是返回一个空的 optional 对象。

◆ try_parse_documents()

optional< vector< shared_ptr< yaml_value > > > yaml_parser::try_parse_documents ( )

尝试解析多个YAML文档(不抛出异常)

返回
成功时返回文档列表,失败时返回空 optional

parse_documents() 功能相同,但解析失败时不抛出异常。


该类的文档由以下文件生成: