CHAPTER 13
YamlParser 配置解析
对应文件:
- 接口与实现:
include/YamlParser.h(header-only)
1. 模块定位
这是一个自实现 YAML 解析器,提供:
- 节点模型(标量/序列/映射)
- YAML 文本读取与解析
- 路径查询(含数组索引)
- 类型读取(string/int/double/bool/array)
- YAML 回写保存
2. 节点体系
2.1 YamlNode(抽象基类)
getType()toString()toYamlString(indent)
2.2 YamlScalarNode
- 保存
std::string value_ - 类型读取:
asIntasDoubleasBool- 模板
as<T>()
- 输出时会判断是否需要加引号并做转义
2.3 YamlSequenceNode
- 内部:
vector<shared_ptr<YamlNode>> - 接口:
addNode/get/size/getItems - 输出格式:
- item
2.4 YamlMappingNode
- 内部:
map<string, shared_ptr<YamlNode>> - 接口:
addNode/get/hasKey/getItems - 输出格式:
key: value
3. 解析流程(核心)
入口:loadYaml()
- 读取文件行到
vector<string> parseDocument(lines, pos)parseNode(lines, pos, indent)递归下降
分支:
- 序列:
parseSequence - 映射:
parseMapping - 标量:直接
YamlScalarNode
辅助:
trimgetIndentLevelparseMultilineString(|)parseFoldedString(>)
4. 路径查询能力
getNode(path) 支持:
- 点路径:
database.mysql.host - 数组索引:
hosts[0]
执行策略:
- 逐段解析 token
- 当前节点必须是映射才能按键取值
- 含
[...]时先取键再按序列索引访问
5. 读取接口
getString(path, default)getInt(path, default)getDouble(path, default)getBool(path, default)getStringArray(path)
都采用“查不到或类型不匹配返回默认值”策略,业务使用成本低。
6. 序列化保存
saveToFile(path)将rootNode_->toYamlString()写出printYaml()可直接输出当前结构(调试)
7. 已知能力边界
当前实现偏“实用子集 YAML”:
- 对复杂 YAML 特性支持有限(锚点、别名、tag、复杂流式语法)
- 缩进与结构错误容忍度有限
- 标量类型推断仍较基础
8. 优点与改进建议
优点:
- 无第三方依赖
- 结构清晰,便于定制
- 覆盖项目常见配置读取场景
建议:
- 增加更严格的语法错误定位(列号、上下文)
- 增加 anchors/aliases 支持(若配置复杂度上升)
- 补充更完整单元测试(空白、注释、嵌套、异常输入)