yaml синтаксис научной нотации - PullRequest
2 голосов
/ 21 июля 2011

При работе с документом 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_calibration) создает -8e-05, в то время как snakeyaml анализирует его как строку.

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

Ответы [ 2 ]

4 голосов
/ 21 июля 2011

Выход должен быть проанализирован как !!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 page содержит регулярное выражение:

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

(а также версии для base-60, infinity и not-a-number).Кажется, для этого требуется десятичное число.

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

0 голосов
/ 21 июля 2011

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

...