Class: SLF0::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/slf0/parser.rb

Direct Known Subclasses

XCActivityLog::Parser

Instance Method Summary collapse

Constructor Details

#initialize(class_deserializer:) ⇒ Parser

Returns a new instance of Parser.



8
9
10
# File 'lib/slf0/parser.rb', line 8

def initialize(class_deserializer:)
  @class_deserializer = class_deserializer
end

Instance Method Details

#make_stream(tokens, class_deserializer) ⇒ Object



34
35
36
# 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) ⇒ Object



12
13
14
15
16
# File 'lib/slf0/parser.rb', line 12

def parse!(io)
  tokens = Tokenizer.tokenize(io)

  parse_tokens!(tokens)
end

#parse_tokens!(tokens) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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