亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
用 Ruby 進行簡單的 lisp 表達式的解析
[打印本頁]
作者:
Lexus
時間:
2015-06-30 10:12
標題:
用 Ruby 進行簡單的 lisp 表達式的解析
就是lisp用的s表達式,可以向json一樣用來讀取保存的數(shù)據(jù),也可以用來做DSL什么的。
代碼的各種情況還考慮得不是很完全,等用到一種測試用例再來補充對應的實現(xiàn)吧。
這個實現(xiàn)對S表達式的格式以及這個解析函數(shù)在各方面都暫且以簡單能用首要目的來著。
[Ruby]代碼
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}
復制代碼
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2