Guest User

Untitled

a guest
May 20th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.96 KB | None | 0 0
  1. def tokenize(code)
  2. tokens = []
  3. code = code.dup
  4.  
  5. while !code.empty?
  6. if ['(', ')'].include? code[0,1]
  7. tokens << code[0,1]
  8. code = code[1...code.size]
  9. elsif code[0,1] == ' '
  10. code = code[1...code.size]
  11. else
  12. m = /[a-zA-Z0-9+-=*\/?#]+/.match(code)
  13. tokens << m[0]
  14. code = code[m[0].size...code.size]
  15. end
  16. end
  17. tokens
  18. end
  19.  
  20. def parse(tokens)
  21. input = tokens.dup
  22. stack = []
  23. current = stack
  24. previous = []
  25.  
  26. while !input.empty?
  27. if input.first == '('
  28. previous << current
  29. current << []
  30. current = current.last
  31. input = input[1...input.size]
  32. elsif input.first == ')'
  33. current = previous.pop
  34. input = input[1...input.size]
  35. else
  36. current << input.first
  37. input = input[1...input.size]
  38. end
  39. end
  40. stack.first
  41. end
  42.  
  43. p parse(tokenize("(def (f x) (h 23 ((g x) 24)))"))
  44. p parse(tokenize("(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))"))
Add Comment
Please, Sign In to add comment