[今日のPiet]GridPietGenerator入門編B(命令チートシート2)

どもです。

はてなブログは9/7にメンテをするそうですが、

筆者は昨日メンテを行っていました(何)

1日おいての更新です。

 

今回は予告通り番外編B、命令チートシートその2です。

以前もチートシート書きましたが、その時にgoto命令と

ラベルの解説が抜けていたので、こちらに載せました。

チートシートその1はこちら:

ymos-hobby-programing.hatenablog.com

命令解説

add命令

概要:加算

書き方:add

入力:なし

スタック変化:あり(2→1)

f:id:y-mos:20210827223901p:plainf:id:y-mos:20210827223909p:plain
add

出力:なし

説明:スタック最上部の2つの値をポップして、最上部にあった値と、その下にあった値を足し算し、結果をスタックにプッシュします。

 実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

outc命令

概要:文字出力

書き方:outc

入力:なし

スタック変化:あり(1→0)

f:id:y-mos:20210827224048p:plainf:id:y-mos:20210827224052p:plain
outc

出力:文字C

説明:スタック最上部の値Cをポップし、ポップした値を文字コードに持つ文字Cを出力します。

 実行時にスタックに値がない場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

roll命令

概要:ロール

書き方:roll

入力:なし

スタック変化:あり(n+2→n)

f:id:y-mos:20210822051653p:plainf:id:y-mos:20210822051706p:plain
roll (c>0)

出力:なし

説明:スタック最上部の2つの値をポップします。

 このうち、最上部にあった値をn、最上部から2番目にあった値をcとします。

 n、cがポップされた後のスタックに対し、深さnの「ロール操作」をc回繰り返します。

 

 ここで、1回の「ロール操作」とは、

 最上部の値を、スタックの上からn番目に移動する操作のことです。

ロール回数cが負の時

  c\lt{0}の場合は、ロール操作の向きが逆転します。

 つまり、スタックの上からn番目の値を、最上部に移動する操作を、

 |c|回繰り返すことになります。

f:id:y-mos:20210827225344p:plainf:id:y-mos:20210827225353p:plain    f:id:y-mos:20210827225359p:plainf:id:y-mos:20210827225404p:plain
roll操作(左:c=1のとき、右:c=-1のとき)

深さnが負の時

 n\lt{0}の場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

深さnが、スタックにある値の数より大きい場合

 実行時エラーとなります。(この命令は無視されて次の命令が実行されます。)

深さnが、実装されたスタックの最大長より大きい場合

 実行時エラーとなります。(この命令は無視されて次の命令が実行されます。)

inn命令

概要:数値入力

書き方:inn

入力:数値N

スタック変化:あり(0→1)

f:id:y-mos:20210827224052p:plainf:id:y-mos:20210827224210p:plain
inn

出力:なし

説明:標準入力から数値を1つ読み取り、入力された値をスタックにプッシュします。

 入力が数値として読み込めない場合、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

mod命令

概要:剰余算

書き方:mod

入力:なし

スタック変化:あり(2→1)

f:id:y-mos:20210824001707p:plainf:id:y-mos:20210824002018p:plain
mod

出力:なし

説明:スタック最上部の2つの値をポップして、最上部にあった値、その下にあった値で割って、その余りをスタックにプッシュします。

 実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

 ゼロ割が発生した場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

div命令

概要:除算

書き方:div

入力:なし

スタック変化:あり(2→1)

f:id:y-mos:20210824001707p:plainf:id:y-mos:20210824003536p:plain
div

出力:なし

説明:スタック最上部の2つの値をポップして、最上部にあった値、その下にあった値で割って、その商をスタックにプッシュします。

 実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

 ゼロ割が発生した場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

not命令

概要:否定

書き方:not

入力:なし

スタック変化:あり(1→1)

f:id:y-mos:20210827224411p:plainf:id:y-mos:20210827224339p:plain
not

出力:なし

説明:スタックの最上部の1つの値をポップし、

  • ポップした値が0ならば、1をプッシュします。
  • ポップした値が0でないならば、0をプッシュします。 1

 実行時にスタックに1つも値がない場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

inc命令

概要:文字入力

書き方:inc

入力:文字C

スタック変化:あり(0→1)

f:id:y-mos:20210827224052p:plainf:id:y-mos:20210827224554p:plain
inc

出力:なし

説明:標準入力から文字を1つ読み取り、その文字コードをスタックにプッシュします。

gt命令

概要:数値比較

書き方:gt

入力:なし

スタック変化:あり(1→1)

f:id:y-mos:20210827223901p:plainf:id:y-mos:20210827224635p:plain
gt

出力:なし

説明:スタックの最上部の2つの値をポップし、

  • 最上部にあった値よりも、その下にあった値の方が大きい場合、1をプッシュします。
  • 上記以外の場合は、0をプッシュします。

 実行時にスタックに1つ以下の値しかない場合は、実行時エラーとなります。

 (この命令は無視されて次の命令が実行されます。)

goto命令

概要:無条件ジャンプ

書き方:goto:ラベル

入力:なし

スタック変化:なし

出力:なし

説明:無条件でラベル:ラベルにジャンプします。

goto命令に続くコロン:の前後に、半角スペースなどの区切り文字を入れてはいけません。

ラベル

概要:プログラムのジャンプ先

書き方::ラベル名

入力:なし

スタック変化:なし

出力:なし

説明:プログラム(if命令とgoto命令)のジャンプ先を示す目標としてのみ機能します。

 ラベルを作るときは、コロン:に続けて英数字またはアンダースコア_を並べてください。

 コロン:の後ろの文字列が「ラベル名」です。

 ただし、以下のルールがあります。

  • ルール1:コロン:の後に、半角スペースなどの空白文字を入れてはいけません。
  • ルール2:コロン:の直後の1文字は必ず英字にしてください。
  • ルール3:同じラベルを複数回使ってはいけません。

おわりに

番外編Aと今回の番外編Bで、

処理フローファイルを書くのに必要な情報は全て出てきました。

次回以降どうしようかはちょっと迷っているのですが、

  • Pietそのものの解説(処理フローファイルの命令との関係を解説)
  • 中級編を作る(関数を作ってみるとか、再帰処理にチャレンジするとか)
  • 上級編(「処理フローファイル読めるでしょ?」というスタンスで好き勝手に突っ走る)
  • メンテ(何)

のどれかかなと思っています。

まぁ最後の選択肢はお約束のジョークみたいなもんなので、

なんかしら書きますよ。

 

じゃ、この辺で。

では。


  1. C言語的にかくと、not命令は(a==0)と同じ結果になります。