/Zatlin

Domain-specific language for generating words

Primary LanguageJavaApache License 2.0Apache-2.0

Zatlin

概要

Zatlin は、架空言語の単語を生成するための DSL です。 このリポジトリには、それを処理する Java ライブラリが含まれます。 Zatlin ver 1.0.0 (ZpDIC ver 1.19.0 に内蔵されているもの) と同じ動作をします。

使用方法

Zatlin オブジェクトを生成し、生成規則データとなる文字列を引数に渡して load メソッドを呼んでください。 その後に generate メソッドを呼ぶと、生成規則データに従って文字列を生成します。

// create a Zatlin object
Zatlin zatlin = new Zatlin();
// load a source
String source = "% \"s\" | \"t\" | \"k\"";
zatlin.load(source);
// generate
System.out.println(zatlin.generate());

生成規則データはファイルからも読み込むことができます。 その場合は、load メソッドの引数に File オブジェクトを渡してください。

// load a source from a file
File file = new File(path);
zatlin.load(file);

生成規則データの書き方

基本

% の後に | で区切った文字列リテラルを記述すると、それらの文字列のうちいずれかがランダムに出力されます。 文末には ; を置いてください。

% "s" | "t" | "d";
# 「s」か「t」か「d」のいずれかを生成するパターン

変数の利用

変数名 (半角英数字もしくはアンダーバーから成る文字列) の後に = を書き、その後にパターンを記述すると、そのパターンを変数に格納して、以降利用することができます。 変数定義の最後には ; を置いてください。 なお、行末の ; に限り省略できます。

vowel = "a" | "e" | "i" | "o" | "u";

パターンの合成

パターン中に変数や文字列リテラルを並べて置くことで、パターンを合成することができます。

vowel = "a" | "e" | "i" | "o" | "u";
pattern = "s" vowel "t";
# 「s」と「t」の間に vowel が生成する文字列を挟んだものを生成するパターン
# つまり「sat」「set」「sit」「sot」「sut」のいずれかが出力される

確率の設定

| で区切られたそれぞれのパターンに対し、末尾に数字を置くことで、確率を変えることができます。 例えば、2 を指定すると、そのパターンは他のパターンと比べて 2 倍出やすくなります。

vowel = "a" 2 | "e" 2 | "i";
# 「a」と「e」は「i」より 2 倍出力されやすい
# つまり「a」と「e」は 2/5 の確率で出力され「i」は 1/5 の確率で出力される

数字を指定しない場合は 1 の省略だと見なされます。

除外設定

パターンの後に - を置き、さらにその後に | で区切った文字列リテラルを記述すると、生成される文字列からここで指定された文字列を含むものが除外されます。

cons = "s" | "z" | "t" | "d";
pattern = cons cons - "ss" | "zz";
# cos を 2 つを合成
# ただし「ss」と「zz」を含むものは出力しない

除外設定の文字列の前に ^ を置くと、その文字列から始まるものが除外されます。 また、文字列の後に ^ を置くと、その文字列で終わるものが除外されます。

cons = "s" | "z" | "t" | "d";
pattern = cons cons - "s"^ | ^"d" | "tt";
# 「s」で終わる文字列と「d」で始まる文字列と「tt」を含む文字列を除外

除外設定では変数は使えません。

コメント

# から行末まではコメントです。 生成規則の定義に関与しません。

vowel = "a" 4 | "e" 2 | "i" 2 | "o" 1 | "u"; # ここはコメントです
# この行はコメントです

複雑な例

V = "a" 3 | "e" 3 | "i" 2 | "o" 2 | "u" 2
C = "s" | "z" | "t" | "d" | "k" | "g" | "f" | "v" | "n" | "h"
# 母音と子音
yV = V | "y" V - "yi"
# 半母音のパターン
# ただし「yi」は除外
% V | C yV | yV C | C yV C | C yV C C | C C yV C | C C yV C C - "fy" | "vy" | "h"^
# CCVCC までの 1 音節の単語を生成
# ただし「fy」と「vy」を含んでいたり「h」で終わったりするものは生成しない

実行結果例:

dya, uv, zyas, knuz, gyazn, ngav, dyevt, gdyuft