.snojファイルはモジュールの集まりであるので、ダンプされるJSONは「『名前』と『値』のペア」として「モジュール名を文字列化したものと、モジュールの中身をJSON化したもののペア」をとったオブジェクトである。暗黙モジュールには名前がないので、仮の名前として_Mainを用いる。
モジュール名には、2種類の形がある。
| 単独型 | 識別子 |
| 推移型 | 識別子 => 識別子 |
なお、識別子は、アルファベットの後に、(アルファベット・数字・_)が0個以上続いたものである。
単独型はモジュール名をそのまま、推移型については識別子=>識別子を、モジュール名を表す文字列とする。また、前述の通り、暗黙モジュールには名前がないので、仮の名前として_Mainという文字列で表す。
モジュールの中身には、2種類の形がある。片方は、2章で説明されている「文列」であり、もう片方は「モジュールの合成」である。
モジュールの合成の場合、中身をJSON化したものとして「中に含まれるモジュールを文字列化したものの配列」を用いる。
「文列」の場合、以下の要素からなるオブジェクトを用いる。
| 名前 | 値 |
| conversions | 変換規則定義文をJSON化したものの配列 |
| define | 『名前』を識別子、『値』を「候補の文字列からなる配列」としたペアからなるオブジェクト |
| option | 『名前』を環境指定識別子、『値』をtrueとしたペアからなるオブジェクト |
変換規則定義文は、次のような構造を持つ
0または1個のCONDITION 1個以上のSELECT 0または1個のCONDITION -> 1個以上のPHONEME;
ので、selectsとして左辺をJSON化したものを持ち、phonemesとして右辺をPHONEMEの配列としてJSON化したものを持つオブジェクトとして、変換規則定義文を表現する。左辺は0または1個のCONDITION → 1個以上のSELECT → 0または1個のCONDITIONを順に並べた配列として表現する。
PHONEMEについては、$ならnull、そうでなければスラッシュリテラルの文字列値をそのまま用いる。
SELECTについては、語境界であれば{"bound":true}、識別子であれば{"id":識別子}、( 1個以上の文字列リテラル | 1個以上の文字列リテラル | 1個以上の文字列リテラル )のような場合は{"or":文字列の配列として表現する。
CONDITIONは{"not":中のSELECT}としてJSON化する。
% baz { %% foobar >> (foo) >> (A => B => C) ; }
%foobar {
@FALL_THRU;
"a" -> /\u3042/
}
% foo {
@CASE_SENSITIVE;
"\u3042" -> /a/
sample = "foo" | "bar" "baz" | "foobar";
PUNCTUATION = "." | "," | "!" | "?";
"n" ^ ("m"|"p") -> /m/ $
"m" -> /m/
"p" -> /p/
"n" -> /n/
"a" -> /a/
"i" -> /i/;
"u" -> /u/
"g" -> /g/
}
% A=>B {
@FALLTHRU;
vowel = "a" | "i";
"u" "g" !vowel -> /u/ /u/;
}
% B=>C {
@FALL_THROUGH;
"a" -> /aa/;
}
%% baz;
{"foobar":{"conversions":[{"selects":[{"or":["a"]}],"phonemes":["あ"]}],"define":{},"option":{"FALL_THROUGH":true}},"foo":{"conversions":[{"selects":[{"or":["あ"]}],"phonemes":["a"]},{"selects":[{"or":["n"]},{"bound":true},{"or":["m","p"]}],"phonemes":["m",null]},{"selects":[{"or":["m"]}],"phonemes":["m"]},{"selects":[{"or":["p"]}],"phonemes":["p"]},{"selects":[{"or":["n"]}],"phonemes":["n"]},{"selects":[{"or":["a"]}],"phonemes":["a"]},{"selects":[{"or":["i"]}],"phonemes":["i"]},{"selects":[{"or":["u"]}],"phonemes":["u"]},{"selects":[{"or":["g"]}],"phonemes":["g"]}],"define":{"PUNCTUATION":[".",",","!","?"],"sample":["foo","barbaz","foobar"]},"option":{"CASE_SENSITIVE":true}},"baz":["foobar","foo","A=>B","B=>C"],"_Main":["baz"],"B=>C":{"conversions":[{"selects":[{"or":["a"]}],"phonemes":["aa"]}],"define":{},"option":{"FALL_THROUGH":true}},"A=>B":{"conversions":[{"selects":[{"or":["u"]},{"or":["g"]},{"not":{"id":"vowel"}}],"phonemes":["u","u"]}],"define":{"vowel":["a","i"]},"option":{"FALL_THROUGH":true}}}