blob: a52fd093e6743cebd256901d0af3666a704fe492 [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öwis5b222132007-06-10 09:51:05 +0000530 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200531 if (!id || PyUnicode_READY(id) == -1)
Benjamin Peterson30760062008-11-25 04:02:28 +0000532 return NULL;
Martin v. Löwis47383402007-08-15 07:32:56 +0000533 /* Check whether there are non-ASCII characters in the
534 identifier; if so, normalize to NFKC. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200535 if (PyUnicode_MAX_CHAR_VALUE((PyUnicodeObject *)id) >= 128) {
536 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
537 PyObject *id2;
538 if (!m)
539 return NULL;
540 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
541 Py_DECREF(m);
542 if (!id2)
543 return NULL;
544 Py_DECREF(id);
545 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000546 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000547 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000548 PyArena_AddPyObject(arena, id);
549 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550}
551
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000552#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553
554/* This routine provides an invalid object for the syntax error.
555 The outermost routine must unpack this error and create the
556 proper object. We do this so that we don't have to pass
557 the filename to everything function.
558
559 XXX Maybe we should just pass the filename...
560*/
561
562static int
563ast_error(const node *n, const char *errstr)
564{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000565 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000567 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568 PyErr_SetObject(PyExc_SyntaxError, u);
569 Py_DECREF(u);
570 return 0;
571}
572
573static void
574ast_error_finish(const char *filename)
575{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000576 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000577 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000578 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579
580 assert(PyErr_Occurred());
581 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
584 PyErr_Fetch(&type, &value, &tback);
585 errstr = PyTuple_GetItem(value, 0);
586 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000587 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000589 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000590 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000591 Py_DECREF(errstr);
592 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000593 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000594 offset = PyTuple_GetItem(value, 2);
595 if (!offset) {
596 Py_DECREF(errstr);
597 return;
598 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 Py_DECREF(value);
600
601 loc = PyErr_ProgramText(filename, lineno);
602 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000603 Py_INCREF(Py_None);
604 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000605 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000606 if (filename != NULL)
607 filename_obj = PyUnicode_DecodeFSDefault(filename);
608 else {
609 Py_INCREF(Py_None);
610 filename_obj = Py_None;
611 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000612 if (filename_obj != NULL)
613 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
614 else
615 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000617 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000618 Py_DECREF(errstr);
619 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000620 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000621 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 Py_DECREF(errstr);
623 Py_DECREF(tmp);
624 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000625 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000626 PyErr_Restore(type, value, tback);
627}
628
629/* num_stmts() returns number of contained statements.
630
631 Use this routine to determine how big a sequence is needed for
632 the statements in a parse tree. Its raison d'etre is this bit of
633 grammar:
634
635 stmt: simple_stmt | compound_stmt
636 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
637
638 A simple_stmt can contain multiple small_stmt elements joined
639 by semicolons. If the arg is a simple_stmt, the number of
640 small_stmt elements is returned.
641*/
642
643static int
644num_stmts(const node *n)
645{
646 int i, l;
647 node *ch;
648
649 switch (TYPE(n)) {
650 case single_input:
651 if (TYPE(CHILD(n, 0)) == NEWLINE)
652 return 0;
653 else
654 return num_stmts(CHILD(n, 0));
655 case file_input:
656 l = 0;
657 for (i = 0; i < NCH(n); i++) {
658 ch = CHILD(n, i);
659 if (TYPE(ch) == stmt)
660 l += num_stmts(ch);
661 }
662 return l;
663 case stmt:
664 return num_stmts(CHILD(n, 0));
665 case compound_stmt:
666 return 1;
667 case simple_stmt:
668 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
669 case suite:
670 if (NCH(n) == 1)
671 return num_stmts(CHILD(n, 0));
672 else {
673 l = 0;
674 for (i = 2; i < (NCH(n) - 1); i++)
675 l += num_stmts(CHILD(n, i));
676 return l;
677 }
678 default: {
679 char buf[128];
680
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000681 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000682 TYPE(n), NCH(n));
683 Py_FatalError(buf);
684 }
685 }
686 assert(0);
687 return 0;
688}
689
690/* Transform the CST rooted at node * to the appropriate AST
691*/
692
693mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000694PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
695 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000696{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000697 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698 asdl_seq *stmts = NULL;
699 stmt_ty s;
700 node *ch;
701 struct compiling c;
702
703 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000704 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000705 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000706#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000707 ast_error(n, "encoding declaration in Unicode string");
708 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000709#endif
710 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000711 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712 } else if (TYPE(n) == encoding_decl) {
713 c.c_encoding = STR(n);
714 n = CHILD(n, 0);
715 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000717 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000718 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000719 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000720 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000721
Jeremy Hyltona8293132006-02-28 17:58:27 +0000722 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 switch (TYPE(n)) {
724 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000725 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 for (i = 0; i < NCH(n) - 1; i++) {
729 ch = CHILD(n, i);
730 if (TYPE(ch) == NEWLINE)
731 continue;
732 REQ(ch, stmt);
733 num = num_stmts(ch);
734 if (num == 1) {
735 s = ast_for_stmt(&c, ch);
736 if (!s)
737 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000738 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 }
740 else {
741 ch = CHILD(ch, 0);
742 REQ(ch, simple_stmt);
743 for (j = 0; j < num; j++) {
744 s = ast_for_stmt(&c, CHILD(ch, j * 2));
745 if (!s)
746 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000747 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 }
749 }
750 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000751 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 case eval_input: {
753 expr_ty testlist_ast;
754
Nick Coghlan650f0d02007-04-15 12:05:43 +0000755 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000756 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 if (!testlist_ast)
758 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000759 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760 }
761 case single_input:
762 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000763 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000765 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000766 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
767 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000768 if (!asdl_seq_GET(stmts, 0))
769 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000770 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000771 }
772 else {
773 n = CHILD(n, 0);
774 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000775 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000777 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000779 s = ast_for_stmt(&c, n);
780 if (!s)
781 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 asdl_seq_SET(stmts, 0, s);
783 }
784 else {
785 /* Only a simple_stmt can contain multiple statements. */
786 REQ(n, simple_stmt);
787 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788 if (TYPE(CHILD(n, i)) == NEWLINE)
789 break;
790 s = ast_for_stmt(&c, CHILD(n, i));
791 if (!s)
792 goto error;
793 asdl_seq_SET(stmts, i / 2, s);
794 }
795 }
796
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000797 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 }
799 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000800 PyErr_Format(PyExc_SystemError,
801 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 goto error;
803 }
804 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805 ast_error_finish(filename);
806 return NULL;
807}
808
809/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
810*/
811
812static operator_ty
813get_operator(const node *n)
814{
815 switch (TYPE(n)) {
816 case VBAR:
817 return BitOr;
818 case CIRCUMFLEX:
819 return BitXor;
820 case AMPER:
821 return BitAnd;
822 case LEFTSHIFT:
823 return LShift;
824 case RIGHTSHIFT:
825 return RShift;
826 case PLUS:
827 return Add;
828 case MINUS:
829 return Sub;
830 case STAR:
831 return Mult;
832 case SLASH:
833 return Div;
834 case DOUBLESLASH:
835 return FloorDiv;
836 case PERCENT:
837 return Mod;
838 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000839 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 }
841}
842
Guido van Rossume7ba4952007-06-06 23:52:48 +0000843static const char* FORBIDDEN[] = {
844 "None",
845 "True",
846 "False",
847 NULL,
848};
849
850static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000851forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000852{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000853 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000854 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
855 ast_error(n, "assignment to keyword");
856 return 1;
857 }
858 if (full_checks) {
859 const char **p;
860 for (p = FORBIDDEN; *p; p++) {
861 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
862 ast_error(n, "assignment to keyword");
863 return 1;
864 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000865 }
866 }
867 return 0;
868}
869
Jeremy Hyltona8293132006-02-28 17:58:27 +0000870/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871
872 Only sets context for expr kinds that "can appear in assignment context"
873 (according to ../Parser/Python.asdl). For other expr kinds, it sets
874 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875*/
876
877static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000878set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000879{
880 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000881 /* If a particular expression type can't be used for assign / delete,
882 set expr_name to its name and an error message will be generated.
883 */
884 const char* expr_name = NULL;
885
886 /* The ast defines augmented store and load contexts, but the
887 implementation here doesn't actually use them. The code may be
888 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000889 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000890 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000891 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000892 */
893 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894
895 switch (e->kind) {
896 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000897 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000898 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
899 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000900 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000902 e->v.Subscript.ctx = ctx;
903 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000904 case Starred_kind:
905 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000906 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000907 return 0;
908 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000910 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000911 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000912 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000913 }
914 e->v.Name.ctx = ctx;
915 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000917 e->v.List.ctx = ctx;
918 s = e->v.List.elts;
919 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000921 if (asdl_seq_LEN(e->v.Tuple.elts)) {
922 e->v.Tuple.ctx = ctx;
923 s = e->v.Tuple.elts;
924 }
925 else {
926 expr_name = "()";
927 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000928 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 case Lambda_kind:
930 expr_name = "lambda";
931 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000935 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 case UnaryOp_kind:
938 expr_name = "operator";
939 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000941 expr_name = "generator expression";
942 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000943 case Yield_kind:
944 expr_name = "yield expression";
945 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000946 case ListComp_kind:
947 expr_name = "list comprehension";
948 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000949 case SetComp_kind:
950 expr_name = "set comprehension";
951 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000952 case DictComp_kind:
953 expr_name = "dict comprehension";
954 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000955 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000956 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 case Num_kind:
958 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500959 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000960 expr_name = "literal";
961 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000962 case Ellipsis_kind:
963 expr_name = "Ellipsis";
964 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000965 case Compare_kind:
966 expr_name = "comparison";
967 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000968 case IfExp_kind:
969 expr_name = "conditional expression";
970 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyErr_Format(PyExc_SystemError,
973 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000974 e->kind, e->lineno);
975 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 /* Check for error string set by switch */
978 if (expr_name) {
979 char buf[300];
980 PyOS_snprintf(buf, sizeof(buf),
981 "can't %s %s",
982 ctx == Store ? "assign to" : "delete",
983 expr_name);
984 return ast_error(n, buf);
985 }
986
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 */
990 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Thomas Wouters89f507f2006-12-13 04:49:30 +0000993 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000994 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000995 return 0;
996 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997 }
998 return 1;
999}
1000
1001static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001002ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003{
1004 REQ(n, augassign);
1005 n = CHILD(n, 0);
1006 switch (STR(n)[0]) {
1007 case '+':
1008 return Add;
1009 case '-':
1010 return Sub;
1011 case '/':
1012 if (STR(n)[1] == '/')
1013 return FloorDiv;
1014 else
1015 return Div;
1016 case '%':
1017 return Mod;
1018 case '<':
1019 return LShift;
1020 case '>':
1021 return RShift;
1022 case '&':
1023 return BitAnd;
1024 case '^':
1025 return BitXor;
1026 case '|':
1027 return BitOr;
1028 case '*':
1029 if (STR(n)[1] == '*')
1030 return Pow;
1031 else
1032 return Mult;
1033 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001034 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001035 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 }
1037}
1038
1039static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001040ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001042 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 |'is' 'not'
1044 */
1045 REQ(n, comp_op);
1046 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001047 n = CHILD(n, 0);
1048 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 case LESS:
1050 return Lt;
1051 case GREATER:
1052 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001053 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 return Eq;
1055 case LESSEQUAL:
1056 return LtE;
1057 case GREATEREQUAL:
1058 return GtE;
1059 case NOTEQUAL:
1060 return NotEq;
1061 case NAME:
1062 if (strcmp(STR(n), "in") == 0)
1063 return In;
1064 if (strcmp(STR(n), "is") == 0)
1065 return Is;
1066 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001067 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 }
1072 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 /* handle "not in" and "is not" */
1074 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075 case NAME:
1076 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1077 return NotIn;
1078 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1079 return IsNot;
1080 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001081 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001083 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085 }
Neal Norwitz79792652005-11-14 04:25:03 +00001086 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089}
1090
1091static asdl_seq *
1092seq_for_testlist(struct compiling *c, const node *n)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001095 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1096 */
Armin Rigo31441302005-10-21 12:57:31 +00001097 asdl_seq *seq;
1098 expr_ty expression;
1099 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001100 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001102 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 if (!seq)
1104 return NULL;
1105
1106 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001108 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Benjamin Peterson4905e802009-09-27 02:43:28 +00001110 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001111 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
1114 assert(i / 2 < seq->size);
1115 asdl_seq_SET(seq, i / 2, expression);
1116 }
1117 return seq;
1118}
1119
Neal Norwitzc1505362006-12-28 06:47:50 +00001120static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001121compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001122{
1123 identifier name;
1124 expr_ty annotation = NULL;
1125 node *ch;
1126
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001127 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001128 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001129 name = NEW_IDENTIFIER(ch);
1130 if (!name)
1131 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001132 if (forbidden_name(name, ch, 0))
1133 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001134
1135 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1136 annotation = ast_for_expr(c, CHILD(n, 2));
1137 if (!annotation)
1138 return NULL;
1139 }
1140
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001141 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001142#if 0
1143 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1144 if (!set_context(c, result, Store, n))
1145 return NULL;
1146 return result;
1147#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148}
1149
Guido van Rossum4f72a782006-10-27 23:31:49 +00001150/* returns -1 if failed to handle keyword only arguments
1151 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001152 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001153 ^^^
1154 start pointing here
1155 */
1156static int
1157handle_keywordonly_args(struct compiling *c, const node *n, int start,
1158 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1159{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001160 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001161 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001162 expr_ty expression, annotation;
1163 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001164 int i = start;
1165 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001166
1167 if (kwonlyargs == NULL) {
1168 ast_error(CHILD(n, start), "named arguments must follow bare *");
1169 return -1;
1170 }
1171 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001172 while (i < NCH(n)) {
1173 ch = CHILD(n, i);
1174 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001175 case vfpdef:
1176 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001177 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001178 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001179 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001180 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001181 asdl_seq_SET(kwdefaults, j, expression);
1182 i += 2; /* '=' and test */
1183 }
1184 else { /* setting NULL if no default value exists */
1185 asdl_seq_SET(kwdefaults, j, NULL);
1186 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001187 if (NCH(ch) == 3) {
1188 /* ch is NAME ':' test */
1189 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001190 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001191 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 }
1193 else {
1194 annotation = NULL;
1195 }
1196 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001197 argname = NEW_IDENTIFIER(ch);
1198 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001199 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001200 if (forbidden_name(argname, ch, 0))
1201 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001202 arg = arg(argname, annotation, c->c_arena);
1203 if (!arg)
1204 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001205 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001206 i += 2; /* the name and the comma */
1207 break;
1208 case DOUBLESTAR:
1209 return i;
1210 default:
1211 ast_error(ch, "unexpected node");
1212 goto error;
1213 }
1214 }
1215 return i;
1216 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001218}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219
Jeremy Hyltona8293132006-02-28 17:58:27 +00001220/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221
1222static arguments_ty
1223ast_for_arguments(struct compiling *c, const node *n)
1224{
Neal Norwitzc1505362006-12-28 06:47:50 +00001225 /* This function handles both typedargslist (function definition)
1226 and varargslist (lambda definition).
1227
1228 parameters: '(' [typedargslist] ')'
1229 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001231 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001232 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001233 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001234 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001236 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001237 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001238 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001240 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1241 int nposdefaults = 0, found_default = 0;
1242 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001244 arg_ty arg;
1245 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 node *ch;
1247
1248 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001249 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001250 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1251 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001252 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001254 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255
Jeremy Hyltone921e022008-07-17 16:37:17 +00001256 /* First count the number of positional args & defaults. The
1257 variable i is the loop index for this for loop and the next.
1258 The next loop picks up where the first leaves off.
1259 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001261 ch = CHILD(n, i);
1262 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001263 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001264 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001265 if (i < NCH(n) && /* skip argument following star */
1266 (TYPE(CHILD(n, i)) == tfpdef ||
1267 TYPE(CHILD(n, i)) == vfpdef)) {
1268 i++;
1269 }
1270 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001271 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001272 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001273 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001274 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001277 defaults for keyword only args */
1278 for ( ; i < NCH(n); ++i) {
1279 ch = CHILD(n, i);
1280 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001281 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001282 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001283 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1284 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001285 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001286 kwonlyargs = (nkwonlyargs ?
1287 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1288 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001289 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1292 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001293 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001295 since we set NULL as default for keyword only argument w/o default
1296 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001297 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001298 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1299 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001300 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001301
1302 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001303 ast_error(n, "more than 255 arguments");
1304 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001305 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001307 /* tfpdef: NAME [':' test]
1308 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 */
1310 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001311 j = 0; /* index for defaults */
1312 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001314 ch = CHILD(n, i);
1315 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001316 case tfpdef:
1317 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1319 anything other than EQUAL or a comma? */
1320 /* XXX Should NCH(n) check be made a separate check? */
1321 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001322 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1323 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001324 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001325 assert(posdefaults != NULL);
1326 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001328 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001333 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001334 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001335 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001336 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001337 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001338 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001339 i += 2; /* the name and the comma */
1340 break;
1341 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001342 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001344 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001345 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001346 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001347 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001348 if (TYPE(ch) == COMMA) {
1349 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001350 i += 2; /* now follows keyword only arguments */
1351 res = handle_keywordonly_args(c, n, i,
1352 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001353 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001354 i = res; /* res has new position to process */
1355 }
1356 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001357 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001358 if (!vararg)
1359 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001360 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1361 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001362 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001363 /* there is an annotation on the vararg */
1364 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001365 if (!varargannotation)
1366 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001367 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001368 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001369 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1370 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001371 int res = 0;
1372 res = handle_keywordonly_args(c, n, i,
1373 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001374 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001375 i = res; /* res has new position to process */
1376 }
1377 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001378 break;
1379 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001380 ch = CHILD(n, i+1); /* tfpdef */
1381 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001382 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001383 if (!kwarg)
1384 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001385 if (NCH(ch) > 1) {
1386 /* there is an annotation on the kwarg */
1387 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001388 if (!kwargannotation)
1389 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001390 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001391 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001392 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393 i += 3;
1394 break;
1395 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001396 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 "unexpected node in varargslist: %d @ %d",
1398 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001399 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001400 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001402 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1403 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404}
1405
1406static expr_ty
1407ast_for_dotted_name(struct compiling *c, const node *n)
1408{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001409 expr_ty e;
1410 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001411 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 int i;
1413
1414 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001415
1416 lineno = LINENO(n);
1417 col_offset = n->n_col_offset;
1418
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 id = NEW_IDENTIFIER(CHILD(n, 0));
1420 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001421 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001422 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001424 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425
1426 for (i = 2; i < NCH(n); i+=2) {
1427 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001428 if (!id)
1429 return NULL;
1430 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1431 if (!e)
1432 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433 }
1434
1435 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436}
1437
1438static expr_ty
1439ast_for_decorator(struct compiling *c, const node *n)
1440{
1441 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1442 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001443 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001446 REQ(CHILD(n, 0), AT);
1447 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1450 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001451 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001454 d = name_expr;
1455 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456 }
1457 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001458 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001459 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001460 if (!d)
1461 return NULL;
1462 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 }
1464 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001465 d = ast_for_call(c, CHILD(n, 3), name_expr);
1466 if (!d)
1467 return NULL;
1468 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 }
1470
1471 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472}
1473
1474static asdl_seq*
1475ast_for_decorators(struct compiling *c, const node *n)
1476{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001477 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001478 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001482 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 if (!decorator_seq)
1484 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001487 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001488 if (!d)
1489 return NULL;
1490 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 }
1492 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493}
1494
1495static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001496ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001498 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001499 identifier name;
1500 arguments_ty args;
1501 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001502 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001503 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504
1505 REQ(n, funcdef);
1506
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 name = NEW_IDENTIFIER(CHILD(n, name_i));
1508 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001509 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001510 if (forbidden_name(name, CHILD(n, name_i), 0))
1511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1513 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001514 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001515 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1516 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1517 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001518 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001519 name_i += 2;
1520 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 body = ast_for_suite(c, CHILD(n, name_i + 3));
1522 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001523 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524
Neal Norwitzc1505362006-12-28 06:47:50 +00001525 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001526 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527}
1528
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001529static stmt_ty
1530ast_for_decorated(struct compiling *c, const node *n)
1531{
1532 /* decorated: decorators (classdef | funcdef) */
1533 stmt_ty thing = NULL;
1534 asdl_seq *decorator_seq = NULL;
1535
1536 REQ(n, decorated);
1537
1538 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1539 if (!decorator_seq)
1540 return NULL;
1541
1542 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001544
1545 if (TYPE(CHILD(n, 1)) == funcdef) {
1546 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1547 } else if (TYPE(CHILD(n, 1)) == classdef) {
1548 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1549 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001550 /* we count the decorators in when talking about the class' or
1551 * function's line number */
1552 if (thing) {
1553 thing->lineno = LINENO(n);
1554 thing->col_offset = n->n_col_offset;
1555 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001556 return thing;
1557}
1558
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559static expr_ty
1560ast_for_lambdef(struct compiling *c, const node *n)
1561{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001562 /* lambdef: 'lambda' [varargslist] ':' test
1563 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564 arguments_ty args;
1565 expr_ty expression;
1566
1567 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001568 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1569 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570 if (!args)
1571 return NULL;
1572 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001573 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 }
1576 else {
1577 args = ast_for_arguments(c, CHILD(n, 1));
1578 if (!args)
1579 return NULL;
1580 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001581 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 }
1584
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001585 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586}
1587
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001588static expr_ty
1589ast_for_ifexpr(struct compiling *c, const node *n)
1590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001592 expr_ty expression, body, orelse;
1593
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001594 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001595 body = ast_for_expr(c, CHILD(n, 0));
1596 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001597 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001598 expression = ast_for_expr(c, CHILD(n, 2));
1599 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001600 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001601 orelse = ast_for_expr(c, CHILD(n, 4));
1602 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001603 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001604 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1605 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001606}
1607
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001609 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001610
Nick Coghlan650f0d02007-04-15 12:05:43 +00001611 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001612*/
1613
1614static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001615count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001616{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618
Guido van Rossumd8faa362007-04-27 19:54:29 +00001619 count_comp_for:
1620 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001621 REQ(n, comp_for);
1622 if (NCH(n) == 5)
1623 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 else
1625 return n_fors;
1626 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001627 REQ(n, comp_iter);
1628 n = CHILD(n, 0);
1629 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001630 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001631 else if (TYPE(n) == comp_if) {
1632 if (NCH(n) == 3) {
1633 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001634 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001635 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001636 else
1637 return n_fors;
1638 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001639
Guido van Rossumd8faa362007-04-27 19:54:29 +00001640 /* Should never be reached */
1641 PyErr_SetString(PyExc_SystemError,
1642 "logic error in count_comp_fors");
1643 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644}
1645
Nick Coghlan650f0d02007-04-15 12:05:43 +00001646/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647
Nick Coghlan650f0d02007-04-15 12:05:43 +00001648 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649*/
1650
1651static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001652count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001654 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655
Guido van Rossumd8faa362007-04-27 19:54:29 +00001656 while (1) {
1657 REQ(n, comp_iter);
1658 if (TYPE(CHILD(n, 0)) == comp_for)
1659 return n_ifs;
1660 n = CHILD(n, 0);
1661 REQ(n, comp_if);
1662 n_ifs++;
1663 if (NCH(n) == 2)
1664 return n_ifs;
1665 n = CHILD(n, 2);
1666 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667}
1668
Guido van Rossum992d4a32007-07-11 13:09:30 +00001669static asdl_seq *
1670ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001673 asdl_seq *comps;
1674
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001675 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676 if (n_fors == -1)
1677 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001678
Nick Coghlan650f0d02007-04-15 12:05:43 +00001679 comps = asdl_seq_new(n_fors, c->c_arena);
1680 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001682
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001684 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001686 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001687 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688
Guido van Rossum992d4a32007-07-11 13:09:30 +00001689 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690
Guido van Rossum992d4a32007-07-11 13:09:30 +00001691 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001692 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001693 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001695 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001696 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001698
Thomas Wouters89f507f2006-12-13 04:49:30 +00001699 /* Check the # of children rather than the length of t, since
1700 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001701 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001702 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001703 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001705 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1706 c->c_arena),
1707 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001708 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001710
Guido van Rossum992d4a32007-07-11 13:09:30 +00001711 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 int j, n_ifs;
1713 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714
Guido van Rossum992d4a32007-07-11 13:09:30 +00001715 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001716 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001717 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001719
1720 ifs = asdl_seq_new(n_ifs, c->c_arena);
1721 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001723
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001725 REQ(n, comp_iter);
1726 n = CHILD(n, 0);
1727 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728
Guido van Rossum992d4a32007-07-11 13:09:30 +00001729 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001730 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001731 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001732 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001733 if (NCH(n) == 3)
1734 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001736 /* on exit, must guarantee that n is a comp_for */
1737 if (TYPE(n) == comp_iter)
1738 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001739 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001741 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001742 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001743 return comps;
1744}
1745
1746static expr_ty
1747ast_for_itercomp(struct compiling *c, const node *n, int type)
1748{
1749 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1750 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1751 expr_ty elt;
1752 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753
Guido van Rossum992d4a32007-07-11 13:09:30 +00001754 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755
Guido van Rossum992d4a32007-07-11 13:09:30 +00001756 elt = ast_for_expr(c, CHILD(n, 0));
1757 if (!elt)
1758 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759
Guido van Rossum992d4a32007-07-11 13:09:30 +00001760 comps = ast_for_comprehension(c, CHILD(n, 1));
1761 if (!comps)
1762 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001763
1764 if (type == COMP_GENEXP)
1765 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1766 else if (type == COMP_LISTCOMP)
1767 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1768 else if (type == COMP_SETCOMP)
1769 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1770 else
1771 /* Should never happen */
1772 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773}
1774
1775static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001776ast_for_dictcomp(struct compiling *c, const node *n)
1777{
1778 expr_ty key, value;
1779 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780
Guido van Rossum992d4a32007-07-11 13:09:30 +00001781 assert(NCH(n) > 3);
1782 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783
Guido van Rossum992d4a32007-07-11 13:09:30 +00001784 key = ast_for_expr(c, CHILD(n, 0));
1785 if (!key)
1786 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001787 value = ast_for_expr(c, CHILD(n, 2));
1788 if (!value)
1789 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790
Guido van Rossum992d4a32007-07-11 13:09:30 +00001791 comps = ast_for_comprehension(c, CHILD(n, 3));
1792 if (!comps)
1793 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794
Guido van Rossum992d4a32007-07-11 13:09:30 +00001795 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1796}
1797
1798static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001799ast_for_genexp(struct compiling *c, const node *n)
1800{
1801 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001802 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001803}
1804
1805static expr_ty
1806ast_for_listcomp(struct compiling *c, const node *n)
1807{
1808 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001809 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001810}
1811
1812static expr_ty
1813ast_for_setcomp(struct compiling *c, const node *n)
1814{
1815 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001816 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001817}
1818
1819
1820static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821ast_for_atom(struct compiling *c, const node *n)
1822{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001823 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1824 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001825 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 */
1827 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001828 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001831 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001832 /* All names start in Load context, but may later be
1833 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001834 PyObject *name = NEW_IDENTIFIER(ch);
1835 if (!name)
1836 return NULL;
1837 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1838 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001840 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001841 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001842 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001843 PyObject *type, *value, *tback, *errstr;
1844 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001845 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001846 if (errstr) {
1847 char *s = "";
1848 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001849 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001850 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1851 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001852 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001853 } else {
1854 ast_error(n, "(unicode error) unknown error");
1855 }
1856 Py_DECREF(type);
1857 Py_DECREF(value);
1858 Py_XDECREF(tback);
1859 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001860 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001861 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001863 if (bytesmode)
1864 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1865 else
1866 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 }
1868 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001869 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 if (!pynum)
1871 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001872
Thomas Wouters89f507f2006-12-13 04:49:30 +00001873 PyArena_AddPyObject(c->c_arena, pynum);
1874 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 }
Georg Brandldde00282007-03-18 19:01:53 +00001876 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001877 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001879 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 if (TYPE(ch) == RPAR)
1882 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 if (TYPE(ch) == yield_expr)
1885 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001888 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001890
Nick Coghlan650f0d02007-04-15 12:05:43 +00001891 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894
Thomas Wouters89f507f2006-12-13 04:49:30 +00001895 if (TYPE(ch) == RSQB)
1896 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897
Nick Coghlan650f0d02007-04-15 12:05:43 +00001898 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1900 asdl_seq *elts = seq_for_testlist(c, ch);
1901 if (!elts)
1902 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001903
Thomas Wouters89f507f2006-12-13 04:49:30 +00001904 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1905 }
1906 else
1907 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001909 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1910 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001911 int i, size;
1912 asdl_seq *keys, *values;
1913
1914 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001915 if (TYPE(ch) == RBRACE) {
1916 /* it's an empty dict */
1917 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1918 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1919 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001920 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001921 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001922 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001924 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001925 for (i = 0; i < NCH(ch); i += 2) {
1926 expr_ty expression;
1927 expression = ast_for_expr(c, CHILD(ch, i));
1928 if (!expression)
1929 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001930 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001931 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001932 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1933 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1934 /* it's a set comprehension */
1935 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001936 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1937 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001938 } else {
1939 /* it's a dict */
1940 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1941 keys = asdl_seq_new(size, c->c_arena);
1942 if (!keys)
1943 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944
Guido van Rossum86e58e22006-08-28 15:27:34 +00001945 values = asdl_seq_new(size, c->c_arena);
1946 if (!values)
1947 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948
Guido van Rossum86e58e22006-08-28 15:27:34 +00001949 for (i = 0; i < NCH(ch); i += 4) {
1950 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951
Guido van Rossum86e58e22006-08-28 15:27:34 +00001952 expression = ast_for_expr(c, CHILD(ch, i));
1953 if (!expression)
1954 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001955
Guido van Rossum86e58e22006-08-28 15:27:34 +00001956 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001957
Guido van Rossum86e58e22006-08-28 15:27:34 +00001958 expression = ast_for_expr(c, CHILD(ch, i + 2));
1959 if (!expression)
1960 return NULL;
1961
1962 asdl_seq_SET(values, i / 4, expression);
1963 }
1964 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1965 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001968 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1969 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 }
1971}
1972
1973static slice_ty
1974ast_for_slice(struct compiling *c, const node *n)
1975{
1976 node *ch;
1977 expr_ty lower = NULL, upper = NULL, step = NULL;
1978
1979 REQ(n, subscript);
1980
1981 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001982 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983 sliceop: ':' [test]
1984 */
1985 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 if (NCH(n) == 1 && TYPE(ch) == test) {
1987 /* 'step' variable hold no significance in terms of being used over
1988 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 if (!step)
1991 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992
Thomas Wouters89f507f2006-12-13 04:49:30 +00001993 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 }
1995
1996 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!lower)
1999 return NULL;
2000 }
2001
2002 /* If there's an upper bound it's in the second or third position. */
2003 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002004 if (NCH(n) > 1) {
2005 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006
Thomas Wouters89f507f2006-12-13 04:49:30 +00002007 if (TYPE(n2) == test) {
2008 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 if (!upper)
2010 return NULL;
2011 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 if (TYPE(n2) == test) {
2017 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 if (!upper)
2019 return NULL;
2020 }
2021 }
2022
2023 ch = CHILD(n, NCH(n) - 1);
2024 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002025 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002026 ch = CHILD(ch, 1);
2027 if (TYPE(ch) == test) {
2028 step = ast_for_expr(c, ch);
2029 if (!step)
2030 return NULL;
2031 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 }
2033 }
2034
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002035 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036}
2037
2038static expr_ty
2039ast_for_binop(struct compiling *c, const node *n)
2040{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002041 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002043 BinOp(BinOp(A, op, B), op, C).
2044 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045
Guido van Rossumd8faa362007-04-27 19:54:29 +00002046 int i, nops;
2047 expr_ty expr1, expr2, result;
2048 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049
Guido van Rossumd8faa362007-04-27 19:54:29 +00002050 expr1 = ast_for_expr(c, CHILD(n, 0));
2051 if (!expr1)
2052 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Guido van Rossumd8faa362007-04-27 19:54:29 +00002054 expr2 = ast_for_expr(c, CHILD(n, 2));
2055 if (!expr2)
2056 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Guido van Rossumd8faa362007-04-27 19:54:29 +00002058 newoperator = get_operator(CHILD(n, 1));
2059 if (!newoperator)
2060 return NULL;
2061
2062 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2063 c->c_arena);
2064 if (!result)
2065 return NULL;
2066
2067 nops = (NCH(n) - 1) / 2;
2068 for (i = 1; i < nops; i++) {
2069 expr_ty tmp_result, tmp;
2070 const node* next_oper = CHILD(n, i * 2 + 1);
2071
2072 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002073 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 return NULL;
2075
Guido van Rossumd8faa362007-04-27 19:54:29 +00002076 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2077 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 return NULL;
2079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002081 LINENO(next_oper), next_oper->n_col_offset,
2082 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002084 return NULL;
2085 result = tmp_result;
2086 }
2087 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088}
2089
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002090static expr_ty
2091ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002094 subscriptlist: subscript (',' subscript)* [',']
2095 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2096 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002097 REQ(n, trailer);
2098 if (TYPE(CHILD(n, 0)) == LPAR) {
2099 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002100 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2101 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002102 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002103 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002104 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002105 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002106 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2107 if (!attr_id)
2108 return NULL;
2109 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002110 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002111 }
2112 else {
2113 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002114 REQ(CHILD(n, 2), RSQB);
2115 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002116 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002117 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2118 if (!slc)
2119 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002120 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2121 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002122 }
2123 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002125 by treating the sequence as a tuple literal if there are
2126 no slice features.
2127 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002128 int j;
2129 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002130 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002131 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002132 asdl_seq *slices, *elts;
2133 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002134 if (!slices)
2135 return NULL;
2136 for (j = 0; j < NCH(n); j += 2) {
2137 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002138 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002139 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002140 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002141 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002142 asdl_seq_SET(slices, j / 2, slc);
2143 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002144 if (!simple) {
2145 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002146 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002147 }
2148 /* extract Index values and put them in a Tuple */
2149 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002150 if (!elts)
2151 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002152 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2153 slc = (slice_ty)asdl_seq_GET(slices, j);
2154 assert(slc->kind == Index_kind && slc->v.Index.value);
2155 asdl_seq_SET(elts, j, slc->v.Index.value);
2156 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002157 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002158 if (!e)
2159 return NULL;
2160 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002162 }
2163 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002164}
2165
2166static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002167ast_for_factor(struct compiling *c, const node *n)
2168{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002169 expr_ty expression;
2170
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002171 expression = ast_for_expr(c, CHILD(n, 1));
2172 if (!expression)
2173 return NULL;
2174
2175 switch (TYPE(CHILD(n, 0))) {
2176 case PLUS:
2177 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2178 c->c_arena);
2179 case MINUS:
2180 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2181 c->c_arena);
2182 case TILDE:
2183 return UnaryOp(Invert, expression, LINENO(n),
2184 n->n_col_offset, c->c_arena);
2185 }
2186 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2187 TYPE(CHILD(n, 0)));
2188 return NULL;
2189}
2190
2191static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002192ast_for_power(struct compiling *c, const node *n)
2193{
2194 /* power: atom trailer* ('**' factor)*
2195 */
2196 int i;
2197 expr_ty e, tmp;
2198 REQ(n, power);
2199 e = ast_for_atom(c, CHILD(n, 0));
2200 if (!e)
2201 return NULL;
2202 if (NCH(n) == 1)
2203 return e;
2204 for (i = 1; i < NCH(n); i++) {
2205 node *ch = CHILD(n, i);
2206 if (TYPE(ch) != trailer)
2207 break;
2208 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002209 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002210 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002211 tmp->lineno = e->lineno;
2212 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002213 e = tmp;
2214 }
2215 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2216 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002217 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002218 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002219 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002220 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002221 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002222 e = tmp;
2223 }
2224 return e;
2225}
2226
Guido van Rossum0368b722007-05-11 16:50:42 +00002227static expr_ty
2228ast_for_starred(struct compiling *c, const node *n)
2229{
2230 expr_ty tmp;
2231 REQ(n, star_expr);
2232
2233 tmp = ast_for_expr(c, CHILD(n, 1));
2234 if (!tmp)
2235 return NULL;
2236
2237 /* The Load context is changed later. */
2238 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2239}
2240
2241
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242/* Do not name a variable 'expr'! Will cause a compile error.
2243*/
2244
2245static expr_ty
2246ast_for_expr(struct compiling *c, const node *n)
2247{
2248 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002249 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002250 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 and_test: not_test ('and' not_test)*
2253 not_test: 'not' not_test | comparison
2254 comparison: expr (comp_op expr)*
2255 expr: xor_expr ('|' xor_expr)*
2256 xor_expr: and_expr ('^' and_expr)*
2257 and_expr: shift_expr ('&' shift_expr)*
2258 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2259 arith_expr: term (('+'|'-') term)*
2260 term: factor (('*'|'/'|'%'|'//') factor)*
2261 factor: ('+'|'-'|'~') factor | power
2262 power: atom trailer* ('**' factor)*
2263 */
2264
2265 asdl_seq *seq;
2266 int i;
2267
2268 loop:
2269 switch (TYPE(n)) {
2270 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002271 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002272 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002273 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002275 else if (NCH(n) > 1)
2276 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002277 /* Fallthrough */
2278 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 case and_test:
2280 if (NCH(n) == 1) {
2281 n = CHILD(n, 0);
2282 goto loop;
2283 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002284 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 if (!seq)
2286 return NULL;
2287 for (i = 0; i < NCH(n); i += 2) {
2288 expr_ty e = ast_for_expr(c, CHILD(n, i));
2289 if (!e)
2290 return NULL;
2291 asdl_seq_SET(seq, i / 2, e);
2292 }
2293 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002294 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2295 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002296 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002297 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 case not_test:
2299 if (NCH(n) == 1) {
2300 n = CHILD(n, 0);
2301 goto loop;
2302 }
2303 else {
2304 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2305 if (!expression)
2306 return NULL;
2307
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002308 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2309 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 }
2311 case comparison:
2312 if (NCH(n) == 1) {
2313 n = CHILD(n, 0);
2314 goto loop;
2315 }
2316 else {
2317 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002318 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002319 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002320 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 if (!ops)
2322 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002323 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 return NULL;
2326 }
2327 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002328 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002330 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002331 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002333 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334
2335 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002336 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002340 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 asdl_seq_SET(cmps, i / 2, expression);
2342 }
2343 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002344 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002346 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002348 return Compare(expression, ops, cmps, LINENO(n),
2349 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 }
2351 break;
2352
Guido van Rossum0368b722007-05-11 16:50:42 +00002353 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 /* The next five cases all handle BinOps. The main body of code
2356 is the same in each case, but the switch turned inside out to
2357 reuse the code for each type of operator.
2358 */
2359 case expr:
2360 case xor_expr:
2361 case and_expr:
2362 case shift_expr:
2363 case arith_expr:
2364 case term:
2365 if (NCH(n) == 1) {
2366 n = CHILD(n, 0);
2367 goto loop;
2368 }
2369 return ast_for_binop(c, n);
2370 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002371 expr_ty exp = NULL;
2372 if (NCH(n) == 2) {
2373 exp = ast_for_testlist(c, CHILD(n, 1));
2374 if (!exp)
2375 return NULL;
2376 }
2377 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
2378 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002379 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 if (NCH(n) == 1) {
2381 n = CHILD(n, 0);
2382 goto loop;
2383 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002384 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002385 case power:
2386 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002388 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 return NULL;
2390 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002391 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 return NULL;
2393}
2394
2395static expr_ty
2396ast_for_call(struct compiling *c, const node *n, expr_ty func)
2397{
2398 /*
2399 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2400 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002401 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402 */
2403
2404 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002405 asdl_seq *args;
2406 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 expr_ty vararg = NULL, kwarg = NULL;
2408
2409 REQ(n, arglist);
2410
2411 nargs = 0;
2412 nkeywords = 0;
2413 ngens = 0;
2414 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 node *ch = CHILD(n, i);
2416 if (TYPE(ch) == argument) {
2417 if (NCH(ch) == 1)
2418 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002419 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 nkeywords++;
2423 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 }
2425 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002426 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 "if not sole argument");
2428 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 }
2430
2431 if (nargs + nkeywords + ngens > 255) {
2432 ast_error(n, "more than 255 arguments");
2433 return NULL;
2434 }
2435
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002436 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002438 return NULL;
2439 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002441 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 nargs = 0;
2443 nkeywords = 0;
2444 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002445 node *ch = CHILD(n, i);
2446 if (TYPE(ch) == argument) {
2447 expr_ty e;
2448 if (NCH(ch) == 1) {
2449 if (nkeywords) {
2450 ast_error(CHILD(ch, 0),
2451 "non-keyword arg after keyword arg");
2452 return NULL;
2453 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002454 if (vararg) {
2455 ast_error(CHILD(ch, 0),
2456 "only named arguments may follow *expression");
2457 return NULL;
2458 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002459 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002461 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002464 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002467 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002468 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 else {
2471 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002472 identifier key, tmp;
2473 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 /* f(lambda x: x[0] = 3) ends up getting parsed with
2480 * LHS test = lambda x: x[0], and RHS test = 3.
2481 * SF bug 132313 points out that complaining about a keyword
2482 * then is very confusing.
2483 */
2484 if (e->kind == Lambda_kind) {
2485 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 } else if (e->kind != Name_kind) {
2488 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002489 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002490 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 return NULL;
2492 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002494 for (k = 0; k < nkeywords; k++) {
2495 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2496 if (!PyUnicode_Compare(tmp, key)) {
2497 ast_error(CHILD(ch, 0), "keyword argument repeated");
2498 return NULL;
2499 }
2500 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002501 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002503 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002504 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002506 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 asdl_seq_SET(keywords, nkeywords++, kw);
2508 }
2509 }
2510 else if (TYPE(ch) == STAR) {
2511 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002512 if (!vararg)
2513 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002514 i++;
2515 }
2516 else if (TYPE(ch) == DOUBLESTAR) {
2517 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002518 if (!kwarg)
2519 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002520 i++;
2521 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 }
2523
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002524 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525}
2526
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002528ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002530 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002531 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002533 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002534 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002535 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002536 }
2537 else {
2538 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002539 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002542 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543 else {
2544 asdl_seq *tmp = seq_for_testlist(c, n);
2545 if (!tmp)
2546 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002547 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002549}
2550
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551static stmt_ty
2552ast_for_expr_stmt(struct compiling *c, const node *n)
2553{
2554 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002557 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 test: ... here starts the operator precendence dance
2561 */
2562
2563 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 if (!e)
2566 return NULL;
2567
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 }
2570 else if (TYPE(CHILD(n, 1)) == augassign) {
2571 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002572 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002573 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574
Thomas Wouters89f507f2006-12-13 04:49:30 +00002575 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 if (!expr1)
2577 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002578 if(!set_context(c, expr1, Store, ch))
2579 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002580 /* set_context checks that most expressions are not the left side.
2581 Augmented assignments can only have a name, a subscript, or an
2582 attribute on the left, though, so we have to explicitly check for
2583 those. */
2584 switch (expr1->kind) {
2585 case Name_kind:
2586 case Attribute_kind:
2587 case Subscript_kind:
2588 break;
2589 default:
2590 ast_error(ch, "illegal expression for augmented assignment");
2591 return NULL;
2592 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 ch = CHILD(n, 2);
2595 if (TYPE(ch) == testlist)
2596 expr2 = ast_for_testlist(c, ch);
2597 else
2598 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002599 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 return NULL;
2601
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002602 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002603 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 return NULL;
2605
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 }
2608 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002609 int i;
2610 asdl_seq *targets;
2611 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 expr_ty expression;
2613
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 /* a normal assignment */
2615 REQ(CHILD(n, 1), EQUAL);
2616 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2617 if (!targets)
2618 return NULL;
2619 for (i = 0; i < NCH(n) - 2; i += 2) {
2620 expr_ty e;
2621 node *ch = CHILD(n, i);
2622 if (TYPE(ch) == yield_expr) {
2623 ast_error(ch, "assignment to yield expression not possible");
2624 return NULL;
2625 }
2626 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002630 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002631 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002632 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 asdl_seq_SET(targets, i / 2, e);
2635 }
2636 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002637 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002638 expression = ast_for_testlist(c, value);
2639 else
2640 expression = ast_for_expr(c, value);
2641 if (!expression)
2642 return NULL;
2643 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645}
2646
Benjamin Peterson78565b22009-06-28 19:19:51 +00002647
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002649ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650{
2651 asdl_seq *seq;
2652 int i;
2653 expr_ty e;
2654
2655 REQ(n, exprlist);
2656
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002657 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002659 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002661 e = ast_for_expr(c, CHILD(n, i));
2662 if (!e)
2663 return NULL;
2664 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002665 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002666 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 }
2668 return seq;
2669}
2670
2671static stmt_ty
2672ast_for_del_stmt(struct compiling *c, const node *n)
2673{
2674 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 /* del_stmt: 'del' exprlist */
2677 REQ(n, del_stmt);
2678
2679 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2680 if (!expr_list)
2681 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002682 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683}
2684
2685static stmt_ty
2686ast_for_flow_stmt(struct compiling *c, const node *n)
2687{
2688 /*
2689 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2690 | yield_stmt
2691 break_stmt: 'break'
2692 continue_stmt: 'continue'
2693 return_stmt: 'return' [testlist]
2694 yield_stmt: yield_expr
2695 yield_expr: 'yield' testlist
2696 raise_stmt: 'raise' [test [',' test [',' test]]]
2697 */
2698 node *ch;
2699
2700 REQ(n, flow_stmt);
2701 ch = CHILD(n, 0);
2702 switch (TYPE(ch)) {
2703 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002704 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002706 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002708 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2709 if (!exp)
2710 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002711 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 }
2713 case return_stmt:
2714 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002715 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002717 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 if (!expression)
2719 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002720 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 }
2722 case raise_stmt:
2723 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002724 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2725 else if (NCH(ch) >= 2) {
2726 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2728 if (!expression)
2729 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002730 if (NCH(ch) == 4) {
2731 cause = ast_for_expr(c, CHILD(ch, 3));
2732 if (!cause)
2733 return NULL;
2734 }
2735 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 }
2737 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002738 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 "unexpected flow_stmt: %d", TYPE(ch));
2740 return NULL;
2741 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002742
2743 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2744 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745}
2746
2747static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002748alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749{
2750 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002751 import_as_name: NAME ['as' NAME]
2752 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 dotted_name: NAME ('.' NAME)*
2754 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002755 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002756
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 loop:
2758 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002759 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002760 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002761 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002762 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002763 if (!name)
2764 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002765 if (NCH(n) == 3) {
2766 node *str_node = CHILD(n, 2);
2767 str = NEW_IDENTIFIER(str_node);
2768 if (!str)
2769 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002770 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002771 return NULL;
2772 }
2773 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002774 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002775 return NULL;
2776 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002777 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002778 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 case dotted_as_name:
2780 if (NCH(n) == 1) {
2781 n = CHILD(n, 0);
2782 goto loop;
2783 }
2784 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002785 node *asname_node = CHILD(n, 2);
2786 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002787 if (!a)
2788 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002790 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002791 if (!a->asname)
2792 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002793 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002794 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 return a;
2796 }
2797 break;
2798 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002799 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002800 node *name_node = CHILD(n, 0);
2801 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002802 if (!name)
2803 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002804 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002805 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002806 return alias(name, NULL, c->c_arena);
2807 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 else {
2809 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002810 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002811 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002814
2815 len = 0;
2816 for (i = 0; i < NCH(n); i += 2)
2817 /* length of string plus one for the dot */
2818 len += strlen(STR(CHILD(n, i))) + 1;
2819 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002820 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 if (!str)
2822 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002823 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 if (!s)
2825 return NULL;
2826 for (i = 0; i < NCH(n); i += 2) {
2827 char *sch = STR(CHILD(n, i));
2828 strcpy(s, STR(CHILD(n, i)));
2829 s += strlen(sch);
2830 *s++ = '.';
2831 }
2832 --s;
2833 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2835 PyBytes_GET_SIZE(str),
2836 NULL);
2837 Py_DECREF(str);
2838 if (!uni)
2839 return NULL;
2840 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002841 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002842 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002843 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844 }
2845 break;
2846 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002847 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002848 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002849 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002851 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002852 "unexpected import name: %d", TYPE(n));
2853 return NULL;
2854 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002855
2856 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 return NULL;
2858}
2859
2860static stmt_ty
2861ast_for_import_stmt(struct compiling *c, const node *n)
2862{
2863 /*
2864 import_stmt: import_name | import_from
2865 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002866 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2867 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002869 int lineno;
2870 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 int i;
2872 asdl_seq *aliases;
2873
2874 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002875 lineno = LINENO(n);
2876 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002878 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002880 REQ(n, dotted_as_names);
2881 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2882 if (!aliases)
2883 return NULL;
2884 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002885 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002886 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002888 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002890 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002892 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002894 int idx, ndots = 0;
2895 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002896 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002898 /* Count the number of dots (for relative imports) and check for the
2899 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002900 for (idx = 1; idx < NCH(n); idx++) {
2901 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002902 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2903 if (!mod)
2904 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 idx++;
2906 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002907 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002909 ndots += 3;
2910 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 } else if (TYPE(CHILD(n, idx)) != DOT) {
2912 break;
2913 }
2914 ndots++;
2915 }
2916 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002917 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002918 case STAR:
2919 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920 n = CHILD(n, idx);
2921 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002922 break;
2923 case LPAR:
2924 /* from ... import (x, y, z) */
2925 n = CHILD(n, idx + 1);
2926 n_children = NCH(n);
2927 break;
2928 case import_as_names:
2929 /* from ... import x, y, z */
2930 n = CHILD(n, idx);
2931 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002932 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 ast_error(n, "trailing comma not allowed without"
2934 " surrounding parentheses");
2935 return NULL;
2936 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002937 break;
2938 default:
2939 ast_error(n, "Unexpected node-type in from-import");
2940 return NULL;
2941 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2944 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946
2947 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002948 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002949 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002950 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002952 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002954 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002955 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002956 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002957 if (!import_alias)
2958 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002960 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002962 if (mod != NULL)
2963 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002964 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002965 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 }
Neal Norwitz79792652005-11-14 04:25:03 +00002967 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 "unknown import statement: starts with command '%s'",
2969 STR(CHILD(n, 0)));
2970 return NULL;
2971}
2972
2973static stmt_ty
2974ast_for_global_stmt(struct compiling *c, const node *n)
2975{
2976 /* global_stmt: 'global' NAME (',' NAME)* */
2977 identifier name;
2978 asdl_seq *s;
2979 int i;
2980
2981 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002982 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002986 name = NEW_IDENTIFIER(CHILD(n, i));
2987 if (!name)
2988 return NULL;
2989 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002991 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992}
2993
2994static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002995ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2996{
2997 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2998 identifier name;
2999 asdl_seq *s;
3000 int i;
3001
3002 REQ(n, nonlocal_stmt);
3003 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3004 if (!s)
3005 return NULL;
3006 for (i = 1; i < NCH(n); i += 2) {
3007 name = NEW_IDENTIFIER(CHILD(n, i));
3008 if (!name)
3009 return NULL;
3010 asdl_seq_SET(s, i / 2, name);
3011 }
3012 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3013}
3014
3015static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016ast_for_assert_stmt(struct compiling *c, const node *n)
3017{
3018 /* assert_stmt: 'assert' test [',' test] */
3019 REQ(n, assert_stmt);
3020 if (NCH(n) == 2) {
3021 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3022 if (!expression)
3023 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003024 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 }
3026 else if (NCH(n) == 4) {
3027 expr_ty expr1, expr2;
3028
3029 expr1 = ast_for_expr(c, CHILD(n, 1));
3030 if (!expr1)
3031 return NULL;
3032 expr2 = ast_for_expr(c, CHILD(n, 3));
3033 if (!expr2)
3034 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035
Thomas Wouters89f507f2006-12-13 04:49:30 +00003036 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 }
Neal Norwitz79792652005-11-14 04:25:03 +00003038 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 "improper number of parts to 'assert' statement: %d",
3040 NCH(n));
3041 return NULL;
3042}
3043
3044static asdl_seq *
3045ast_for_suite(struct compiling *c, const node *n)
3046{
3047 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003048 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 stmt_ty s;
3050 int i, total, num, end, pos = 0;
3051 node *ch;
3052
3053 REQ(n, suite);
3054
3055 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003056 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003058 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003060 n = CHILD(n, 0);
3061 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003063 */
3064 end = NCH(n) - 1;
3065 if (TYPE(CHILD(n, end - 1)) == SEMI)
3066 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 for (i = 0; i < end; i += 2) {
3069 ch = CHILD(n, i);
3070 s = ast_for_stmt(c, ch);
3071 if (!s)
3072 return NULL;
3073 asdl_seq_SET(seq, pos++, s);
3074 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 }
3076 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003077 for (i = 2; i < (NCH(n) - 1); i++) {
3078 ch = CHILD(n, i);
3079 REQ(ch, stmt);
3080 num = num_stmts(ch);
3081 if (num == 1) {
3082 /* small_stmt or compound_stmt with only one child */
3083 s = ast_for_stmt(c, ch);
3084 if (!s)
3085 return NULL;
3086 asdl_seq_SET(seq, pos++, s);
3087 }
3088 else {
3089 int j;
3090 ch = CHILD(ch, 0);
3091 REQ(ch, simple_stmt);
3092 for (j = 0; j < NCH(ch); j += 2) {
3093 /* statement terminates with a semi-colon ';' */
3094 if (NCH(CHILD(ch, j)) == 0) {
3095 assert((j + 1) == NCH(ch));
3096 break;
3097 }
3098 s = ast_for_stmt(c, CHILD(ch, j));
3099 if (!s)
3100 return NULL;
3101 asdl_seq_SET(seq, pos++, s);
3102 }
3103 }
3104 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 }
3106 assert(pos == seq->size);
3107 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108}
3109
3110static stmt_ty
3111ast_for_if_stmt(struct compiling *c, const node *n)
3112{
3113 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3114 ['else' ':' suite]
3115 */
3116 char *s;
3117
3118 REQ(n, if_stmt);
3119
3120 if (NCH(n) == 4) {
3121 expr_ty expression;
3122 asdl_seq *suite_seq;
3123
3124 expression = ast_for_expr(c, CHILD(n, 1));
3125 if (!expression)
3126 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003128 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130
Guido van Rossumd8faa362007-04-27 19:54:29 +00003131 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3132 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003134
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135 s = STR(CHILD(n, 4));
3136 /* s[2], the third character in the string, will be
3137 's' for el_s_e, or
3138 'i' for el_i_f
3139 */
3140 if (s[2] == 's') {
3141 expr_ty expression;
3142 asdl_seq *seq1, *seq2;
3143
3144 expression = ast_for_expr(c, CHILD(n, 1));
3145 if (!expression)
3146 return NULL;
3147 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003148 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149 return NULL;
3150 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003151 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 return NULL;
3153
Guido van Rossumd8faa362007-04-27 19:54:29 +00003154 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3155 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 }
3157 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003158 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 expr_ty expression;
3160 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003161 asdl_seq *orelse = NULL;
3162 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163 /* must reference the child n_elif+1 since 'else' token is third,
3164 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003165 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3166 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3167 has_else = 1;
3168 n_elif -= 3;
3169 }
3170 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171
Thomas Wouters89f507f2006-12-13 04:49:30 +00003172 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003174
Thomas Wouters89f507f2006-12-13 04:49:30 +00003175 orelse = asdl_seq_new(1, c->c_arena);
3176 if (!orelse)
3177 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003179 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003181 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3182 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003184 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3185 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 asdl_seq_SET(orelse, 0,
3189 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 LINENO(CHILD(n, NCH(n) - 6)),
3191 CHILD(n, NCH(n) - 6)->n_col_offset,
3192 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003193 /* the just-created orelse handled the last elif */
3194 n_elif--;
3195 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196
Thomas Wouters89f507f2006-12-13 04:49:30 +00003197 for (i = 0; i < n_elif; i++) {
3198 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003199 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3200 if (!newobj)
3201 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003203 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003206 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208
Thomas Wouters89f507f2006-12-13 04:49:30 +00003209 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 LINENO(CHILD(n, off)),
3212 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003213 orelse = newobj;
3214 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 expression = ast_for_expr(c, CHILD(n, 1));
3216 if (!expression)
3217 return NULL;
3218 suite_seq = ast_for_suite(c, CHILD(n, 3));
3219 if (!suite_seq)
3220 return NULL;
3221 return If(expression, suite_seq, orelse,
3222 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003224
3225 PyErr_Format(PyExc_SystemError,
3226 "unexpected token in 'if' statement: %s", s);
3227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228}
3229
3230static stmt_ty
3231ast_for_while_stmt(struct compiling *c, const node *n)
3232{
3233 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3234 REQ(n, while_stmt);
3235
3236 if (NCH(n) == 4) {
3237 expr_ty expression;
3238 asdl_seq *suite_seq;
3239
3240 expression = ast_for_expr(c, CHILD(n, 1));
3241 if (!expression)
3242 return NULL;
3243 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003244 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003246 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247 }
3248 else if (NCH(n) == 7) {
3249 expr_ty expression;
3250 asdl_seq *seq1, *seq2;
3251
3252 expression = ast_for_expr(c, CHILD(n, 1));
3253 if (!expression)
3254 return NULL;
3255 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003256 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257 return NULL;
3258 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003259 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003260 return NULL;
3261
Thomas Wouters89f507f2006-12-13 04:49:30 +00003262 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003264
3265 PyErr_Format(PyExc_SystemError,
3266 "wrong number of tokens for 'while' statement: %d",
3267 NCH(n));
3268 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269}
3270
3271static stmt_ty
3272ast_for_for_stmt(struct compiling *c, const node *n)
3273{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003274 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003276 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003277 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3279 REQ(n, for_stmt);
3280
3281 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003282 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 if (!seq)
3284 return NULL;
3285 }
3286
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003287 node_target = CHILD(n, 1);
3288 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003289 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003291 /* Check the # of children rather than the length of _target, since
3292 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003293 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003294 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003295 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003297 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003299 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003300 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301 return NULL;
3302 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003303 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 return NULL;
3305
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003306 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3307 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308}
3309
3310static excepthandler_ty
3311ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3312{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003313 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314 REQ(exc, except_clause);
3315 REQ(body, suite);
3316
3317 if (NCH(exc) == 1) {
3318 asdl_seq *suite_seq = ast_for_suite(c, body);
3319 if (!suite_seq)
3320 return NULL;
3321
Neal Norwitzad74aa82008-03-31 05:14:30 +00003322 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003323 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003324 }
3325 else if (NCH(exc) == 2) {
3326 expr_ty expression;
3327 asdl_seq *suite_seq;
3328
3329 expression = ast_for_expr(c, CHILD(exc, 1));
3330 if (!expression)
3331 return NULL;
3332 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003333 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003334 return NULL;
3335
Neal Norwitzad74aa82008-03-31 05:14:30 +00003336 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003337 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338 }
3339 else if (NCH(exc) == 4) {
3340 asdl_seq *suite_seq;
3341 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003342 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003343 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003345 if (forbidden_name(e, CHILD(exc, 3), 0))
3346 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003348 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003349 return NULL;
3350 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003351 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 return NULL;
3353
Neal Norwitzad74aa82008-03-31 05:14:30 +00003354 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003355 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003357
3358 PyErr_Format(PyExc_SystemError,
3359 "wrong number of children for 'except' clause: %d",
3360 NCH(exc));
3361 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362}
3363
3364static stmt_ty
3365ast_for_try_stmt(struct compiling *c, const node *n)
3366{
Neal Norwitzf599f422005-12-17 21:33:47 +00003367 const int nch = NCH(n);
3368 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003369 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003370
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371 REQ(n, try_stmt);
3372
Neal Norwitzf599f422005-12-17 21:33:47 +00003373 body = ast_for_suite(c, CHILD(n, 2));
3374 if (body == NULL)
3375 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376
Neal Norwitzf599f422005-12-17 21:33:47 +00003377 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3378 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3379 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3380 /* we can assume it's an "else",
3381 because nch >= 9 for try-else-finally and
3382 it would otherwise have a type of except_clause */
3383 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3384 if (orelse == NULL)
3385 return NULL;
3386 n_except--;
3387 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388
Neal Norwitzf599f422005-12-17 21:33:47 +00003389 finally = ast_for_suite(c, CHILD(n, nch - 1));
3390 if (finally == NULL)
3391 return NULL;
3392 n_except--;
3393 }
3394 else {
3395 /* we can assume it's an "else",
3396 otherwise it would have a type of except_clause */
3397 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3398 if (orelse == NULL)
3399 return NULL;
3400 n_except--;
3401 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003402 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003403 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003404 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003405 return NULL;
3406 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407
Neal Norwitzf599f422005-12-17 21:33:47 +00003408 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003409 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003410 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003411 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003412 if (handlers == NULL)
3413 return NULL;
3414
3415 for (i = 0; i < n_except; i++) {
3416 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3417 CHILD(n, 5 + i * 3));
3418 if (!e)
3419 return NULL;
3420 asdl_seq_SET(handlers, i, e);
3421 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003422 }
3423
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003424 assert(finally != NULL || asdl_seq_LEN(handlers));
3425 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426}
3427
Georg Brandl0c315622009-05-25 21:10:36 +00003428/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003429static withitem_ty
3430ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003431{
3432 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003433
Georg Brandl0c315622009-05-25 21:10:36 +00003434 REQ(n, with_item);
3435 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003436 if (!context_expr)
3437 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003438 if (NCH(n) == 3) {
3439 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003440
3441 if (!optional_vars) {
3442 return NULL;
3443 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003444 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003445 return NULL;
3446 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003447 }
3448
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003449 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003450}
3451
Georg Brandl0c315622009-05-25 21:10:36 +00003452/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3453static stmt_ty
3454ast_for_with_stmt(struct compiling *c, const node *n)
3455{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003456 int i, n_items;
3457 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003458
3459 REQ(n, with_stmt);
3460
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003461 n_items = (NCH(n) - 2) / 2;
3462 items = asdl_seq_new(n_items, c->c_arena);
3463 for (i = 1; i < NCH(n) - 2; i += 2) {
3464 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3465 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003466 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003467 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003468 }
3469
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003470 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3471 if (!body)
3472 return NULL;
3473
3474 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003475}
3476
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003477static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003478ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003479{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003480 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003481 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003482 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003483 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003485 REQ(n, classdef);
3486
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003487 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003488 s = ast_for_suite(c, CHILD(n, 3));
3489 if (!s)
3490 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003491 classname = NEW_IDENTIFIER(CHILD(n, 1));
3492 if (!classname)
3493 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003494 if (forbidden_name(classname, CHILD(n, 3), 0))
3495 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003496 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3497 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003498 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003499
3500 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003501 s = ast_for_suite(c, CHILD(n,5));
3502 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003503 return NULL;
3504 classname = NEW_IDENTIFIER(CHILD(n, 1));
3505 if (!classname)
3506 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003507 if (forbidden_name(classname, CHILD(n, 3), 0))
3508 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003509 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3510 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511 }
3512
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003513 /* class NAME '(' arglist ')' ':' suite */
3514 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003515 {
3516 PyObject *dummy_name;
3517 expr_ty dummy;
3518 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3519 if (!dummy_name)
3520 return NULL;
3521 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3522 call = ast_for_call(c, CHILD(n, 3), dummy);
3523 if (!call)
3524 return NULL;
3525 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003526 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003527 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003528 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003529 classname = NEW_IDENTIFIER(CHILD(n, 1));
3530 if (!classname)
3531 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003532 if (forbidden_name(classname, CHILD(n, 1), 0))
3533 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003534
Benjamin Peterson30760062008-11-25 04:02:28 +00003535 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003536 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003537 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003538}
3539
3540static stmt_ty
3541ast_for_stmt(struct compiling *c, const node *n)
3542{
3543 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003544 assert(NCH(n) == 1);
3545 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003546 }
3547 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003548 assert(num_stmts(n) == 1);
3549 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003550 }
3551 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003552 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003553 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3554 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003555 */
3556 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 case expr_stmt:
3558 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559 case del_stmt:
3560 return ast_for_del_stmt(c, n);
3561 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003562 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563 case flow_stmt:
3564 return ast_for_flow_stmt(c, n);
3565 case import_stmt:
3566 return ast_for_import_stmt(c, n);
3567 case global_stmt:
3568 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003569 case nonlocal_stmt:
3570 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 case assert_stmt:
3572 return ast_for_assert_stmt(c, n);
3573 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003574 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3576 TYPE(n), NCH(n));
3577 return NULL;
3578 }
3579 }
3580 else {
3581 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003582 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003583 */
3584 node *ch = CHILD(n, 0);
3585 REQ(n, compound_stmt);
3586 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587 case if_stmt:
3588 return ast_for_if_stmt(c, ch);
3589 case while_stmt:
3590 return ast_for_while_stmt(c, ch);
3591 case for_stmt:
3592 return ast_for_for_stmt(c, ch);
3593 case try_stmt:
3594 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003595 case with_stmt:
3596 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003598 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003599 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003600 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 case decorated:
3602 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003603 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003604 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3606 TYPE(n), NCH(n));
3607 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 }
3610}
3611
3612static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003613parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003615 const char *end;
3616 long x;
3617 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003618 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003619 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003621 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003622 errno = 0;
3623 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003624 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003625 if (s[0] == '0') {
3626 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3627 if (x < 0 && errno == 0) {
3628 return PyLong_FromString((char *)s,
3629 (char **)0,
3630 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003631 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003632 }
3633 else
3634 x = PyOS_strtol((char *)s, (char **)&end, 0);
3635 if (*end == '\0') {
3636 if (errno != 0)
3637 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003638 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003639 }
3640 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003641 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003642 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003643 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3644 if (compl.imag == -1.0 && PyErr_Occurred())
3645 return NULL;
3646 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 }
3648 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003649 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003650 dx = PyOS_string_to_double(s, NULL, NULL);
3651 if (dx == -1.0 && PyErr_Occurred())
3652 return NULL;
3653 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003654 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655}
3656
3657static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003658decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003659{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003660 char *s, *t;
3661 t = s = (char *)*sPtr;
3662 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3663 while (s < end && (*s & 0x80)) s++;
3664 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003665 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666}
3667
3668static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003669decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003670{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003671 PyObject *v, *u;
3672 char *buf;
3673 char *p;
3674 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003675
Guido van Rossumd8faa362007-04-27 19:54:29 +00003676 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003678 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003679 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003680 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003681 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003682 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3683 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3684 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003685 if (u == NULL)
3686 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003687 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003688 end = s + len;
3689 while (s < end) {
3690 if (*s == '\\') {
3691 *p++ = *s++;
3692 if (*s & 0x80) {
3693 strcpy(p, "u005c");
3694 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003695 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 }
3697 if (*s & 0x80) { /* XXX inefficient */
3698 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003699 int kind;
3700 void *data;
3701 Py_ssize_t len, i;
3702 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003703 if (w == NULL) {
3704 Py_DECREF(u);
3705 return NULL;
3706 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003707 kind = PyUnicode_KIND(w);
3708 data = PyUnicode_DATA(w);
3709 len = PyUnicode_GET_LENGTH(w);
3710 for (i = 0; i < len; i++) {
3711 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3712 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003713 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003714 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003715 /* Should be impossible to overflow */
3716 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003717 Py_DECREF(w);
3718 } else {
3719 *p++ = *s++;
3720 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003721 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003722 len = p - buf;
3723 s = buf;
3724 }
3725 if (rawmode)
3726 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3727 else
3728 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3729 Py_XDECREF(u);
3730 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003731}
3732
3733/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003734 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003735 * parsestr parses it, and returns the decoded Python string object.
3736 */
3737static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003738parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003739{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003740 size_t len;
3741 const char *s = STR(n);
3742 int quote = Py_CHARMASK(*s);
3743 int rawmode = 0;
3744 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003745 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003746 if (quote == 'b' || quote == 'B') {
3747 quote = *++s;
3748 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003750 if (quote == 'r' || quote == 'R') {
3751 quote = *++s;
3752 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003753 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003754 }
3755 if (quote != '\'' && quote != '\"') {
3756 PyErr_BadInternalCall();
3757 return NULL;
3758 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003759 s++;
3760 len = strlen(s);
3761 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003763 "string to parse is too long");
3764 return NULL;
3765 }
3766 if (s[--len] != quote) {
3767 PyErr_BadInternalCall();
3768 return NULL;
3769 }
3770 if (len >= 4 && s[0] == quote && s[1] == quote) {
3771 s += 2;
3772 len -= 2;
3773 if (s[--len] != quote || s[--len] != quote) {
3774 PyErr_BadInternalCall();
3775 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003776 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003777 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003778 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003779 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003780 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003781 if (*bytesmode) {
3782 /* Disallow non-ascii characters (but not escapes) */
3783 const char *c;
3784 for (c = s; *c; c++) {
3785 if (Py_CHARMASK(*c) >= 0x80) {
3786 ast_error(n, "bytes can only contain ASCII "
3787 "literal characters.");
3788 return NULL;
3789 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003790 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003791 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003792 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003793 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 if (rawmode || strchr(s, '\\') == NULL) {
3795 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003796 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003797 if (u == NULL || !*bytesmode)
3798 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003799 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003800 Py_DECREF(u);
3801 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003802 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003803 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003804 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003805 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003807 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003808 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003809 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003810 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003811 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003812}
3813
Guido van Rossum29fd7122007-11-12 01:13:56 +00003814/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815 * compile-time literal catenation, calling parsestr() on each piece, and
3816 * pasting the intermediate results together.
3817 */
3818static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003819parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003820{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003821 PyObject *v;
3822 int i;
3823 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003824 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003825 if (v != NULL) {
3826 /* String literal concatenation */
3827 for (i = 1; i < NCH(n); i++) {
3828 PyObject *s;
3829 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003830 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003831 if (s == NULL)
3832 goto onError;
3833 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003834 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003835 goto onError;
3836 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003837 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3838 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003839 if (v == NULL)
3840 goto onError;
3841 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003842 else {
3843 PyObject *temp = PyUnicode_Concat(v, s);
3844 Py_DECREF(s);
3845 Py_DECREF(v);
3846 v = temp;
3847 if (v == NULL)
3848 goto onError;
3849 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003850 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003851 }
3852 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003853
Guido van Rossumd8faa362007-04-27 19:54:29 +00003854 onError:
3855 Py_XDECREF(v);
3856 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003857}