blob: 48aef4815db2ff76a5fb638ec15f1fe7ea50f3bd [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
112 if (args->varargannotation) {
113 if (!args->vararg) {
114 PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
115 return 0;
116 }
117 if (!validate_expr(args->varargannotation, Load))
118 return 0;
119 }
120 if (!validate_args(args->kwonlyargs))
121 return 0;
122 if (args->kwargannotation) {
123 if (!args->kwarg) {
124 PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
125 return 0;
126 }
127 if (!validate_expr(args->kwargannotation, Load))
128 return 0;
129 }
130 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
131 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
132 return 0;
133 }
134 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
135 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
136 "kw_defaults on arguments");
137 return 0;
138 }
139 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
140}
141
142static int
143validate_expr(expr_ty exp, expr_context_ty ctx)
144{
145 int check_ctx = 1;
146 expr_context_ty actual_ctx;
147
148 /* First check expression context. */
149 switch (exp->kind) {
150 case Attribute_kind:
151 actual_ctx = exp->v.Attribute.ctx;
152 break;
153 case Subscript_kind:
154 actual_ctx = exp->v.Subscript.ctx;
155 break;
156 case Starred_kind:
157 actual_ctx = exp->v.Starred.ctx;
158 break;
159 case Name_kind:
160 actual_ctx = exp->v.Name.ctx;
161 break;
162 case List_kind:
163 actual_ctx = exp->v.List.ctx;
164 break;
165 case Tuple_kind:
166 actual_ctx = exp->v.Tuple.ctx;
167 break;
168 default:
169 if (ctx != Load) {
170 PyErr_Format(PyExc_ValueError, "expression which can't be "
171 "assigned to in %s context", expr_context_name(ctx));
172 return 0;
173 }
174 check_ctx = 0;
175 }
176 if (check_ctx && actual_ctx != ctx) {
177 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
178 expr_context_name(ctx), expr_context_name(actual_ctx));
179 return 0;
180 }
181
182 /* Now validate expression. */
183 switch (exp->kind) {
184 case BoolOp_kind:
185 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
186 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
187 return 0;
188 }
189 return validate_exprs(exp->v.BoolOp.values, Load, 0);
190 case BinOp_kind:
191 return validate_expr(exp->v.BinOp.left, Load) &&
192 validate_expr(exp->v.BinOp.right, Load);
193 case UnaryOp_kind:
194 return validate_expr(exp->v.UnaryOp.operand, Load);
195 case Lambda_kind:
196 return validate_arguments(exp->v.Lambda.args) &&
197 validate_expr(exp->v.Lambda.body, Load);
198 case IfExp_kind:
199 return validate_expr(exp->v.IfExp.test, Load) &&
200 validate_expr(exp->v.IfExp.body, Load) &&
201 validate_expr(exp->v.IfExp.orelse, Load);
202 case Dict_kind:
203 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
204 PyErr_SetString(PyExc_ValueError,
205 "Dict doesn't have the same number of keys as values");
206 return 0;
207 }
208 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
209 validate_exprs(exp->v.Dict.values, Load, 0);
210 case Set_kind:
211 return validate_exprs(exp->v.Set.elts, Load, 0);
212#define COMP(NAME) \
213 case NAME ## _kind: \
214 return validate_comprehension(exp->v.NAME.generators) && \
215 validate_expr(exp->v.NAME.elt, Load);
216 COMP(ListComp)
217 COMP(SetComp)
218 COMP(GeneratorExp)
219#undef COMP
220 case DictComp_kind:
221 return validate_comprehension(exp->v.DictComp.generators) &&
222 validate_expr(exp->v.DictComp.key, Load) &&
223 validate_expr(exp->v.DictComp.value, Load);
224 case Yield_kind:
225 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
226 case Compare_kind:
227 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
228 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
229 return 0;
230 }
231 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
232 asdl_seq_LEN(exp->v.Compare.ops)) {
233 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
234 "of comparators and operands");
235 return 0;
236 }
237 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
238 validate_expr(exp->v.Compare.left, Load);
239 case Call_kind:
240 return validate_expr(exp->v.Call.func, Load) &&
241 validate_exprs(exp->v.Call.args, Load, 0) &&
242 validate_keywords(exp->v.Call.keywords) &&
243 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
244 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
245 case Num_kind: {
246 PyObject *n = exp->v.Num.n;
247 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
248 !PyComplex_CheckExact(n)) {
249 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
250 return 0;
251 }
252 return 1;
253 }
254 case Str_kind: {
255 PyObject *s = exp->v.Str.s;
256 if (!PyUnicode_CheckExact(s)) {
257 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
258 return 0;
259 }
260 return 1;
261 }
262 case Bytes_kind: {
263 PyObject *b = exp->v.Bytes.s;
264 if (!PyBytes_CheckExact(b)) {
265 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
266 return 0;
267 }
268 return 1;
269 }
270 case Attribute_kind:
271 return validate_expr(exp->v.Attribute.value, Load);
272 case Subscript_kind:
273 return validate_slice(exp->v.Subscript.slice) &&
274 validate_expr(exp->v.Subscript.value, Load);
275 case Starred_kind:
276 return validate_expr(exp->v.Starred.value, ctx);
277 case List_kind:
278 return validate_exprs(exp->v.List.elts, ctx, 0);
279 case Tuple_kind:
280 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
281 /* These last cases don't have any checking. */
282 case Name_kind:
283 case Ellipsis_kind:
284 return 1;
285 default:
286 PyErr_SetString(PyExc_SystemError, "unexpected expression");
287 return 0;
288 }
289}
290
291static int
292validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
293{
294 if (asdl_seq_LEN(seq))
295 return 1;
296 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
297 return 0;
298}
299
300static int
301validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
302{
303 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
304 validate_exprs(targets, ctx, 0);
305}
306
307static int
308validate_body(asdl_seq *body, const char *owner)
309{
310 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
311}
312
313static int
314validate_stmt(stmt_ty stmt)
315{
316 int i;
317 switch (stmt->kind) {
318 case FunctionDef_kind:
319 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
320 validate_arguments(stmt->v.FunctionDef.args) &&
321 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
322 (!stmt->v.FunctionDef.returns ||
323 validate_expr(stmt->v.FunctionDef.returns, Load));
324 case ClassDef_kind:
325 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
326 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
327 validate_keywords(stmt->v.ClassDef.keywords) &&
328 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
329 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
330 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
331 case Return_kind:
332 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
333 case Delete_kind:
334 return validate_assignlist(stmt->v.Delete.targets, Del);
335 case Assign_kind:
336 return validate_assignlist(stmt->v.Assign.targets, Store) &&
337 validate_expr(stmt->v.Assign.value, Load);
338 case AugAssign_kind:
339 return validate_expr(stmt->v.AugAssign.target, Store) &&
340 validate_expr(stmt->v.AugAssign.value, Load);
341 case For_kind:
342 return validate_expr(stmt->v.For.target, Store) &&
343 validate_expr(stmt->v.For.iter, Load) &&
344 validate_body(stmt->v.For.body, "For") &&
345 validate_stmts(stmt->v.For.orelse);
346 case While_kind:
347 return validate_expr(stmt->v.While.test, Load) &&
348 validate_body(stmt->v.While.body, "While") &&
349 validate_stmts(stmt->v.While.orelse);
350 case If_kind:
351 return validate_expr(stmt->v.If.test, Load) &&
352 validate_body(stmt->v.If.body, "If") &&
353 validate_stmts(stmt->v.If.orelse);
354 case With_kind:
355 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
356 return 0;
357 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
358 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
359 if (!validate_expr(item->context_expr, Load) ||
360 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
361 return 0;
362 }
363 return validate_body(stmt->v.With.body, "With");
364 case Raise_kind:
365 if (stmt->v.Raise.exc) {
366 return validate_expr(stmt->v.Raise.exc, Load) &&
367 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
368 }
369 if (stmt->v.Raise.cause) {
370 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
371 return 0;
372 }
373 return 1;
374 case Try_kind:
375 if (!validate_body(stmt->v.Try.body, "Try"))
376 return 0;
377 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
378 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
379 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
380 return 0;
381 }
382 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
383 asdl_seq_LEN(stmt->v.Try.orelse)) {
384 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
385 return 0;
386 }
387 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
388 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
389 if ((handler->v.ExceptHandler.type &&
390 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
391 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
392 return 0;
393 }
394 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
395 validate_stmts(stmt->v.Try.finalbody)) &&
396 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
397 validate_stmts(stmt->v.Try.orelse));
398 case Assert_kind:
399 return validate_expr(stmt->v.Assert.test, Load) &&
400 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
401 case Import_kind:
402 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
403 case ImportFrom_kind:
404 if (stmt->v.ImportFrom.level < -1) {
405 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
406 return 0;
407 }
408 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
409 case Global_kind:
410 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
411 case Nonlocal_kind:
412 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
413 case Expr_kind:
414 return validate_expr(stmt->v.Expr.value, Load);
415 case Pass_kind:
416 case Break_kind:
417 case Continue_kind:
418 return 1;
419 default:
420 PyErr_SetString(PyExc_SystemError, "unexpected statement");
421 return 0;
422 }
423}
424
425static int
426validate_stmts(asdl_seq *seq)
427{
428 int i;
429 for (i = 0; i < asdl_seq_LEN(seq); i++) {
430 stmt_ty stmt = asdl_seq_GET(seq, i);
431 if (stmt) {
432 if (!validate_stmt(stmt))
433 return 0;
434 }
435 else {
436 PyErr_SetString(PyExc_ValueError,
437 "None disallowed in statement list");
438 return 0;
439 }
440 }
441 return 1;
442}
443
444static int
445validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
446{
447 int i;
448 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
449 expr_ty expr = asdl_seq_GET(exprs, i);
450 if (expr) {
451 if (!validate_expr(expr, ctx))
452 return 0;
453 }
454 else if (!null_ok) {
455 PyErr_SetString(PyExc_ValueError,
456 "None disallowed in expression list");
457 return 0;
458 }
459
460 }
461 return 1;
462}
463
464int
465PyAST_Validate(mod_ty mod)
466{
467 int res = 0;
468
469 switch (mod->kind) {
470 case Module_kind:
471 res = validate_stmts(mod->v.Module.body);
472 break;
473 case Interactive_kind:
474 res = validate_stmts(mod->v.Interactive.body);
475 break;
476 case Expression_kind:
477 res = validate_expr(mod->v.Expression.body, Load);
478 break;
479 case Suite_kind:
480 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
481 break;
482 default:
483 PyErr_SetString(PyExc_SystemError, "impossible module node");
484 res = 0;
485 break;
486 }
487 return res;
488}
489
490/* This is down here, so defines like "test" don't intefere with access AST above. */
491#include "grammar.h"
492#include "parsetok.h"
493#include "graminit.h"
494
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495/* Data structure used internally */
496struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000497 char *c_encoding; /* source encoding */
498 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000499 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500};
501
502static asdl_seq *seq_for_testlist(struct compiling *, const node *);
503static expr_ty ast_for_expr(struct compiling *, const node *);
504static stmt_ty ast_for_stmt(struct compiling *, const node *);
505static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000506static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
507 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000508static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000509static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000510
511/* Note different signature for ast_for_call */
512static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
513
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000514static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000515static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000516static PyObject *parsestrplus(struct compiling *, const node *n,
517 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521#endif
522
Nick Coghlan650f0d02007-04-15 12:05:43 +0000523#define COMP_GENEXP 0
524#define COMP_LISTCOMP 1
525#define COMP_SETCOMP 2
526
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000527static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +0000528new_identifier(const char* n, PyArena *arena)
529{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200530 _Py_IDENTIFIER(normalize);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000531 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200532 if (!id || PyUnicode_READY(id) == -1)
Benjamin Peterson30760062008-11-25 04:02:28 +0000533 return NULL;
Martin v. Löwis47383402007-08-15 07:32:56 +0000534 /* Check whether there are non-ASCII characters in the
535 identifier; if so, normalize to NFKC. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200536 if (PyUnicode_MAX_CHAR_VALUE((PyUnicodeObject *)id) >= 128) {
537 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
538 PyObject *id2;
539 if (!m)
540 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200541 id2 = _PyObject_CallMethodId(m, &PyId_normalize, "sO", "NFKC", id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200542 Py_DECREF(m);
543 if (!id2)
544 return NULL;
545 Py_DECREF(id);
546 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000547 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000548 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000549 PyArena_AddPyObject(arena, id);
550 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551}
552
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000553#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554
555/* This routine provides an invalid object for the syntax error.
556 The outermost routine must unpack this error and create the
557 proper object. We do this so that we don't have to pass
558 the filename to everything function.
559
560 XXX Maybe we should just pass the filename...
561*/
562
563static int
564ast_error(const node *n, const char *errstr)
565{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000566 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 PyErr_SetObject(PyExc_SyntaxError, u);
570 Py_DECREF(u);
571 return 0;
572}
573
574static void
575ast_error_finish(const char *filename)
576{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000577 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000578 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000579 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580
581 assert(PyErr_Occurred());
582 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000583 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584
585 PyErr_Fetch(&type, &value, &tback);
586 errstr = PyTuple_GetItem(value, 0);
587 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000588 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000590 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000591 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000592 Py_DECREF(errstr);
593 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000594 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000595 offset = PyTuple_GetItem(value, 2);
596 if (!offset) {
597 Py_DECREF(errstr);
598 return;
599 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 Py_DECREF(value);
601
602 loc = PyErr_ProgramText(filename, lineno);
603 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000604 Py_INCREF(Py_None);
605 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000607 if (filename != NULL)
608 filename_obj = PyUnicode_DecodeFSDefault(filename);
609 else {
610 Py_INCREF(Py_None);
611 filename_obj = Py_None;
612 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000613 if (filename_obj != NULL)
614 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
615 else
616 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000617 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000618 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000619 Py_DECREF(errstr);
620 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000621 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000622 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623 Py_DECREF(errstr);
624 Py_DECREF(tmp);
625 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000626 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 PyErr_Restore(type, value, tback);
628}
629
630/* num_stmts() returns number of contained statements.
631
632 Use this routine to determine how big a sequence is needed for
633 the statements in a parse tree. Its raison d'etre is this bit of
634 grammar:
635
636 stmt: simple_stmt | compound_stmt
637 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
638
639 A simple_stmt can contain multiple small_stmt elements joined
640 by semicolons. If the arg is a simple_stmt, the number of
641 small_stmt elements is returned.
642*/
643
644static int
645num_stmts(const node *n)
646{
647 int i, l;
648 node *ch;
649
650 switch (TYPE(n)) {
651 case single_input:
652 if (TYPE(CHILD(n, 0)) == NEWLINE)
653 return 0;
654 else
655 return num_stmts(CHILD(n, 0));
656 case file_input:
657 l = 0;
658 for (i = 0; i < NCH(n); i++) {
659 ch = CHILD(n, i);
660 if (TYPE(ch) == stmt)
661 l += num_stmts(ch);
662 }
663 return l;
664 case stmt:
665 return num_stmts(CHILD(n, 0));
666 case compound_stmt:
667 return 1;
668 case simple_stmt:
669 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
670 case suite:
671 if (NCH(n) == 1)
672 return num_stmts(CHILD(n, 0));
673 else {
674 l = 0;
675 for (i = 2; i < (NCH(n) - 1); i++)
676 l += num_stmts(CHILD(n, i));
677 return l;
678 }
679 default: {
680 char buf[128];
681
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000682 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683 TYPE(n), NCH(n));
684 Py_FatalError(buf);
685 }
686 }
687 assert(0);
688 return 0;
689}
690
691/* Transform the CST rooted at node * to the appropriate AST
692*/
693
694mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000695PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
696 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000697{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000698 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000699 asdl_seq *stmts = NULL;
700 stmt_ty s;
701 node *ch;
702 struct compiling c;
703
704 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000705 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000706 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000707#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000708 ast_error(n, "encoding declaration in Unicode string");
709 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000710#endif
711 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000712 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 } else if (TYPE(n) == encoding_decl) {
714 c.c_encoding = STR(n);
715 n = CHILD(n, 0);
716 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000718 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000719 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000720 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000721 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722
Jeremy Hyltona8293132006-02-28 17:58:27 +0000723 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000724 switch (TYPE(n)) {
725 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000726 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 for (i = 0; i < NCH(n) - 1; i++) {
730 ch = CHILD(n, i);
731 if (TYPE(ch) == NEWLINE)
732 continue;
733 REQ(ch, stmt);
734 num = num_stmts(ch);
735 if (num == 1) {
736 s = ast_for_stmt(&c, ch);
737 if (!s)
738 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000739 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740 }
741 else {
742 ch = CHILD(ch, 0);
743 REQ(ch, simple_stmt);
744 for (j = 0; j < num; j++) {
745 s = ast_for_stmt(&c, CHILD(ch, j * 2));
746 if (!s)
747 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000748 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000749 }
750 }
751 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000752 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 case eval_input: {
754 expr_ty testlist_ast;
755
Nick Coghlan650f0d02007-04-15 12:05:43 +0000756 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000757 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 if (!testlist_ast)
759 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000760 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 }
762 case single_input:
763 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000764 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000766 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000767 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
768 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000769 if (!asdl_seq_GET(stmts, 0))
770 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000771 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 }
773 else {
774 n = CHILD(n, 0);
775 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000776 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000778 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000780 s = ast_for_stmt(&c, n);
781 if (!s)
782 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 asdl_seq_SET(stmts, 0, s);
784 }
785 else {
786 /* Only a simple_stmt can contain multiple statements. */
787 REQ(n, simple_stmt);
788 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 if (TYPE(CHILD(n, i)) == NEWLINE)
790 break;
791 s = ast_for_stmt(&c, CHILD(n, i));
792 if (!s)
793 goto error;
794 asdl_seq_SET(stmts, i / 2, s);
795 }
796 }
797
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000798 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799 }
800 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000801 PyErr_Format(PyExc_SystemError,
802 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 goto error;
804 }
805 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 ast_error_finish(filename);
807 return NULL;
808}
809
810/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
811*/
812
813static operator_ty
814get_operator(const node *n)
815{
816 switch (TYPE(n)) {
817 case VBAR:
818 return BitOr;
819 case CIRCUMFLEX:
820 return BitXor;
821 case AMPER:
822 return BitAnd;
823 case LEFTSHIFT:
824 return LShift;
825 case RIGHTSHIFT:
826 return RShift;
827 case PLUS:
828 return Add;
829 case MINUS:
830 return Sub;
831 case STAR:
832 return Mult;
833 case SLASH:
834 return Div;
835 case DOUBLESLASH:
836 return FloorDiv;
837 case PERCENT:
838 return Mod;
839 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000840 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841 }
842}
843
Guido van Rossume7ba4952007-06-06 23:52:48 +0000844static const char* FORBIDDEN[] = {
845 "None",
846 "True",
847 "False",
848 NULL,
849};
850
851static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000852forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000853{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000854 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000855 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
856 ast_error(n, "assignment to keyword");
857 return 1;
858 }
859 if (full_checks) {
860 const char **p;
861 for (p = FORBIDDEN; *p; p++) {
862 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
863 ast_error(n, "assignment to keyword");
864 return 1;
865 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000866 }
867 }
868 return 0;
869}
870
Jeremy Hyltona8293132006-02-28 17:58:27 +0000871/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872
873 Only sets context for expr kinds that "can appear in assignment context"
874 (according to ../Parser/Python.asdl). For other expr kinds, it sets
875 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876*/
877
878static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000879set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880{
881 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000882 /* If a particular expression type can't be used for assign / delete,
883 set expr_name to its name and an error message will be generated.
884 */
885 const char* expr_name = NULL;
886
887 /* The ast defines augmented store and load contexts, but the
888 implementation here doesn't actually use them. The code may be
889 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000890 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000891 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000892 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000893 */
894 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895
896 switch (e->kind) {
897 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000899 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
900 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000901 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000903 e->v.Subscript.ctx = ctx;
904 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000905 case Starred_kind:
906 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000907 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000908 return 0;
909 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000911 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000912 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000913 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000914 }
915 e->v.Name.ctx = ctx;
916 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000918 e->v.List.ctx = ctx;
919 s = e->v.List.elts;
920 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000922 if (asdl_seq_LEN(e->v.Tuple.elts)) {
923 e->v.Tuple.ctx = ctx;
924 s = e->v.Tuple.elts;
925 }
926 else {
927 expr_name = "()";
928 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000930 case Lambda_kind:
931 expr_name = "lambda";
932 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000934 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000935 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000936 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000938 case UnaryOp_kind:
939 expr_name = "operator";
940 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000942 expr_name = "generator expression";
943 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000944 case Yield_kind:
945 expr_name = "yield expression";
946 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000947 case ListComp_kind:
948 expr_name = "list comprehension";
949 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000950 case SetComp_kind:
951 expr_name = "set comprehension";
952 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000953 case DictComp_kind:
954 expr_name = "dict comprehension";
955 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000956 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000957 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958 case Num_kind:
959 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500960 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000961 expr_name = "literal";
962 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000963 case Ellipsis_kind:
964 expr_name = "Ellipsis";
965 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 case Compare_kind:
967 expr_name = "comparison";
968 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000969 case IfExp_kind:
970 expr_name = "conditional expression";
971 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000972 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyErr_Format(PyExc_SystemError,
974 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 e->kind, e->lineno);
976 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000978 /* Check for error string set by switch */
979 if (expr_name) {
980 char buf[300];
981 PyOS_snprintf(buf, sizeof(buf),
982 "can't %s %s",
983 ctx == Store ? "assign to" : "delete",
984 expr_name);
985 return ast_error(n, buf);
986 }
987
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990 */
991 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000992 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993
Thomas Wouters89f507f2006-12-13 04:49:30 +0000994 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000995 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000996 return 0;
997 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 }
999 return 1;
1000}
1001
1002static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001003ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004{
1005 REQ(n, augassign);
1006 n = CHILD(n, 0);
1007 switch (STR(n)[0]) {
1008 case '+':
1009 return Add;
1010 case '-':
1011 return Sub;
1012 case '/':
1013 if (STR(n)[1] == '/')
1014 return FloorDiv;
1015 else
1016 return Div;
1017 case '%':
1018 return Mod;
1019 case '<':
1020 return LShift;
1021 case '>':
1022 return RShift;
1023 case '&':
1024 return BitAnd;
1025 case '^':
1026 return BitXor;
1027 case '|':
1028 return BitOr;
1029 case '*':
1030 if (STR(n)[1] == '*')
1031 return Pow;
1032 else
1033 return Mult;
1034 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001035 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001036 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 }
1038}
1039
1040static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001041ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001043 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 |'is' 'not'
1045 */
1046 REQ(n, comp_op);
1047 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001048 n = CHILD(n, 0);
1049 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050 case LESS:
1051 return Lt;
1052 case GREATER:
1053 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001054 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055 return Eq;
1056 case LESSEQUAL:
1057 return LtE;
1058 case GREATEREQUAL:
1059 return GtE;
1060 case NOTEQUAL:
1061 return NotEq;
1062 case NAME:
1063 if (strcmp(STR(n), "in") == 0)
1064 return In;
1065 if (strcmp(STR(n), "is") == 0)
1066 return Is;
1067 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001068 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001071 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 }
1073 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001074 /* handle "not in" and "is not" */
1075 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076 case NAME:
1077 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1078 return NotIn;
1079 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1080 return IsNot;
1081 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001082 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001084 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001085 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 }
Neal Norwitz79792652005-11-14 04:25:03 +00001087 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001089 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090}
1091
1092static asdl_seq *
1093seq_for_testlist(struct compiling *c, const node *n)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001096 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1097 */
Armin Rigo31441302005-10-21 12:57:31 +00001098 asdl_seq *seq;
1099 expr_ty expression;
1100 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001101 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001103 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104 if (!seq)
1105 return NULL;
1106
1107 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001109 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
Benjamin Peterson4905e802009-09-27 02:43:28 +00001111 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001112 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114
1115 assert(i / 2 < seq->size);
1116 asdl_seq_SET(seq, i / 2, expression);
1117 }
1118 return seq;
1119}
1120
Neal Norwitzc1505362006-12-28 06:47:50 +00001121static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001122compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001123{
1124 identifier name;
1125 expr_ty annotation = NULL;
1126 node *ch;
1127
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001128 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001129 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001130 name = NEW_IDENTIFIER(ch);
1131 if (!name)
1132 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001133 if (forbidden_name(name, ch, 0))
1134 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001135
1136 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1137 annotation = ast_for_expr(c, CHILD(n, 2));
1138 if (!annotation)
1139 return NULL;
1140 }
1141
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001142 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001143#if 0
1144 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1145 if (!set_context(c, result, Store, n))
1146 return NULL;
1147 return result;
1148#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149}
1150
Guido van Rossum4f72a782006-10-27 23:31:49 +00001151/* returns -1 if failed to handle keyword only arguments
1152 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001153 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001154 ^^^
1155 start pointing here
1156 */
1157static int
1158handle_keywordonly_args(struct compiling *c, const node *n, int start,
1159 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1160{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001161 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001162 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 expr_ty expression, annotation;
1164 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001165 int i = start;
1166 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001167
1168 if (kwonlyargs == NULL) {
1169 ast_error(CHILD(n, start), "named arguments must follow bare *");
1170 return -1;
1171 }
1172 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001173 while (i < NCH(n)) {
1174 ch = CHILD(n, i);
1175 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001176 case vfpdef:
1177 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001178 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001179 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001180 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001181 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 asdl_seq_SET(kwdefaults, j, expression);
1183 i += 2; /* '=' and test */
1184 }
1185 else { /* setting NULL if no default value exists */
1186 asdl_seq_SET(kwdefaults, j, NULL);
1187 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001188 if (NCH(ch) == 3) {
1189 /* ch is NAME ':' test */
1190 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001191 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001193 }
1194 else {
1195 annotation = NULL;
1196 }
1197 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001198 argname = NEW_IDENTIFIER(ch);
1199 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001200 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001201 if (forbidden_name(argname, ch, 0))
1202 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001203 arg = arg(argname, annotation, c->c_arena);
1204 if (!arg)
1205 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001206 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001207 i += 2; /* the name and the comma */
1208 break;
1209 case DOUBLESTAR:
1210 return i;
1211 default:
1212 ast_error(ch, "unexpected node");
1213 goto error;
1214 }
1215 }
1216 return i;
1217 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001219}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220
Jeremy Hyltona8293132006-02-28 17:58:27 +00001221/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222
1223static arguments_ty
1224ast_for_arguments(struct compiling *c, const node *n)
1225{
Neal Norwitzc1505362006-12-28 06:47:50 +00001226 /* This function handles both typedargslist (function definition)
1227 and varargslist (lambda definition).
1228
1229 parameters: '(' [typedargslist] ')'
1230 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001232 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001233 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001234 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001235 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001237 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001238 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001241 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1242 int nposdefaults = 0, found_default = 0;
1243 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001245 arg_ty arg;
1246 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 node *ch;
1248
1249 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001250 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001251 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1252 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001253 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001255 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256
Jeremy Hyltone921e022008-07-17 16:37:17 +00001257 /* First count the number of positional args & defaults. The
1258 variable i is the loop index for this for loop and the next.
1259 The next loop picks up where the first leaves off.
1260 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001262 ch = CHILD(n, i);
1263 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001264 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001265 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001266 if (i < NCH(n) && /* skip argument following star */
1267 (TYPE(CHILD(n, i)) == tfpdef ||
1268 TYPE(CHILD(n, i)) == vfpdef)) {
1269 i++;
1270 }
1271 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001272 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001273 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001274 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001275 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001278 defaults for keyword only args */
1279 for ( ; i < NCH(n); ++i) {
1280 ch = CHILD(n, i);
1281 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001282 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001283 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001284 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1285 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001286 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 kwonlyargs = (nkwonlyargs ?
1288 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1289 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1293 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 since we set NULL as default for keyword only argument w/o default
1297 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001298 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001299 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1300 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001301 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001302
1303 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001304 ast_error(n, "more than 255 arguments");
1305 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001308 /* tfpdef: NAME [':' test]
1309 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 */
1311 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001312 j = 0; /* index for defaults */
1313 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 ch = CHILD(n, i);
1316 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001317 case tfpdef:
1318 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1320 anything other than EQUAL or a comma? */
1321 /* XXX Should NCH(n) check be made a separate check? */
1322 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001323 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1324 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001325 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 assert(posdefaults != NULL);
1327 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001329 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001331 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001334 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001336 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001337 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001338 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001339 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 i += 2; /* the name and the comma */
1341 break;
1342 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001343 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001345 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001346 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001347 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001348 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001349 if (TYPE(ch) == COMMA) {
1350 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 i += 2; /* now follows keyword only arguments */
1352 res = handle_keywordonly_args(c, n, i,
1353 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001354 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 i = res; /* res has new position to process */
1356 }
1357 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001358 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001359 if (!vararg)
1360 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001361 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1362 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001363 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001364 /* there is an annotation on the vararg */
1365 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001366 if (!varargannotation)
1367 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001368 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001369 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001370 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1371 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001372 int res = 0;
1373 res = handle_keywordonly_args(c, n, i,
1374 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001375 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001376 i = res; /* res has new position to process */
1377 }
1378 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 break;
1380 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001381 ch = CHILD(n, i+1); /* tfpdef */
1382 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001383 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001384 if (!kwarg)
1385 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001386 if (NCH(ch) > 1) {
1387 /* there is an annotation on the kwarg */
1388 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001389 if (!kwargannotation)
1390 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001391 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001392 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001393 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 i += 3;
1395 break;
1396 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001397 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 "unexpected node in varargslist: %d @ %d",
1399 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001400 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001401 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001403 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1404 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001405}
1406
1407static expr_ty
1408ast_for_dotted_name(struct compiling *c, const node *n)
1409{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001410 expr_ty e;
1411 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001412 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 int i;
1414
1415 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001416
1417 lineno = LINENO(n);
1418 col_offset = n->n_col_offset;
1419
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 id = NEW_IDENTIFIER(CHILD(n, 0));
1421 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001422 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001423 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001425 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426
1427 for (i = 2; i < NCH(n); i+=2) {
1428 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 if (!id)
1430 return NULL;
1431 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1432 if (!e)
1433 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 }
1435
1436 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437}
1438
1439static expr_ty
1440ast_for_decorator(struct compiling *c, const node *n)
1441{
1442 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1443 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001444 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001447 REQ(CHILD(n, 0), AT);
1448 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1451 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001452 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001455 d = name_expr;
1456 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 }
1458 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001460 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001461 if (!d)
1462 return NULL;
1463 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 }
1465 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 d = ast_for_call(c, CHILD(n, 3), name_expr);
1467 if (!d)
1468 return NULL;
1469 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 }
1471
1472 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473}
1474
1475static asdl_seq*
1476ast_for_decorators(struct compiling *c, const node *n)
1477{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001478 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001479 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001483 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 if (!decorator_seq)
1485 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001488 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001489 if (!d)
1490 return NULL;
1491 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 }
1493 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494}
1495
1496static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001497ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001499 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001500 identifier name;
1501 arguments_ty args;
1502 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001503 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001504 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505
1506 REQ(n, funcdef);
1507
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508 name = NEW_IDENTIFIER(CHILD(n, name_i));
1509 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001510 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001511 if (forbidden_name(name, CHILD(n, name_i), 0))
1512 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1514 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001515 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001516 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1517 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1518 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001519 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001520 name_i += 2;
1521 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522 body = ast_for_suite(c, CHILD(n, name_i + 3));
1523 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001524 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525
Neal Norwitzc1505362006-12-28 06:47:50 +00001526 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001527 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528}
1529
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001530static stmt_ty
1531ast_for_decorated(struct compiling *c, const node *n)
1532{
1533 /* decorated: decorators (classdef | funcdef) */
1534 stmt_ty thing = NULL;
1535 asdl_seq *decorator_seq = NULL;
1536
1537 REQ(n, decorated);
1538
1539 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1540 if (!decorator_seq)
1541 return NULL;
1542
1543 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001545
1546 if (TYPE(CHILD(n, 1)) == funcdef) {
1547 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1548 } else if (TYPE(CHILD(n, 1)) == classdef) {
1549 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1550 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001551 /* we count the decorators in when talking about the class' or
1552 * function's line number */
1553 if (thing) {
1554 thing->lineno = LINENO(n);
1555 thing->col_offset = n->n_col_offset;
1556 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001557 return thing;
1558}
1559
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560static expr_ty
1561ast_for_lambdef(struct compiling *c, const node *n)
1562{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001563 /* lambdef: 'lambda' [varargslist] ':' test
1564 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 arguments_ty args;
1566 expr_ty expression;
1567
1568 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001569 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1570 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571 if (!args)
1572 return NULL;
1573 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001574 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 }
1577 else {
1578 args = ast_for_arguments(c, CHILD(n, 1));
1579 if (!args)
1580 return NULL;
1581 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001582 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584 }
1585
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001586 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587}
1588
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001589static expr_ty
1590ast_for_ifexpr(struct compiling *c, const node *n)
1591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001593 expr_ty expression, body, orelse;
1594
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001595 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001596 body = ast_for_expr(c, CHILD(n, 0));
1597 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001598 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001599 expression = ast_for_expr(c, CHILD(n, 2));
1600 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001601 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001602 orelse = ast_for_expr(c, CHILD(n, 4));
1603 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001604 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001605 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1606 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001607}
1608
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001610 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001611
Nick Coghlan650f0d02007-04-15 12:05:43 +00001612 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613*/
1614
1615static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001616count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001618 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620 count_comp_for:
1621 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001622 REQ(n, comp_for);
1623 if (NCH(n) == 5)
1624 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625 else
1626 return n_fors;
1627 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001628 REQ(n, comp_iter);
1629 n = CHILD(n, 0);
1630 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001632 else if (TYPE(n) == comp_if) {
1633 if (NCH(n) == 3) {
1634 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001635 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001636 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001637 else
1638 return n_fors;
1639 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001640
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641 /* Should never be reached */
1642 PyErr_SetString(PyExc_SystemError,
1643 "logic error in count_comp_fors");
1644 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645}
1646
Nick Coghlan650f0d02007-04-15 12:05:43 +00001647/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648
Nick Coghlan650f0d02007-04-15 12:05:43 +00001649 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650*/
1651
1652static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001653count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001655 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656
Guido van Rossumd8faa362007-04-27 19:54:29 +00001657 while (1) {
1658 REQ(n, comp_iter);
1659 if (TYPE(CHILD(n, 0)) == comp_for)
1660 return n_ifs;
1661 n = CHILD(n, 0);
1662 REQ(n, comp_if);
1663 n_ifs++;
1664 if (NCH(n) == 2)
1665 return n_ifs;
1666 n = CHILD(n, 2);
1667 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668}
1669
Guido van Rossum992d4a32007-07-11 13:09:30 +00001670static asdl_seq *
1671ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001674 asdl_seq *comps;
1675
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001676 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 if (n_fors == -1)
1678 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001679
Nick Coghlan650f0d02007-04-15 12:05:43 +00001680 comps = asdl_seq_new(n_fors, c->c_arena);
1681 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001685 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001687 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001688 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689
Guido van Rossum992d4a32007-07-11 13:09:30 +00001690 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691
Guido van Rossum992d4a32007-07-11 13:09:30 +00001692 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001693 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001694 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001696 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001697 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001699
Thomas Wouters89f507f2006-12-13 04:49:30 +00001700 /* Check the # of children rather than the length of t, since
1701 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001702 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001703 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001704 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001706 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1707 c->c_arena),
1708 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001709 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001711
Guido van Rossum992d4a32007-07-11 13:09:30 +00001712 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 int j, n_ifs;
1714 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715
Guido van Rossum992d4a32007-07-11 13:09:30 +00001716 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001717 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001720
1721 ifs = asdl_seq_new(n_ifs, c->c_arena);
1722 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001724
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001726 REQ(n, comp_iter);
1727 n = CHILD(n, 0);
1728 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001732 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001733 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001734 if (NCH(n) == 3)
1735 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001737 /* on exit, must guarantee that n is a comp_for */
1738 if (TYPE(n) == comp_iter)
1739 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001740 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001742 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001744 return comps;
1745}
1746
1747static expr_ty
1748ast_for_itercomp(struct compiling *c, const node *n, int type)
1749{
1750 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1751 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1752 expr_ty elt;
1753 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754
Guido van Rossum992d4a32007-07-11 13:09:30 +00001755 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756
Guido van Rossum992d4a32007-07-11 13:09:30 +00001757 elt = ast_for_expr(c, CHILD(n, 0));
1758 if (!elt)
1759 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760
Guido van Rossum992d4a32007-07-11 13:09:30 +00001761 comps = ast_for_comprehension(c, CHILD(n, 1));
1762 if (!comps)
1763 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001764
1765 if (type == COMP_GENEXP)
1766 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1767 else if (type == COMP_LISTCOMP)
1768 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1769 else if (type == COMP_SETCOMP)
1770 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1771 else
1772 /* Should never happen */
1773 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774}
1775
1776static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001777ast_for_dictcomp(struct compiling *c, const node *n)
1778{
1779 expr_ty key, value;
1780 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781
Guido van Rossum992d4a32007-07-11 13:09:30 +00001782 assert(NCH(n) > 3);
1783 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784
Guido van Rossum992d4a32007-07-11 13:09:30 +00001785 key = ast_for_expr(c, CHILD(n, 0));
1786 if (!key)
1787 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001788 value = ast_for_expr(c, CHILD(n, 2));
1789 if (!value)
1790 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 comps = ast_for_comprehension(c, CHILD(n, 3));
1793 if (!comps)
1794 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795
Guido van Rossum992d4a32007-07-11 13:09:30 +00001796 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1797}
1798
1799static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800ast_for_genexp(struct compiling *c, const node *n)
1801{
1802 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001803 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001804}
1805
1806static expr_ty
1807ast_for_listcomp(struct compiling *c, const node *n)
1808{
1809 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001810 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001811}
1812
1813static expr_ty
1814ast_for_setcomp(struct compiling *c, const node *n)
1815{
1816 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001817 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001818}
1819
1820
1821static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822ast_for_atom(struct compiling *c, const node *n)
1823{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001824 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1825 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001826 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 */
1828 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001829 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001832 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001833 /* All names start in Load context, but may later be
1834 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001835 PyObject *name = NEW_IDENTIFIER(ch);
1836 if (!name)
1837 return NULL;
1838 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1839 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001841 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001842 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001843 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001844 PyObject *type, *value, *tback, *errstr;
1845 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001846 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001847 if (errstr) {
1848 char *s = "";
1849 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001850 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001851 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1852 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001853 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001854 } else {
1855 ast_error(n, "(unicode error) unknown error");
1856 }
1857 Py_DECREF(type);
1858 Py_DECREF(value);
1859 Py_XDECREF(tback);
1860 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001862 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001864 if (bytesmode)
1865 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1866 else
1867 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 }
1869 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001870 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 if (!pynum)
1872 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001873
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 PyArena_AddPyObject(c->c_arena, pynum);
1875 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 }
Georg Brandldde00282007-03-18 19:01:53 +00001877 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001878 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001880 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 if (TYPE(ch) == RPAR)
1883 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 if (TYPE(ch) == yield_expr)
1886 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001889 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001890 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001891
Nick Coghlan650f0d02007-04-15 12:05:43 +00001892 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 if (TYPE(ch) == RSQB)
1897 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1901 asdl_seq *elts = seq_for_testlist(c, ch);
1902 if (!elts)
1903 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001904
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1906 }
1907 else
1908 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001910 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1911 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001912 int i, size;
1913 asdl_seq *keys, *values;
1914
1915 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001916 if (TYPE(ch) == RBRACE) {
1917 /* it's an empty dict */
1918 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1919 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1920 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001921 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001922 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001923 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001924 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001925 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001926 for (i = 0; i < NCH(ch); i += 2) {
1927 expr_ty expression;
1928 expression = ast_for_expr(c, CHILD(ch, i));
1929 if (!expression)
1930 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001933 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1934 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1935 /* it's a set comprehension */
1936 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001937 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1938 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 } else {
1940 /* it's a dict */
1941 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1942 keys = asdl_seq_new(size, c->c_arena);
1943 if (!keys)
1944 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 values = asdl_seq_new(size, c->c_arena);
1947 if (!values)
1948 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 for (i = 0; i < NCH(ch); i += 4) {
1951 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 expression = ast_for_expr(c, CHILD(ch, i));
1954 if (!expression)
1955 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001956
Guido van Rossum86e58e22006-08-28 15:27:34 +00001957 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001958
Guido van Rossum86e58e22006-08-28 15:27:34 +00001959 expression = ast_for_expr(c, CHILD(ch, i + 2));
1960 if (!expression)
1961 return NULL;
1962
1963 asdl_seq_SET(values, i / 4, expression);
1964 }
1965 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1966 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001969 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 }
1972}
1973
1974static slice_ty
1975ast_for_slice(struct compiling *c, const node *n)
1976{
1977 node *ch;
1978 expr_ty lower = NULL, upper = NULL, step = NULL;
1979
1980 REQ(n, subscript);
1981
1982 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001983 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 sliceop: ':' [test]
1985 */
1986 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (NCH(n) == 1 && TYPE(ch) == test) {
1988 /* 'step' variable hold no significance in terms of being used over
1989 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 if (!step)
1992 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 }
1996
1997 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 if (!lower)
2000 return NULL;
2001 }
2002
2003 /* If there's an upper bound it's in the second or third position. */
2004 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 if (NCH(n) > 1) {
2006 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 if (TYPE(n2) == test) {
2009 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 if (!upper)
2011 return NULL;
2012 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016
Thomas Wouters89f507f2006-12-13 04:49:30 +00002017 if (TYPE(n2) == test) {
2018 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 if (!upper)
2020 return NULL;
2021 }
2022 }
2023
2024 ch = CHILD(n, NCH(n) - 1);
2025 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002026 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002027 ch = CHILD(ch, 1);
2028 if (TYPE(ch) == test) {
2029 step = ast_for_expr(c, ch);
2030 if (!step)
2031 return NULL;
2032 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 }
2034 }
2035
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002036 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037}
2038
2039static expr_ty
2040ast_for_binop(struct compiling *c, const node *n)
2041{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002042 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002044 BinOp(BinOp(A, op, B), op, C).
2045 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046
Guido van Rossumd8faa362007-04-27 19:54:29 +00002047 int i, nops;
2048 expr_ty expr1, expr2, result;
2049 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 expr1 = ast_for_expr(c, CHILD(n, 0));
2052 if (!expr1)
2053 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054
Guido van Rossumd8faa362007-04-27 19:54:29 +00002055 expr2 = ast_for_expr(c, CHILD(n, 2));
2056 if (!expr2)
2057 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058
Guido van Rossumd8faa362007-04-27 19:54:29 +00002059 newoperator = get_operator(CHILD(n, 1));
2060 if (!newoperator)
2061 return NULL;
2062
2063 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2064 c->c_arena);
2065 if (!result)
2066 return NULL;
2067
2068 nops = (NCH(n) - 1) / 2;
2069 for (i = 1; i < nops; i++) {
2070 expr_ty tmp_result, tmp;
2071 const node* next_oper = CHILD(n, i * 2 + 1);
2072
2073 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002074 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 return NULL;
2076
Guido van Rossumd8faa362007-04-27 19:54:29 +00002077 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2078 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 return NULL;
2080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002082 LINENO(next_oper), next_oper->n_col_offset,
2083 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002085 return NULL;
2086 result = tmp_result;
2087 }
2088 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089}
2090
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002091static expr_ty
2092ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002095 subscriptlist: subscript (',' subscript)* [',']
2096 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2097 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002098 REQ(n, trailer);
2099 if (TYPE(CHILD(n, 0)) == LPAR) {
2100 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002101 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2102 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002103 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002104 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002105 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002106 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002107 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2108 if (!attr_id)
2109 return NULL;
2110 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002111 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002112 }
2113 else {
2114 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002115 REQ(CHILD(n, 2), RSQB);
2116 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002117 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002118 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2119 if (!slc)
2120 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002121 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2122 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002123 }
2124 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002126 by treating the sequence as a tuple literal if there are
2127 no slice features.
2128 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002129 int j;
2130 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002131 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002132 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002133 asdl_seq *slices, *elts;
2134 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002135 if (!slices)
2136 return NULL;
2137 for (j = 0; j < NCH(n); j += 2) {
2138 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002139 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002140 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002141 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002142 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002143 asdl_seq_SET(slices, j / 2, slc);
2144 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002145 if (!simple) {
2146 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002147 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002148 }
2149 /* extract Index values and put them in a Tuple */
2150 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002151 if (!elts)
2152 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002153 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2154 slc = (slice_ty)asdl_seq_GET(slices, j);
2155 assert(slc->kind == Index_kind && slc->v.Index.value);
2156 asdl_seq_SET(elts, j, slc->v.Index.value);
2157 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002158 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002159 if (!e)
2160 return NULL;
2161 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002162 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002163 }
2164 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002165}
2166
2167static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002168ast_for_factor(struct compiling *c, const node *n)
2169{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002170 expr_ty expression;
2171
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002172 expression = ast_for_expr(c, CHILD(n, 1));
2173 if (!expression)
2174 return NULL;
2175
2176 switch (TYPE(CHILD(n, 0))) {
2177 case PLUS:
2178 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2179 c->c_arena);
2180 case MINUS:
2181 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2182 c->c_arena);
2183 case TILDE:
2184 return UnaryOp(Invert, expression, LINENO(n),
2185 n->n_col_offset, c->c_arena);
2186 }
2187 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2188 TYPE(CHILD(n, 0)));
2189 return NULL;
2190}
2191
2192static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002193ast_for_power(struct compiling *c, const node *n)
2194{
2195 /* power: atom trailer* ('**' factor)*
2196 */
2197 int i;
2198 expr_ty e, tmp;
2199 REQ(n, power);
2200 e = ast_for_atom(c, CHILD(n, 0));
2201 if (!e)
2202 return NULL;
2203 if (NCH(n) == 1)
2204 return e;
2205 for (i = 1; i < NCH(n); i++) {
2206 node *ch = CHILD(n, i);
2207 if (TYPE(ch) != trailer)
2208 break;
2209 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002210 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002211 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002212 tmp->lineno = e->lineno;
2213 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002214 e = tmp;
2215 }
2216 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2217 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002218 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002219 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002220 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002221 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002222 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002223 e = tmp;
2224 }
2225 return e;
2226}
2227
Guido van Rossum0368b722007-05-11 16:50:42 +00002228static expr_ty
2229ast_for_starred(struct compiling *c, const node *n)
2230{
2231 expr_ty tmp;
2232 REQ(n, star_expr);
2233
2234 tmp = ast_for_expr(c, CHILD(n, 1));
2235 if (!tmp)
2236 return NULL;
2237
2238 /* The Load context is changed later. */
2239 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2240}
2241
2242
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243/* Do not name a variable 'expr'! Will cause a compile error.
2244*/
2245
2246static expr_ty
2247ast_for_expr(struct compiling *c, const node *n)
2248{
2249 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002250 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002251 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 and_test: not_test ('and' not_test)*
2254 not_test: 'not' not_test | comparison
2255 comparison: expr (comp_op expr)*
2256 expr: xor_expr ('|' xor_expr)*
2257 xor_expr: and_expr ('^' and_expr)*
2258 and_expr: shift_expr ('&' shift_expr)*
2259 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2260 arith_expr: term (('+'|'-') term)*
2261 term: factor (('*'|'/'|'%'|'//') factor)*
2262 factor: ('+'|'-'|'~') factor | power
2263 power: atom trailer* ('**' factor)*
2264 */
2265
2266 asdl_seq *seq;
2267 int i;
2268
2269 loop:
2270 switch (TYPE(n)) {
2271 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002272 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002273 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002274 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002276 else if (NCH(n) > 1)
2277 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002278 /* Fallthrough */
2279 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 case and_test:
2281 if (NCH(n) == 1) {
2282 n = CHILD(n, 0);
2283 goto loop;
2284 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002285 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 if (!seq)
2287 return NULL;
2288 for (i = 0; i < NCH(n); i += 2) {
2289 expr_ty e = ast_for_expr(c, CHILD(n, i));
2290 if (!e)
2291 return NULL;
2292 asdl_seq_SET(seq, i / 2, e);
2293 }
2294 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002295 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2296 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002297 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002298 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 case not_test:
2300 if (NCH(n) == 1) {
2301 n = CHILD(n, 0);
2302 goto loop;
2303 }
2304 else {
2305 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2306 if (!expression)
2307 return NULL;
2308
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002309 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2310 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 }
2312 case comparison:
2313 if (NCH(n) == 1) {
2314 n = CHILD(n, 0);
2315 goto loop;
2316 }
2317 else {
2318 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002319 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002320 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002321 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 if (!ops)
2323 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002324 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 return NULL;
2327 }
2328 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002329 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002331 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002332 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002334 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335
2336 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002337 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002339 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002341 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 asdl_seq_SET(cmps, i / 2, expression);
2343 }
2344 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002345 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002347 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002349 return Compare(expression, ops, cmps, LINENO(n),
2350 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351 }
2352 break;
2353
Guido van Rossum0368b722007-05-11 16:50:42 +00002354 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 /* The next five cases all handle BinOps. The main body of code
2357 is the same in each case, but the switch turned inside out to
2358 reuse the code for each type of operator.
2359 */
2360 case expr:
2361 case xor_expr:
2362 case and_expr:
2363 case shift_expr:
2364 case arith_expr:
2365 case term:
2366 if (NCH(n) == 1) {
2367 n = CHILD(n, 0);
2368 goto loop;
2369 }
2370 return ast_for_binop(c, n);
2371 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002372 expr_ty exp = NULL;
2373 if (NCH(n) == 2) {
2374 exp = ast_for_testlist(c, CHILD(n, 1));
2375 if (!exp)
2376 return NULL;
2377 }
2378 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
2379 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002380 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381 if (NCH(n) == 1) {
2382 n = CHILD(n, 0);
2383 goto loop;
2384 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002385 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002386 case power:
2387 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002389 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 return NULL;
2391 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002392 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 return NULL;
2394}
2395
2396static expr_ty
2397ast_for_call(struct compiling *c, const node *n, expr_ty func)
2398{
2399 /*
2400 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2401 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002402 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 */
2404
2405 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002406 asdl_seq *args;
2407 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 expr_ty vararg = NULL, kwarg = NULL;
2409
2410 REQ(n, arglist);
2411
2412 nargs = 0;
2413 nkeywords = 0;
2414 ngens = 0;
2415 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002416 node *ch = CHILD(n, i);
2417 if (TYPE(ch) == argument) {
2418 if (NCH(ch) == 1)
2419 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002420 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 nkeywords++;
2424 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425 }
2426 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002427 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002428 "if not sole argument");
2429 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 }
2431
2432 if (nargs + nkeywords + ngens > 255) {
2433 ast_error(n, "more than 255 arguments");
2434 return NULL;
2435 }
2436
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002437 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002439 return NULL;
2440 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002442 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 nargs = 0;
2444 nkeywords = 0;
2445 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002446 node *ch = CHILD(n, i);
2447 if (TYPE(ch) == argument) {
2448 expr_ty e;
2449 if (NCH(ch) == 1) {
2450 if (nkeywords) {
2451 ast_error(CHILD(ch, 0),
2452 "non-keyword arg after keyword arg");
2453 return NULL;
2454 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002455 if (vararg) {
2456 ast_error(CHILD(ch, 0),
2457 "only named arguments may follow *expression");
2458 return NULL;
2459 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002460 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002462 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002465 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002468 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 else {
2472 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002473 identifier key, tmp;
2474 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002479 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 /* f(lambda x: x[0] = 3) ends up getting parsed with
2481 * LHS test = lambda x: x[0], and RHS test = 3.
2482 * SF bug 132313 points out that complaining about a keyword
2483 * then is very confusing.
2484 */
2485 if (e->kind == Lambda_kind) {
2486 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002487 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 } else if (e->kind != Name_kind) {
2489 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002490 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002491 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 return NULL;
2493 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002494 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002495 for (k = 0; k < nkeywords; k++) {
2496 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2497 if (!PyUnicode_Compare(tmp, key)) {
2498 ast_error(CHILD(ch, 0), "keyword argument repeated");
2499 return NULL;
2500 }
2501 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002502 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002504 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002507 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 asdl_seq_SET(keywords, nkeywords++, kw);
2509 }
2510 }
2511 else if (TYPE(ch) == STAR) {
2512 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002513 if (!vararg)
2514 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002515 i++;
2516 }
2517 else if (TYPE(ch) == DOUBLESTAR) {
2518 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002519 if (!kwarg)
2520 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 i++;
2522 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 }
2524
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002525 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526}
2527
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002529ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002531 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002532 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002534 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002535 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002536 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002537 }
2538 else {
2539 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002540 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002541 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002543 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 else {
2545 asdl_seq *tmp = seq_for_testlist(c, n);
2546 if (!tmp)
2547 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002548 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002550}
2551
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552static stmt_ty
2553ast_for_expr_stmt(struct compiling *c, const node *n)
2554{
2555 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002558 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002560 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 test: ... here starts the operator precendence dance
2562 */
2563
2564 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 if (!e)
2567 return NULL;
2568
Thomas Wouters89f507f2006-12-13 04:49:30 +00002569 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
2571 else if (TYPE(CHILD(n, 1)) == augassign) {
2572 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002573 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002574 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575
Thomas Wouters89f507f2006-12-13 04:49:30 +00002576 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 if (!expr1)
2578 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002579 if(!set_context(c, expr1, Store, ch))
2580 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002581 /* set_context checks that most expressions are not the left side.
2582 Augmented assignments can only have a name, a subscript, or an
2583 attribute on the left, though, so we have to explicitly check for
2584 those. */
2585 switch (expr1->kind) {
2586 case Name_kind:
2587 case Attribute_kind:
2588 case Subscript_kind:
2589 break;
2590 default:
2591 ast_error(ch, "illegal expression for augmented assignment");
2592 return NULL;
2593 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 ch = CHILD(n, 2);
2596 if (TYPE(ch) == testlist)
2597 expr2 = ast_for_testlist(c, ch);
2598 else
2599 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002600 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 return NULL;
2602
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002603 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002604 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 return NULL;
2606
Thomas Wouters89f507f2006-12-13 04:49:30 +00002607 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 }
2609 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002610 int i;
2611 asdl_seq *targets;
2612 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 expr_ty expression;
2614
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 /* a normal assignment */
2616 REQ(CHILD(n, 1), EQUAL);
2617 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2618 if (!targets)
2619 return NULL;
2620 for (i = 0; i < NCH(n) - 2; i += 2) {
2621 expr_ty e;
2622 node *ch = CHILD(n, i);
2623 if (TYPE(ch) == yield_expr) {
2624 ast_error(ch, "assignment to yield expression not possible");
2625 return NULL;
2626 }
2627 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002629 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002631 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002632 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 asdl_seq_SET(targets, i / 2, e);
2636 }
2637 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002638 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 expression = ast_for_testlist(c, value);
2640 else
2641 expression = ast_for_expr(c, value);
2642 if (!expression)
2643 return NULL;
2644 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646}
2647
Benjamin Peterson78565b22009-06-28 19:19:51 +00002648
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002650ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651{
2652 asdl_seq *seq;
2653 int i;
2654 expr_ty e;
2655
2656 REQ(n, exprlist);
2657
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002658 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002660 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002662 e = ast_for_expr(c, CHILD(n, i));
2663 if (!e)
2664 return NULL;
2665 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002666 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002667 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 }
2669 return seq;
2670}
2671
2672static stmt_ty
2673ast_for_del_stmt(struct compiling *c, const node *n)
2674{
2675 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 /* del_stmt: 'del' exprlist */
2678 REQ(n, del_stmt);
2679
2680 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2681 if (!expr_list)
2682 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002683 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684}
2685
2686static stmt_ty
2687ast_for_flow_stmt(struct compiling *c, const node *n)
2688{
2689 /*
2690 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2691 | yield_stmt
2692 break_stmt: 'break'
2693 continue_stmt: 'continue'
2694 return_stmt: 'return' [testlist]
2695 yield_stmt: yield_expr
2696 yield_expr: 'yield' testlist
2697 raise_stmt: 'raise' [test [',' test [',' test]]]
2698 */
2699 node *ch;
2700
2701 REQ(n, flow_stmt);
2702 ch = CHILD(n, 0);
2703 switch (TYPE(ch)) {
2704 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002705 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002707 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2710 if (!exp)
2711 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002712 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 }
2714 case return_stmt:
2715 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002716 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002718 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 if (!expression)
2720 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002721 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 }
2723 case raise_stmt:
2724 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002725 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2726 else if (NCH(ch) >= 2) {
2727 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2729 if (!expression)
2730 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002731 if (NCH(ch) == 4) {
2732 cause = ast_for_expr(c, CHILD(ch, 3));
2733 if (!cause)
2734 return NULL;
2735 }
2736 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 }
2738 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002739 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 "unexpected flow_stmt: %d", TYPE(ch));
2741 return NULL;
2742 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002743
2744 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746}
2747
2748static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002749alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750{
2751 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002752 import_as_name: NAME ['as' NAME]
2753 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 dotted_name: NAME ('.' NAME)*
2755 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002756 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002757
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 loop:
2759 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002760 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002761 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002762 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002763 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002764 if (!name)
2765 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002766 if (NCH(n) == 3) {
2767 node *str_node = CHILD(n, 2);
2768 str = NEW_IDENTIFIER(str_node);
2769 if (!str)
2770 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002771 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002772 return NULL;
2773 }
2774 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002775 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002776 return NULL;
2777 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002778 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002779 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 case dotted_as_name:
2781 if (NCH(n) == 1) {
2782 n = CHILD(n, 0);
2783 goto loop;
2784 }
2785 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002786 node *asname_node = CHILD(n, 2);
2787 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002788 if (!a)
2789 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002791 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002792 if (!a->asname)
2793 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002794 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 return a;
2797 }
2798 break;
2799 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002800 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002801 node *name_node = CHILD(n, 0);
2802 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002803 if (!name)
2804 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002805 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002806 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002807 return alias(name, NULL, c->c_arena);
2808 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 else {
2810 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002811 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002812 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815
2816 len = 0;
2817 for (i = 0; i < NCH(n); i += 2)
2818 /* length of string plus one for the dot */
2819 len += strlen(STR(CHILD(n, i))) + 1;
2820 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002821 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 if (!str)
2823 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002824 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 if (!s)
2826 return NULL;
2827 for (i = 0; i < NCH(n); i += 2) {
2828 char *sch = STR(CHILD(n, i));
2829 strcpy(s, STR(CHILD(n, i)));
2830 s += strlen(sch);
2831 *s++ = '.';
2832 }
2833 --s;
2834 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2836 PyBytes_GET_SIZE(str),
2837 NULL);
2838 Py_DECREF(str);
2839 if (!uni)
2840 return NULL;
2841 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002842 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002843 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002844 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 }
2846 break;
2847 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002848 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002849 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002850 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002852 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853 "unexpected import name: %d", TYPE(n));
2854 return NULL;
2855 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002856
2857 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 return NULL;
2859}
2860
2861static stmt_ty
2862ast_for_import_stmt(struct compiling *c, const node *n)
2863{
2864 /*
2865 import_stmt: import_name | import_from
2866 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002867 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2868 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002870 int lineno;
2871 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 int i;
2873 asdl_seq *aliases;
2874
2875 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002876 lineno = LINENO(n);
2877 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002879 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002881 REQ(n, dotted_as_names);
2882 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2883 if (!aliases)
2884 return NULL;
2885 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002886 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002887 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002889 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002891 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002893 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002895 int idx, ndots = 0;
2896 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002897 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002899 /* Count the number of dots (for relative imports) and check for the
2900 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 for (idx = 1; idx < NCH(n); idx++) {
2902 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002903 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2904 if (!mod)
2905 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002906 idx++;
2907 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002908 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002910 ndots += 3;
2911 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 } else if (TYPE(CHILD(n, idx)) != DOT) {
2913 break;
2914 }
2915 ndots++;
2916 }
2917 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002918 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002919 case STAR:
2920 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 n = CHILD(n, idx);
2922 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002923 break;
2924 case LPAR:
2925 /* from ... import (x, y, z) */
2926 n = CHILD(n, idx + 1);
2927 n_children = NCH(n);
2928 break;
2929 case import_as_names:
2930 /* from ... import x, y, z */
2931 n = CHILD(n, idx);
2932 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002933 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934 ast_error(n, "trailing comma not allowed without"
2935 " surrounding parentheses");
2936 return NULL;
2937 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002938 break;
2939 default:
2940 ast_error(n, "Unexpected node-type in from-import");
2941 return NULL;
2942 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002943
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2945 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947
2948 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002949 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002950 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002951 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002953 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002955 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002956 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002957 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002958 if (!import_alias)
2959 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002961 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002963 if (mod != NULL)
2964 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002965 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002966 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 }
Neal Norwitz79792652005-11-14 04:25:03 +00002968 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 "unknown import statement: starts with command '%s'",
2970 STR(CHILD(n, 0)));
2971 return NULL;
2972}
2973
2974static stmt_ty
2975ast_for_global_stmt(struct compiling *c, const node *n)
2976{
2977 /* global_stmt: 'global' NAME (',' NAME)* */
2978 identifier name;
2979 asdl_seq *s;
2980 int i;
2981
2982 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002983 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002985 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002987 name = NEW_IDENTIFIER(CHILD(n, i));
2988 if (!name)
2989 return NULL;
2990 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002992 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993}
2994
2995static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002996ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2997{
2998 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2999 identifier name;
3000 asdl_seq *s;
3001 int i;
3002
3003 REQ(n, nonlocal_stmt);
3004 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3005 if (!s)
3006 return NULL;
3007 for (i = 1; i < NCH(n); i += 2) {
3008 name = NEW_IDENTIFIER(CHILD(n, i));
3009 if (!name)
3010 return NULL;
3011 asdl_seq_SET(s, i / 2, name);
3012 }
3013 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3014}
3015
3016static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017ast_for_assert_stmt(struct compiling *c, const node *n)
3018{
3019 /* assert_stmt: 'assert' test [',' test] */
3020 REQ(n, assert_stmt);
3021 if (NCH(n) == 2) {
3022 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3023 if (!expression)
3024 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003025 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026 }
3027 else if (NCH(n) == 4) {
3028 expr_ty expr1, expr2;
3029
3030 expr1 = ast_for_expr(c, CHILD(n, 1));
3031 if (!expr1)
3032 return NULL;
3033 expr2 = ast_for_expr(c, CHILD(n, 3));
3034 if (!expr2)
3035 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036
Thomas Wouters89f507f2006-12-13 04:49:30 +00003037 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 }
Neal Norwitz79792652005-11-14 04:25:03 +00003039 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 "improper number of parts to 'assert' statement: %d",
3041 NCH(n));
3042 return NULL;
3043}
3044
3045static asdl_seq *
3046ast_for_suite(struct compiling *c, const node *n)
3047{
3048 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003049 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050 stmt_ty s;
3051 int i, total, num, end, pos = 0;
3052 node *ch;
3053
3054 REQ(n, suite);
3055
3056 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003057 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003059 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003061 n = CHILD(n, 0);
3062 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003064 */
3065 end = NCH(n) - 1;
3066 if (TYPE(CHILD(n, end - 1)) == SEMI)
3067 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003069 for (i = 0; i < end; i += 2) {
3070 ch = CHILD(n, i);
3071 s = ast_for_stmt(c, ch);
3072 if (!s)
3073 return NULL;
3074 asdl_seq_SET(seq, pos++, s);
3075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 }
3077 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003078 for (i = 2; i < (NCH(n) - 1); i++) {
3079 ch = CHILD(n, i);
3080 REQ(ch, stmt);
3081 num = num_stmts(ch);
3082 if (num == 1) {
3083 /* small_stmt or compound_stmt with only one child */
3084 s = ast_for_stmt(c, ch);
3085 if (!s)
3086 return NULL;
3087 asdl_seq_SET(seq, pos++, s);
3088 }
3089 else {
3090 int j;
3091 ch = CHILD(ch, 0);
3092 REQ(ch, simple_stmt);
3093 for (j = 0; j < NCH(ch); j += 2) {
3094 /* statement terminates with a semi-colon ';' */
3095 if (NCH(CHILD(ch, j)) == 0) {
3096 assert((j + 1) == NCH(ch));
3097 break;
3098 }
3099 s = ast_for_stmt(c, CHILD(ch, j));
3100 if (!s)
3101 return NULL;
3102 asdl_seq_SET(seq, pos++, s);
3103 }
3104 }
3105 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 }
3107 assert(pos == seq->size);
3108 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109}
3110
3111static stmt_ty
3112ast_for_if_stmt(struct compiling *c, const node *n)
3113{
3114 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3115 ['else' ':' suite]
3116 */
3117 char *s;
3118
3119 REQ(n, if_stmt);
3120
3121 if (NCH(n) == 4) {
3122 expr_ty expression;
3123 asdl_seq *suite_seq;
3124
3125 expression = ast_for_expr(c, CHILD(n, 1));
3126 if (!expression)
3127 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003129 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131
Guido van Rossumd8faa362007-04-27 19:54:29 +00003132 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3133 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003135
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 s = STR(CHILD(n, 4));
3137 /* s[2], the third character in the string, will be
3138 's' for el_s_e, or
3139 'i' for el_i_f
3140 */
3141 if (s[2] == 's') {
3142 expr_ty expression;
3143 asdl_seq *seq1, *seq2;
3144
3145 expression = ast_for_expr(c, CHILD(n, 1));
3146 if (!expression)
3147 return NULL;
3148 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003149 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 return NULL;
3151 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003152 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153 return NULL;
3154
Guido van Rossumd8faa362007-04-27 19:54:29 +00003155 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3156 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157 }
3158 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003159 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003160 expr_ty expression;
3161 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003162 asdl_seq *orelse = NULL;
3163 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164 /* must reference the child n_elif+1 since 'else' token is third,
3165 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003166 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3167 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3168 has_else = 1;
3169 n_elif -= 3;
3170 }
3171 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172
Thomas Wouters89f507f2006-12-13 04:49:30 +00003173 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175
Thomas Wouters89f507f2006-12-13 04:49:30 +00003176 orelse = asdl_seq_new(1, c->c_arena);
3177 if (!orelse)
3178 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003180 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3183 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3186 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 asdl_seq_SET(orelse, 0,
3190 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003191 LINENO(CHILD(n, NCH(n) - 6)),
3192 CHILD(n, NCH(n) - 6)->n_col_offset,
3193 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003194 /* the just-created orelse handled the last elif */
3195 n_elif--;
3196 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197
Thomas Wouters89f507f2006-12-13 04:49:30 +00003198 for (i = 0; i < n_elif; i++) {
3199 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003200 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3201 if (!newobj)
3202 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003204 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003207 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209
Thomas Wouters89f507f2006-12-13 04:49:30 +00003210 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003212 LINENO(CHILD(n, off)),
3213 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 orelse = newobj;
3215 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 expression = ast_for_expr(c, CHILD(n, 1));
3217 if (!expression)
3218 return NULL;
3219 suite_seq = ast_for_suite(c, CHILD(n, 3));
3220 if (!suite_seq)
3221 return NULL;
3222 return If(expression, suite_seq, orelse,
3223 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003225
3226 PyErr_Format(PyExc_SystemError,
3227 "unexpected token in 'if' statement: %s", s);
3228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229}
3230
3231static stmt_ty
3232ast_for_while_stmt(struct compiling *c, const node *n)
3233{
3234 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3235 REQ(n, while_stmt);
3236
3237 if (NCH(n) == 4) {
3238 expr_ty expression;
3239 asdl_seq *suite_seq;
3240
3241 expression = ast_for_expr(c, CHILD(n, 1));
3242 if (!expression)
3243 return NULL;
3244 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003245 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003247 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248 }
3249 else if (NCH(n) == 7) {
3250 expr_ty expression;
3251 asdl_seq *seq1, *seq2;
3252
3253 expression = ast_for_expr(c, CHILD(n, 1));
3254 if (!expression)
3255 return NULL;
3256 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003257 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003258 return NULL;
3259 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003260 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 return NULL;
3262
Thomas Wouters89f507f2006-12-13 04:49:30 +00003263 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003265
3266 PyErr_Format(PyExc_SystemError,
3267 "wrong number of tokens for 'while' statement: %d",
3268 NCH(n));
3269 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270}
3271
3272static stmt_ty
3273ast_for_for_stmt(struct compiling *c, const node *n)
3274{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003275 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003276 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003277 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003278 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3280 REQ(n, for_stmt);
3281
3282 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003283 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284 if (!seq)
3285 return NULL;
3286 }
3287
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003288 node_target = CHILD(n, 1);
3289 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003290 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003292 /* Check the # of children rather than the length of _target, since
3293 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003294 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003295 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003296 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003298 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003300 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003301 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 return NULL;
3303 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003304 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 return NULL;
3306
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003307 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3308 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309}
3310
3311static excepthandler_ty
3312ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3313{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003314 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315 REQ(exc, except_clause);
3316 REQ(body, suite);
3317
3318 if (NCH(exc) == 1) {
3319 asdl_seq *suite_seq = ast_for_suite(c, body);
3320 if (!suite_seq)
3321 return NULL;
3322
Neal Norwitzad74aa82008-03-31 05:14:30 +00003323 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003324 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325 }
3326 else if (NCH(exc) == 2) {
3327 expr_ty expression;
3328 asdl_seq *suite_seq;
3329
3330 expression = ast_for_expr(c, CHILD(exc, 1));
3331 if (!expression)
3332 return NULL;
3333 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003334 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335 return NULL;
3336
Neal Norwitzad74aa82008-03-31 05:14:30 +00003337 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003338 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339 }
3340 else if (NCH(exc) == 4) {
3341 asdl_seq *suite_seq;
3342 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003343 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003344 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003345 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003346 if (forbidden_name(e, CHILD(exc, 3), 0))
3347 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003349 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350 return NULL;
3351 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003352 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353 return NULL;
3354
Neal Norwitzad74aa82008-03-31 05:14:30 +00003355 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003356 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003358
3359 PyErr_Format(PyExc_SystemError,
3360 "wrong number of children for 'except' clause: %d",
3361 NCH(exc));
3362 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363}
3364
3365static stmt_ty
3366ast_for_try_stmt(struct compiling *c, const node *n)
3367{
Neal Norwitzf599f422005-12-17 21:33:47 +00003368 const int nch = NCH(n);
3369 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003370 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003371
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003372 REQ(n, try_stmt);
3373
Neal Norwitzf599f422005-12-17 21:33:47 +00003374 body = ast_for_suite(c, CHILD(n, 2));
3375 if (body == NULL)
3376 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377
Neal Norwitzf599f422005-12-17 21:33:47 +00003378 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3379 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3380 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3381 /* we can assume it's an "else",
3382 because nch >= 9 for try-else-finally and
3383 it would otherwise have a type of except_clause */
3384 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3385 if (orelse == NULL)
3386 return NULL;
3387 n_except--;
3388 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389
Neal Norwitzf599f422005-12-17 21:33:47 +00003390 finally = ast_for_suite(c, CHILD(n, nch - 1));
3391 if (finally == NULL)
3392 return NULL;
3393 n_except--;
3394 }
3395 else {
3396 /* we can assume it's an "else",
3397 otherwise it would have a type of except_clause */
3398 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3399 if (orelse == NULL)
3400 return NULL;
3401 n_except--;
3402 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003404 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003405 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003406 return NULL;
3407 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408
Neal Norwitzf599f422005-12-17 21:33:47 +00003409 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003410 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003411 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003412 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003413 if (handlers == NULL)
3414 return NULL;
3415
3416 for (i = 0; i < n_except; i++) {
3417 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3418 CHILD(n, 5 + i * 3));
3419 if (!e)
3420 return NULL;
3421 asdl_seq_SET(handlers, i, e);
3422 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003423 }
3424
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003425 assert(finally != NULL || asdl_seq_LEN(handlers));
3426 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427}
3428
Georg Brandl0c315622009-05-25 21:10:36 +00003429/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003430static withitem_ty
3431ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003432{
3433 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003434
Georg Brandl0c315622009-05-25 21:10:36 +00003435 REQ(n, with_item);
3436 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003437 if (!context_expr)
3438 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003439 if (NCH(n) == 3) {
3440 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003441
3442 if (!optional_vars) {
3443 return NULL;
3444 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003445 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003446 return NULL;
3447 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003448 }
3449
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003450 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003451}
3452
Georg Brandl0c315622009-05-25 21:10:36 +00003453/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3454static stmt_ty
3455ast_for_with_stmt(struct compiling *c, const node *n)
3456{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003457 int i, n_items;
3458 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003459
3460 REQ(n, with_stmt);
3461
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003462 n_items = (NCH(n) - 2) / 2;
3463 items = asdl_seq_new(n_items, c->c_arena);
3464 for (i = 1; i < NCH(n) - 2; i += 2) {
3465 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3466 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003467 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003468 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003469 }
3470
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003471 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3472 if (!body)
3473 return NULL;
3474
3475 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003476}
3477
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003478static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003479ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003480{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003481 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003482 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003483 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003484 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003486 REQ(n, classdef);
3487
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003488 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003489 s = ast_for_suite(c, CHILD(n, 3));
3490 if (!s)
3491 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003492 classname = NEW_IDENTIFIER(CHILD(n, 1));
3493 if (!classname)
3494 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003495 if (forbidden_name(classname, CHILD(n, 3), 0))
3496 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003497 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3498 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003499 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003500
3501 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003502 s = ast_for_suite(c, CHILD(n,5));
3503 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003504 return NULL;
3505 classname = NEW_IDENTIFIER(CHILD(n, 1));
3506 if (!classname)
3507 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003508 if (forbidden_name(classname, CHILD(n, 3), 0))
3509 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003510 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3511 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003512 }
3513
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003514 /* class NAME '(' arglist ')' ':' suite */
3515 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003516 {
3517 PyObject *dummy_name;
3518 expr_ty dummy;
3519 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3520 if (!dummy_name)
3521 return NULL;
3522 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3523 call = ast_for_call(c, CHILD(n, 3), dummy);
3524 if (!call)
3525 return NULL;
3526 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003527 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003528 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003529 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003530 classname = NEW_IDENTIFIER(CHILD(n, 1));
3531 if (!classname)
3532 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003533 if (forbidden_name(classname, CHILD(n, 1), 0))
3534 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003535
Benjamin Peterson30760062008-11-25 04:02:28 +00003536 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003537 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003538 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539}
3540
3541static stmt_ty
3542ast_for_stmt(struct compiling *c, const node *n)
3543{
3544 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003545 assert(NCH(n) == 1);
3546 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 }
3548 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003549 assert(num_stmts(n) == 1);
3550 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 }
3552 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003553 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003554 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3555 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003556 */
3557 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 case expr_stmt:
3559 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003560 case del_stmt:
3561 return ast_for_del_stmt(c, n);
3562 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003563 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 case flow_stmt:
3565 return ast_for_flow_stmt(c, n);
3566 case import_stmt:
3567 return ast_for_import_stmt(c, n);
3568 case global_stmt:
3569 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003570 case nonlocal_stmt:
3571 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003572 case assert_stmt:
3573 return ast_for_assert_stmt(c, n);
3574 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003575 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3577 TYPE(n), NCH(n));
3578 return NULL;
3579 }
3580 }
3581 else {
3582 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003583 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003584 */
3585 node *ch = CHILD(n, 0);
3586 REQ(n, compound_stmt);
3587 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003588 case if_stmt:
3589 return ast_for_if_stmt(c, ch);
3590 case while_stmt:
3591 return ast_for_while_stmt(c, ch);
3592 case for_stmt:
3593 return ast_for_for_stmt(c, ch);
3594 case try_stmt:
3595 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003596 case with_stmt:
3597 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003599 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003601 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 case decorated:
3603 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003605 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3607 TYPE(n), NCH(n));
3608 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003609 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 }
3611}
3612
3613static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003614parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003616 const char *end;
3617 long x;
3618 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003619 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003620 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003622 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003623 errno = 0;
3624 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003625 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003626 if (s[0] == '0') {
3627 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3628 if (x < 0 && errno == 0) {
3629 return PyLong_FromString((char *)s,
3630 (char **)0,
3631 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003632 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003633 }
3634 else
3635 x = PyOS_strtol((char *)s, (char **)&end, 0);
3636 if (*end == '\0') {
3637 if (errno != 0)
3638 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003639 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003640 }
3641 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003642 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003643 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003644 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3645 if (compl.imag == -1.0 && PyErr_Occurred())
3646 return NULL;
3647 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003648 }
3649 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003650 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003651 dx = PyOS_string_to_double(s, NULL, NULL);
3652 if (dx == -1.0 && PyErr_Occurred())
3653 return NULL;
3654 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003656}
3657
3658static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003659decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003661 char *s, *t;
3662 t = s = (char *)*sPtr;
3663 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3664 while (s < end && (*s & 0x80)) s++;
3665 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003666 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667}
3668
3669static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003670decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 PyObject *v, *u;
3673 char *buf;
3674 char *p;
3675 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003676
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003678 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003679 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003680 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003681 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003682 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003683 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3684 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3685 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003686 if (u == NULL)
3687 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003688 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003689 end = s + len;
3690 while (s < end) {
3691 if (*s == '\\') {
3692 *p++ = *s++;
3693 if (*s & 0x80) {
3694 strcpy(p, "u005c");
3695 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003696 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697 }
3698 if (*s & 0x80) { /* XXX inefficient */
3699 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003700 int kind;
3701 void *data;
3702 Py_ssize_t len, i;
3703 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003704 if (w == NULL) {
3705 Py_DECREF(u);
3706 return NULL;
3707 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003708 kind = PyUnicode_KIND(w);
3709 data = PyUnicode_DATA(w);
3710 len = PyUnicode_GET_LENGTH(w);
3711 for (i = 0; i < len; i++) {
3712 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3713 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003714 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003715 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003716 /* Should be impossible to overflow */
3717 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003718 Py_DECREF(w);
3719 } else {
3720 *p++ = *s++;
3721 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003722 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003723 len = p - buf;
3724 s = buf;
3725 }
3726 if (rawmode)
3727 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3728 else
3729 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3730 Py_XDECREF(u);
3731 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003732}
3733
3734/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003735 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003736 * parsestr parses it, and returns the decoded Python string object.
3737 */
3738static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003739parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003740{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003741 size_t len;
3742 const char *s = STR(n);
3743 int quote = Py_CHARMASK(*s);
3744 int rawmode = 0;
3745 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003746 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003747 if (quote == 'b' || quote == 'B') {
3748 quote = *++s;
3749 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003751 if (quote == 'r' || quote == 'R') {
3752 quote = *++s;
3753 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003754 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003755 }
3756 if (quote != '\'' && quote != '\"') {
3757 PyErr_BadInternalCall();
3758 return NULL;
3759 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003760 s++;
3761 len = strlen(s);
3762 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003764 "string to parse is too long");
3765 return NULL;
3766 }
3767 if (s[--len] != quote) {
3768 PyErr_BadInternalCall();
3769 return NULL;
3770 }
3771 if (len >= 4 && s[0] == quote && s[1] == quote) {
3772 s += 2;
3773 len -= 2;
3774 if (s[--len] != quote || s[--len] != quote) {
3775 PyErr_BadInternalCall();
3776 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003777 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003778 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003779 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003780 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003781 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003782 if (*bytesmode) {
3783 /* Disallow non-ascii characters (but not escapes) */
3784 const char *c;
3785 for (c = s; *c; c++) {
3786 if (Py_CHARMASK(*c) >= 0x80) {
3787 ast_error(n, "bytes can only contain ASCII "
3788 "literal characters.");
3789 return NULL;
3790 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003791 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003792 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003793 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003794 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003795 if (rawmode || strchr(s, '\\') == NULL) {
3796 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003797 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003798 if (u == NULL || !*bytesmode)
3799 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003800 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003801 Py_DECREF(u);
3802 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003803 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003804 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003805 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003806 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003808 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003809 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003810 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003811 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003812 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003813}
3814
Guido van Rossum29fd7122007-11-12 01:13:56 +00003815/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003816 * compile-time literal catenation, calling parsestr() on each piece, and
3817 * pasting the intermediate results together.
3818 */
3819static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003820parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003821{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 PyObject *v;
3823 int i;
3824 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003825 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003826 if (v != NULL) {
3827 /* String literal concatenation */
3828 for (i = 1; i < NCH(n); i++) {
3829 PyObject *s;
3830 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003831 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003832 if (s == NULL)
3833 goto onError;
3834 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003835 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 goto onError;
3837 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003838 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3839 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003840 if (v == NULL)
3841 goto onError;
3842 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003843 else {
3844 PyObject *temp = PyUnicode_Concat(v, s);
3845 Py_DECREF(s);
3846 Py_DECREF(v);
3847 v = temp;
3848 if (v == NULL)
3849 goto onError;
3850 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003851 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 }
3853 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003854
Guido van Rossumd8faa362007-04-27 19:54:29 +00003855 onError:
3856 Py_XDECREF(v);
3857 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858}