新しく発言する  EXIT  インデックスへ

Brainf*ckインタプリタをつくる


  Brainf*ckインタプリタをつくる 山中和義 2008/08/26 19:19:08 
  プログラム例(DATA文の差し替え) 山中和義 2008/08/26 19:19:34 
  参考.チューリングマシンのシミュレータ 山中和義 2008/08/27 19:45:29  (修正1回)
Re: Brainf*ckインタプリタをつくる  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/27 19:45:29 ** この記事は1回修正されてます
参考.チューリングマシンのシミュレータ


!1テープ・チューリングマシン(Turing Machine)


!---------- ↓↓↓↓↓ ----------

!動作表(状態遷移表)
! 現在の状態、現在のテープの値
! テープに書き込む値、移動方向、次の状態

100 DATA 1,_, _,R,1 !1進法による数の減算
DATA 1,1, 1,R,1
DATA 1,-, -,R,1
DATA 1,"=", _,L,2
DATA 2,1, "=",L,3
DATA 2,"-", _,L,2 !halt
DATA 3,1, 1,L,3
DATA 3,"-", "-",L,4
DATA 4,_, _,L,4
DATA 4,1, _,R,1

!初期値
LET q=1 !状態q0
LET tp$="11111-11=" !テープの値 ※5-2の計算
LET p=1 !ヘッダ位置
!---------- ↑↑↑↑↑ ----------


!トレース
CALL DispStatus !初期状態

LET Running=1 !実行フラグ
DO WHILE Running=1
LET Running=0

LET n=1 !行番号
RESTORE 100
DO !一致するプログラム(動作表)を実行する
READ IF MISSING THEN EXIT DO: p1,p2$,p3$,p4$,p5

IF p<1 OR p>LEN(tp$) THEN
PRINT "テープから外れます。"; p
STOP
END IF

IF q=p1 AND tp$(p:p)=p2$ THEN
LET Running=1

LET tp$(p:p)=p3$ !テープへの書き込み

SELECT CASE UCASE$(p4$) !ヘッドの移動
CASE "R"
LET p=p+1
CASE "L"
LET p=p-1
CASE ELSE
END SELECT

LET q=p5 !状態遷移

!トレース
PRINT "動作";STR$(n);" →";p1;p2$;" ";p3$;" ";p4$;p5 !実行した動作
CALL DispStatus !遷移した状態
END IF

LET n=n+1
LOOP

LOOP

PRINT "停止!"


SUB DispStatus !現在の状態を表示する
PRINT "テープの値=";tp$
PRINT "ヘッド位置=";p
PRINT "状態=";q
PRINT
END SUB

END
   └サンプル(DATA文差し替え) 山中和義 2008/08/29 22:01:20 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。