Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 298650c

Browse files
authored
Reproduce current parser's error messages for indentation errors (#107)
1 parent 975baa4 commit 298650c

File tree

4 files changed

+189
-134
lines changed

4 files changed

+189
-134
lines changed

Grammar/python.gram

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,10 @@ class_def_raw[stmt_ty]:
224224
(b) ? ((expr_ty) b)->v.Call.keywords : NULL,
225225
c, NULL, EXTRA) }
226226

227-
block[asdl_seq*] (memo): NEWLINE INDENT a=statements DEDENT { a } | simple_stmt
227+
block[asdl_seq*] (memo):
228+
| NEWLINE INDENT a=statements DEDENT { a }
229+
| simple_stmt
230+
| invalid_block
228231

229232
expressions_list[asdl_seq*]: a=','.star_expression+ [','] { a }
230233
star_expressions[expr_ty]:
@@ -532,3 +535,5 @@ invalid_assignment:
532535
_PyPegen_raise_syntax_error(p, "illegal target for annotation") }
533536
| a=expression ('=' | augassign) (yield_expr | star_expressions) {
534537
_PyPegen_raise_syntax_error(p, "cannot assign to %s", _PyPegen_get_expr_name(a)) }
538+
invalid_block:
539+
| NEWLINE !INDENT { _PyPegen_raise_syntax_error(p, "expected an indented block") }

Lib/test/test_peg_parser.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,8 @@ def f():
602602
("[a, b]: int", "only single target (not list) can be annotated"),
603603
("a(): int", "illegal target for annotation"),
604604
("1 += 1", "cannot assign to literal"),
605+
("pass\n pass", "unexpected indent"),
606+
("def f():\npass", "expected an indented block"),
605607
]
606608

