lib/sxp/reader/scheme.rb in sxp-0.0.5 vs lib/sxp/reader/scheme.rb in sxp-0.0.6
- old
+ new
@@ -1,17 +1,29 @@
module SXP; class Reader
##
- # A Scheme-like S-expression parser.
+ # A Scheme R4RS S-expressions parser.
+ #
+ # @see http://people.csail.mit.edu/jaffer/r4rs_9.html#SEC65
class Scheme < Extended
DECIMAL = /^[+-]?(\d*)?\.\d*$/.freeze
INTEGER_BASE_2 = /^[+-]?[01]+$/.freeze
INTEGER_BASE_8 = /^[+-]?[0-7]+$/.freeze
INTEGER_BASE_10 = /^[+-]?\d+$/.freeze
INTEGER_BASE_16 = /^[+-]?[\da-z]+$/i.freeze
RATIONAL = /^([+-]?\d+)\/(\d+)$/.freeze
##
+ # Initializes the reader.
+ #
+ # @param [IO, StringIO, String] input
+ # @param [Hash{Symbol => Object}] options
+ # @option options [Symbol] :version (:r4rs)
+ def initialize(input, options = {}, &block)
+ super(input, {:version => :r4rs}.merge(options), &block)
+ end
+
+ ##
# @return [Object]
def read_token
case peek_char
when ?# then [:atom, read_sharp]
else super
@@ -33,20 +45,20 @@
##
# @return [Object]
def read_sharp
skip_char # '#'
case char = read_char
- when ?n then nil # not in Scheme
- when ?f then false
- when ?t then true
- when ?b then read_integer(2)
- when ?o then read_integer(8)
- when ?d then read_integer(10)
- when ?x then read_integer(16)
- when ?\\ then read_character
- when ?; then skip; read
- when ?! then skip_line; read # shebang
+ when ?n, ?N then nil # not in Scheme per se
+ when ?f, ?F then false
+ when ?t, ?T then true
+ when ?b, ?B then read_integer(2)
+ when ?o, ?O then read_integer(8)
+ when ?d, ?D then read_integer(10)
+ when ?x, ?X then read_integer(16)
+ when ?\\ then read_character
+ when ?; then skip; read
+ when ?! then skip_line; read # shebang
else raise Error, "invalid sharp-sign read syntax: ##{char.chr}"
end
end
- end # class Reader
+ end # class Scheme
end; end # class SXP::Reader