__credits__ = \
'GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip Montanaro'
-import re
+import regex as re
from codecs import BOM_UTF8, lookup
-from attr import dataclass
from blib2to3.pgen2.token import *
from . import token
# recognized as two instances of =).
Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"<>", r"!=",
r"//=?", r"->",
- r"[+\-*/%&@|^=<>]=?",
+ r"[+\-*/%&@|^=<>:]=?",
r"~")
Bracket = '[][(){}]'
tabsize = 8
-@dataclass(frozen=True)
-class TokenizerConfig:
- async_is_reserved_keyword: bool = False
-
class TokenError(Exception): pass
class StopTokenizing(Exception): pass
ut = Untokenizer()
return ut.untokenize(iterable)
-def generate_tokens(readline, config: TokenizerConfig = TokenizerConfig()):
+def generate_tokens(readline, grammar=None):
"""
The generate_tokens() generator requires one argument, readline, which
must be a callable object which provides the same interface as the
# If we know we're parsing 3.7+, we can unconditionally parse `async` and
# `await` as keywords.
- async_is_reserved_keyword = config.async_is_reserved_keyword
+ async_keywords = False if grammar is None else grammar.async_keywords
# 'stashed' and 'async_*' are used for async/await parsing
stashed = None
async_def = False
yield (STRING, token, spos, epos, line)
elif initial.isidentifier(): # ordinary name
if token in ('async', 'await'):
- if async_is_reserved_keyword or async_def:
+ if async_keywords or async_def:
yield (ASYNC if token == 'async' else AWAIT,
token, spos, epos, line)
continue