607609
GOOD_BUT_FAIL_TEST_CASES = [

Parser/pegen/parse.c

Lines changed: 172 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -199,137 +199,138 @@ static KeywordToken *reserved_keywords[] = {
199199
#define incorrect_arguments_type 1137
200200
#define invalid_named_expression_type 1138
201201
#define invalid_assignment_type 1139
202-
#define _loop0_1_type 1140
203-
#define _loop1_2_type 1141
204-
#define _loop0_4_type 1142
205-
#define _gather_3_type 1143
206-
#define _tmp_5_type 1144
207-
#define _tmp_6_type 1145
208-
#define _tmp_7_type 1146
209-
#define _tmp_8_type 1147
210-
#define _tmp_9_type 1148
211-
#define _tmp_10_type 1149
212-
#define _tmp_11_type 1150
213-
#define _tmp_12_type 1151
214-
#define _loop1_13_type 1152
215-
#define _tmp_14_type 1153
216-
#define _tmp_15_type 1154
217-
#define _loop0_17_type 1155
218-
#define _gather_16_type 1156
219-
#define _loop0_19_type 1157
220-
#define _gather_18_type 1158
221-
#define _tmp_20_type 1159
222-
#define _loop0_21_type 1160
223-
#define _loop1_22_type 1161
224-
#define _loop0_24_type 1162
225-
#define _gather_23_type 1163
226-
#define _tmp_25_type 1164
227-
#define _loop0_27_type 1165
228-
#define _gather_26_type 1166
229-
#define _tmp_28_type 1167
230-
#define _loop0_30_type 1168
231-
#define _gather_29_type 1169
232-
#define _loop0_32_type 1170
233-
#define _gather_31_type 1171
234-
#define _tmp_33_type 1172
235-
#define _loop1_34_type 1173
236-
#define _tmp_35_type 1174
237-
#define _tmp_36_type 1175
238-
#define _tmp_37_type 1176
239-
#define _tmp_38_type 1177
240-
#define _tmp_39_type 1178
241-
#define _tmp_40_type 1179
242-
#define _tmp_41_type 1180
243-
#define _tmp_42_type 1181
244-
#define _tmp_43_type 1182
245-
#define _tmp_44_type 1183
246-
#define _tmp_45_type 1184
247-
#define _tmp_46_type 1185
248-
#define _loop0_47_type 1186
249-
#define _tmp_48_type 1187
250-
#define _loop1_49_type 1188
251-
#define _tmp_50_type 1189
252-
#define _tmp_51_type 1190
253-
#define _loop0_53_type 1191
254-
#define _gather_52_type 1192
255-
#define _loop0_55_type 1193
256-
#define _gather_54_type 1194
257-
#define _tmp_56_type 1195
258-
#define _loop1_57_type 1196
259-
#define _tmp_58_type 1197
260-
#define _loop0_60_type 1198
261-
#define _gather_59_type 1199
262-
#define _loop1_61_type 1200
263-
#define _loop0_63_type 1201
264-
#define _gather_62_type 1202
265-
#define _loop1_64_type 1203
266-
#define _tmp_65_type 1204
267-
#define _tmp_66_type 1205
268-
#define _tmp_67_type 1206
269-
#define _tmp_68_type 1207
270-
#define _tmp_69_type 1208
271-
#define _tmp_70_type 1209
272-
#define _tmp_71_type 1210
273-
#define _tmp_72_type 1211
274-
#define _tmp_73_type 1212
275-
#define _loop0_74_type 1213
276-
#define _tmp_75_type 1214
277-
#define _loop1_76_type 1215
278-
#define _tmp_77_type 1216
279-
#define _tmp_78_type 1217
280-
#define _loop0_80_type 1218
281-
#define _gather_79_type 1219
282-
#define _loop0_82_type 1220
283-
#define _gather_81_type 1221
284-
#define _loop1_83_type 1222
285-
#define _loop1_84_type 1223
286-
#define _loop1_85_type 1224
287-
#define _loop0_87_type 1225
288-
#define _gather_86_type 1226
289-
#define _tmp_88_type 1227
290-
#define _tmp_89_type 1228
291-
#define _tmp_90_type 1229
292-
#define _tmp_91_type 1230
293-
#define _loop1_92_type 1231
294-
#define _tmp_93_type 1232
295-
#define _tmp_94_type 1233
296-
#define _loop0_96_type 1234
297-
#define _gather_95_type 1235
298-
#define _loop1_97_type 1236
299-
#define _tmp_98_type 1237
300-
#define _tmp_99_type 1238
301-
#define _loop0_101_type 1239
302-
#define _gather_100_type 1240
303-
#define _loop0_103_type 1241
304-
#define _gather_102_type 1242
305-
#define _loop0_105_type 1243
306-
#define _gather_104_type 1244
307-
#define _loop0_107_type 1245
308-
#define _gather_106_type 1246
309-
#define _loop0_108_type 1247
310-
#define _loop0_110_type 1248
311-
#define _gather_109_type 1249
312-
#define _loop0_112_type 1250
313-
#define _gather_111_type 1251
314-
#define _loop0_114_type 1252
315-
#define _gather_113_type 1253
316-
#define _tmp_115_type 1254
317-
#define _tmp_116_type 1255
318-
#define _tmp_117_type 1256
319-
#define _tmp_118_type 1257
320-
#define _tmp_119_type 1258
321-
#define _tmp_120_type 1259
322-
#define _tmp_121_type 1260
323-
#define _tmp_122_type 1261
324-
#define _tmp_123_type 1262
325-
#define _tmp_124_type 1263
326-
#define _tmp_125_type 1264
327-
#define _tmp_126_type 1265
328-
#define _tmp_127_type 1266
329-
#define _tmp_128_type 1267
330-
#define _tmp_129_type 1268
331-
#define _loop0_130_type 1269
332-
#define _tmp_131_type 1270
202+
#define invalid_block_type 1140
203+
#define _loop0_1_type 1141
204+
#define _loop1_2_type 1142
205+
#define _loop0_4_type 1143
206+
#define _gather_3_type 1144
207+
#define _tmp_5_type 1145
208+
#define _tmp_6_type 1146
209+
#define _tmp_7_type 1147
210+
#define _tmp_8_type 1148
211+
#define _tmp_9_type 1149
212+
#define _tmp_10_type 1150
213+
#define _tmp_11_type 1151
214+
#define _tmp_12_type 1152
215+
#define _loop1_13_type 1153
216+
#define _tmp_14_type 1154
217+
#define _tmp_15_type 1155
218+
#define _loop0_17_type 1156
219+
#define _gather_16_type 1157
220+
#define _loop0_19_type 1158
221+
#define _gather_18_type 1159
222+
#define _tmp_20_type 1160
223+
#define _loop0_21_type 1161
224+
#define _loop1_22_type 1162
225+
#define _loop0_24_type 1163
226+
#define _gather_23_type 1164
227+
#define _tmp_25_type 1165
228+
#define _loop0_27_type 1166
229+
#define _gather_26_type 1167
230+
#define _tmp_28_type 1168
231+
#define _loop0_30_type 1169
232+
#define _gather_29_type 1170
233+
#define _loop0_32_type 1171
234+
#define _gather_31_type 1172
235+
#define _tmp_33_type 1173
236+
#define _loop1_34_type 1174
237+
#define _tmp_35_type 1175
238+
#define _tmp_36_type 1176
239+
#define _tmp_37_type 1177
240+
#define _tmp_38_type 1178
241+
#define _tmp_39_type 1179
242+
#define _tmp_40_type 1180
243+
#define _tmp_41_type 1181
244+
#define _tmp_42_type 1182
245+
#define _tmp_43_type 1183
246+
#define _tmp_44_type 1184
247+
#define _tmp_45_type 1185
248+
#define _tmp_46_type 1186
249+
#define _loop0_47_type 1187
250+
#define _tmp_48_type 1188
251+
#define _loop1_49_type 1189
252+
#define _tmp_50_type 1190
253+
#define _tmp_51_type 1191
254+
#define _loop0_53_type 1192
255+
#define _gather_52_type 1193
256+
#define _loop0_55_type 1194
257+
#define _gather_54_type 1195
258+
#define _tmp_56_type 1196
259+
#define _loop1_57_type 1197
260+
#define _tmp_58_type 1198
261+
#define _loop0_60_type 1199
262+
#define _gather_59_type 1200
263+
#define _loop1_61_type 1201
264+
#define _loop0_63_type 1202
265+
#define _gather_62_type 1203
266+
#define _loop1_64_type 1204
267+
#define _tmp_65_type 1205
268+
#define _tmp_66_type 1206
269+
#define _tmp_67_type 1207
270+
#define _tmp_68_type 1208
271+
#define _tmp_69_type 1209
272+
#define _tmp_70_type 1210
273+
#define _tmp_71_type 1211
274+
#define _tmp_72_type 1212
275+
#define _tmp_73_type 1213
276+
#define _loop0_74_type 1214
277+
#define _tmp_75_type 1215
278+
#define _loop1_76_type 1216
279+
#define _tmp_77_type 1217
280+
#define _tmp_78_type 1218
281+
#define _loop0_80_type 1219
282+
#define _gather_79_type 1220
283+
#define _loop0_82_type 1221
284+
#define _gather_81_type 1222
285+
#define _loop1_83_type 1223
286+
#define _loop1_84_type 1224
287+
#define _loop1_85_type 1225
288+
#define _loop0_87_type 1226
289+
#define _gather_86_type 1227
290+
#define _tmp_88_type 1228
291+
#define _tmp_89_type 1229
292+
#define _tmp_90_type 1230
293+
#define _tmp_91_type 1231
294+
#define _loop1_92_type 1232
295+
#define _tmp_93_type 1233
296+
#define _tmp_94_type 1234
297+
#define _loop0_96_type 1235
298+
#define _gather_95_type 1236
299+
#define _loop1_97_type 1237
300+
#define _tmp_98_type 1238
301+
#define _tmp_99_type 1239
302+
#define _loop0_101_type 1240
303+
#define _gather_100_type 1241
304+
#define _loop0_103_type 1242
305+
#define _gather_102_type 1243
306+
#define _loop0_105_type 1244
307+
#define _gather_104_type 1245
308+
#define _loop0_107_type 1246
309+
#define _gather_106_type 1247
310+
#define _loop0_108_type 1248
311+
#define _loop0_110_type 1249
312+
#define _gather_109_type 1250
313+
#define _loop0_112_type 1251
314+
#define _gather_111_type 1252
315+
#define _loop0_114_type 1253
316+
#define _gather_113_type 1254
317+
#define _tmp_115_type 1255
318+
#define _tmp_116_type 1256
319+
#define _tmp_117_type 1257
320+
#define _tmp_118_type 1258
321+
#define _tmp_119_type 1259
322+
#define _tmp_120_type 1260
323+
#define _tmp_121_type 1261
324+
#define _tmp_122_type 1262
325+
#define _tmp_123_type 1263
326+
#define _tmp_124_type 1264
327+
#define _tmp_125_type 1265
328+
#define _tmp_126_type 1266
329+
#define _tmp_127_type 1267
330+
#define _tmp_128_type 1268
331+
#define _tmp_129_type 1269
332+
#define _loop0_130_type 1270
333+
#define _tmp_131_type 1271
333334

334335
static mod_ty file_rule(Parser *p);
335336
static mod_ty interactive_rule(Parser *p);
@@ -471,6 +472,7 @@ static expr_ty t_atom_rule(Parser *p);
471472
static void *incorrect_arguments_rule(Parser *p);
472473
static void *invalid_named_expression_rule(Parser *p);
473474
static void *invalid_assignment_rule(Parser *p);
475+
static void *invalid_block_rule(Parser *p);
474476
static asdl_seq *_loop0_1_rule(Parser *p);
475477
static asdl_seq *_loop1_2_rule(Parser *p);
476478
static asdl_seq *_loop0_4_rule(Parser *p);
@@ -3651,7 +3653,7 @@ class_def_raw_rule(Parser *p)
36513653
return res;
36523654
}
36533655

3654-
// block: NEWLINE INDENT statements DEDENT | simple_stmt
3656+
// block: NEWLINE INDENT statements DEDENT | simple_stmt | invalid_block
36553657
static asdl_seq*
36563658
block_rule(Parser *p)
36573659
{
@@ -3693,6 +3695,17 @@ block_rule(Parser *p)
36933695
}
36943696
p->mark = mark;
36953697
}
3698+
{ // invalid_block
3699+
void *invalid_block_var;
3700+
if (
3701+
(invalid_block_var = invalid_block_rule(p))
3702+
)
3703+
{
3704+
res = invalid_block_var;
3705+
goto done;
3706+
}
3707+
p->mark = mark;
3708+
}
36963709
res = NULL;
36973710
done:
36983711
_PyPegen_insert_memo(p, mark, block_type, res);
@@ -9043,6 +9056,33 @@ invalid_assignment_rule(Parser *p)
90439056
return res;
90449057
}
90459058

