Sha256: e836fe812ffe8f8e355e502b89904ae99b705a3e45f02666a4a532837737fb52
Contents?: true
Size: 1.76 KB
Versions: 2
Compression:
Stored size: 1.76 KB
Contents
# -*- encoding: utf-8 -*- module SXP; class Reader ## # A basic S-expression parser. class Basic < Reader LPARENS = [?(] RPARENS = [?)] ATOM = /^[^\s()]+/ RATIONAL = /^([+-]?\d+)\/(\d+)$/ DECIMAL = /^[+-]?(\d*)?\.\d*$/ INTEGER = /^[+-]?\d+$/ ## # @return [Object] def read_token case peek_char when ?(, ?) then [:list, read_char] when ?" then [:atom, read_string] #" else super end end ## # @return [Object] def read_atom case buffer = read_literal when '.' then buffer.to_sym when RATIONAL then Rational($1.to_i, $2.to_i) when DECIMAL then Float(buffer.end_with?('.') ? "#{buffer}0" : buffer) when INTEGER then Integer(buffer) else buffer.to_sym end end ## # @return [String] def read_string buffer = "" skip_char # '"' until peek_char == ?" #" buffer << case char = read_char when ?\\ then read_character else char end end skip_char # '"' buffer end ## # @return [String] def read_character case char = read_char when ?b then ?\b when ?f then ?\f when ?n then ?\n when ?r then ?\r when ?t then ?\t when ?u then read_chars(4).to_i(16).chr(Encoding::UTF_8) when ?U then read_chars(8).to_i(16).chr(Encoding::UTF_8) when ?" then char #" when ?\\ then char else char end end ## # @return [String] def read_literal grammar = self.class.const_get(:ATOM) buffer = "" buffer << read_char while !eof? && peek_char.chr =~ grammar buffer end end # Basic end; end # SXP::Reader
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
sxp-1.3.0 | lib/sxp/reader/basic.rb |
sxp-1.2.4 | lib/sxp/reader/basic.rb |