Является ли пустая строка допустимым документом YAML? - PullRequest
0 голосов
/ 18 июня 2020
  • У меня есть библиотека, не возвращающая документа при загрузке пустой строки (''), и мне интересно, является ли это ошибкой.
  • Я не смог сделать вывод из Спецификация YAML 1.2 (самая последняя на момент задания этого вопроса), является ли пустая строка допустимым документом YAML.
  • Различные (онлайн) валидаторы YAML требуют хотя бы одного символа для отображения результата, например YAMLValidator.com или OnlineYAMLTools.com .
  • YAMLLint.com принимает пустую строку как ввод, но изменяет вводимый текст на --- false после проверки возникает вопрос, действительно ли пустая строка была введена.

Итак, в общем случае является ли пустая строка допустимым документом YAML?

1 Ответ

2 голосов
/ 19 июня 2020

Файл YAML анализируется парсером как поток YAML. Поток YAML может содержать несколько документов. Определение этого потока в spe c выглядит следующим образом:

l-yaml-stream ::= l-document-prefix* l-any-document?
                  ( l-document-suffix+ l-document-prefix* l-any-document?
                  | l-document-prefix* l-explicit-document? )* 

Как видите, поскольку оба l-document-prefix и l-any-document являются необязательными, пустой поток YAML допустим, но не содержит документа .

Если вы спрашиваете, может ли l-any-document создавать пустую строку, ответ отрицательный. Без начального --- у вас есть l-bare-document, который должен содержать хотя бы один узел. Простой скаляр создается ns-plain(n,c), и если вы спуститесь туда, вы заметите, что он должен содержать хотя бы один символ, созданный ns-plain-first(c).

Если вы хотите иметь поток YAML, содержащий один документ который содержит пустой скаляр как узел root, у вас есть следующие варианты:

  • пустые скаляры в кавычках ("" или '') - лучше всего, если вы хотите, чтобы скаляр загружался как строка, поскольку пустой скаляр без кавычек должен быть разрешен до !!null в соответствии со схемой, определенной в явном документе spe c.
  • (---). Поскольку документ явно начинается с маркера конца директив, ему разрешено не иметь содержимого, которое интерпретируется как пустой скаляр на верхнем уровне.
  • явный документ с тегом (--- !!str) гарантирует, что пустой скаляр загружается как строка.

Изменить: Примечание на этом сайте YAMLlint: не используйте его. Он не сообщает вам, какую реализацию он использует, какую версию YAML ожидает et c. Его выходные данные показывают, что он анализирует пустой ввод как отдельный документ с пустым скаляром и анализирует этот скаляр как логическое значение false. Хотя это разрешено SPE c (поскольку SPE c не навязывает какую-либо конкретную схему c при реализации), это не соответствует какой-либо официальной схеме.

...