s="if for each map class def module times lambda do".split.inject "" do |a , m|
# a + "\\s?.*#{m}{\\s?.*|\(}" + "|"
# a + "[\\s?.*|^\\s.?]#{m}[\\s?.*|\(|\"|\'|\`|\~|\?|\{]" + "|"
a + "\\s?.*#{m}[\\s?.*|\(|\"|\'|\`|\~|\?|\{]" + "|"
# a + m + "|"
end
do_yoyakugo = /#{s.chop}/
#do_yoyakugo = /if|for|each|class|def|times/
#exit
sp = []
kp = []
out = ""
src = DATA.read + "\n__END__"
#ダブルクオーテーション関係
sstk = Hash.new
instance_exec src.clone do | srct |
srct.scan(/\"(.*)\"/).each_with_index do | ( s ) , i |
i = i.to_s
src.sub!( sstk.store( 255.chr + i , s ) , 255.chr + i )
end
end
# p sstk
src.each_line do | s |
s.chomp!
# 半角スペース数える
s.each_byte.each_with_index do | c , i |
if c.chr != "\s"
sp.push i
# 予約語見つけたら半角スペースの数をメモ
if s =~ do_yoyakugo
kp.push i
end
break
end # if
end # injct
endf = nil
# end を装飾する
if ( sp[-2] and sp[-1] ) and ( sp[-2] > sp[-1] )
loop do
m = kp.pop
if (endf and m == endf) || (m.nil? || sp.last > m)
kp.push m
# print:bre
# p s
endf = nil
break
end
endf = m
tmp = "end".rjust(3+m," ")
out << tmp+"\n"
end
end
#既にendが書かれていたらそのendをスルーする
if s =~ /\s?.*?(.*end)\s?.*/
# todo
# endf = $1.size-3
else
out << s+"\n"
end
end # each
#p sp
#p kp
sstk.each do | k , v |
out.sub!( k , v )
end
puts out
eval out
__END__
class A
def func
for i in 1..3
for n in 1..3
printf "%02d " % ( i * n )
puts
A.new.func
[4,5,6].map do |x|
puts x
3.times do |n|
print "_"
puts
print "if for each map class def module times lambda do"