【问题标题】:yaml scientific notation syntaxyaml 科学记数法语法
【发布时间】:2011-10-09 19:16:37
【问题描述】:

在处理 yaml 文档时,我发现我的一个值被用snakeyaml 解析为字符串:

-8e-05

发现使用yaml-cpp写yamls的ros是用下面的代码写数组

out << YAML::BeginSeq;
for (int i = 0; i < m.rows*m.cols; ++i)
  out << m.data[i];
out << YAML::EndSeq;

但上面的 c++ 代码(从 camera_calibration 包中的 ros "parse_yml.cpp" 复制)创建 -8e-05,而 snakeyaml 将其解析为字符串。

那么谁是对的,应该有错误报告吗?如果是的话给谁? 1.2 yaml 规范似乎允许可选的小数,但我不知道 1.1 yaml 规范是否允许它实现蛇。

【问题讨论】:

    标签: yaml yaml-cpp snakeyaml


    【解决方案1】:

    根据 YAML 1.2,输出应该被解析为 !!float,但在 YAML 1.1 中最初是 !!str;正如@psr 所说,这是为了匹配 JSON 规范。

    YAML 1.2 规范提供了 JSON schema 和扩展名 "core schema"。在这两种情况下,!!float 正则表达式都是:

    [-+]? ( \. [0-9]+ | [0-9]+ ( \. [0-9]* )? ) ( [eE] [-+]? [0-9]+ )?
    

    它允许一个可选的小数。 (核心模式增加了对无穷大和非数字的支持。)

    YAML 1.1 规范没有直接指定这种类型的标签解析,但它为每种类型提供了几个相关的页面。 !!float page 列出了正则表达式:

    [-+]?([0-9][0-9_]*)?\.[0-9.]*([eE][-+][0-9]+)?
    

    (以及 base-60、infinity 和 not-a-number 的版本)。 这似乎需要小数。

    从 1.9 版开始,该问题已在 SnakeYAML(请参阅 http://code.google.com/p/snakeyaml/issues/detail?id=130)中得到修复。

    【讨论】:

    • 谢谢杰西,这正是我想要的。我可以通过修改snakeyaml 的输出来相当容易地解决这个问题,因为我对数据类型了解得更多,但我想如果可以的话,我会尽力提供帮助。感谢您的回复。
    • 该问题已在 SnakeYAML 中修复:code.google.com/p/snakeyaml/issues/detail?id=130
    【解决方案2】:

    YAML 是 JSON 的超集,如果您查看http://www.json.org/,它在页面底部有一个 BNF 等效图,它显示了如何解析数字的定义。 -8e-05 符合该定义,因此snakeyami 将其解析为字符串是不正确的。

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多