From 2e0a3da2bc8b764dc8cb5aec390cc7ac7dacd8ae Mon Sep 17 00:00:00 2001 From: Alex Mykyta Date: Tue, 10 Mar 2020 20:57:28 -0700 Subject: [PATCH] parse hex, octal, and binary integer literals --- CHANGES.rst | 2 ++ src/jinja2/lexer.py | 19 +++++++++++++++++-- tests/test_lexnparse.py | 7 +++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1e0ec0ee..f45d523c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -50,6 +50,8 @@ Unreleased extension. :issue:`441` - The ``|indent`` filter's ``width`` argument can be a string to indent by. :pr:`1167` +- The parser understands hex, octal, and binary integer literals. + :issue:`1170` Version 2.11.3 diff --git a/src/jinja2/lexer.py b/src/jinja2/lexer.py index 082a051d..d992f0d1 100644 --- a/src/jinja2/lexer.py +++ b/src/jinja2/lexer.py @@ -23,7 +23,22 @@ newline_re = re.compile(r"(\r\n|\r|\n)") string_re = re.compile( r"('([^'\\]*(?:\\.[^'\\]*)*)'" r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S ) -integer_re = re.compile(r"(\d+_)*\d+") +integer_re = re.compile( + r""" + ( + 0b(_?[0-1])+ # binary + | + 0o(_?[0-7])+ # octal + | + 0x(_?[\da-f])+ # hex + | + [1-9](_?\d)* # decimal + | + 0(_?0)* # decimal zero + ) + """, + re.IGNORECASE | re.VERBOSE, +) float_re = re.compile( r""" (?