JSONにコメントを入れたい、という声もある。
自作JSON Parserは主にABNFで作ってあるのでABNFを拡張する必要がある。
MicrosoftがJSONCというものを作ったようだがABNF構文がないので考えてみることにした。
出来上がったらコメントのみの変更なのでABNF Parserを通せばそのままJSON Parserとして使える。
YAMLという形もあるが複雑そうなのであとで考える。
JSONC の差分
/* */ のコメントが書ける
// の1行コメントが書ける
, をObject, Array末尾につけられる
でいいだろうか。曖昧。
ABNF
基礎となるのはRFC 8259 JSONのABNF構文。
コメントが入りそうな場所はJSONのABNFでwsを拡張することで対応できそうというところまで目安にする。
コメントは2種類、// からはじまる行単位のコメントと、/* */ で囲むコメント。
// からはじまる行は改行を目安にコメントを終了すればよさそう。
ws拡張
RFC 8259 Section. 2 のwsは次のようになっている。
ws = *(
%x20 / ; Space
%x09 / ; Horizontal tab
%x0A / ; Line feed or New line
%x0D ) ; Carriage return
スペース(SP %x20)、垂直タブ(HT %x09)、改行(LF %x0A)、復帰(CR %x0D)の4文字がスペース文字として扱われている。
複数行書けるコメント /* */ をとりあえず comment という名にする。1行コメントを linecomment という名にする。
ws = *(
linecomment / ; single line comment
comment / ; multi line comment
%x20 / ; Space
%x09 / ; Horizontal tab
%x0A / ; Line feed or New line
%x0D ) ; Carriage return
この方向でいいんじゃないかな?
開始と終了を決める。
linecomment = "//" inslcomment ( %x0A / %x0D )
comment = "/*" inmlcomment "*/"
中身に書ける文字を決める。
基本的に何でも書けるがCの終端文字0x00などは避ける方がいいのかな。
inslcomment = %x01-09 / %x0b / %x0c / %x0e-%x10ffff
inmlcomment = %x01-29 / %x2b-10ffff / ( %x2a ( %x01-%2e / %x30-10ffff ) )
これでひとまず中身は何でも書けるという形にできた。ただしエスケープなどを考慮する場合はもう少し拡張が必要。考慮する必要があるのかどうか不明。