class SLF0::Parser

Public Class Methods

new(class_deserializer:) click to toggle source
# File lib/slf0/parser.rb, line 8
def initialize(class_deserializer:)
  @class_deserializer = class_deserializer
end

Public Instance Methods

make_stream(tokens, class_deserializer) click to toggle source
# File lib/slf0/parser.rb, line 34
def make_stream(tokens, class_deserializer)
  SLF0::Token::Stream.new(tokens, class_deserializer: class_deserializer)
end
parse!(io) click to toggle source
# File lib/slf0/parser.rb, line 12
def parse!(io)
  tokens = Tokenizer.tokenize(io)

  parse_tokens!(tokens)
end
parse_tokens!(tokens) click to toggle source
# File lib/slf0/parser.rb, line 18
def parse_tokens!(tokens)
  class_names = tokens.grep(SLF0::Token::ClassName).map(&:value)
  tokens.reject! { |t| t.is_a? SLF0::Token::ClassName }
  values = []
  stream = make_stream(tokens, [nil] + class_names.map { |n| [n, @class_deserializer[n]] })
  until tokens.empty?
    values << case tokens.first
              when SLF0::Token::ClassNameRef
                stream.object
              else
                tokens.shift.value
              end
  end
  values
end