class EDN::Parser
Public Class Methods
new(source, *extra)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 7 def initialize(source, *extra) io = source.instance_of?(String) ? StringIO.new(source) : source @s = CharStream.new(io) end
Public Instance Methods
call_reader(reader)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 146 def call_reader(reader) if reader.instance_of? Symbol self.send(reader) else self.instance_exec(&reader) end end
eof?()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 22 def eof? @s.eof? end
escape_char(ch)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 120 def escape_char(ch) return '\\' if ch == '\\' return "\n" if ch == 'n' return "\t" if ch == 't' return "\r" if ch == 'r' ch end
finish_float(whole_part)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 185 def finish_float(whole_part) result = whole_part 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
read(return_nothing=false)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 12 def read(return_nothing=false) meta = read_meta value = read_basic(return_nothing) if meta && value != NOTHING value.extend EDN::Metadata value.metadata = meta end value end
read_basic(return_nothing=false)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 154 def read_basic(return_nothing=false) @s.skip_ws ch = @s.current result = call_reader(READERS[ch]) while NOTHING.equal?(result) && !return_nothing @s.skip_ws result = call_reader(READERS[@s.current]) end result end
read_char()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 34 def read_char result = @s.advance @s.advance until @s.eof? break unless @s.digit? || @s.alpha? result += @s.current @s.advance end return result if result.size == 1 case result when 'newline' "\n" when 'return' "\r" when 'tab' "\t" when 'space' " " else raise "Unknown char #{result}" end end
read_collection(clazz, closing)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 252 def read_collection(clazz, closing) result = clazz.new while true @s.skip_ws 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
read_digits(min_digits=0)
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 166 def read_digits(min_digits=0) result = '' if @s.current == '+' || @s.current == '-' result << @s.current @s.advance end n_digits = 0 while @s.current =~ /[0-9]/ n_digits += 1 result << @s.current @s.advance end raise "Expected at least #{min_digits} digits, found #{result}" unless n_digits >= min_digits result end
read_eof()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 30 def read_eof EOF end
read_extension()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 91 def read_extension @s.advance if @s.current == '{' @s.advance read_collection(Set, '}') elsif @s.current == "_" @s.advance x = read NOTHING else tag = read_symbol_chars value = read EDN.tagged_element(tag, value) end end
read_keyword()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 115 def read_keyword @s.advance read_symbol_chars.to_sym end
read_list()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 235 def read_list @s.advance read_collection(EDN::Type::List, ')') end
read_map()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 245 def read_map @s.advance array = read_collection(Array, '}') raise "Need an even number of items for a map" unless array.count.even? Hash[*array] end
read_meta()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 216 def read_meta raw_metadata = [] @s.skip_ws while @s.current == '^' @s.advance raw_metadata << read_basic @s.skip_ws end metadata = raw_metadata.reverse.reduce({}) do |acc, m| case m when Symbol then acc.merge(m => true) when EDN::Type::Symbol then acc.merge(:tag => m) else acc.merge(m) end end metadata.empty? ? nil : metadata end
read_number(leading='')
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 204 def read_number(leading='') result = leading + read_digits 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 end end
read_number_or_symbol()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 64 def read_number_or_symbol leading = @s.current @s.advance return read_number(leading) if @s.digit? read_symbol(leading) end
read_slash()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 59 def read_slash @s.advance Type::Symbol.new('/') end
read_string()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 128 def read_string @s.advance result = '' until @s.current == '"' raise "Unexpected eof" if @s.eof? if @s.current == '\\' @s.advance result << escape_char(@s.current) else result << @s.current end @s.advance end @s.advance result end
read_symbol(leading='')
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 107 def read_symbol(leading='') token = leading + read_symbol_chars return true if token == "true" return false if token == "false" return nil if token == "nil" Type::Symbol.new(token) end
read_symbol_chars()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 71 def read_symbol_chars result = '' ch = @s.current while SYMBOL_INTERIOR_CHARS.include?(ch) result << ch ch = @s.advance end return result unless @s.skip_past('/') result << '/' ch = @s.current while SYMBOL_INTERIOR_CHARS.include?(ch) result << ch ch = @s.advance end result end
read_vector()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 240 def read_vector @s.advance read_collection(Array, ']') end
unknown()
click to toggle source
# File lib/edn/ruby_edn_parser.rb, line 26 def unknown raise "Don't know what to do with #{@s.current} #{@s.current.class}" end