INSTEP Interpreter

この記事で紹介したBrainfuck系言語「INSTEP (INterpreter for Supplementary Tokens and Encodable Printing)」のインタプリタです。普通のBrainfuckインタプリタ(入力ストリームなし)としても使えます。
INSTEPの名前自体にInterpreterが入ってるのにINSTEPのインタプリタって言うのはおかしいと思っても気にしない。
説明・詳しい挙動などはにあります。

実行する

ソースコード

vの代わりに$を使う
!でデバッグ
データ領域のバイト数

・出力

・実行の情報

・デバッグログ


仕様説明

・命令

命令動作
>データポインタを右に移動
<データポインタを左に移動
+ポインタの指す値をインクリメント
-ポインタの指す値をデクリメント
^ポインタの指す値を左に1ビットシフト
vポインタの指す値を右に1ビットシフト
[ポインタの指す値が0なら対応する]の直後へジャンプ
]対応する[へジャンプ

上記以外の文字は基本的にすべて無視されます。

・実装依存の挙動について

・メモリーに格納できる値は0~255
・加算・減算命令によるオーバーフロー/アンダーフローは値が循環する

(例:255 + 1 = 0, 0 - 1 = 255 )

・シフト演算によってあふれたビットは消滅、空きビットは0で初期化する

(例:10000001 << 1 = 00000010, 00001111 >> 1 = 00000111 )

・データ領域の長さは指定可能(デフォルトは30000、上限は100000)
・データポインタがデータ領域からはみ出たらエラー。負番地も不可
・タイムアウトは10秒

・エラーコード

PointerOverFlowError

ポインタがデータ領域の右端からはみ出たとき。
(例: PointerOverFlowError: Pointer Overflow at 7 (~ +++[- > +]>>> ~) )

PointerUnderFlowError

ポインタがデータ領域の左端からはみ出たとき。
(例: PointerUnderFlowError: Pointer Underflow at 14 (~ --<[< < ]>>>+ ~) )

InvalidTokenError

括弧の対応が取れていないとき。
(例: InvalidTokenError: Invalid Token '[' at 364 (~ -]>>v [ [>]+^ ~) )

・オプション

vの代わりに$を使う

コード中に英語でコメントを入れる場合、無意識にvを使ってしまい誤動作を引き起こすことがあるから

!でデバッグ

その時点でのポインタの位置とポインタの指す値を出力する

テストコード

・Hello World

+^^^^[>>+++++>++++++>+++++++>++<<<<<-]>>--------.>+++++.>----..+++.>.<<<<+^^^^[>+<-]>-.>>.+++.------.<-.

・あ

+^+^+^^^^+^+.>+^^^^^^^+.+.

・Brainfuckはクソ

+^^^^^+^.>>+^+^+^^^+^.<+^^^^+[>-<-]>.++++++++.+++++.--------.<+^^^^-[>+<-]>.<+^^^+^[>-<-]>.++++++++.>+^+^+^^^^+^+.<<+^+^^^--[>+<-]>.>>>+^^+^^+^+^+^+.<<.<+.>>>.<<.<.>>+^^^^--[>+<-]>.

・FizzBuzz

>>+^^^^^[>++>++++>++++>+++>++<<<<<-]++++>++>----------->------>+++++++++>++++++>++>>>+^^^^^>+^+^^^+^^>>+^^^^-<<[->>>>>>>+>+[<[>-<-<<[->>+>+<<<]>>[-<<+>>]+>[<->[-]]<[-<<+^+^^^^>+^^^+>]+<[-<+>>-]>[-<+^^^+<--------->>>>>>+<<<]>>>>+<<<<<]>[<<<[>>>->>>>+<<<<]>>>[->>>]<<<]>>>>]<<<<<<<<<<<[<<<<]<<<<+<[->-]>[-<++<.<.<..>>>>>>>>>[-]<<<<]<<<[<<<]+>[-<-]<[->++++>.>.>..>>>>>>>>>[-]<<<<<<<<<<<<<<]>>>[>>>>]+<[>->>[>>>>]<<<<[.<<<<]>>]>[-<+>>]<<<<<.>]

・Quine

>+^^+^+^+^^+>+^+^+^+^^>+^^+^+^+^>+^^+^+^^+^+>+^+^+^+^^>+^^+^+^+^^+>+^^+^^+^+>+^+^+^+^^>+^^+^+^+^>+^^+^+^^+>+^^+^+^^+^+>+^^+^^+^+>+^+^+^+^^>+^^+^+^+^^+>+^+^+^+^+^>+^^+^+^^+^+>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^^+^+^+^^+>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^^+^+^+^^+>+^+^+^+^^>+^^+^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^^+>+^+^+^+^+^>+^^+^+^^+^+>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^^+^+^+^^+>+^^+^+^^+>+^+^+^+^^>+^^+^+^+^^+>+^^+^+^^+>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^^+^^+^+>+^+^+^+^+^>+^^+^^+^+>+^+^+^+^+^>+^^+^^+^+>+^+^+^+^+^>+^^+^+^^+^+>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^^+^+^+^^+>+^^+^+^+^^+>+^^+^+^^+>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^^+^^+^+>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^^+^+^^+^+>+^+^+^+^+^>+^^+^+^+^^+>+^+^+^+^^>+^^+^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^^+>+^+^+^+^+^>+^^+^+^^+^+>+^^+^+^^+^+>+^+^+^^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^^+^+^+^^+>+^^+^+^^+>+^+^+^+^^>+^^+^+^+^^+>+^+^+^+^^>+^^+^+^^+^+>+^^+^^+^+>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^+^>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^^+>+^+^+^+^+^>+^^+^+^^+^+>+^+^+^+^+^>+^+^+^+^+^>+^^+^+^^+^+>+^+^+^+^^>+^^+^+^+^^+>+^+^+^+^+^>+^^+^+^^+>+^+^+^+^^>+^^+^+^^+>+^^+^+^^+^+>+^^+^+^+^+^>+^+^+^^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^^+^+^^+^+>+^^+^+^+^+^>+^^+^+^+^+^>+^^+^+^+^+^>+^^+^^+^+>+^^+^+^+^^+>+^^+^+^^+>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^^+^^+^+>+^+^+^+^+^>+^^+^^+^+>+^+^+^+^+^>+^^+^^+^+>+^+^+^+^+^>+^^+^^+^+>+^+^+^+^+^>+^+^+^+^+^>+^^+^+^^+^+>+^^+^+^^+^+>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^+^+^+^^>+^^+^+^^+>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>+^+^+^+^+^>>>>>>-<<<<<<[[>>+>+>+>+<<<<<-]+^^^[>>>v^[-<->]<[>>[>]+^^+^^+^+[<]<-]>>v[[>]+^^+^+^+^+^[<]>[<<<+>>>-]]<<<[>+>+>+<<<-]<-]>>>>>[>]+^+^+^+^+^[<]<<<<<]>>>>>>[>]<+[-.<+]<[.<]