.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}}}