トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

プログラム言語「てってってー」

このページの短縮URLは http://chiraura.hhiro.net/tettette/ です。

概要

てってってー」で書くプログラム言語です。

Brainf*ckのパクリですが、若干拡張仕様があります。

サンプル

{「てってってーてってっててー」と出力するプログラム}

ーてってってー {「てってっ」をメモリに書き込む}
てっててーてっててーてっててーてっててー {ポインタを4つ戻す}
てってっーてってっーてってっーてってっー {標準出力へ4文字出力する}
ーててーてっててーてってっー {「て」をメモリに書き込み、ポインタを戻してから標準出力へ出力する}

ーーてってっててー {「ーてってって」をメモリに書き込む}
てっててーてっててーてっててーてっててーてっててーてっててー {ポインタを6つ戻す}
てってっーてってっーてってっーてってっーてってっーてってっー {標準出力へ6文字出力する}
ーててーてっててーてってっー {「て」をメモリに書き込み、ポインタを戻してから標準出力へ出力する}
ーーてーてっててーてってっー {「ー」をメモリに書き込み、ポインタを戻してから標準出力へ出力する}

対応プラットフォーム

以下の環境ならば、OSに関わらず動作させられると思われます。

  • 32bit CPUで、数値表現はリトルエンディアン(すなわちx86など)
  • C++がコンパイル可能(Windowsについては実行ファイルも同梱しているので、コンパイル出来る環境がなくてもお試しいただけます)

※64bit機での検証は出来ていません。ひょっとしたらそのままコンパイル出来るかもしれません。

 動作確認

「動作した/しなかった」「そのままだと動作しなかったが、部分的に変更することで動作した」など、分かったことがありましたらご連絡お願いします。

ダウンロード

Windows用実行ファイル(実行にはVisual C++ 2008のランタイムが必要)、ソースコード、サンプルコードを同梱しています。

まだアルファ版という位置づけです。

なお現在のところ、ソースコードはUTF-16 little endianのみ対応してます(BOMはあってもなくてもよい)。

他の方による実装

作成途中の仕様に従って作成されている模様のため、若干挙動が違うかもしれません。例えば「"てってってー"による記法とBrainf*ck風の記法を混ぜたコード」には対応してないかもしれません。

 JavaScript版(小飼弾氏)

404 Blog Not Found:javascript - てってってー言語を移植してみた

 C#版(zecl氏)

さっそくC#でプログラム言語「てってってー」のインタプリタを書いたよ - Bug Catharsis

 Windows Mobile版(LIUNQA氏)

この言語の元ネタである、Brainf*ckも利用可能。

LIUNQA Site (Program - BF*K)

仕様

  • B:サイズが無限にある(注:実際の上限はメモリに依存)、Unicode文字(1文字16ビット)を格納する配列。添字は0起点とし、初期値はすべて0である。
  • P:ポインタ変数。初期値は0である。
  • S:ソースコード上の位置を格納するスタック。

ただし、B[P]でBP番目の値(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進める
(なし) , 標準入力から読んだ文字をバッファに書き込む
てってっててー [ ループの開始
てってってっー ] ループの終了

お問い合わせ

main(あっとまーく)hhiro.net