View on Github

akrantiain仕様書 — .snojファイルのjsonダンプの仕様

トップに戻る

6. .snojファイルのjsonダンプの仕様

6-0. 構造

.snojファイルはモジュールの集まりであるので、ダンプされるJSONは「『名前』と『値』のペア」として「モジュール名を文字列化したものと、モジュールの中身をJSON化したもののペア」をとったオブジェクトである。暗黙モジュールには名前がないので、仮の名前として_Mainを用いる。

6-1. モジュール名の文字列化

モジュール名には、2種類の形がある。

単独型識別子
推移型識別子 => 識別子

なお、識別子は、アルファベットの後に、(アルファベット・数字・_)が0個以上続いたものである。

単独型はモジュール名をそのまま、推移型については識別子=>識別子を、モジュール名を表す文字列とする。また、前述の通り、暗黙モジュールには名前がないので、仮の名前として_Mainという文字列で表す。

6-2. 「モジュールの中身」のJSON化

モジュールの中身には、2種類の形がある。片方は、2章で説明されている「文列」であり、もう片方は「モジュールの合成」である。

モジュールの合成の場合、中身をJSON化したものとして「中に含まれるモジュールを文字列化したものの配列」を用いる。

「文列」の場合、以下の要素からなるオブジェクトを用いる。

名前
conversions変換規則定義文をJSON化したものの配列
define『名前』を識別子、『値』を「候補の文字列からなる配列」としたペアからなるオブジェクト
option『名前』を環境指定識別子、『値』をtrueとしたペアからなるオブジェクト

6-3. 変換規則定義文のJSON化

変換規則定義文は、次のような構造を持つ

0または1個のCONDITION 1個以上のSELECT 0または1個のCONDITION -> 1個以上のPHONEME;

ので、selectsとして左辺をJSON化したものを持ち、phonemesとして右辺をPHONEMEの配列としてJSON化したものを持つオブジェクトとして、変換規則定義文を表現する。左辺は0または1個のCONDITION1個以上のSELECT0または1個のCONDITIONを順に並べた配列として表現する。

PHONEMEについては、$ならnull、そうでなければスラッシュリテラルの文字列値をそのまま用いる。

SELECTについては、語境界であれば{"bound":true}、識別子であれば{"id":識別子}( 1個以上の文字列リテラル | 1個以上の文字列リテラル | 1個以上の文字列リテラル )のような場合は{"or":文字列の配列として表現する。

CONDITIONは{"not":中のSELECT}としてJSON化する。

6-4. 具体例

snoj

% 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;

JSON

{"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}}}