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