import binascii
import collections
+import functools
import re
from don import tags, _shared
return _STRING_SERIALIZERS[o.tag](o.value)
-def _make_constant_parser(constant, value):
+def _consume_leading_whitespace(wrapped_parser):
+ @functools.wraps(wrapped_parser)
def parser(s):
+ s = s.lstrip()
+ return wrapped_parser(s)
+
+ return parser
+
+def _make_constant_parser(constant, value):
+ @_consume_leading_whitespace
+ def constant_parser(s):
if s.startswith(constant):
result = _shared.ParseResult(
success = True,
return _shared._FAILED_PARSE_RESULT
- return parser
+ return constant_parser
def _make_integer_parser(width):
matcher = re.compile(r'(-?\d+)i' + str(width))
- def parser(s):
+ @_consume_leading_whitespace
+ def integer_parser(s):
match = matcher.match(s)
if match:
return _shared._FAILED_PARSE_RESULT
- return parser
+ return integer_parser
_BINARY32_MATCHER = re.compile(r'(-?\d+\.\d+)f')
_BINARY64_MATCHER = re.compile(r'(-?\d+\.\d+)d')
+@_consume_leading_whitespace
def _binary32_parser(s):
match = _BINARY32_MATCHER.match(s)
return _shared._FAILED_PARSE_RESULT
+@_consume_leading_whitespace
def _binary64_parser(s):
match = _BINARY64_MATCHER.match(s)
_BINARY_MATCHER = re.compile(r'"([\da-f]*)"b')
+@_consume_leading_whitespace
def _binary_parser(s):
match = _BINARY_MATCHER.match(s)
def _make_utf_parser(encoding):
matcher = re.compile(r'"(.*?)"' + encoding)
- def parser(s):
+ @_consume_leading_whitespace
+ def utf_parser(s):
match = matcher.match(s)
if match:
return _shared._FAILED_PARSE_RESULT
- return parser
+ return utf_parser
def _prefix_with_comma(parser):
def wrapped(s):