LoginSignup
1
0

JSONCのABNFを作る

Posted at

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 ) )

これでひとまず中身は何でも書けるという形にできた。ただしエスケープなどを考慮する場合はもう少し拡張が必要。考慮する必要があるのかどうか不明。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0