X-Git-Url: https://code.kerkeslager.com/?p=ton;a=blobdiff_plain;f=don%2Fstring.py;fp=don%2Fstring.py;h=ee925f662b33b6ded3985b340fb43b8e1d02c176;hp=c7d810b5eb6723b48be006c54856467cb1a5bac2;hb=4714e340486e676ed50e8d6e08c5f2129daa4c59;hpb=b3b37a652de06531af2ca1e6c127bc0e7a774f57 diff --git a/don/string.py b/don/string.py index c7d810b..ee925f6 100644 --- a/don/string.py +++ b/don/string.py @@ -80,6 +80,7 @@ def _make_integer_parser(width): match = matcher.match(s) if match: + # TODO Validate that the integer is in range return _shared.ParseResult( success = True, value = int(match.group(1)), @@ -90,6 +91,52 @@ def _make_integer_parser(width): return parser +_BINARY32_MATCHER = re.compile(r'(-?\d+\.\d+)f') +_BINARY64_MATCHER = re.compile(r'(-?\d+\.\d+)d') + +def _binary32_parser(s): + match = _BINARY32_MATCHER.match(s) + + if match: + # TODO Validate that the double is in range + return _shared.ParseResult( + success = True, + value = float(match.group(1)), + remaining = s[match.end():], + ) + + return _shared._FAILED_PARSE_RESULT + +def _binary64_parser(s): + match = _BINARY64_MATCHER.match(s) + + if match: + # TODO Validate that the double is in range + return _shared.ParseResult( + success = True, + value = float(match.group(1)), + remaining = s[match.end():], + ) + + return _shared._FAILED_PARSE_RESULT + +_BINARY_MATCHER = re.compile(r'"([\da-f]*)"b') + +def _binary_parser(s): + match = _BINARY_MATCHER.match(s) + + if match: + # TODO Validate that the double is in range + return _shared.ParseResult( + success = True, + value = binascii.unhexlify(match.group(1)), + remaining = s[match.end():], + ) + + return _shared._FAILED_PARSE_RESULT + + + _PARSERS = [ _make_constant_parser('null', None), _make_constant_parser('true', True), @@ -98,6 +145,9 @@ _PARSERS = [ _make_integer_parser(16), _make_integer_parser(32), _make_integer_parser(64), + _binary32_parser, + _binary64_parser, + _binary_parser, ] def _object_parser(source):