Module: Parsr::Rules::Array

Defined in:
lib/parsr/rules/array.rb

Defined Under Namespace

Classes: Unterminated

Class Method Summary collapse

Class Method Details

.match(scanner, &block) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/parsr/rules/array.rb', line 9

def match(scanner, &block)
  if scanner.scan(/\[\s*/)
    array = []
    begin
      if scanner.scan(/[a-zA-Z_][0-9a-zA-Z_]*\:/)
        token = Parsr::Token.new(scanner.matched.chomp(':').to_sym)
        array << parse_unclosed_hash(scanner, token, &block)
        break
      end

      token = yield 
      if token.is_a?(Parsr::Token) && scanner.scan(/\s*=>\s*/)
        array << parse_unclosed_hash(scanner, token, &block)
        break
      end
      
      array << token.value if token.is_a?(Parsr::Token)
    end while scanner.scan(/\s*,\s*/)
    raise Unterminated.new(scanner) unless scanner.scan(/\s*\]/)
    Parsr::Token.new(array)
  end
end

.parse_unclosed_hash(scanner, token, &block) ⇒ Object



32
33
34
35
36
37
38
39
40
# File 'lib/parsr/rules/array.rb', line 32

def parse_unclosed_hash(scanner, token, &block)
  hash = []
  while pair = Parsr::Rules::Hash.parse_pair(scanner, token, &block)
    token = nil
    hash << pair
    break unless scanner.scan(/\s*\,\s*/)
  end
  Hash[hash]
end