YamlParser 配置解析
C++ 后端服务器框架YamlParser 配置解析
CHAPTER 13

YamlParser 配置解析

2 分钟阅读 · 491 字

对应文件:

  • 接口与实现: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_
  • 类型读取:
    • asInt
    • asDouble
    • asBool
    • 模板 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()

  1. 读取文件行到 vector<string>
  2. parseDocument(lines, pos)
  3. parseNode(lines, pos, indent) 递归下降

分支:

  • 序列:parseSequence
  • 映射:parseMapping
  • 标量:直接 YamlScalarNode

辅助:

  • trim
  • getIndentLevel
  • parseMultilineString(|)
  • 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 支持(若配置复杂度上升)
  • 补充更完整单元测试(空白、注释、嵌套、异常输入)
全部章节