lib/edn/parser.rb in edn-1.0.6 vs lib/edn/parser.rb in edn-1.0.7

- old
+ new

@@ -84,14 +84,14 @@ def initialize(source, *extra) io = source.instance_of?(String) ? StringIO.new(source) : source @s = CharStream.new(io) end - def read + def read(return_nothing=false) meta = read_meta - value = read_basic - if meta + value = read_basic(return_nothing) + if meta && value != NOTHING value.extend EDN::Metadata value.metadata = meta end value end @@ -226,18 +226,19 @@ else self.instance_exec(&reader) end end - def read_basic + def read_basic(return_nothing=false) @s.skip_ws ch = @s.current result = call_reader(READERS[ch]) - while NOTHING.equal?(result) + while NOTHING.equal?(result) && !return_nothing @s.skip_ws result = call_reader(READERS[@s.current]) end + result end def read_digits(min_digits=0) result = '' @@ -258,23 +259,31 @@ result end def finish_float(whole_part) result = whole_part - result += @s.skip_past('.', 'Expected .') - result += read_digits(1) + + if @s.current == '.' + result += '.' + @s.advance + result = @s.digit? ? result + read_digits : result + '0' + #puts "aaa: #{result}" + end + if @s.current == 'e' || @s.current == 'E' @s.advance result = result + 'e' + read_digits + #puts "bbb: #{result}" end + #puts result result.to_f end def read_number(leading='') result = leading + read_digits - if @s.current == '.' + if %w{. e E}.include? @s.current return finish_float(result) elsif @s.skip_past('M') || @s.skip_past('N') result.to_i else result.to_i @@ -318,17 +327,15 @@ end def read_collection(clazz, closing) result = clazz.new - @s.skip_ws - - ch = @s.current - while ch != closing - raise "Unexpected eof" if ch == :eof - result << read + while true @s.skip_ws - ch = @s.current + raise "Unexpected eof" if @s.eof? + break if @s.current == closing + next_value = read(true) + result << next_value unless next_value == NOTHING end @s.advance result end end