create piet image from stack-based pseudo-language. 美しくはない。
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
output
piet
tests
.eslintrc.js
.gitignore
.tachikoma.yml
.travis.yml
Makefile
README.md
app.js
config.js
package.json
test.sh

README.md

Piet automata

自動piet生成。

Gallery

  • Hello, World! Hello, World!

  • puts 72 puts 72

  • even-or-odd(標準入力から一つ読み取り、それが奇数なら1を出し、そうでないならば0を出す) even-or-odd

中間言語

スタック志向っぽい言語。 一つだけ整数のスタックを持っている。

命令一覧

PUSH n

スタックにnを積む。

PUSH 1 以外を使うと、適当にコード生成しているので、効率が悪い可能性があります。 でもとりあえず動くはずです。

PUSH 'a'
という記法で、対応するasciiコードをpushできるようになりました。 この場合は97がpushされます。

PUSH 0 もできます。

POP

スタックの先頭を捨てる。

ADD

スタックから2つ取り和を積む。

SUB

スタックから2つ取り、2つ目から1つ目を引いた値を積む。

MUL

スタックから2つ取り積を積む。

DIV

スタックから2つ取り、2つ目を1つ目で割った商を積む。

MOD

スタックから2つ取り、2つ目を1つ目で割った余りを積む。

NOT

スタックから1つ取り、それが0ならば1を積み、そうでないならば0を積む。

GREATER

スタックから2つ取り、2つ目のほうが1つ目より大きければ1、そうでないならば0を積む。

DUP

スタックから1つ取り、それを2つ積む。

ROLL

Pietのロールそのまま。 スタックから2つ取り、2つ目分の深さまでのスタックの値を1つ目分だけ回転する。

回転とは、トップの値を指定の深さに落とし、それ以外を一つづつ上げる操作。

1 2 3 4 3 2 -> top の状態からロールを行うと、 結果は 1 3 4 2 -> top となる。

http://www.slideshare.net/KMC_JP/piet-46068527 ここの39-40を見て下さい。

INN

標準入力から数字を一つ読み取り、その値をスタックに積む。

INC

標準入力から一文字読み取り、その文字のUnicode値をスタックに積む。

インクリメントではない。

OUTN

スタックから1つ取り、それを数字として出力する。

OUTC

スタックから1つ取り、そのUnicode値を持つ文字を出力する。

HALT

プログラムを停止させる。

LABEL word

その位置にあとで飛んでこれるラベルをつける。

JEZ word

スタックのから1つ取り、その値がゼロなら、対応するwordを持つLABELにジャンプする。

Jump Equal Zero

JMP word

対応するwordに無条件ジャンプする。

SWAP

スタックの上2つを入れ替えます。

PUSH 2
PUSH 1
ROLL

と同じです。

ブロックサイズの変更

config.jsのsize変数を書き換えてみると、うまくいくとより小さい画像が生成される可能性があります。 書き換えて試してみてください。

Tests/Lisp-like-calc.pas

https://gist.github.com/1995hnagamin/408da3708bf279e2095d