diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sexp/parse.rb | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/lib/sexp/parse.rb b/lib/sexp/parse.rb index 58692fb..51a86e3 100644 --- a/lib/sexp/parse.rb +++ b/lib/sexp/parse.rb @@ -47,6 +47,26 @@ class SExp "(#{car} . #{cdr})" end end + + def to_a + res = [] + at = self + + until at.nil? + res << at.car + at = at.cdr + end + + res + end + + def self.from_a(list) + if list.empty? + SExp.new + else + SExp.new(list[0], SExp.from_a(list[1..-1])) + end + end end def peek_token(tokens) @@ -78,14 +98,6 @@ def num_members(tokens) members end -def members_to_tree(members) - if members.empty? - SExp.new - else - SExp.new(members[0], members_to_tree(members[1..-1])) - end -end - def parse_sexp(tokens) need = num_members(tokens) get_token(tokens) @@ -103,7 +115,7 @@ def parse_sexp(tokens) get_token(tokens) - members_to_tree(members) + SExp.from_a(members) end def parse_sexps(tokens) |