# File lib/coderay/scanners/json.rb, line 19
19: def scan_tokens tokens, options
20:
21: state = :initial
22: stack = []
23: key_expected = false
24:
25: until eos?
26:
27: kind = nil
28: match = nil
29:
30: case state
31:
32: when :initial
33: if match = scan(/ \s+ | \\\n /)
34: tokens << [match, :space]
35: next
36: elsif match = scan(/ [:,\[{\]}] /)
37: kind = :operator
38: case match
39: when '{' then stack << :object; key_expected = true
40: when '[' then stack << :array
41: when ':' then key_expected = false
42: when ',' then key_expected = true if stack.last == :object
43: when '}', ']' then stack.pop # no error recovery, but works for valid JSON
44: end
45: elsif match = scan(/ true | false | null /)
46: kind = :value
47: elsif match = scan(/-?(?:0|[1-9]\d*)/)
48: kind = :integer
49: if scan(/\.\d+(?:[eE][-+]?\d+)?|[eE][-+]?\d+/)
50: match << matched
51: kind = :float
52: end
53: elsif match = scan(/"/)
54: state = key_expected ? :key : :string
55: tokens << [:open, state]
56: kind = :delimiter
57: else
58: getch
59: kind = :error
60: end
61:
62: when :string, :key
63: if scan(/[^\\"]+/)
64: kind = :content
65: elsif scan(/"/)
66: tokens << ['"', :delimiter]
67: tokens << [:close, state]
68: state = :initial
69: next
70: elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /ox)
71: kind = :char
72: elsif scan(/\\./)
73: kind = :content
74: elsif scan(/ \\ | $ /)
75: tokens << [:close, state]
76: kind = :error
77: state = :initial
78: else
79: raise_inspect "else case \" reached; %p not handled." % peek(1), tokens
80: end
81:
82: else
83: raise_inspect 'Unknown state', tokens
84:
85: end
86:
87: match ||= matched
88: if $CODERAY_DEBUG and not kind
89: raise_inspect 'Error token %p in line %d' %
90: [[match, kind], line], tokens
91: end
92: raise_inspect 'Empty token', tokens unless match
93:
94: tokens << [match, kind]
95:
96: end
97:
98: if [:string, :key].include? state
99: tokens << [:close, state]
100: end
101:
102: tokens
103: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.