def parse(line)
s = line.scan(/\(|\)|"(?:\\.|[^"])*"|[^()" \n]+/)
f = ->(t=nil){
case x = t || s.shift
when ?(
y = []
while x = s.shift
return y if x==?)
y << f[x]
end
fail ")?"
when nil
nil
when /^#(.*)$/
{?t=>true,?f=>false}[$~[1]]
when /\d+/
x.to_i
when /^\"(.*)\"$/m
$~[1].gsub(/\\./,'\n'=>"\n","\\\\"=>"\\","\\\""=>'"')
else
x.to_sym
end
}
f[]
end
$tests = {
"" => nil,
"1" => 1,
"(a b)" => [:a,:b],
"(1 2(2 3))" => [1,2,[2,3]],
'(a"b"c"d"(ef))' => [:a,"b",:c,"d",[:ef]],
'("a b" (c d-e))' => ["a b",[:c,:"d-e"]],
"(\"a\nb\"\nb\nc (d))" => ["a\nb",:b,:c,[:d]],
' "a\nb"' => "a\nb",
'"a\\"b"'=>'a"b',
"\"\\\\\""=> "\\",
"(#t #f)" => [true,false],
"(define (f x) (if (zero? x) 0 (+ x (f (- x 1)))))" =>
[:define,[:f,:x],[:if,[:zero?,:x],0,[:+,:x,[:f,[:-,:x,1]]]]],
}
p $tests.all?{|x,y|parse(x)==y} 热门文章更多>>
标签更多>>
专题更多>>
最新文章更多>>
- 华为m3和ipad air2哪个好?华为平板m3和ipad air2详细区别对比评测
- 华为平板M3怎么调节色温保护眼睛?
- 8.4英寸华为平板M3真机图赏:主打影音视频和游戏
- 华为平板M3怎么使用自带的云服务导入旧手机资料数据?
- 怎么将之前手机中的就资料导入华为平板M3?
- 华硕ZenPad 3S 10值得买吗?华硕ZenPad 3S 10平板全面评测
- 小米平板2的16G内存够用吗? 16GB版小米平板2可以刷Win10系统吗?
- 华为平板M3值得买吗 华为平板M3全面评测图解
- 华为平板M3和小米平板2哪个好?小米平板2和华为平板M3详细区别对比评测
- 华为平板M3有几个版本?华为平板M3 WiFi版与LTE版各版本区别对比评测
我本善良8584314