用 Ruby 进行简单的 lisp 表达式的解析

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

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,[: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,[:-,1]]]]],}

p $tests.all?{|x,y|parse(x)==y}

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...