9059+
// invalid_block: NEWLINE !INDENT
9060+
static void *
9061+
invalid_block_rule(Parser *p)
9062+
{
9063+
void * res = NULL;
9064+
int mark = p->mark;
9065+
{ // NEWLINE !INDENT
9066+
void *newline_var;
9067+
if (
9068+
(newline_var = _PyPegen_newline_token(p))
9069+
&&
9070+
_PyPegen_lookahead(0, _PyPegen_indent_token, p)
9071+
)
9072+
{
9073+
res = _PyPegen_raise_syntax_error ( p , "expected an indented block" );
9074+
if (res == NULL && PyErr_Occurred()) {
9075+
longjmp(p->error_env, 1);
9076+
}
9077+
goto done;
9078+
}
9079+
p->mark = mark;
9080+
}
9081+
res = NULL;
9082+
done:
9083+
return res;
9084+
}
9085+
90469086
// _loop0_1: NEWLINE
90479087
static asdl_seq *
90489088
_loop0_1_rule(Parser *p)

Parser/pegen/pegen.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,15 @@ _PyPegen_run_parser(Parser *p)
762762
_PyPegen_raise_syntax_error(p, "error at start before reading any input");
763763
}
764764
else {
765-
_PyPegen_raise_syntax_error(p, "invalid syntax");
765+
if (p->tokens[p->fill-1]->type == INDENT) {
766+
_PyPegen_raise_syntax_error(p, "unexpected indent");
767+
}
768+
else if (p->tokens[p->fill-1]->type == DEDENT) {
769+
_PyPegen_raise_syntax_error(p, "unexpected unindent");
770+
}
771+
else {
772+
_PyPegen_raise_syntax_error(p, "invalid syntax");
773+
}
766774
}
767775
return NULL;
768776
}

0 commit comments

Comments
 (0)