| a=expression ':' expression ['=' annotated_rhs] {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") }
| (star_targets '=')* a=star_expressions '=' {
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_TARGET(a),
- "cannot assign to %s", _PyPegen_get_expr_name(GET_INVALID_TARGET(a))) }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
| (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") }
| a=star_expressions augassign (yield_expr | star_expressions) {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
)}
invalid_del_stmt:
| 'del' a=star_expressions {
- GET_INVALID_DEL_TARGET(a) != NULL ?
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_DEL_TARGET(a),
- "cannot delete %s", _PyPegen_get_expr_name(GET_INVALID_DEL_TARGET(a))
- ) :
- RAISE_SYNTAX_ERROR("invalid syntax") }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) }
invalid_block:
| NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block") }
invalid_comprehension:
RAISE_SYNTAX_ERROR("Cannot have two type comments on def") }
invalid_with_item:
| expression 'as' a=expression {
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_TARGET(a),
- "cannot assign to %s", _PyPegen_get_expr_name(GET_INVALID_TARGET(a))
- ) }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
invalid_for_target:
| ASYNC? 'for' a=star_expressions {
- GET_INVALID_FOR_TARGET(a) != NULL ?
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
- GET_INVALID_FOR_TARGET(a),
- "cannot assign to %s", _PyPegen_get_expr_name(GET_INVALID_FOR_TARGET(a))
- ) :
- RAISE_SYNTAX_ERROR("invalid syntax") }
+ RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) }
invalid_group:
| '(' a=starred_expression ')' {
Traceback (most recent call last):
SyntaxError: invalid syntax
+>>> for a, b
+Traceback (most recent call last):
+SyntaxError: invalid syntax
+
>>> with a as b(): pass
Traceback (most recent call last):
SyntaxError: cannot assign to function call
Traceback (most recent call last):
SyntaxError: cannot assign to function call
+>>> with a as b
+Traceback (most recent call last):
+SyntaxError: invalid syntax
+
>>> p = p =
Traceback (most recent call last):
SyntaxError: invalid syntax
)
{
D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='"));
- _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( GET_INVALID_TARGET ( a ) , "cannot assign to %s" , _PyPegen_get_expr_name ( GET_INVALID_TARGET ( a ) ) );
+ _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( STAR_TARGETS , a );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
D(p->level--);
)
{
D(fprintf(stderr, "%*c+ invalid_del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' star_expressions"));
- _res = GET_INVALID_DEL_TARGET ( a ) != NULL ? RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( GET_INVALID_DEL_TARGET ( a ) , "cannot delete %s" , _PyPegen_get_expr_name ( GET_INVALID_DEL_TARGET ( a ) ) ) : RAISE_SYNTAX_ERROR ( "invalid syntax" );
+ _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( DEL_TARGETS , a );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
D(p->level--);
)
{
D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression"));
- _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( GET_INVALID_TARGET ( a ) , "cannot assign to %s" , _PyPegen_get_expr_name ( GET_INVALID_TARGET ( a ) ) );
+ _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( STAR_TARGETS , a );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
D(p->level--);
)
{
D(fprintf(stderr, "%*c+ invalid_for_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC? 'for' star_expressions"));
- _res = GET_INVALID_FOR_TARGET ( a ) != NULL ? RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( GET_INVALID_FOR_TARGET ( a ) , "cannot assign to %s" , _PyPegen_get_expr_name ( GET_INVALID_FOR_TARGET ( a ) ) ) : RAISE_SYNTAX_ERROR ( "invalid syntax" );
+ _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( FOR_TARGETS , a );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
D(p->level--);
FOR_TARGETS
} TARGETS_TYPE;
expr_ty _PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type);
-#define GET_INVALID_TARGET(e) (expr_ty)CHECK(_PyPegen_get_invalid_target(e, STAR_TARGETS))
-#define GET_INVALID_DEL_TARGET(e) (expr_ty)CHECK_NULL_ALLOWED(_PyPegen_get_invalid_target(e, DEL_TARGETS))
-#define GET_INVALID_FOR_TARGET(e) (expr_ty)CHECK_NULL_ALLOWED(_PyPegen_get_invalid_target(e, FOR_TARGETS))
+#define RAISE_SYNTAX_ERROR_INVALID_TARGET(type, e) _RAISE_SYNTAX_ERROR_INVALID_TARGET(p, type, e)
+
+Py_LOCAL_INLINE(void *)
+_RAISE_SYNTAX_ERROR_INVALID_TARGET(Parser *p, TARGETS_TYPE type, void *e)
+{
+ expr_ty invalid_target = CHECK_NULL_ALLOWED(_PyPegen_get_invalid_target(e, type));
+ if (invalid_target != NULL) {
+ const char *msg;
+ if (type == STAR_TARGETS || type == FOR_TARGETS) {
+ msg = "cannot assign to %s";
+ }
+ else {
+ msg = "cannot delete %s";
+ }
+ return RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
+ invalid_target,
+ msg,
+ _PyPegen_get_expr_name(invalid_target)
+ );
+ }
+ return RAISE_SYNTAX_ERROR("invalid syntax");
+}
void *_PyPegen_arguments_parsing_error(Parser *, expr_ty);
void *_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args);