2

在使用 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 规范是否允许它实现了它。

4

2 回答 2

4

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

YAML 1.2 规范提供了JSON 模式和扩展,即“核心模式”。在这两种情况下,!!float正则表达式都是:

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

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

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

[-+]?([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)中得到修复。

于 2011-07-21T01:22:05.187 回答
0

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

于 2011-07-20T22:32:17.300 回答