5 from simplejson
._speedups
import make_scanner
as c_make_scanner
9 __all__
= ['make_scanner']
11 NUMBER_RE
= re
.compile(
12 r
'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
13 (re
.VERBOSE | re
.MULTILINE | re
.DOTALL
))
15 def py_make_scanner(context
):
16 parse_object
= context
.parse_object
17 parse_array
= context
.parse_array
18 parse_string
= context
.parse_string
19 match_number
= NUMBER_RE
.match
20 encoding
= context
.encoding
21 strict
= context
.strict
22 parse_float
= context
.parse_float
23 parse_int
= context
.parse_int
24 parse_constant
= context
.parse_constant
25 object_hook
= context
.object_hook
27 def _scan_once(string
, idx
):
29 nextchar
= string
[idx
]
34 return parse_string(string
, idx
+ 1, encoding
, strict
)
36 return parse_object((string
, idx
+ 1), encoding
, strict
, _scan_once
, object_hook
)
38 return parse_array((string
, idx
+ 1), _scan_once
)
39 elif nextchar
== 'n' and string
[idx
:idx
+ 4] == 'null':
41 elif nextchar
== 't' and string
[idx
:idx
+ 4] == 'true':
43 elif nextchar
== 'f' and string
[idx
:idx
+ 5] == 'false':
46 m
= match_number(string
, idx
)
48 integer
, frac
, exp
= m
.groups()
50 res
= parse_float(integer
+ (frac
or '') + (exp
or ''))
52 res
= parse_int(integer
)
54 elif nextchar
== 'N' and string
[idx
:idx
+ 3] == 'NaN':
55 return parse_constant('NaN'), idx
+ 3
56 elif nextchar
== 'I' and string
[idx
:idx
+ 8] == 'Infinity':
57 return parse_constant('Infinity'), idx
+ 8
58 elif nextchar
== '-' and string
[idx
:idx
+ 9] == '-Infinity':
59 return parse_constant('-Infinity'), idx
+ 9
65 make_scanner
= c_make_scanner
or py_make_scanner