etsavの日記: 『Turing Machine と等価っぽい何か』の使い方
日記 by
etsav
折角作った んで書いておこう。 リンク先エントリのスクリプトを tmtn.rb に保存したとして、
ruby tmtn.rb programfile
で programfile を読ませて実行(tmtn.rb に実行パーミッションつけてもいーけど)。 それでその programfile の記述法。 基本的には行単位で記述。 いーかげんにパーサ書いたんで厳密じゃないけど大雑把にこんな:
- # 以降行末までは注釈として無視される。
- (注釈を除いた上で)ホワイトスペースのみからなる空行は無視される。
- ホワイトスペース以外の連続した文字からなる一語だけがあれば、 状態名として登録される。
- 次の状態名の登録行が来るか、 ファイルの終わりに到達するまでの間が、 その状態での遷移規則(後述)の記述になる。
- 同じ状態名の多重登録は許されない。
- 遷移規則はホワイトスペースで区切られた四つのフィールドで記述される
- 第一フィールドは『現在位置の文字』
- この遷移規則が属する状態の時、 それ以前の行の遷移規則が適用される前であれば、 現在位置の文字が [] で囲われた中のキャラクタのどれかに一致すれば、 この遷移規則が適用される(つまり適用は前の行が優先。 同じ文字が後の行にあっても無視される)。
- [] の中に何も書かないことも出来る。 これは全ての文字と一致する(switch-case での default: みたいな)。
- 第二フィールドは『書き換え文字』
- この遷移規則が適用される時、 現在の位置の文字は [] で囲われた中の記述に従って書き換えられる。
- [] の中に何も書かれていなければ、元の文字のまま。
- [] の中が一文字であれば、その文字に書き換えられる。
- [] の中が複数の文字の場合、 第一フィールドの [] の中と同じ文字数でなければならない。 現在位置が第一フィールドの n番目の文字だった時、 第二フィールドの n番目の文字に書き換えられる。
- 第一フィールドの [] の中が空の場合、 第二フィールドの [] の中は空であるか(書き換えなし)、 一文字でなければならない。
- 第三フィールドは『移動方向』
- この遷移規則が適用される時、 L であれば現在位置を左に、 R であれば現在位置を右に移動する。
- 第四フィールドは『次の状態』
- この遷移規則が適用される時、 ここに記述された状態に遷移する。
- 最初に登録された状態が初期状態となる。
- 登録されていない状態に遷移したとき、 または現在の状態で現在位置の文字から適用される遷移規則が無いとき、 動作を停止する。
『Turing Machine と等価っぽい何か』の使い方 More ログイン