|
NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
|
YAML 1.2 递归下降解析器 更多...
#include <yaml_parser.hpp>
Public 成员函数 | |
| yaml_parser (string yaml_str) | |
| 构造函数 | |
| shared_ptr< yaml_value > | parse () |
| 解析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 引用 | 说明 |
|---|---|---|
| 空值(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 | 保留(+)、剥离(-)换行符 |
基本解析(单文档):
带错误处理的解析:
多文档解析:
| 特性 | 规范参数 |
|---|---|
| 编码 | 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_parser.hpp 第 116 行定义.
|
inlineexplicit |
构造函数
| yaml_str | 待解析的YAML字符串(将被移动) |
构造后立即可以调用 parse() 或 try_parse() 进行解析。
在文件 yaml_parser.hpp 第 564 行定义.
| shared_ptr< yaml_value > yaml_parser::parse | ( | ) |
解析YAML文档
| yaml_exception | 解析失败时抛出,包含行号和列号信息 |
解析单个YAML文档。如果输入包含多个文档(由 — 分隔), 仅返回第一个文档。使用 parse_documents() 解析所有文档。
| vector< shared_ptr< yaml_value > > yaml_parser::parse_documents | ( | ) |
解析多个YAML文档
| yaml_exception | 解析失败时抛出 |
解析由 — 分隔的多个YAML文档。如果只有单个文档, 返回包含一个元素的vector。
| optional< shared_ptr< yaml_value > > yaml_parser::try_parse | ( | ) |
尝试解析YAML文档(不抛出异常)
与 parse() 功能相同,但解析失败时不抛出异常, 而是返回一个空的 optional 对象。
| optional< vector< shared_ptr< yaml_value > > > yaml_parser::try_parse_documents | ( | ) |