============================================================ プログラム言語「てってってー」(Tettette Language) 仕様(Version 0.1.0 現在) (C)2009- H.Hiro(Maraigue) http://kugyu.info/tettette/ ============================================================ ==== 1. はじめに =============================================================== プログラム言語「てってってー」(以下「てってってー言語」)は、「てってってー」を テーマにしたプログラム言語です。 ※「てってってー」そのものについては、こちらをご参照下さい。  てってってーとは - ニコニコ大百科  http://dic.nicovideo.jp/a/%E3%81%A6%E3%81%A3%E3%81%A6%E3%81%A3%E3%81%A6%E3%83%BC 特徴は、ソースコードが以下のように「てってってー」だらけになることです。   ーてってってー   てっててーてっててーてっててーてっててー   てってっーてってっーてってっーてってっー   ーててーてっててーてってっー   ーーてってっててー   てっててーてっててーてっててーてっててーてっててーてっててー   てってっーてってっーてってっーてってっーてってっーてってっー   ーててーてっててーてってっー   ーーてーてっててーてってっー これをソースコードとしててってってー言語のインタプリタに与えると、   てってってーてってっててー を出力します。 てってってー言語の構造は、Brainf*ck(http://ja.wikipedia.org/wiki/Brainfuck)が 元になっています。ただし、数点仕様を拡張しています。 ==== 2. ソースコードについて =================================================== ソースコードは現在のところ、UTF-16 little endianで書かれたもののみ受け付ける (BOMはあってもなくても構いませんが、big endianのUTF-16はBOMがあっても 受け付けません)。これについては近いうち他の文字コードにも対応する予定である。 ==== 3. ソースコードの解釈 ===================================================== ソースコードは全体が一旦メモリ上に読み込まれ、その先頭から順に解釈される。 ソースコードを先頭から見て、それが特定の意味を持つ文字列(これを以下「コマンド」 と呼ぶ)のいずれかに合致していれば、それに従って処理を行い、その合致した部分の 次の文字から解釈を再開する。どのコマンドにも合致しなければ、エラーとしてそこで 処理を終了する。 (例)ソースコードが「ててーてててー」であった場合、  ・まず先頭から見ると、「ててー」がコマンドであるため、その処理が実行される。  ・続いて残る「てててー」が解釈されるが、「て」「てて」「ててて」「てててー」は   いずれもコマンドでないため、エラーとなる。 コマンドは、それ一つで機能を為すもの(以下「単独コマンド」と呼ぶ)と、コマンドの 後に続くソースコードの内容を含めて解釈するもの(以下「領域コマンド」)がある。 それぞれのコマンドの機能は、後述する「コマンド一覧」にて述べる。 なお、以下の文字は領域コマンドの内部を除いて無視される。 * BOM * スペース(全角・半角) * タブ * 改行(CR・LFともに) ==== 4. 概念 =================================================================== 以下のものが(仮想的に)準備されているとする。 B: サイズが無限にある(注:実際の上限はメモリおよびアーキテクチャに依存)、 Unicode文字(1文字16ビット)を格納する配列。添字は0起点とし、初期値はすべて 0である。また、この配列のサイズは必要に応じて拡大される。 また、B[i]でBのi番目の要素を表す。 P: ポインタ変数。初期値は0である。 S: ソースコード上の位置を格納するスタック。初期状態は空のスタックである。 てってってー言語は、Bの値を適宜書き換えつつ処理を実現する。 ==== 5. コマンド一覧 =========================================================== ---- 5.1. 領域コマンド --------------------------------------------------------- *「{」   ソースコード中に次に「}」が現れるまで、その途中のソースコードを読み飛ばす。   これはソースコード中にコメントを入れるのに用いる。 *「ー」あるいは「`」   ソースコード中に次に「てー」あるいは「'"」が現れるまでソースコードを読み込み   その間の文字をすべてBの中に順次書き込む。Bに書き込む際の基点の位置はPとし、   1文字書き込むごとにPが1増えるものとする。   これは文字・文字列のリテラルを記述するのに用いる。   例えばPが10のときに「ーてってってってー」として6文字書き込んだ場合、最終的に   Pは16に変わる。      なお、「ー」あるいは「`」と、「てー」あるいは「'"」の間に以下の文字列が   含まれていた場合は、以下の条件に従って解釈する(エスケープシーケンス)。   ここで、#は任意の文字とする。   * \x## 「##」を2桁の十六進数の数とみなし、文字コードがその値である文字を    B[P]に書き込む。例えば「ーAてー」と「ー\x41てー」は同じである。    (「A」の文字コードは十六進数で「41」)    「##」が十六進数として解釈できない場合はエラーとなる。   * \u#### 「####」を4桁の十六進数の数とみなし、文字コードがその値である    文字をB[P]に書き込む。例えば「ーててー」と「ー\u3066てー」は同じで    ある。(「て」のUTF-16LEでの文字コードは十六進数で「3066」)    「####」が十六進数として解釈できない場合はエラーとなる。   * \d##### 「#####」を5桁の十進数の数とみなし、文字コードがその値である    文字をB[P]に書き込む。例えば「ー\u3066てー」と「ー\d12390てー」は    同じである。    「#####」が十進数として解釈できない場合、あるいは十進数であっても    65535(=0xFFFF)を超える場合はエラーとなる。   * \0 「\x00」と同じである。   * \a 「\x07」と同じである。   * \b 「\x08」と同じである。   * \f 「\x0C」と同じである。   * \n 「\x0A」と同じである。    C言語などとは異なり、環境によらず常にこの値である。   * \r 「\x0D」と同じである。   * \t 「\x09」と同じである。   * \v 「\x0B」と同じである。   * \\ 文字「\」の文字コードの値である。「\x5C」と同じである。   * \" 文字「"」の文字コードの値である。「\x22」と同じである。   * \' 文字「'」の文字コードの値である。「\x27」と同じである。 ---- 5.2. 単独コマンド --------------------------------------------------------- *「ててー」あるいは「+」   B[P]の値を1増やす。65535の次は0である。 *「てっー」あるいは「-」   B[P]の値を1減らす。0の前は65535である。 *「てってー」あるいは「>」   Pの値を1増やす。 *「てっててー」あるいは「<」   Pの値を1減らす。Pが0のときに用いるとエラーとなる。 *「てってっー」あるいは「)」   B[P]の値を標準出力に出力したのち、Pの値を1増やす。 *「てってってー」あるいは「(」   標準入力から1文字読み込み、その値をB[P]に書き込んだのち、Pの値を1増やす。 *「.」   B[P]の値を標準出力に出力する。Pの値は変更されない。   このコマンドは、Brainf*ckに合わせて設けている。 *「,」   標準入力から1文字読み込み、その値をB[P]に書き込む。Pの値は変更されない。   このコマンドは、Brainf*ckに合わせて設けている。 *「てってっててー」あるいは「[」   B[P]の値が0なら、次に「てってってっー」あるいは「]」が現れるまでソースコード   を読み飛ばし、その次の文字からソースコードの解析を再開する。   そうでなければ、この「てってっててー」のソースコード上での位置(最初の「て」   の位置)をSの先頭に追加する。   これはループ処理を行うのに用いられる。C言語の「while(B[P]){」に相当する。 *「てってってっー」あるいは「]」   Sの先頭にある、ソースコード上の文字の位置を示す値を除去し、その除去した値の   位置からソースコードの解析を再開する。Sが空の場合はエラーとなる。   「てってっててー」あるいは「[」がループの始点であるのに対し、このコマンドは   ループの終点となる。 ==== 6. チュートリアル ========================================================= ---- 6.1. 文字列を出力するプログラム ------------------------------------------- (sample-base.ttt もご覧下さい。) 「てってってーてってっててー」を出力することを考える。 てってってー言語ではプログラム中に文字列リテラルを記述できる。そのため、簡単に これを実現するには、以下のようにすればよい。 (1) Bに「てってってーてってっててー」と書き込む。 (2) Pを、今書き込んだ「てってってーてってっててー」の先頭に合わせる。 (3) コマンド「てってっー」を文字数分実行し出力する。 これをそのまま書くと、以下のようなソースコードになる。   ーてってってーてってっててーてー {処理(1)}   てっててーてっててーてっててーてっててーてっててーてっててーてっててー   てっててーてっててーてっててーてっててーてっててーてっててー {処理(2)}   てってっーてってっーてってっーてってっーてってっーてってっーてってっー   てってっーてってっーてってっーてってっーてってっーてってっー {処理(3)} しかし、処理(1)はこれでは正常に動かない。 これは「てってっ *てー* てってっててー」の部分でリテラルの部分が終わると みなされるためである。これを回避するには、「てってってーてってっててー」という 文字列を「てってって」「ーてってってて」「ー」の3つの文字列に分けて書き込めば よい。これを実装したのが以下のコードである。   {「てってって」の部分}   ーてってっててー {処理(1)}   てっててーてっててーてっててーてっててーてっててー {処理(2)}   てってっーてってっーてってっーてってっーてってっー {処理(3)}      {「ーてってってて」の部分}   ーーてってってててー {処理(1)}   てっててーてっててーてっててーてっててーてっててー   てっててーてっててー {処理(2)}   てってっーてってっーてってっーてってっーてってっー   てってっーてってっー {処理(3)}      {「ー」の部分}   ーーてー {処理(1)} てっててー {処理(2)} てってっー {処理(3)} これにより、「てってってーてってっててー」が出力される。 ---- 6.2. ループ処理を用いた簡単なプログラム ----------------------------------- (sample-loop.ttt もご覧下さい。) 半角の大文字アルファベットを「A」から「Z」まで出力することを考える。 ここでは、以下の方針でプログラムを書く。 (1)変数xに文字「A」を格納し、変数yに26(十進数)を格納する。 ここで26はアルファベットの個数である。 (2)yが0ならば終了する。 (3)yが0でなければ、xの文字を出力し、xの値を1増やすとともにyの値を1減らす。 その後(2)に戻る。 てってってー言語では変数が利用できないため、ループに必要な変数に相当する値は、 Bのどこかに場所を決めて格納しておくことになる。ここではB[0]に変数xを、B[1]に 変数yを割り当てる方針を採る。 プログラムは以下のようになる。   ーA\d00026てー {B[0]に「A」を、B[1]に26を格納する}   てっててー {Pを1に合わせる(ループ継続判定はB[1]の値で行うため)   てってっててー {ループ開始}     てっててーてってっー {Pを0にしたのち、B[0]の値を出力する}     てっててーててー {Pを0にしたのち、B[0]の値を1増やす}     てってーてっー {Pを1にしたのち、B[1]の値を1減らす}   てってってっー {ループ終了} これにより、「ABCDEFGHIJKLMNOPQRSTUVWXYZ」が出力される。 ==== 7. 著作権表示 ============================================================= (C)2009- H.Hiro(Maraigue) メールアドレス main@hhiro.net 配布サイト http://kugyu.info/tettette/ ドキュメントも含め、クリエイティブ・コモンズの「表示 2.1 日本」に従う限りに おいて、自由に利用することを認めます。 http://creativecommons.org/licenses/by/2.1/jp/ ただし、H.Hiro(Maraigue)が制作した以外のファイルはこの限りではありません。 具体的には以下のファイルが該当します。 ・nkf.exe   Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa)   Copyright (C) 1996-2009, The nkf Project   http://sourceforge.jp/projects/nkf/   ライセンスは zlib/libpng License です。   http://opensource.org/licenses/zlib-license.php