YAML 1.2 メモ (5) プレイン

YAML では、ノードの種類を先頭の文字で判別します。この種類判別のための文字はインジケータと名づけられていて、予約されています。

'-' : 直後にスペース・タブ・改行があるときに限りブロック・シーケンス。ないときはプレインの開始。
'?' : 直後にスペース・タブ・改行があるときに限りマッピングの明示キー。ないときはプレインの開始。
':' : 直後にスペース・タブ・改行があるときに限りマッピングの値。ないときはプレインの開始。
      ただし、フロー・マッピングとフロー・シーケンス中で、キーが JSON 要素の場合は空白不要。
'|' : ブロック・リテラル
'>' : ブロック・フォールデッド
'[と]' : フロー・シーケンス
'{と}' : フロー・マッピング
',' : フロー・シーケンスとフロー・マッピングのアイテム間の区切り
'"' : ダブル・クォーテッド
"'" : シングル・クォーテッド
'!' : タグ・プロパティ
'&' : アンカー
'*' : エイリアス
'%' : ディレクティブの開始記号
'#' : 行頭以外では直前に空白・タブがあるとコメント開始
'@と`' : 予約
上記以外でスペース・タブ・改行でもない文字 : プレインの開始

インジケータで始まらない要素はプレインの開始を表します。いったん、プレインが開始されると、フロー・シーケンス外かつフロー・マッピング外では、コロンとシャープを除いたすべての文字を自由に使うことができます。

コロンは後ろにスペース・タブ・改行があるとコロンの直前でプレインが終わることを表します。マッピングの暗黙キーにするときだけでなく、他のどのような場合であっても、コロン+空白の前でプレインが終わるものとして扱います。当然ながら、マッピングでないときに、コロンが出現すると、シンタックス・エラーになります。

シャープは行頭、もしくはシャープの前にスペースまたはタブが存在するときはコメント開始の意味なり、そのシャープの前の白くない最後の文字までがプレインになります。行頭でなくかつ前にスペースもタブもない場合はプレインの一部として使うことができます。なお、プレインの途中にコメントを挟むことはできません。

フロー・シーケンス内またはフロー・マッピング内でも、コロンとシャープについての規則はあてはまります。加えて、フロー・シーケンスの括弧とフロー・マッピングの括弧、さらにコンマの5文字をプレインに使うことができなくなります。コロンと違い、これら5文字は後ろにスペース・タブがあろうがなかろうが関係なくプレインに使えなくなり、これら5文字の前でプレインが終わります。

---
- プレインはプの文字から始まり、
  複数行にまたがって伸びていきます。
  空行以外のプレインの白くない行は空白文字で連結されて折りたたまれます。


  空白行を挟むと空白行の行数分の改行文字をプレインに取り込みます。
  プレイン中ではコロン(:)とシャープ(#)が特別扱いされます。
  コロンの直後にスペース・タブ・改行があると、そのコロンの前でプレインは
  終わります。マッピングのキーと値の区切りに関係なく、コロンのルールは
  適用されるので、マッピングでないからとうっかりコロン・スペースを書くと
  思わぬところでプレインが終わってしまう上に、コロンがあったらいけない
  場所にコロンがあることになるので、エラーになってしまいます。

  
  シャープは行頭にある場合かシャープの直前にスペースかタブがある場合
  その前の白くない文字の場所でプレインが終わると判断されます。

- -1  # のようにマイナスの直後にスペース・タブ・改行がないときは、プレインに
      # なります。これは整数の -1
- :A  # コロンの直後にスペース・タブ・改行がないときも同様でプレインになります。
- ?A  # クエスチョンの直後にスペース・タブ・改行がないときも同様でプレインになります。
- http://hoge#fuga  # コロンとシャープがプレインの一部になる例です。

- # これはコメント
  # これもコメント
  
  
  # コメントは間に白い行を挟んで何行にでも伸ばせるので(ただし、リテラルと
  # フォールデッドはインジケータのある行の行末までに限ります)……
  
  
  プレインはこの行のプの文字から始まります。
  そしてこの行の句点で終わります。    # ここはコメントです。


- プレインの途中にコメントを挟むことはできません。
  # 前の場合、コメント以降には、次のブロック・シーケンスのエントリを
  # 置くしかありません。

- null   # ヌル。他に Null NULL ~ も。
- true   # 真偽値の true。他に True TRUE も。
- false  # 真偽値の false。他に False FALSE も。
- -1     # 整数。
- 0o777  # 8進整数。
- 0xfff  # 16進整数。
- 1.0    # 浮動小数点数。他に -1.0 1.0e10 .nan .NaN .NAN .inf .Inf .INF も。

プレインは、必ずしも文字列になるとは限らず、タグ・プロパティがなくても、スキーマで定められているパターンに一致する場合には、真偽値・整数・浮動小数点などへの解釈がおこなわれます。どのパターンで、どの型に解釈するべきかはスキーマ次第です。JSON スキーマが最も解釈幅が狭く、コア・スキーマで多少広がります。上の例では、コア・スキーマで解釈しています。