◆ YAML は自由度が高くてどういうデータになるか分かりづらいことが多い
◆ YAML の記法の良いところだけ取り入れた個人的な理想の YAML を作ってみた

このブログでも何度か書いた気がしますが個人的には YAML がキライです
自由すぎて読みづらく どういうデータが得られるのかを見てもわからないことが多いです
確認のために JSON 化することは少なくなく やってみると 「あ そう解釈されるの?」 と思うこともよくあります

しかし クオートやカンマなしで書けるところや 配列とオブジェクトの書き方や インデントベースなところなど書きやすいところもあります
もっとフォーマットを厳しくすればいいのに 有効な書き方が多すぎるんですよね
ということで 制限を強くして YAML であれば有効であっても構文エラーとなるようにして 読みやすさ重視となるものを作ることにしました

当初は制限付き YAML で LYAML という名前の予定だったのですが 色々考えてるうちに YAML として有効ではなかったり 有効でも異なる結果となるようなものになったので Y を抜いて LAML という名前にしました

LAML

最終的には YAML をベースというよりも JSON をベースに配列やオブジェクトを YAML 風に書けるようにして「[]」や「{}」や「""」などを不要にした感じです
JSON 互換の記法はなくしてるので JSON を書くとエラーです
配列やオブジェクトは 1 行に 1 エントリしか書くことができず 1 行に全部書くみたいなことは不可能です
またインデントが強制でズレがあると即エラーです
Python のようにインデントが深くなるところでは「:」を必要にしていて 配列でも必要です

数値

1
-2.1

基本は JSON と一緒で小数点前後の 0 を省略はできません
1e2 みたいな指数記法は使えません

文字列

abc
"foo"

"" で囲んでも良いですが 囲まなくても良いです
'' は使えません

ブロック文字列

"""
aaa
bbb
"""

改行を直接書くことができます
\n などのエスケープ文字列はそのままの文字になります

""" の行は文字列に含まれません

インデントが要求される場所では文字列内でもインデントが必要です
その際の要求されるインデントは文字列には含まれません

真偽値

true
false

true/false の 2 つだけです
大文字とか yes/no は使えません

null

null

null のみです
nil とか none とか大文字は使えません

オブジェクト

x:1
y:a
z:
sub:
subsub:1

「:」 区切りで key と value を書きます
「:」 で行を終えると次の行にインデントを加えて value を書けます

インデントを浅くするには空行が必要です

a:
x:1
y:2

b:
x:1
y:2

キーに 「:」 を含む場合はキーを "" で囲みます

"a:b": "c:d"

配列

- 1
- abc

「- 」 から始めて value を書きます
「-:」 から始めると次の行にインデントを加えて value を書けます

-:
- 1
- 2

-:
- 3
- 4

コメント

// comment

行コメントのみです
コメントもインデントが強制されます

Playground

ここで試せます