Class: ProtocolBuffers::TextScanner

Inherits:
Object
  • Object
show all
Defined in:
lib/protocol_buffers/runtime/text_scanner.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(text) ⇒ TextScanner

Returns a new instance of TextScanner.



9
10
11
12
13
# File 'lib/protocol_buffers/runtime/text_scanner.rb', line 9

def initialize(text)
  @text = text.encode(Encoding::UTF_8)
  @scanner = StringScanner.new(@text)
  @lineno = 1
end

Instance Attribute Details

#linenoObject (readonly)

Returns the value of attribute lineno.



15
16
17
# File 'lib/protocol_buffers/runtime/text_scanner.rb', line 15

def lineno
  @lineno
end

Instance Method Details

#scan {|[false, nil]| ... } ⇒ Object

Yields:

  • ([false, nil])


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/protocol_buffers/runtime/text_scanner.rb', line 17

def scan
  while @scanner.rest?
    case
    when @scanner.skip(/[ \t\v]+/)
      next
    when @scanner.skip(/#.*?$/)
      next
    when @scanner.skip(/\r?\n|\r/)
      @lineno += 1
      next
    when @scanner.scan(/[.:<>{}\[\]]/)
      c = @scanner[0]
      yield [c, c]
    when @scanner.scan(/true/)
      yield [:bool, true]
    when @scanner.scan(/false/)
      yield [:bool, false]
    when @scanner.scan(/["']/)
      quote = @scanner[0]
      line = lineno
      if @scanner.scan(/(.*?)(?<!\\)#{quote}/)
        str = @scanner[1]
        yield [:string, unescape(str)]
      else
        raise Racc::ParseError, "unterminated string from line #{line}"
      end
    when @scanner.scan(/([+-])?[0-9]+\.[0-9]+([Ee][+-]?[0-9]+)?/)
      yield [:float, Float(@scanner[0])]
    when @scanner.scan(/([+-])?0[Bb]([01]+)/)
      yield [:integer, Integer(@scanner[0], 2)]
    when @scanner.scan(/([+-])?0[Xx]([[:xdigit:]]+)/)
      yield [:integer, Integer(@scanner[0], 16)]
    when @scanner.scan(/([+-])?0[Oo]?([0-7]+)/)
      yield [:integer, Integer(@scanner[0], 8)]
    when @scanner.scan(/([+-])?(?:0[Dd])?([0-9]+)/)
      yield [:integer, Integer(@scanner[0], 10)]
    when @scanner.scan(/[[:alpha:]_][[:alnum:]_]*/)
      yield [:identifier, @scanner[0]]
    else
      line = lineno
      raise Racc::ParseError, "unexpected character at: line #{line}: #{@scanner.rest.inspect}"
    end
  end
  yield [false, nil]
end