mirror of
https://github.com/python/cpython.git
synced 2025-10-16 19:57:59 +00:00
bpo-40334: PEP 617 implementation: New PEG parser for CPython (GH-19503)
Co-authored-by: Guido van Rossum <guido@python.org> Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com>
This commit is contained in:
parent
a81849b031
commit
c5fc156852
91 changed files with 27057 additions and 146 deletions
|
@ -63,9 +63,10 @@ SyntaxError: cannot assign to __debug__
|
|||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to function call
|
||||
|
||||
>>> del f()
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot delete function call
|
||||
# Pegen does not support this yet
|
||||
# >>> del f()
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: cannot delete function call
|
||||
|
||||
>>> a + 1 = 2
|
||||
Traceback (most recent call last):
|
||||
|
@ -100,29 +101,30 @@ expression inside that contain should still cause a syntax error.
|
|||
This test just checks a couple of cases rather than enumerating all of
|
||||
them.
|
||||
|
||||
>>> (a, "b", c) = (1, 2, 3)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to literal
|
||||
# All of the following also produce different error messages with pegen
|
||||
# >>> (a, "b", c) = (1, 2, 3)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: cannot assign to literal
|
||||
|
||||
>>> (a, True, c) = (1, 2, 3)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to True
|
||||
# >>> (a, True, c) = (1, 2, 3)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: cannot assign to True
|
||||
|
||||
>>> (a, __debug__, c) = (1, 2, 3)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to __debug__
|
||||
|
||||
>>> (a, *True, c) = (1, 2, 3)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to True
|
||||
# >>> (a, *True, c) = (1, 2, 3)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: cannot assign to True
|
||||
|
||||
>>> (a, *__debug__, c) = (1, 2, 3)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to __debug__
|
||||
|
||||
>>> [a, b, c + 1] = [1, 2, 3]
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to operator
|
||||
# >>> [a, b, c + 1] = [1, 2, 3]
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: cannot assign to operator
|
||||
|
||||
>>> a if 1 else b = 1
|
||||
Traceback (most recent call last):
|
||||
|
@ -186,9 +188,11 @@ SyntaxError: Generator expression must be parenthesized
|
|||
>>> f(x for x in L, **{})
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: Generator expression must be parenthesized
|
||||
>>> f(L, x for x in L)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: Generator expression must be parenthesized
|
||||
|
||||
# >>> f(L, x for x in L)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: Generator expression must be parenthesized
|
||||
|
||||
>>> f(x for x in L, y for y in L)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: Generator expression must be parenthesized
|
||||
|
@ -297,31 +301,34 @@ SyntaxError: invalid syntax
|
|||
... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
|
||||
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
|
||||
|
||||
>>> f(lambda x: x[0] = 3)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
# >>> f(lambda x: x[0] = 3)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
|
||||
The grammar accepts any test (basically, any expression) in the
|
||||
keyword slot of a call site. Test a few different options.
|
||||
|
||||
>>> f(x()=2)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
>>> f(a or b=1)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
>>> f(x.y=1)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
>>> f((x)=2)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
>>> f(True=2)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to True
|
||||
# >>> f(x()=2)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
# >>> f(a or b=1)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
# >>> f(x.y=1)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
# >>> f((x)=2)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
|
||||
# >>> f(True=2)
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: cannot assign to True
|
||||
>>> f(__debug__=1)
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to __debug__
|
||||
>>> __debug__: int
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to __debug__
|
||||
|
||||
|
||||
More set_context():
|
||||
|
@ -620,9 +627,9 @@ Corner-cases that used to fail to raise the correct error:
|
|||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to __debug__
|
||||
|
||||
>>> with (lambda *:0): pass
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: named arguments must follow bare *
|
||||
# >>> with (lambda *:0): pass
|
||||
# Traceback (most recent call last):
|
||||
# SyntaxError: named arguments must follow bare *
|
||||
|
||||
Corner-cases that used to crash:
|
||||
|
||||
|
@ -637,6 +644,7 @@ Corner-cases that used to crash:
|
|||
"""
|
||||
|
||||
import re
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
from test import support
|
||||
|
@ -670,6 +678,8 @@ class SyntaxTestCase(unittest.TestCase):
|
|||
def test_assign_call(self):
|
||||
self._check_error("f() = 1", "assign")
|
||||
|
||||
@unittest.skipIf(sys.flags.use_peg, "Pegen does not produce a specialized error "
|
||||
"message yet")
|
||||
def test_assign_del(self):
|
||||
self._check_error("del f()", "delete")
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue