Created
August 18, 2014 11:37
-
-
Save kb10uy/9663613e62757f26ee70 to your computer and use it in GitHub Desktop.
Brainf*ckの派生言語「ごちうさ」 Ruby実装
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding: utf-8 | |
#+-----------------------------------------------------------------------------+ | |
#| Brainfuckをごちうさチックにしたやつ | | |
#| Gochiusa v1.0 | | |
#| MIT License | | |
#| | | |
#| ソースコードファイルの拡張子はitoarかgudを適当に推奨 | | |
#| (Is The Order A Rabbit と [ご]注文は[う]さぎ[で]すか?から採用) | | |
#| デフォルトでは出力・入力ともにUTF-8なので必要なら適当に変えて | | |
#| 所定の文字列以外では空白と改行が許されます | | |
#| | | |
#| 対応表 | | |
#| + ぴょん - らん | | |
#| > 心 < 胸が | | |
#| [ 詰んだ詰んだ ] ぽっぴんジャンプ♪ | | |
#| . 言いなさい , セロリタベテル! | | |
#+-----------------------------------------------------------------------------+ | |
require "strscan" | |
class Gochiusa | |
def initialize() | |
@s_inc="ぴょん" | |
@s_dec="らん" | |
@s_nxt="心" | |
@s_prv="胸が" | |
@s_jlb="詰んだ詰んだ" | |
@s_jmp="ぽっぴんジャンプ♪" | |
@s_put="言いなさい" | |
@s_get="セロリタベテル!" | |
@code=[] | |
@code_jump=[] | |
end | |
def execute(src) | |
@code=[] | |
stack=[] | |
pc=0 | |
s=StringScanner.new(src) | |
until s.eos? | |
case | |
when s.scan(/#{@s_inc}/) | |
@code << :increment | |
pc+=1 | |
when s.scan(/#{@s_dec}/) | |
@code << :decrement | |
pc+=1 | |
when s.scan(/#{@s_nxt}/) | |
@code << :next | |
pc+=1 | |
when s.scan(/#{@s_prv}/) | |
@code << :previous | |
pc+=1 | |
when s.scan(/#{@s_jlb}/) | |
stack.push pc | |
@code << :jump_label | |
pc+=1 | |
when s.scan(/#{@s_jmp}/) | |
left=stack.pop | |
@code_jump[pc]=left | |
@code_jump[left]=pc | |
#p left.to_s + "and"+pc.to_s | |
@code << :jump | |
pc+=1 | |
when s.scan(/#{@s_put}/) | |
@code << :puts | |
pc+=1 | |
when s.scan(/#{@s_get}/) | |
@code << :getc | |
pc+=1 | |
when s.scan(/\s/) | |
else | |
puts "許可されていない文字列があります" | |
exit | |
end | |
end | |
#@code.each{|i|p i} | |
run | |
end | |
def run | |
cp=0 | |
mem=[] | |
ptr=0 | |
until @code[cp].nil? | |
mem[ptr] ||= 0 | |
case @code[cp] | |
when :increment | |
mem[ptr]+=1 | |
when :decrement | |
mem[ptr]-=1 | |
when :next | |
ptr+=1 | |
when :previous | |
ptr-=1 | |
when :jump_label | |
if mem[ptr]==0 then | |
cp=@code_jump[cp] | |
end | |
when :jump | |
if mem[ptr]!=0 then | |
cp=@code_jump[cp] | |
end | |
when :puts | |
print mem[ptr].chr Encoding::UTF_8 | |
when :getc | |
mem[ptr]=$stdin.getc.ord | |
end | |
cp+=1 | |
end | |
end | |
end | |
gc=Gochiusa.new() | |
gc.execute File.read(ARGV[0],:encoding=>Encoding::UTF_8) | |
#参考までに | |
# | |
#ぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん | |
#詰んだ詰んだ | |
#心ぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん | |
#心ぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん | |
#心ぴょんぴょんぴょんぴょんぴょん | |
#胸が胸が胸がらん | |
#ぽっぴんジャンプ♪ | |
#心言いなさい | |
#心ぴょんぴょん | |
#言いなさい | |
#ぴょんぴょんぴょんぴょんぴょんぴょんぴょん | |
#言いなさい言いなさい | |
#ぴょんぴょんぴょん | |
#言いなさい | |
#心 | |
#らん | |
#言いなさい | |
#らんらんらんらんらんらんらんらんらんらんらんらん | |
#言いなさい | |
#胸がぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん | |
#言いなさい | |
#らんらんらんらんらんらんらんらん | |
#言いなさいぴょんぴょんぴょん | |
#言いなさいらんらんらんらんらんらん | |
#言いなさいらんらんらんらんらんらんらんらん | |
#言いなさい心ぴょん | |
#言いなさい |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment