Синтаксис научной нотации yaml

Работая с документом yaml, я обнаружил, что одно из моих значений анализируется как строка с помощью snakeyaml:

-8e-05

Я обнаружил, что ros, который использует yaml-cpp для записи yamls, использует следующий код для записи массива

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

но приведенный выше код C++ (скопированный из ros "parse_yml.cpp" в пакете camera_dication) создает -8e-05, в то время как змейкамл анализирует его как строку.

Так кто прав, должен ли быть отчет об ошибке? если да то кому? Спецификация yaml 1.2, кажется, допускает необязательную десятичную дробь, но я не мог понять, разрешает ли спецификация yaml 1.1 то, что реализует змея.


person Sandy    schedule 20.07.2011    source источник


Ответы (2)


Вывод должен быть проанализирован как !!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]+)?

(а также версии для базы 60, бесконечности и не числа). Кажется, для этого требуется десятичная дробь.

Это было исправлено в SnakeYAML (см. http://code.google.com/p/snakeyaml/issues/detail?id=130), начиная с версии 1.9.

person Jesse Beder    schedule 21.07.2011
comment
Спасибо, Джесси, это именно то, что я искал. Я смог обойти это довольно легко, изменив вывод змейки, поскольку я знаю больше о типах данных, но подумал, что попытаюсь помочь, если смогу. Ценю ваш ответ. - person Sandy; 23.07.2011
comment
Проблема устранена в SnakeYAML: code.google.com/p/ змеямл/проблемы/деталь?id=130 - person Andrey; 29.07.2011

YAML — это надмножество JSON, и если вы посмотрите на http://www.json.org/, диаграмма, эквивалентная BNF, внизу страницы, которая показывает определение того, как анализировать число. -8e-05 подходит под это определение, поэтому снейками неправильно анализировать его как строку.

person psr    schedule 20.07.2011