akrantiainは、.sozysozbot.によって開発されている、言語の音韻規則や正書法規則などを記述しその規則に基づいた文字列変換を実行するためのDSLです。 実装は、GitHubの該当リポジトリから取得することができます。
なお、以下の説明では入力として何らかの正書法で書かれた単語を受け取り、その単語の音素表記を出力するような場合に絞って説明しますが、akrantiain自体はそれ以外の文字列変換も行うことができ、自然数の10進数表現を入力として受け取り2進数表現にして出力することなども可能です。
akrantiainでは、「snojファイル」と呼ばれる音韻規則を記述したファイルを読み込み、それに基づいて入力された単語から発音記号などを生成します。
->の前に単語内の文字を羅列し、->の後にそれぞれの文字に対応する音素を記述してください。 単語内の文字は"で囲み、音素は/で囲みます。 最後に、文の終わりを示す;を置きます。 以下は、単語内の「s」という文字を/z/と読むという規則を表します。
"s" -> /z/;
2文字以上に1つの音素を割り当てることもできます。 また、->の前後の文字列や音素は複数でも構いません。 ただし、文字列と音素の個数は一致していなければなりません。 以下は、単語内の「sh」とそれに後続する「e」をそれぞれ/ʃ/と/ə/で読むという規則を表します。
"sh" "e" -> /ʃ/ /ə/;
文字列を|で区切って括弧で囲むことで、区切られた文字列のどれかを意味することができます。 例えば、以下は「m」もしくは「b」の後に「a」があった場合に、「m」か「b」は/b/と読み、後続する「a」は/ʌ/と読む規則を表します。
("m" | "b") "a" -> /b/ /ʌ/;
->の右辺に、音素の代わりに$を置くことで、対応する文字の音韻をこの規則では定めることはせず、別の規則に委ねることができます。 例えば以下では、「v」の後に「i」が現れた場合、「v」は/w/で発音しますが、「i」の発音についてはこの規則で定めることはせず、別の規則によって音素を定めるようにしています。
"v" "i" -> /w/ $;
したがって、以下のように「i」に関する規則も別個に用意しておく必要があります。
"v" "i" -> /w/ $; "i" -> /i/;
変数名の後に=を置き、さらにその後に|で区切った文字を並べることで、パターンを変数に割り当てることができます。 括弧で囲むことはしません。 変数名は、半角英数字とアンダーバーから成る文字列であり、数字から始めることはできません。 以下は、「vowel」という名前の変数に、「a」もしくは「e」もしくは「i」を意味するパターンを格納しています。
vowel = "a" | "e" | "i";
変数は、音韻規則を定義する文の->の左辺で用いることができます。 例えば、以下は「vowel」という変数を定義して、vowelの表すパターン(「a」もしくは「e」もしくは「i」)の後に「k」がある場合に、その「k」を/ɡ/と読む規則を定義しています。
vowel = "a" | "e" | "i"; vowel "k" -> $ /ɡ/;
->の左辺には^を置くことができ、これは語境界を示します。 ^に音素を割り当てることはできません。 例えば、以下は「z」の後に語境界が現れた場合、すなわち「z」が語末にある場合、その「z」を/s/と読む規則を定義しています。 ^に音素は割り当てないので、右辺の音素は1つであることに注意してください。
"z" ^ -> /s/;
なお、空白からなる文字列リテラルを用いて語境界を表現することはできず、行おうとするとエラーが発生します。
# "z " -> /s/; # エラー
->の左辺にある文字列や変数名の並びの最初か最後に、!に続いて文字列や変数名を記述したものを追加すると、前後の除外条件が設定できます。 例えば、以下の規則は、「t」の直前以外の「au」を/o/と読む規則を表します。
"au" !"t" -> /o/;
また、以下の規則は、「a」の直後でも「o」の直後でも「u」の直後でもない「ch」を/ç/と読む規則を表します。この例から分かるように、!に続いて『文字列を|で区切って括弧で囲んだもの』を用いることもできます。
!("a" | "o" | "u") "ch" -> /ç/;
除外条件は前後両方に指定することもでき、以下は、直前にvowelにマッチする文字がなく、さらに直後が「s」でも「z」でもないような「th」を、/θ/と読む規則を定義しています。
vowel = "a" | "e" | "i" | "o" | "u"; !vowel "th" !("s" | "z") -> /θ/;
#から行末まではコメントとして扱われ、変数や音韻規則の定義に関与しません。
C = "s" | "t" | "k" | "f"; # この部分はコメント # この行はコメントです
行末のセミコロンは省略できます。 1つの行に複数の文を記述する場合は、中間のセミコロンは省略できません。
semivow = "y" | "w"; vow = "a" | "e" # 省略 semivow vow -> // $ # 省略 # semivow = "y" | "w" vow = "a" | "e"; # 構文エラーになる
上記で説明した機能以外にも、句読点の設定や、「モジュール」と呼ばれる強力な機能があります。 詳しくは、リポジトリを参照してください。