View on Github

akrantiain仕様書 — 文列についての仕様書

トップに戻る
English Version kanteluescosti virle lineparine

2. 「文列」の構文規則

2-0. 構造

「文列」とは、文の集まりである。文には識別子定義文変換規則定義文、そして環境指定文がある。
変換規則定義文を上から辿っていき、順に変換規則を適用することによりakrantiainは動作する。
故に、変換規則定義文の順番を入れ替えると動作が変わる可能性があるが、一方識別子定義文や環境指定文の位置や順序はakrantiainの動作に一切影響を与えない。
行末は文の境目である。行をまたいで1文を定義することはできない。
逆に、文末のセミコロンは、行の最後および行コメントの直前では省略できる。また、}の前でも省略できる。

2-1. コメント

#から行末までに書かれたものは無視される。ただし、文字列リテラルおよびスラッシュリテラル内の#はコメントを意味しない。
複数行コメントは存在しない。

2-2. 識別子定義文

識別子定義文は、次のような構造を持つ。
識別子 = 1個以上の文字列リテラル | 1個以上の文字列リテラル | 1個以上の文字列リテラル | 1個以上の文字列リテラル;
例としては、こんな感じである。
sample = "foo" | "bar" "baz" | "foobar";
こう書くと、識別子sample"foo""bar" "baz""foobar"の3つのどれかにマッチするパターンとして定義される。
識別子は、アルファベットの後に、(アルファベット・数字・_)が0個以上続いたものである。識別子を数字や_で始めることはできない。

同一の識別子を複数回定義すると、エラーが発生する。

特殊な識別子として、PUNCTUATIONがある。例えばPUNCTUATION = "." | "," | "!" | "?";と定義すると、akrantiainはこれらの文字を句読点と認識する。
これは、例えばThis is a pen.という文において、nの字は語末なのだということをakrantiainに認識させるのに必要である。
現状、複数文字の文字列リテラル(例:"foo")をPUNCTUATIONの定義で用いた時の挙動は未定義である。これは不具合であり、後のバージョンで修正される予定である。

2-3. 変換規則定義文

SELECT^または「1つの識別子」または「1個の文字列リテラル」または( 1個以上の文字列リテラル | 1個以上の文字列リテラル | 1個以上の文字列リテラル )とし、
CONDITIONSELECT!を前置したものとする。
PHONEME$スラッシュリテラルとする。
このとき、変換規則定義文は、次のような構造を持つ。
0または1個のCONDITION 1個以上のSELECT 0または1個のCONDITION -> 1個以上のPHONEME;
ここで、「1個以上のSELECT」を構成するSELECTのうち^以外のものの個数と、「1個以上のPHONEME」を構成するPHONEMEの個数は一致している必要がある。不一致の場合エラーが発生する。
また、「1個以上のPHONEME」を構成するPHONEMEが全て$であると、エラーが発生する。

例としては、こんな感じである。
"u" "g" !vowel -> /u/ /u/;
こう書くと、「文字列"u"の後に文字列"g"があり、直後がパターンvowelにマッチしないとき、"u"/u/に、"g"/u/に変換する」という規則が定義される。

なお、->を構成する->の間にスペースを入れることはできない。

^は語の境界にマッチするパターンである。$は「特に変換先のスラッシュリテラルを指定せず、別の規則によって変換させる」ことを表す。
^$の例としては、こんな感じである。
"n" ^ ("m"|"p") -> /m/ $
こう書くと、「文字列"n"の後に語境界があり、その後に("m"|"p")にマッチする文字列があるとき、
"n"/m/に置き換え、("m"|"p")にマッチした文字列については保留し、後に登場する規則に委ねる」という規則が定義される。

変換規則定義文内で用いている識別子がどの識別子定義文でも定義されていない場合は、エラーが発生する。


PUNCTUATIONの定義に用いられた文字列リテラル内の文字、および空白文字を含んでいる文字列リテラルを変換規則定義文で直接的または(定義された識別子を通じて)間接的に使用することは禁じられている。
使おうとすると、エラーが発生する。

2-4. 環境指定文

環境指定文は、次のような構造を持つ。
@ 識別子 ;
この文は、akrantiainの挙動を、識別子により指定された挙動に変更することを示す文である。同一の環境指定が複数あってもエラーではない。

環境指定識別子自体には大文字と小文字の区別はない。@ uSe_NFd ;@ USE_NFD ;と完全に等価である。

現状で挙動が定義されている環境指定識別子の一覧は、次の通りである。
環境指定識別子意味
CASE_SENSITIVE変換元において大文字と小文字を区別する
FALL_THROUGH FALLTHROUGH FALL_THRU FALLTHRU入力文字列の中で変換規則に消費されなかったものをエラーとせず素通りさせる
USE_NFDアクセント付き文字を、「アクセント無しの文字+アクセント記号」として処理することなどができるようになる

2-5. 文字列リテラル

文字列リテラルは、変換元の文字列を表現するためのリテラルである。文字列リテラルは"で始まり"で終わり、内部に改行を含むことはない。
"という文字自体を含む文字列を文字列リテラルとして表現するには、文字列中の"を文字列リテラル内で\"と表記する必要がある。
\という文字を含む文字列を文字列リテラルとして表現するには、文字列中の\を文字列リテラル内で\\と表記する必要がある。
Unicodeの基本多言語面にある文字は、文字列リテラル内で表したい文字のコードポイントを\uに続き16進数(0~9, A~F, a~f)4桁で書くことでも表現できる。

デフォルトでは、文字列リテラル内の大文字と小文字は区別されない。
区別させるには、環境指定文で環境指定識別子CASE_SENSITIVEを指定する必要がある。

2-6. スラッシュリテラル

スラッシュリテラルは、変換先の文字列を表現するためのリテラルである。スラッシュリテラルは/で始まり/で終わり、内部に改行を含むことはない。
/という文字自体を含む文字列をスラッシュリテラルとして表現するには、文字列中の/をスラッシュリテラル内で\/と表記する必要がある。
\という文字を含む文字列をスラッシュリテラルとして表現するには、文字列中の\をスラッシュリテラル内で\\と表記する必要がある。
Unicodeの基本多言語面にある文字は、スラッシュリテラル内で表したい文字のコードポイントを\uに続き16進数(0~9, A~F, a~f)4桁で書くことでも表現できる。