Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def tokenize(code)
- tokens = []
- code = code.dup
- while !code.empty?
- if ['(', ')'].include? code[0,1]
- tokens << code[0,1]
- code = code[1...code.size]
- elsif code[0,1] == ' '
- code = code[1...code.size]
- else
- m = /[a-zA-Z0-9+-=*\/?#]+/.match(code)
- tokens << m[0]
- code = code[m[0].size...code.size]
- end
- end
- tokens
- end
- def parse(tokens)
- input = tokens.dup
- stack = []
- current = stack
- previous = []
- while !input.empty?
- if input.first == '('
- previous << current
- current << []
- current = current.last
- input = input[1...input.size]
- elsif input.first == ')'
- current = previous.pop
- input = input[1...input.size]
- else
- current << input.first
- input = input[1...input.size]
- end
- end
- stack.first
- end
- p parse(tokenize("(def (f x) (h 23 ((g x) 24)))"))
- p parse(tokenize("(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))"))
Add Comment
Please, Sign In to add comment