@@ -162,22 +162,22 @@ dotted_name[expr_ty]:
162
162
| NAME
163
163
164
164
if_stmt[stmt_ty]:
165
- | 'if' a=named_expression ':' b=block c=elif_stmt {
165
+ | 'if' a=named_expression && ':' b=block c=elif_stmt {
166
166
_Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) }
167
- | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) }
167
+ | 'if' a=named_expression && ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) }
168
168
elif_stmt[stmt_ty]:
169
- | 'elif' a=named_expression ':' b=block c=elif_stmt {
169
+ | 'elif' a=named_expression && ':' b=block c=elif_stmt {
170
170
_Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) }
171
- | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) }
172
- else_block[asdl_stmt_seq*]: 'else' ':' b=block { b }
171
+ | 'elif' a=named_expression && ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) }
172
+ else_block[asdl_stmt_seq*]: 'else' && ':' b=block { b }
173
173
174
174
while_stmt[stmt_ty]:
175
- | 'while' a=named_expression ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) }
175
+ | 'while' a=named_expression && ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) }
176
176
177
177
for_stmt[stmt_ty]:
178
- | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] {
178
+ | 'for' t=star_targets 'in' ~ ex=star_expressions && ':' tc=[TYPE_COMMENT] b=block el=[else_block] {
179
179
_Py_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) }
180
- | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] {
180
+ | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions && ':' tc=[TYPE_COMMENT] b=block el=[else_block] {
181
181
CHECK_VERSION(stmt_ty, 5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) }
182
182
| invalid_for_target
183
183
@@ -190,18 +190,20 @@ with_stmt[stmt_ty]:
190
190
CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) }
191
191
| ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block {
192
192
CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) }
193
+ | invalid_with_stmt
194
+
193
195
with_item[withitem_ty]:
194
196
| e=expression 'as' t=star_target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) }
195
197
| invalid_with_item
196
198
| e=expression { _Py_withitem(e, NULL, p->arena) }
197
199
198
200
try_stmt[stmt_ty]:
199
- | 'try' ':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) }
200
- | 'try' ':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) }
201
+ | 'try' && ':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) }
202
+ | 'try' && ':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) }
201
203
except_block[excepthandler_ty]:
202
- | 'except' e=expression t=['as' z=NAME { z }] ':' b=block {
204
+ | 'except' e=expression t=['as' z=NAME { z }] && ':' b=block {
203
205
_Py_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) }
204
- | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) }
206
+ | 'except' && ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) }
205
207
finally_block[asdl_stmt_seq*]: 'finally' ':' a=block { a }
206
208
207
209
return_stmt[stmt_ty]:
@@ -216,11 +218,11 @@ function_def[stmt_ty]:
216
218
| function_def_raw
217
219
218
220
function_def_raw[stmt_ty]:
219
- | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block {
221
+ | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] && ':' tc=[func_type_comment] b=block {
220
222
_Py_FunctionDef(n->v.Name.id,
221
223
(params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)),
222
224
b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) }
223
- | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block {
225
+ | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] && ':' tc=[func_type_comment] b=block {
224
226
CHECK_VERSION(
225
227
stmt_ty,
226
228
5,
@@ -300,7 +302,7 @@ class_def[stmt_ty]:
300
302
| a=decorators b=class_def_raw { _PyPegen_class_def_decorators(p, a, b) }
301
303
| class_def_raw
302
304
class_def_raw[stmt_ty]:
303
- | 'class' a=NAME b=['(' z=[arguments] ')' { z }] ':' c=block {
305
+ | 'class' a=NAME b=['(' z=[arguments] ')' { z }] && ':' c=block {
304
306
_Py_ClassDef(a->v.Name.id,
305
307
(b) ? ((expr_ty) b)->v.Call.args : NULL,
306
308
(b) ? ((expr_ty) b)->v.Call.keywords : NULL,
@@ -718,7 +720,7 @@ invalid_double_type_comments:
718
720
| TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT {
719
721
RAISE_SYNTAX_ERROR("Cannot have two type comments on def") }
720
722
invalid_with_item:
721
- | expression 'as' a=expression {
723
+ | expression 'as' a=expression &(',' | ')' | ':') {
722
724
RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
723
725
724
726
invalid_for_target:
@@ -731,3 +733,7 @@ invalid_group:
731
733
invalid_import_from_targets:
732
734
| import_from_as_names ',' {
733
735
RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") }
736
+
737
+ invalid_with_stmt:
738
+ | [ASYNC] 'with' ','.(expression ['as' star_target])+ &&':'
739
+ | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':'
0 commit comments