Skip to content

Commit 7c82f3d

Browse files
Dylan Trottertrotterdylan
authored andcommitted
Make "int" token values be long type when [Ll] specified.
1 parent 82bbdca commit 7c82f3d

File tree

5 files changed

+38
-21
lines changed

5 files changed

+38
-21
lines changed

pythonparser/lexer.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
if sys.version_info[0] == 3:
1212
unichr = chr
1313
byte = lambda x: bytes([x])
14+
long = int
1415
else:
1516
byte = chr
1617

@@ -335,33 +336,24 @@ def _refill(self, eof_token):
335336
self.queue.append(Token(tok_range, "complex", int(match.group(7)) * 1j))
336337

337338
elif match.group(8) is not None: # integer literal, dec
338-
literal = match.group(8)
339-
self._check_long_literal(tok_range, match.group(1))
340-
self.queue.append(Token(tok_range, "int", int(literal)))
339+
self.queue.append(self._make_int_token(tok_range, match.group(1), 10))
341340

342341
elif match.group(9) is not None: # integer literal, oct
343-
literal = match.group(9)
344-
self._check_long_literal(tok_range, match.group(1))
345-
self.queue.append(Token(tok_range, "int", int(literal, 8)))
342+
self.queue.append(self._make_int_token(tok_range, match.group(1), 8))
346343

347344
elif match.group(10) is not None: # integer literal, hex
348-
literal = match.group(10)
349-
self._check_long_literal(tok_range, match.group(1))
350-
self.queue.append(Token(tok_range, "int", int(literal, 16)))
345+
self.queue.append(self._make_int_token(tok_range, match.group(1), 16))
351346

352347
elif match.group(11) is not None: # integer literal, bin
353-
literal = match.group(11)
354-
self._check_long_literal(tok_range, match.group(1))
355-
self.queue.append(Token(tok_range, "int", int(literal, 2)))
348+
self.queue.append(self._make_int_token(tok_range, match.group(1), 2))
356349

357350
elif match.group(12) is not None: # integer literal, bare oct
358-
literal = match.group(12)
359-
if len(literal) > 1 and self.version >= (3, 0):
351+
if len(match.group(12)) > 1 and self.version >= (3, 0):
360352
error = diagnostic.Diagnostic(
361353
"error", "in Python 3, decimal literals must not start with a zero", {},
362354
source.Range(self.source_buffer, tok_range.begin_pos, tok_range.begin_pos + 1))
363355
self.diagnostic_engine.process(error)
364-
self.queue.append(Token(tok_range, "int", int(literal, 8)))
356+
self.queue.append(self._make_int_token(tok_range, match.group(1), 8))
365357

366358
elif match.group(14) is not None: # long string literal
367359
self._string_literal(
@@ -546,12 +538,15 @@ def _replace_escape_bytes(self, value):
546538

547539
return b"".join(chunks)
548540

549-
def _check_long_literal(self, range, literal):
550-
if literal[-1] in "lL" and self.version >= (3, 0):
541+
def _make_int_token(self, tok_range, literal, base):
542+
if literal[-1] not in "lL":
543+
return Token(tok_range, "int", int(literal, base))
544+
if self.version >= (3, 0):
551545
error = diagnostic.Diagnostic(
552546
"error", "in Python 3, long integer literals were removed", {},
553-
source.Range(self.source_buffer, range.end_pos - 1, range.end_pos))
547+
source.Range(self.source_buffer, tok_range.end_pos - 1, tok_range.end_pos))
554548
self.diagnostic_engine.process(error)
549+
return Token(tok_range, "long", long(literal[:-1], base))
555550

556551
def _match_pair_delim(self, range, kwop):
557552
if kwop == "(":

pythonparser/parser.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1516,6 +1516,10 @@ def atom_2(self, tok):
15161516
def atom_3(self, tok):
15171517
return ast.Num(n=tok.value, loc=tok.loc)
15181518

1519+
@action(Tok("long"))
1520+
def atom_3_long(self, tok):
1521+
return ast.Num(n=tok.value, loc=tok.loc)
1522+
15191523
@action(Seq(Tok("strbegin"), Tok("strdata"), Tok("strend")))
15201524
def atom_4(self, begin_tok, data_tok, end_tok):
15211525
return ast.Str(s=data_tok.value,
@@ -1542,7 +1546,7 @@ def atom_5(self, strings):
15421546
empty=lambda self: ast.Dict(keys=[], values=[], colon_locs=[],
15431547
loc=None)),
15441548
BeginEnd("`", atom_1, "`"),
1545-
atom_2, atom_3, atom_5)
1549+
atom_2, atom_3, atom_3_long, atom_5)
15461550
"""
15471551
(2.6)
15481552
atom: ('(' [yield_expr|testlist_gexp] ')' |

pythonparser/test/test_lexer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,10 @@ def test_integer_py3(self):
142142
"int", 83)
143143
self.assertLexesVersions(
144144
"123L", [(2,6)],
145-
"int", 123)
145+
"long", 123)
146146
self.assertLexesVersions(
147147
"123l", [(2,6)],
148-
"int", 123)
148+
"long", 123)
149149

150150
self.assertDiagnosesVersions(
151151
"0123", [(3,0)],

pythonparser/test/test_parser.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,13 @@ def test_complex(self):
242242
"1j",
243243
"~~ loc")
244244

245+
def test_long(self):
246+
self.assertParsesExpr(
247+
{"ty": "Num", "n": test_utils.LongOnly(1)},
248+
"1L",
249+
"~~ loc",
250+
only_if=lambda ver: ver < (3,))
251+
245252
def test_string(self):
246253
self.assertParsesExpr(
247254
{"ty": "Str", "s": "foo"},

pythonparser/test/test_utils.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# coding:utf-8
22

33
from __future__ import absolute_import, division, print_function, unicode_literals
4+
import sys
45

56
unicode = type("")
67

@@ -22,3 +23,13 @@ def __eq__(self, o):
2223

2324
def __ne__(self, o):
2425
return not self == o
26+
27+
if sys.version_info >= (3,):
28+
LongOnly = int
29+
else:
30+
class LongOnly(long):
31+
def __eq__(self, o):
32+
return isinstance(o, long) and long.__cmp__(self, o) == 0
33+
34+
def __ne__(self, o):
35+
return not self == o

0 commit comments

Comments
 (0)