{{tag }}このページの短縮URLは http://chiraura.hhiro.net/tettette/ です。{{tag }} {{outline}} !!!概要 「[てってってー|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]のパクリですが、若干拡張仕様があります。 !!!サンプル {「てってってーてってっててー」と出力するプログラム} ーてってってー {「てってっ」をメモリに書き込む} てっててーてっててーてっててーてっててー {ポインタを4つ戻す} てってっーてってっーてってっーてってっー {標準出力へ4文字出力する} ーててーてっててーてってっー {「て」をメモリに書き込み、ポインタを戻してから標準出力へ出力する} ーーてってっててー {「ーてってって」をメモリに書き込む} てっててーてっててーてっててーてっててーてっててーてっててー {ポインタを6つ戻す} てってっーてってっーてってっーてってっーてってっーてってっー {標準出力へ6文字出力する} ーててーてっててーてってっー {「て」をメモリに書き込み、ポインタを戻してから標準出力へ出力する} ーーてーてっててーてってっー {「ー」をメモリに書き込み、ポインタを戻してから標準出力へ出力する} !!!対応プラットフォーム 以下の環境ならば、OSに関わらず動作させられると思われます。 *32bit CPUで、数値表現はリトルエンディアン(すなわちx86など) *C++がコンパイル可能(Windowsについては実行ファイルも同梱しているので、コンパイル出来る環境がなくてもお試しいただけます) ※64bit機での検証は出来ていません。ひょっとしたらそのままコンパイル出来るかもしれません。 !!動作確認 「動作した/しなかった」「そのままだと動作しなかったが、部分的に変更することで動作した」など、分かったことがありましたらご連絡お願いします。 !!!ダウンロード Windows用実行ファイル(実行には[Visual C++ 2008のランタイム|http://www.microsoft.com/downloads/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=ja]が必要)、ソースコード、サンプルコードを同梱しています。 まだアルファ版という位置づけです。 *[tettette-0.1.0.zip|http://chiraura.hhiro.net/tettette/tettette-0.1.0.zip] (2009.4.10) [Readme|http://chiraura.hhiro.net/tettette/Readme-0.1.0.txt] [Help|http://chiraura.hhiro.net/tettette/Help-0.1.0.txt] なお現在のところ、ソースコードは'''UTF-16 little endian'''のみ対応してます(BOMはあってもなくてもよい)。 !!!他の方による実装 作成途中の仕様に従って作成されている模様のため、若干挙動が違うかもしれません。例えば「"てってってー"による記法とBrainf*ck風の記法を混ぜたコード」には対応してないかもしれません。 !!JavaScript版(小飼弾氏) [404 Blog Not Found:javascript - てってってー言語を移植してみた|http://blog.livedoor.jp/dankogai/archives/51170745.html] !!C#版(zecl氏) [さっそくC#でプログラム言語「てってってー」のインタプリタを書いたよ - Bug Catharsis|http://d.hatena.ne.jp/zecl/20090129/p1] !!Windows Mobile版(LIUNQA氏) この言語の元ネタである、Brainf*ckも利用可能。 [LIUNQA Site (Program - BF*K)|http://homepage2.nifty.com/~liunqa/bfakprog.html] !!!仕様 *''B'':サイズが無限にある(注:実際の上限はメモリに依存)、Unicode文字(1文字16ビット)を格納する配列。添字は0起点とし、初期値はすべて0である。 *''P'':ポインタ変数。初期値は0である。 *''S'':ソースコード上の位置を格納するスタック。 ただし、''B''[''P'']で''B''の''P''番目の値(0〜65535)を示す。 ソースコードを先頭から読み込み、以下のいずれかの文字列に合致したら、それに応じた処理を行います。 ::「ー」に一致(注:長音記号) :::ソースコード中に次に「てー」が現れるまでの文字列をすべて、''B''[''P'']を起点にして書き込む。''P''の値は、最後の文字を書き込んだ1つ後ろへ移動する。(例:''P''が10のときに6文字書き込んだ場合、''P''は16に変わる。) ::「ててー」に一致 :::''B''[''P'']の値を1増やす。65535の次は0である。(Brainf*ckの「+」) ::「てっー」に一致 :::''B''[''P'']の値を1減らす。0の前は65535である。(Brainf*ckの「-」) ::「てってー」に一致 :::''P''の値を1増やす。(Brainf*ckの「>」) ::「てっててー」に一致 :::''P''の値を1減らす。''P''が0のときに用いるとエラーとなる。(Brainf*ckの「<」) ::「てってっー」に一致 :::''B''[''P'']の値を標準出力に出力したのち、''P''の値を1増やす。(Brainf*ckの「.」+「>」) ::「てってってー」に一致 :::標準入力から1文字読み込み、''B''[''P'']に書き込んだのち、''P''の値を1増やす。(Brainf*ckの「,」+「>」) ::「てってっててー」に一致 :::''B''[''P'']の値が0なら、次に「てってってっー」が現れるまでソースコードを読み飛ばし、その次の文字からソースコードの解析を再開する。そうでなければ、この「てってっててー」のソースコード上での位置(最初の「て」の位置)を''S''の先頭に追加する。これはループ処理を行うのに用いる。(Brainf*ckの「[」) ::「てってってっー」に一致 :::''S''の先頭にある、ソースコード上の文字の位置を示す値を除去し、その除去した値の位置からソースコードの解析を再開する。''S''が空の場合はエラーとなる。(Brainf*ckの「]」) !!ソースコード中で特別扱いされる文字など ::スペース(全角・半角)・タブ・改行・BOM :::「ー」〜「てー」の間を除き、一切無視される。「ー」〜「てー」の間ではそのままリテラルの文字として扱われる。 ::「\xAB」「\uABCD」「\dABCDE」 :::「ー」〜「てー」の間でのみ利用できる。エスケープシーケンスとして、それ全体で1文字と扱われる。 *「\xAB」は、2桁の十六進数の整数(0〜255)を示す。 *「\uABCD」は、4桁の十六進数の整数(0〜65535)を示す。 *「\dABCDE」は、5桁の十六進数の整数(0〜65535)を示す。範囲外の値(例:\d70000)を指定した場合はエラーとなる。 *いずれも、桁数を減らすことは出来ません(例えば、「hoge\d1234piyo」は「hoge\d01234piyo」とは等価とならず、文法エラーとなります。) ::「{」〜「}」(半角のみ) :::コメントと扱われる。 !!ASCIIで書くときの対応表 (2009.4.7追記) てってってー言語で特殊な意味を持つ文字列は、ASCIIでも表記できるようにしてあります。ほとんどBrainf*ckに合わせてます。 ,基本の表記法,ASCII文字での表記法,意味 ,ー,`,文字列リテラルの始点 ,てー,'",文字列リテラルの終点 ,ててー,+,バッファの値を1増やす ,てっー,-,バッファの値を1減らす ,てってー,>,ポインタを1進める ,てっててー,<,ポインタを1戻す ,てってっー,),バッファの値を標準出力に出力したのち、ポインタを1進める ,(なし),.,バッファの値を標準出力に出力する ,てってってー,(,標準入力から読んだ文字をバッファに書き込んだのち、ポインタを1進める ,(なし),{{tag ","}},標準入力から読んだ文字をバッファに書き込む ,てってっててー,[,ループの開始 ,てってってっー,],ループの終了 !!!お問い合わせ main(あっとまーく)hhiro.net ---- {{footnote_list}}