-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Speed up new backtracking parser (#2728)
- Loading branch information
1 parent
521d1b8
commit 3e73152
Showing
4 changed files
with
176 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
re.match() | ||
match = a | ||
with match() as match: | ||
match = f"{match}" | ||
|
||
re.match() | ||
match = a | ||
with match() as match: | ||
match = f"{match}" | ||
|
||
|
||
def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]: | ||
if not target_versions: | ||
# No target_version specified, so try all grammars. | ||
return [ | ||
# Python 3.7+ | ||
pygram.python_grammar_no_print_statement_no_exec_statement_async_keywords, | ||
# Python 3.0-3.6 | ||
pygram.python_grammar_no_print_statement_no_exec_statement, | ||
# Python 2.7 with future print_function import | ||
pygram.python_grammar_no_print_statement, | ||
# Python 2.7 | ||
pygram.python_grammar, | ||
] | ||
|
||
match match: | ||
case case: | ||
match match: | ||
case case: | ||
pass | ||
|
||
if all(version.is_python2() for version in target_versions): | ||
# Python 2-only code, so try Python 2 grammars. | ||
return [ | ||
# Python 2.7 with future print_function import | ||
pygram.python_grammar_no_print_statement, | ||
# Python 2.7 | ||
pygram.python_grammar, | ||
] | ||
|
||
re.match() | ||
match = a | ||
with match() as match: | ||
match = f"{match}" | ||
|
||
def test_patma_139(self): | ||
x = False | ||
match x: | ||
case bool(z): | ||
y = 0 | ||
self.assertIs(x, False) | ||
self.assertEqual(y, 0) | ||
self.assertIs(z, x) | ||
|
||
# Python 3-compatible code, so only try Python 3 grammar. | ||
grammars = [] | ||
if supports_feature(target_versions, Feature.PATTERN_MATCHING): | ||
# Python 3.10+ | ||
grammars.append(pygram.python_grammar_soft_keywords) | ||
# If we have to parse both, try to parse async as a keyword first | ||
if not supports_feature( | ||
target_versions, Feature.ASYNC_IDENTIFIERS | ||
) and not supports_feature(target_versions, Feature.PATTERN_MATCHING): | ||
# Python 3.7-3.9 | ||
grammars.append( | ||
pygram.python_grammar_no_print_statement_no_exec_statement_async_keywords | ||
) | ||
if not supports_feature(target_versions, Feature.ASYNC_KEYWORDS): | ||
# Python 3.0-3.6 | ||
grammars.append(pygram.python_grammar_no_print_statement_no_exec_statement) | ||
|
||
def test_patma_155(self): | ||
x = 0 | ||
y = None | ||
match x: | ||
case 1e1000: | ||
y = 0 | ||
self.assertEqual(x, 0) | ||
self.assertIs(y, None) | ||
|
||
x = range(3) | ||
match x: | ||
case [y, case as x, z]: | ||
w = 0 | ||
|
||
# At least one of the above branches must have been taken, because every Python | ||
# version has exactly one of the two 'ASYNC_*' flags | ||
return grammars | ||
|
||
|
||
def lib2to3_parse(src_txt: str, target_versions: Iterable[TargetVersion] = ()) -> Node: | ||
"""Given a string with source, return the lib2to3 Node.""" | ||
if not src_txt.endswith("\n"): | ||
src_txt += "\n" | ||
|
||
grammars = get_grammars(set(target_versions)) | ||
|
||
|
||
re.match() | ||
match = a | ||
with match() as match: | ||
match = f"{match}" | ||
|
||
re.match() | ||
match = a | ||
with match() as match: | ||
match = f"{match}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters