Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'ripper'
- require 'pp'
- module Kernel
- def rpp(ast)
- pp ast
- parse_r(ast)
- end
- def parse_r(ast, depth = 0, space: ' ')
- if ast.first.instance_of?(Array)
- parse_r(ast.first, depth, space: space)
- return
- end
- id = ast.first
- if %i(@int @float @rational @imaginary).include?(id)
- puts ast[1..-2]
- return
- else
- puts "#{id.inspect}"
- end
- child_count = ast[1..-1].count {|e| e.instance_of?(Array) }
- if child_count.zero?
- print "#{space}#{ast[1..-1].map(&:inspect).join(', ')}"
- else
- ast[1..-1].each do |elem|
- if ast[-1] == elem
- print "#{space}└─── "
- else
- print "#{space}├─── "
- end
- if elem.instance_of?(Array)
- if ast[-1] == elem
- parse_r(elem, depth+1, space: space + ' ' * 10)
- else
- parse_r(elem, depth+1, space: space + '│' + ' ' * 8)
- end
- else
- puts "#{elem.inspect}"
- end
- end
- end
- end
- end
- rpp Ripper.sexp("3 + 4 + 313")
- __END__
- [:program,
- [[:binary,
- [:binary, [:@int, "3", [1, 0]], :+, [:@int, "4", [1, 4]]],
- :+,
- [:@int, "313", [1, 8]]]]]
- :program
- └─── :binary
- ├─── :binary
- │ ├─── 3
- │ ├─── :+
- │ └─── 4
- ├─── :+
- └─── 313
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement