Advertisement
Guest User

Untitled

a guest
Feb 20th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.39 KB | None | 0 0
  1. require 'ripper'
  2. require 'pp'
  3.  
  4. module Kernel
  5. def rpp(ast)
  6. pp ast
  7. parse_r(ast)
  8. end
  9.  
  10. def parse_r(ast, depth = 0, space: ' ')
  11. if ast.first.instance_of?(Array)
  12. parse_r(ast.first, depth, space: space)
  13. return
  14. end
  15. id = ast.first
  16.  
  17. if %i(@int @float @rational @imaginary).include?(id)
  18. puts ast[1..-2]
  19. return
  20. else
  21. puts "#{id.inspect}"
  22. end
  23.  
  24. child_count = ast[1..-1].count {|e| e.instance_of?(Array) }
  25.  
  26. if child_count.zero?
  27. print "#{space}#{ast[1..-1].map(&:inspect).join(', ')}"
  28. else
  29. ast[1..-1].each do |elem|
  30. if ast[-1] == elem
  31. print "#{space}└─── "
  32. else
  33. print "#{space}├─── "
  34. end
  35.  
  36. if elem.instance_of?(Array)
  37. if ast[-1] == elem
  38. parse_r(elem, depth+1, space: space + ' ' * 10)
  39. else
  40. parse_r(elem, depth+1, space: space + '│' + ' ' * 8)
  41. end
  42. else
  43. puts "#{elem.inspect}"
  44. end
  45. end
  46. end
  47. end
  48. end
  49.  
  50. rpp Ripper.sexp("3 + 4 + 313")
  51.  
  52. __END__
  53. [:program,
  54. [[:binary,
  55. [:binary, [:@int, "3", [1, 0]], :+, [:@int, "4", [1, 4]]],
  56. :+,
  57. [:@int, "313", [1, 8]]]]]
  58. :program
  59. └─── :binary
  60. ├─── :binary
  61. │ ├─── 3
  62. │ ├─── :+
  63. │ └─── 4
  64. ├─── :+
  65. └─── 313
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement