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