yaml科学记数法语法

时间:2011-07-20 22:25:42

标签: yaml yaml-cpp snakeyaml

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

2 个答案:

答案 0 :(得分:4)

根据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)。

答案 1 :(得分:0)

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