class Tomlrb::Scanner

Constants

BOOLEAN
COMMENT
DATETIME
FLOAT
FLOAT_KEYWORD
IDENTIFIER
INTEGER
LOCAL_TIME
NEWLINE
NON_DEC_INTEGER
SPACE
SPACED_ARRAY_OF_TABLES_BOTH
SPACED_ARRAY_OF_TABLES_END
SPACED_ARRAY_OF_TABLES_START
STRING_BASIC
STRING_LITERAL
STRING_LITERAL_MULTI
STRING_MULTI

Public Class Methods

new(io) click to toggle source
# File lib/tomlrb/scanner.rb, line 24
def initialize(io)
  @ss = StringScanner.new(io.read)
  @eos = false
end

Public Instance Methods

next_token() click to toggle source
# File lib/tomlrb/scanner.rb, line 29
def next_token
  case
  when @ss.scan(NEWLINE) then [:NEWLINE, nil]
  when @ss.scan(SPACED_ARRAY_OF_TABLES_START) then raise ParseError.new("Array of tables has spaces in starting brackets")
  when @ss.scan(SPACED_ARRAY_OF_TABLES_END) then raise ParseError.new("Array of tables has spaces in ending brackets")
  when @ss.scan(SPACED_ARRAY_OF_TABLES_BOTH) then raise ParseError.new("Array of tables has spaces in starting and ending brackets")
  when @ss.scan(SPACE) then next_token
  when @ss.scan(COMMENT) then next_token
  when @ss.scan(DATETIME) then process_datetime
  when @ss.scan(LOCAL_TIME) then process_local_time
  when text = @ss.scan(STRING_MULTI) then [:STRING_MULTI, text[3..-4]]
  when text = @ss.scan(STRING_BASIC) then [:STRING_BASIC, text[1..-2]]
  when text = @ss.scan(STRING_LITERAL_MULTI) then [:STRING_LITERAL_MULTI, text[3..-4]]
  when text = @ss.scan(STRING_LITERAL) then [:STRING_LITERAL, text[1..-2]]
  when text = @ss.scan(FLOAT) then [:FLOAT, text]
  when text = @ss.scan(FLOAT_KEYWORD) then [:FLOAT_KEYWORD, text]
  when text = @ss.scan(INTEGER) then [:INTEGER, text]
  when text = @ss.scan(NON_DEC_INTEGER) then [:NON_DEC_INTEGER, text]
  when text = @ss.scan(BOOLEAN) then [:BOOLEAN, text]
  when text = @ss.scan(IDENTIFIER) then [:IDENTIFIER, text]
  when @ss.eos? then process_eos
  else x = @ss.getch; [x, x]
  end
end
process_datetime() click to toggle source
# File lib/tomlrb/scanner.rb, line 54
def process_datetime
  if @ss[7]
    offset = @ss[7].gsub(/[zZ]/, '+00:00')
  end
  args = [@ss[1], @ss[2], @ss[3], @ss[4], @ss[5], @ss[6], offset]
  [:DATETIME, args]
end
process_eos() click to toggle source
# File lib/tomlrb/scanner.rb, line 67
def process_eos
  return if @eos

  @eos = true
  [:EOS, nil]
end
process_local_time() click to toggle source
# File lib/tomlrb/scanner.rb, line 62
def process_local_time
  args = [@ss[1], @ss[2], @ss[3].to_f]
  [:LOCAL_TIME, args]
end