blob: 14500eed8d7fde5933ae91464440b87179d8a76c [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);
Thomas Heller50d5a1c2008-11-25 12:35:58 +0000531 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +0000532 if (!id)
533 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +0000534 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +0000535 /* Check whether there are non-ASCII characters in the
536 identifier; if so, normalize to NFKC. */
537 for (; *u; u++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (*u >= 128) {
539 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
540 PyObject *id2;
541 if (!m)
542 return NULL;
543 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
544 Py_DECREF(m);
545 if (!id2)
546 return NULL;
547 Py_DECREF(id);
548 id = id2;
549 break;
550 }
Martin v. Löwis47383402007-08-15 07:32:56 +0000551 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000552 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000553 PyArena_AddPyObject(arena, id);
554 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555}
556
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000557#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558
559/* This routine provides an invalid object for the syntax error.
560 The outermost routine must unpack this error and create the
561 proper object. We do this so that we don't have to pass
562 the filename to everything function.
563
564 XXX Maybe we should just pass the filename...
565*/
566
567static int
568ast_error(const node *n, const char *errstr)
569{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000570 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 PyErr_SetObject(PyExc_SyntaxError, u);
574 Py_DECREF(u);
575 return 0;
576}
577
578static void
579ast_error_finish(const char *filename)
580{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000581 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000582 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000583 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584
585 assert(PyErr_Occurred());
586 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000587 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588
589 PyErr_Fetch(&type, &value, &tback);
590 errstr = PyTuple_GetItem(value, 0);
591 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000592 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000594 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000595 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 Py_DECREF(errstr);
597 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000598 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000599 offset = PyTuple_GetItem(value, 2);
600 if (!offset) {
601 Py_DECREF(errstr);
602 return;
603 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 Py_DECREF(value);
605
606 loc = PyErr_ProgramText(filename, lineno);
607 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000608 Py_INCREF(Py_None);
609 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000611 if (filename != NULL)
612 filename_obj = PyUnicode_DecodeFSDefault(filename);
613 else {
614 Py_INCREF(Py_None);
615 filename_obj = Py_None;
616 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000617 if (filename_obj != NULL)
618 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
619 else
620 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000622 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000623 Py_DECREF(errstr);
624 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000625 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000626 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 Py_DECREF(errstr);
628 Py_DECREF(tmp);
629 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000630 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631 PyErr_Restore(type, value, tback);
632}
633
634/* num_stmts() returns number of contained statements.
635
636 Use this routine to determine how big a sequence is needed for
637 the statements in a parse tree. Its raison d'etre is this bit of
638 grammar:
639
640 stmt: simple_stmt | compound_stmt
641 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
642
643 A simple_stmt can contain multiple small_stmt elements joined
644 by semicolons. If the arg is a simple_stmt, the number of
645 small_stmt elements is returned.
646*/
647
648static int
649num_stmts(const node *n)
650{
651 int i, l;
652 node *ch;
653
654 switch (TYPE(n)) {
655 case single_input:
656 if (TYPE(CHILD(n, 0)) == NEWLINE)
657 return 0;
658 else
659 return num_stmts(CHILD(n, 0));
660 case file_input:
661 l = 0;
662 for (i = 0; i < NCH(n); i++) {
663 ch = CHILD(n, i);
664 if (TYPE(ch) == stmt)
665 l += num_stmts(ch);
666 }
667 return l;
668 case stmt:
669 return num_stmts(CHILD(n, 0));
670 case compound_stmt:
671 return 1;
672 case simple_stmt:
673 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
674 case suite:
675 if (NCH(n) == 1)
676 return num_stmts(CHILD(n, 0));
677 else {
678 l = 0;
679 for (i = 2; i < (NCH(n) - 1); i++)
680 l += num_stmts(CHILD(n, i));
681 return l;
682 }
683 default: {
684 char buf[128];
685
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000686 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687 TYPE(n), NCH(n));
688 Py_FatalError(buf);
689 }
690 }
691 assert(0);
692 return 0;
693}
694
695/* Transform the CST rooted at node * to the appropriate AST
696*/
697
698mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000699PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
700 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000701{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000702 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703 asdl_seq *stmts = NULL;
704 stmt_ty s;
705 node *ch;
706 struct compiling c;
707
708 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000709 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000710 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000711#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000712 ast_error(n, "encoding declaration in Unicode string");
713 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000714#endif
715 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000716 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000717 } else if (TYPE(n) == encoding_decl) {
718 c.c_encoding = STR(n);
719 n = CHILD(n, 0);
720 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000722 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000724 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000725 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726
Jeremy Hyltona8293132006-02-28 17:58:27 +0000727 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 switch (TYPE(n)) {
729 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000730 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000732 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 for (i = 0; i < NCH(n) - 1; i++) {
734 ch = CHILD(n, i);
735 if (TYPE(ch) == NEWLINE)
736 continue;
737 REQ(ch, stmt);
738 num = num_stmts(ch);
739 if (num == 1) {
740 s = ast_for_stmt(&c, ch);
741 if (!s)
742 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000743 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744 }
745 else {
746 ch = CHILD(ch, 0);
747 REQ(ch, simple_stmt);
748 for (j = 0; j < num; j++) {
749 s = ast_for_stmt(&c, CHILD(ch, j * 2));
750 if (!s)
751 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000752 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 }
754 }
755 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000756 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 case eval_input: {
758 expr_ty testlist_ast;
759
Nick Coghlan650f0d02007-04-15 12:05:43 +0000760 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000761 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 if (!testlist_ast)
763 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000764 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 }
766 case single_input:
767 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000768 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000770 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000771 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
772 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000773 if (!asdl_seq_GET(stmts, 0))
774 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000775 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776 }
777 else {
778 n = CHILD(n, 0);
779 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000780 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000782 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000784 s = ast_for_stmt(&c, n);
785 if (!s)
786 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 asdl_seq_SET(stmts, 0, s);
788 }
789 else {
790 /* Only a simple_stmt can contain multiple statements. */
791 REQ(n, simple_stmt);
792 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 if (TYPE(CHILD(n, i)) == NEWLINE)
794 break;
795 s = ast_for_stmt(&c, CHILD(n, i));
796 if (!s)
797 goto error;
798 asdl_seq_SET(stmts, i / 2, s);
799 }
800 }
801
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000802 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 }
804 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000805 PyErr_Format(PyExc_SystemError,
806 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807 goto error;
808 }
809 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810 ast_error_finish(filename);
811 return NULL;
812}
813
814/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
815*/
816
817static operator_ty
818get_operator(const node *n)
819{
820 switch (TYPE(n)) {
821 case VBAR:
822 return BitOr;
823 case CIRCUMFLEX:
824 return BitXor;
825 case AMPER:
826 return BitAnd;
827 case LEFTSHIFT:
828 return LShift;
829 case RIGHTSHIFT:
830 return RShift;
831 case PLUS:
832 return Add;
833 case MINUS:
834 return Sub;
835 case STAR:
836 return Mult;
837 case SLASH:
838 return Div;
839 case DOUBLESLASH:
840 return FloorDiv;
841 case PERCENT:
842 return Mod;
843 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000844 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 }
846}
847
Guido van Rossume7ba4952007-06-06 23:52:48 +0000848static const char* FORBIDDEN[] = {
849 "None",
850 "True",
851 "False",
852 NULL,
853};
854
855static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000856forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000857{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000858 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000859 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
860 ast_error(n, "assignment to keyword");
861 return 1;
862 }
863 if (full_checks) {
864 const char **p;
865 for (p = FORBIDDEN; *p; p++) {
866 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
867 ast_error(n, "assignment to keyword");
868 return 1;
869 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000870 }
871 }
872 return 0;
873}
874
Jeremy Hyltona8293132006-02-28 17:58:27 +0000875/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876
877 Only sets context for expr kinds that "can appear in assignment context"
878 (according to ../Parser/Python.asdl). For other expr kinds, it sets
879 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880*/
881
882static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000883set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884{
885 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000886 /* If a particular expression type can't be used for assign / delete,
887 set expr_name to its name and an error message will be generated.
888 */
889 const char* expr_name = NULL;
890
891 /* The ast defines augmented store and load contexts, but the
892 implementation here doesn't actually use them. The code may be
893 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000894 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000895 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000896 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000897 */
898 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899
900 switch (e->kind) {
901 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000902 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000903 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
904 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000905 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000907 e->v.Subscript.ctx = ctx;
908 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000909 case Starred_kind:
910 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000911 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000912 return 0;
913 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000915 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000916 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000917 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000918 }
919 e->v.Name.ctx = ctx;
920 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000922 e->v.List.ctx = ctx;
923 s = e->v.List.elts;
924 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000926 if (asdl_seq_LEN(e->v.Tuple.elts)) {
927 e->v.Tuple.ctx = ctx;
928 s = e->v.Tuple.elts;
929 }
930 else {
931 expr_name = "()";
932 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000933 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000934 case Lambda_kind:
935 expr_name = "lambda";
936 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000938 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000939 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000940 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000942 case UnaryOp_kind:
943 expr_name = "operator";
944 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000946 expr_name = "generator expression";
947 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000948 case Yield_kind:
949 expr_name = "yield expression";
950 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000951 case ListComp_kind:
952 expr_name = "list comprehension";
953 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000954 case SetComp_kind:
955 expr_name = "set comprehension";
956 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000957 case DictComp_kind:
958 expr_name = "dict comprehension";
959 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000960 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000961 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 case Num_kind:
963 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500964 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000965 expr_name = "literal";
966 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000967 case Ellipsis_kind:
968 expr_name = "Ellipsis";
969 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000970 case Compare_kind:
971 expr_name = "comparison";
972 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000973 case IfExp_kind:
974 expr_name = "conditional expression";
975 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000976 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 PyErr_Format(PyExc_SystemError,
978 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000979 e->kind, e->lineno);
980 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000982 /* Check for error string set by switch */
983 if (expr_name) {
984 char buf[300];
985 PyOS_snprintf(buf, sizeof(buf),
986 "can't %s %s",
987 ctx == Store ? "assign to" : "delete",
988 expr_name);
989 return ast_error(n, buf);
990 }
991
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 */
995 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000996 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997
Thomas Wouters89f507f2006-12-13 04:49:30 +0000998 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000999 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 return 0;
1001 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002 }
1003 return 1;
1004}
1005
1006static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001007ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008{
1009 REQ(n, augassign);
1010 n = CHILD(n, 0);
1011 switch (STR(n)[0]) {
1012 case '+':
1013 return Add;
1014 case '-':
1015 return Sub;
1016 case '/':
1017 if (STR(n)[1] == '/')
1018 return FloorDiv;
1019 else
1020 return Div;
1021 case '%':
1022 return Mod;
1023 case '<':
1024 return LShift;
1025 case '>':
1026 return RShift;
1027 case '&':
1028 return BitAnd;
1029 case '^':
1030 return BitXor;
1031 case '|':
1032 return BitOr;
1033 case '*':
1034 if (STR(n)[1] == '*')
1035 return Pow;
1036 else
1037 return Mult;
1038 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001039 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001040 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 }
1042}
1043
1044static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001045ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001047 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048 |'is' 'not'
1049 */
1050 REQ(n, comp_op);
1051 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001052 n = CHILD(n, 0);
1053 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 case LESS:
1055 return Lt;
1056 case GREATER:
1057 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001058 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059 return Eq;
1060 case LESSEQUAL:
1061 return LtE;
1062 case GREATEREQUAL:
1063 return GtE;
1064 case NOTEQUAL:
1065 return NotEq;
1066 case NAME:
1067 if (strcmp(STR(n), "in") == 0)
1068 return In;
1069 if (strcmp(STR(n), "is") == 0)
1070 return Is;
1071 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001072 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076 }
1077 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001078 /* handle "not in" and "is not" */
1079 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080 case NAME:
1081 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1082 return NotIn;
1083 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1084 return IsNot;
1085 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001086 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090 }
Neal Norwitz79792652005-11-14 04:25:03 +00001091 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001093 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094}
1095
1096static asdl_seq *
1097seq_for_testlist(struct compiling *c, const node *n)
1098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001100 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1101 */
Armin Rigo31441302005-10-21 12:57:31 +00001102 asdl_seq *seq;
1103 expr_ty expression;
1104 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001105 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001107 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108 if (!seq)
1109 return NULL;
1110
1111 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001113 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114
Benjamin Peterson4905e802009-09-27 02:43:28 +00001115 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001116 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118
1119 assert(i / 2 < seq->size);
1120 asdl_seq_SET(seq, i / 2, expression);
1121 }
1122 return seq;
1123}
1124
Neal Norwitzc1505362006-12-28 06:47:50 +00001125static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001126compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001127{
1128 identifier name;
1129 expr_ty annotation = NULL;
1130 node *ch;
1131
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001132 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001133 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001134 name = NEW_IDENTIFIER(ch);
1135 if (!name)
1136 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001137 if (forbidden_name(name, ch, 0))
1138 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001139
1140 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1141 annotation = ast_for_expr(c, CHILD(n, 2));
1142 if (!annotation)
1143 return NULL;
1144 }
1145
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001146 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001147#if 0
1148 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1149 if (!set_context(c, result, Store, n))
1150 return NULL;
1151 return result;
1152#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153}
1154
Guido van Rossum4f72a782006-10-27 23:31:49 +00001155/* returns -1 if failed to handle keyword only arguments
1156 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001157 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001158 ^^^
1159 start pointing here
1160 */
1161static int
1162handle_keywordonly_args(struct compiling *c, const node *n, int start,
1163 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1164{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001165 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001166 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001167 expr_ty expression, annotation;
1168 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001169 int i = start;
1170 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001171
1172 if (kwonlyargs == NULL) {
1173 ast_error(CHILD(n, start), "named arguments must follow bare *");
1174 return -1;
1175 }
1176 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001177 while (i < NCH(n)) {
1178 ch = CHILD(n, i);
1179 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001180 case vfpdef:
1181 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001183 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001184 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001185 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001186 asdl_seq_SET(kwdefaults, j, expression);
1187 i += 2; /* '=' and test */
1188 }
1189 else { /* setting NULL if no default value exists */
1190 asdl_seq_SET(kwdefaults, j, NULL);
1191 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 if (NCH(ch) == 3) {
1193 /* ch is NAME ':' test */
1194 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001195 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001196 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001197 }
1198 else {
1199 annotation = NULL;
1200 }
1201 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001202 argname = NEW_IDENTIFIER(ch);
1203 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001204 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001205 if (forbidden_name(argname, ch, 0))
1206 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001207 arg = arg(argname, annotation, c->c_arena);
1208 if (!arg)
1209 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001210 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001211 i += 2; /* the name and the comma */
1212 break;
1213 case DOUBLESTAR:
1214 return i;
1215 default:
1216 ast_error(ch, "unexpected node");
1217 goto error;
1218 }
1219 }
1220 return i;
1221 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001223}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224
Jeremy Hyltona8293132006-02-28 17:58:27 +00001225/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226
1227static arguments_ty
1228ast_for_arguments(struct compiling *c, const node *n)
1229{
Neal Norwitzc1505362006-12-28 06:47:50 +00001230 /* This function handles both typedargslist (function definition)
1231 and varargslist (lambda definition).
1232
1233 parameters: '(' [typedargslist] ')'
1234 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001236 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001237 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001238 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001239 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001241 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001242 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001243 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001245 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1246 int nposdefaults = 0, found_default = 0;
1247 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001249 arg_ty arg;
1250 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 node *ch;
1252
1253 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001254 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001255 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1256 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001257 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001259 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260
Jeremy Hyltone921e022008-07-17 16:37:17 +00001261 /* First count the number of positional args & defaults. The
1262 variable i is the loop index for this for loop and the next.
1263 The next loop picks up where the first leaves off.
1264 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001266 ch = CHILD(n, i);
1267 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001268 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001269 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001270 if (i < NCH(n) && /* skip argument following star */
1271 (TYPE(CHILD(n, i)) == tfpdef ||
1272 TYPE(CHILD(n, i)) == vfpdef)) {
1273 i++;
1274 }
1275 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001277 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001278 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001279 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001282 defaults for keyword only args */
1283 for ( ; i < NCH(n); ++i) {
1284 ch = CHILD(n, i);
1285 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001286 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001288 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1289 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291 kwonlyargs = (nkwonlyargs ?
1292 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1293 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1297 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001298 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001300 since we set NULL as default for keyword only argument w/o default
1301 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001302 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001303 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1304 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001305 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306
1307 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001308 ast_error(n, "more than 255 arguments");
1309 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001310 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001312 /* tfpdef: NAME [':' test]
1313 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 */
1315 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001316 j = 0; /* index for defaults */
1317 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 ch = CHILD(n, i);
1320 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001321 case tfpdef:
1322 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1324 anything other than EQUAL or a comma? */
1325 /* XXX Should NCH(n) check be made a separate check? */
1326 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001327 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1328 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001329 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330 assert(posdefaults != NULL);
1331 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001337 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001338 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001339 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001340 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001341 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001342 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001343 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 i += 2; /* the name and the comma */
1345 break;
1346 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001347 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001349 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001350 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001352 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001353 if (TYPE(ch) == COMMA) {
1354 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 i += 2; /* now follows keyword only arguments */
1356 res = handle_keywordonly_args(c, n, i,
1357 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001358 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 i = res; /* res has new position to process */
1360 }
1361 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001362 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001363 if (!vararg)
1364 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001365 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1366 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001367 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001368 /* there is an annotation on the vararg */
1369 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001370 if (!varargannotation)
1371 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001372 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001373 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001374 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1375 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001376 int res = 0;
1377 res = handle_keywordonly_args(c, n, i,
1378 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001379 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001380 i = res; /* res has new position to process */
1381 }
1382 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 break;
1384 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001385 ch = CHILD(n, i+1); /* tfpdef */
1386 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001387 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001388 if (!kwarg)
1389 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001390 if (NCH(ch) > 1) {
1391 /* there is an annotation on the kwarg */
1392 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001393 if (!kwargannotation)
1394 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001395 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001396 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001397 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 i += 3;
1399 break;
1400 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001401 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 "unexpected node in varargslist: %d @ %d",
1403 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001404 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001405 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001407 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1408 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409}
1410
1411static expr_ty
1412ast_for_dotted_name(struct compiling *c, const node *n)
1413{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001414 expr_ty e;
1415 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001416 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 int i;
1418
1419 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001420
1421 lineno = LINENO(n);
1422 col_offset = n->n_col_offset;
1423
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 id = NEW_IDENTIFIER(CHILD(n, 0));
1425 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001426 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001427 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430
1431 for (i = 2; i < NCH(n); i+=2) {
1432 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 if (!id)
1434 return NULL;
1435 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1436 if (!e)
1437 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 }
1439
1440 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441}
1442
1443static expr_ty
1444ast_for_decorator(struct compiling *c, const node *n)
1445{
1446 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1447 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001448 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001451 REQ(CHILD(n, 0), AT);
1452 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1455 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001456 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 d = name_expr;
1460 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 }
1462 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001463 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001464 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001465 if (!d)
1466 return NULL;
1467 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 }
1469 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001470 d = ast_for_call(c, CHILD(n, 3), name_expr);
1471 if (!d)
1472 return NULL;
1473 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 }
1475
1476 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477}
1478
1479static asdl_seq*
1480ast_for_decorators(struct compiling *c, const node *n)
1481{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001482 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001483 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001487 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 if (!decorator_seq)
1489 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001492 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001493 if (!d)
1494 return NULL;
1495 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 }
1497 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498}
1499
1500static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001501ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001503 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001504 identifier name;
1505 arguments_ty args;
1506 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001507 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001508 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509
1510 REQ(n, funcdef);
1511
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 name = NEW_IDENTIFIER(CHILD(n, name_i));
1513 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001514 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001515 if (forbidden_name(name, CHILD(n, name_i), 0))
1516 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1518 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001519 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001520 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1521 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1522 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001523 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001524 name_i += 2;
1525 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526 body = ast_for_suite(c, CHILD(n, name_i + 3));
1527 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001528 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529
Neal Norwitzc1505362006-12-28 06:47:50 +00001530 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001531 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532}
1533
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001534static stmt_ty
1535ast_for_decorated(struct compiling *c, const node *n)
1536{
1537 /* decorated: decorators (classdef | funcdef) */
1538 stmt_ty thing = NULL;
1539 asdl_seq *decorator_seq = NULL;
1540
1541 REQ(n, decorated);
1542
1543 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1544 if (!decorator_seq)
1545 return NULL;
1546
1547 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001549
1550 if (TYPE(CHILD(n, 1)) == funcdef) {
1551 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1552 } else if (TYPE(CHILD(n, 1)) == classdef) {
1553 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1554 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001555 /* we count the decorators in when talking about the class' or
1556 * function's line number */
1557 if (thing) {
1558 thing->lineno = LINENO(n);
1559 thing->col_offset = n->n_col_offset;
1560 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001561 return thing;
1562}
1563
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564static expr_ty
1565ast_for_lambdef(struct compiling *c, const node *n)
1566{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001567 /* lambdef: 'lambda' [varargslist] ':' test
1568 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569 arguments_ty args;
1570 expr_ty expression;
1571
1572 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001573 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1574 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 if (!args)
1576 return NULL;
1577 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001578 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580 }
1581 else {
1582 args = ast_for_arguments(c, CHILD(n, 1));
1583 if (!args)
1584 return NULL;
1585 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001586 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588 }
1589
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001590 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001591}
1592
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001593static expr_ty
1594ast_for_ifexpr(struct compiling *c, const node *n)
1595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001597 expr_ty expression, body, orelse;
1598
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001599 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001600 body = ast_for_expr(c, CHILD(n, 0));
1601 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001602 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001603 expression = ast_for_expr(c, CHILD(n, 2));
1604 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001605 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001606 orelse = ast_for_expr(c, CHILD(n, 4));
1607 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001608 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001609 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1610 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001611}
1612
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001614 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615
Nick Coghlan650f0d02007-04-15 12:05:43 +00001616 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617*/
1618
1619static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001620count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001622 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 count_comp_for:
1625 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001626 REQ(n, comp_for);
1627 if (NCH(n) == 5)
1628 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001629 else
1630 return n_fors;
1631 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001632 REQ(n, comp_iter);
1633 n = CHILD(n, 0);
1634 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001635 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001636 else if (TYPE(n) == comp_if) {
1637 if (NCH(n) == 3) {
1638 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001639 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001640 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641 else
1642 return n_fors;
1643 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001644
Guido van Rossumd8faa362007-04-27 19:54:29 +00001645 /* Should never be reached */
1646 PyErr_SetString(PyExc_SystemError,
1647 "logic error in count_comp_fors");
1648 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649}
1650
Nick Coghlan650f0d02007-04-15 12:05:43 +00001651/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001652
Nick Coghlan650f0d02007-04-15 12:05:43 +00001653 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654*/
1655
1656static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001657count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001659 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660
Guido van Rossumd8faa362007-04-27 19:54:29 +00001661 while (1) {
1662 REQ(n, comp_iter);
1663 if (TYPE(CHILD(n, 0)) == comp_for)
1664 return n_ifs;
1665 n = CHILD(n, 0);
1666 REQ(n, comp_if);
1667 n_ifs++;
1668 if (NCH(n) == 2)
1669 return n_ifs;
1670 n = CHILD(n, 2);
1671 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672}
1673
Guido van Rossum992d4a32007-07-11 13:09:30 +00001674static asdl_seq *
1675ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001678 asdl_seq *comps;
1679
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001680 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 if (n_fors == -1)
1682 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683
Nick Coghlan650f0d02007-04-15 12:05:43 +00001684 comps = asdl_seq_new(n_fors, c->c_arena);
1685 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001687
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001689 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001691 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001692 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693
Guido van Rossum992d4a32007-07-11 13:09:30 +00001694 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695
Guido van Rossum992d4a32007-07-11 13:09:30 +00001696 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001697 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001698 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001700 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001701 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001703
Thomas Wouters89f507f2006-12-13 04:49:30 +00001704 /* Check the # of children rather than the length of t, since
1705 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001706 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001707 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001708 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001710 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1711 c->c_arena),
1712 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001713 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001715
Guido van Rossum992d4a32007-07-11 13:09:30 +00001716 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 int j, n_ifs;
1718 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719
Guido van Rossum992d4a32007-07-11 13:09:30 +00001720 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001721 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001722 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001724
1725 ifs = asdl_seq_new(n_ifs, c->c_arena);
1726 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001728
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 REQ(n, comp_iter);
1731 n = CHILD(n, 0);
1732 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733
Guido van Rossum992d4a32007-07-11 13:09:30 +00001734 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001735 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001736 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001737 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001738 if (NCH(n) == 3)
1739 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001741 /* on exit, must guarantee that n is a comp_for */
1742 if (TYPE(n) == comp_iter)
1743 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001744 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001746 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001748 return comps;
1749}
1750
1751static expr_ty
1752ast_for_itercomp(struct compiling *c, const node *n, int type)
1753{
1754 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1755 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1756 expr_ty elt;
1757 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758
Guido van Rossum992d4a32007-07-11 13:09:30 +00001759 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760
Guido van Rossum992d4a32007-07-11 13:09:30 +00001761 elt = ast_for_expr(c, CHILD(n, 0));
1762 if (!elt)
1763 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764
Guido van Rossum992d4a32007-07-11 13:09:30 +00001765 comps = ast_for_comprehension(c, CHILD(n, 1));
1766 if (!comps)
1767 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001768
1769 if (type == COMP_GENEXP)
1770 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1771 else if (type == COMP_LISTCOMP)
1772 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1773 else if (type == COMP_SETCOMP)
1774 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1775 else
1776 /* Should never happen */
1777 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778}
1779
1780static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001781ast_for_dictcomp(struct compiling *c, const node *n)
1782{
1783 expr_ty key, value;
1784 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785
Guido van Rossum992d4a32007-07-11 13:09:30 +00001786 assert(NCH(n) > 3);
1787 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 key = ast_for_expr(c, CHILD(n, 0));
1790 if (!key)
1791 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 value = ast_for_expr(c, CHILD(n, 2));
1793 if (!value)
1794 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795
Guido van Rossum992d4a32007-07-11 13:09:30 +00001796 comps = ast_for_comprehension(c, CHILD(n, 3));
1797 if (!comps)
1798 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799
Guido van Rossum992d4a32007-07-11 13:09:30 +00001800 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1801}
1802
1803static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001804ast_for_genexp(struct compiling *c, const node *n)
1805{
1806 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001807 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001808}
1809
1810static expr_ty
1811ast_for_listcomp(struct compiling *c, const node *n)
1812{
1813 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001814 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001815}
1816
1817static expr_ty
1818ast_for_setcomp(struct compiling *c, const node *n)
1819{
1820 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001821 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001822}
1823
1824
1825static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826ast_for_atom(struct compiling *c, const node *n)
1827{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001828 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1829 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001830 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 */
1832 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001833 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001836 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001837 /* All names start in Load context, but may later be
1838 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001839 PyObject *name = NEW_IDENTIFIER(ch);
1840 if (!name)
1841 return NULL;
1842 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1843 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001845 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001846 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001847 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001848 PyObject *type, *value, *tback, *errstr;
1849 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001850 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001851 if (errstr) {
1852 char *s = "";
1853 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001854 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001855 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1856 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001857 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001858 } else {
1859 ast_error(n, "(unicode error) unknown error");
1860 }
1861 Py_DECREF(type);
1862 Py_DECREF(value);
1863 Py_XDECREF(tback);
1864 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001865 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001866 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001868 if (bytesmode)
1869 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1870 else
1871 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001874 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 if (!pynum)
1876 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001877
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 PyArena_AddPyObject(c->c_arena, pynum);
1879 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 }
Georg Brandldde00282007-03-18 19:01:53 +00001881 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001882 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885
Thomas Wouters89f507f2006-12-13 04:49:30 +00001886 if (TYPE(ch) == RPAR)
1887 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 if (TYPE(ch) == yield_expr)
1890 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001893 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001895
Nick Coghlan650f0d02007-04-15 12:05:43 +00001896 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 if (TYPE(ch) == RSQB)
1901 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902
Nick Coghlan650f0d02007-04-15 12:05:43 +00001903 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001904 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1905 asdl_seq *elts = seq_for_testlist(c, ch);
1906 if (!elts)
1907 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001908
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1910 }
1911 else
1912 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001914 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1915 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001916 int i, size;
1917 asdl_seq *keys, *values;
1918
1919 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920 if (TYPE(ch) == RBRACE) {
1921 /* it's an empty dict */
1922 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1923 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1924 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001925 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001926 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001927 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001930 for (i = 0; i < NCH(ch); i += 2) {
1931 expr_ty expression;
1932 expression = ast_for_expr(c, CHILD(ch, i));
1933 if (!expression)
1934 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001935 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001936 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001937 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1938 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1939 /* it's a set comprehension */
1940 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001941 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1942 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001943 } else {
1944 /* it's a dict */
1945 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1946 keys = asdl_seq_new(size, c->c_arena);
1947 if (!keys)
1948 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 values = asdl_seq_new(size, c->c_arena);
1951 if (!values)
1952 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953
Guido van Rossum86e58e22006-08-28 15:27:34 +00001954 for (i = 0; i < NCH(ch); i += 4) {
1955 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956
Guido van Rossum86e58e22006-08-28 15:27:34 +00001957 expression = ast_for_expr(c, CHILD(ch, i));
1958 if (!expression)
1959 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960
Guido van Rossum86e58e22006-08-28 15:27:34 +00001961 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001962
Guido van Rossum86e58e22006-08-28 15:27:34 +00001963 expression = ast_for_expr(c, CHILD(ch, i + 2));
1964 if (!expression)
1965 return NULL;
1966
1967 asdl_seq_SET(values, i / 4, expression);
1968 }
1969 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1970 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001973 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1974 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 }
1976}
1977
1978static slice_ty
1979ast_for_slice(struct compiling *c, const node *n)
1980{
1981 node *ch;
1982 expr_ty lower = NULL, upper = NULL, step = NULL;
1983
1984 REQ(n, subscript);
1985
1986 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001987 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 sliceop: ':' [test]
1989 */
1990 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 if (NCH(n) == 1 && TYPE(ch) == test) {
1992 /* 'step' variable hold no significance in terms of being used over
1993 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 if (!step)
1996 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 }
2000
2001 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 if (!lower)
2004 return NULL;
2005 }
2006
2007 /* If there's an upper bound it's in the second or third position. */
2008 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002009 if (NCH(n) > 1) {
2010 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 if (TYPE(n2) == test) {
2013 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 if (!upper)
2015 return NULL;
2016 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002017 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 if (TYPE(n2) == test) {
2022 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 if (!upper)
2024 return NULL;
2025 }
2026 }
2027
2028 ch = CHILD(n, NCH(n) - 1);
2029 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002030 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002031 ch = CHILD(ch, 1);
2032 if (TYPE(ch) == test) {
2033 step = ast_for_expr(c, ch);
2034 if (!step)
2035 return NULL;
2036 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 }
2038 }
2039
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002040 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041}
2042
2043static expr_ty
2044ast_for_binop(struct compiling *c, const node *n)
2045{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002046 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002048 BinOp(BinOp(A, op, B), op, C).
2049 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 int i, nops;
2052 expr_ty expr1, expr2, result;
2053 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054
Guido van Rossumd8faa362007-04-27 19:54:29 +00002055 expr1 = ast_for_expr(c, CHILD(n, 0));
2056 if (!expr1)
2057 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058
Guido van Rossumd8faa362007-04-27 19:54:29 +00002059 expr2 = ast_for_expr(c, CHILD(n, 2));
2060 if (!expr2)
2061 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062
Guido van Rossumd8faa362007-04-27 19:54:29 +00002063 newoperator = get_operator(CHILD(n, 1));
2064 if (!newoperator)
2065 return NULL;
2066
2067 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2068 c->c_arena);
2069 if (!result)
2070 return NULL;
2071
2072 nops = (NCH(n) - 1) / 2;
2073 for (i = 1; i < nops; i++) {
2074 expr_ty tmp_result, tmp;
2075 const node* next_oper = CHILD(n, i * 2 + 1);
2076
2077 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002078 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 return NULL;
2080
Guido van Rossumd8faa362007-04-27 19:54:29 +00002081 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2082 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083 return NULL;
2084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002086 LINENO(next_oper), next_oper->n_col_offset,
2087 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002089 return NULL;
2090 result = tmp_result;
2091 }
2092 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093}
2094
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002095static expr_ty
2096ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002099 subscriptlist: subscript (',' subscript)* [',']
2100 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2101 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002102 REQ(n, trailer);
2103 if (TYPE(CHILD(n, 0)) == LPAR) {
2104 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002105 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2106 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002107 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002108 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002109 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002110 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002111 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2112 if (!attr_id)
2113 return NULL;
2114 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002115 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002116 }
2117 else {
2118 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002119 REQ(CHILD(n, 2), RSQB);
2120 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002121 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002122 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2123 if (!slc)
2124 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002125 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2126 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002127 }
2128 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002130 by treating the sequence as a tuple literal if there are
2131 no slice features.
2132 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002133 int j;
2134 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002135 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002136 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002137 asdl_seq *slices, *elts;
2138 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002139 if (!slices)
2140 return NULL;
2141 for (j = 0; j < NCH(n); j += 2) {
2142 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002143 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002144 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002145 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002146 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002147 asdl_seq_SET(slices, j / 2, slc);
2148 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002149 if (!simple) {
2150 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002151 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002152 }
2153 /* extract Index values and put them in a Tuple */
2154 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002155 if (!elts)
2156 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002157 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2158 slc = (slice_ty)asdl_seq_GET(slices, j);
2159 assert(slc->kind == Index_kind && slc->v.Index.value);
2160 asdl_seq_SET(elts, j, slc->v.Index.value);
2161 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002162 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002163 if (!e)
2164 return NULL;
2165 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002166 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002167 }
2168 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002169}
2170
2171static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002172ast_for_factor(struct compiling *c, const node *n)
2173{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002174 expr_ty expression;
2175
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002176 expression = ast_for_expr(c, CHILD(n, 1));
2177 if (!expression)
2178 return NULL;
2179
2180 switch (TYPE(CHILD(n, 0))) {
2181 case PLUS:
2182 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2183 c->c_arena);
2184 case MINUS:
2185 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2186 c->c_arena);
2187 case TILDE:
2188 return UnaryOp(Invert, expression, LINENO(n),
2189 n->n_col_offset, c->c_arena);
2190 }
2191 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2192 TYPE(CHILD(n, 0)));
2193 return NULL;
2194}
2195
2196static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002197ast_for_power(struct compiling *c, const node *n)
2198{
2199 /* power: atom trailer* ('**' factor)*
2200 */
2201 int i;
2202 expr_ty e, tmp;
2203 REQ(n, power);
2204 e = ast_for_atom(c, CHILD(n, 0));
2205 if (!e)
2206 return NULL;
2207 if (NCH(n) == 1)
2208 return e;
2209 for (i = 1; i < NCH(n); i++) {
2210 node *ch = CHILD(n, i);
2211 if (TYPE(ch) != trailer)
2212 break;
2213 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002214 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002215 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002216 tmp->lineno = e->lineno;
2217 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002218 e = tmp;
2219 }
2220 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2221 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002222 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002223 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002224 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002225 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002226 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002227 e = tmp;
2228 }
2229 return e;
2230}
2231
Guido van Rossum0368b722007-05-11 16:50:42 +00002232static expr_ty
2233ast_for_starred(struct compiling *c, const node *n)
2234{
2235 expr_ty tmp;
2236 REQ(n, star_expr);
2237
2238 tmp = ast_for_expr(c, CHILD(n, 1));
2239 if (!tmp)
2240 return NULL;
2241
2242 /* The Load context is changed later. */
2243 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2244}
2245
2246
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247/* Do not name a variable 'expr'! Will cause a compile error.
2248*/
2249
2250static expr_ty
2251ast_for_expr(struct compiling *c, const node *n)
2252{
2253 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002254 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002255 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 and_test: not_test ('and' not_test)*
2258 not_test: 'not' not_test | comparison
2259 comparison: expr (comp_op expr)*
2260 expr: xor_expr ('|' xor_expr)*
2261 xor_expr: and_expr ('^' and_expr)*
2262 and_expr: shift_expr ('&' shift_expr)*
2263 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2264 arith_expr: term (('+'|'-') term)*
2265 term: factor (('*'|'/'|'%'|'//') factor)*
2266 factor: ('+'|'-'|'~') factor | power
2267 power: atom trailer* ('**' factor)*
2268 */
2269
2270 asdl_seq *seq;
2271 int i;
2272
2273 loop:
2274 switch (TYPE(n)) {
2275 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002276 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002277 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002278 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002280 else if (NCH(n) > 1)
2281 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002282 /* Fallthrough */
2283 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 case and_test:
2285 if (NCH(n) == 1) {
2286 n = CHILD(n, 0);
2287 goto loop;
2288 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002289 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 if (!seq)
2291 return NULL;
2292 for (i = 0; i < NCH(n); i += 2) {
2293 expr_ty e = ast_for_expr(c, CHILD(n, i));
2294 if (!e)
2295 return NULL;
2296 asdl_seq_SET(seq, i / 2, e);
2297 }
2298 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002299 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2300 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002301 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002302 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 case not_test:
2304 if (NCH(n) == 1) {
2305 n = CHILD(n, 0);
2306 goto loop;
2307 }
2308 else {
2309 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2310 if (!expression)
2311 return NULL;
2312
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002313 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2314 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 }
2316 case comparison:
2317 if (NCH(n) == 1) {
2318 n = CHILD(n, 0);
2319 goto loop;
2320 }
2321 else {
2322 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002323 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002324 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002325 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 if (!ops)
2327 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002328 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 return NULL;
2331 }
2332 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002333 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002335 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002336 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339
2340 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002341 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002343 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 asdl_seq_SET(cmps, i / 2, expression);
2347 }
2348 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002349 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002353 return Compare(expression, ops, cmps, LINENO(n),
2354 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 }
2356 break;
2357
Guido van Rossum0368b722007-05-11 16:50:42 +00002358 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002360 /* The next five cases all handle BinOps. The main body of code
2361 is the same in each case, but the switch turned inside out to
2362 reuse the code for each type of operator.
2363 */
2364 case expr:
2365 case xor_expr:
2366 case and_expr:
2367 case shift_expr:
2368 case arith_expr:
2369 case term:
2370 if (NCH(n) == 1) {
2371 n = CHILD(n, 0);
2372 goto loop;
2373 }
2374 return ast_for_binop(c, n);
2375 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002376 expr_ty exp = NULL;
2377 if (NCH(n) == 2) {
2378 exp = ast_for_testlist(c, CHILD(n, 1));
2379 if (!exp)
2380 return NULL;
2381 }
2382 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
2383 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002384 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 if (NCH(n) == 1) {
2386 n = CHILD(n, 0);
2387 goto loop;
2388 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002389 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002390 case power:
2391 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002393 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 return NULL;
2395 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002396 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 return NULL;
2398}
2399
2400static expr_ty
2401ast_for_call(struct compiling *c, const node *n, expr_ty func)
2402{
2403 /*
2404 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2405 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002406 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 */
2408
2409 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002410 asdl_seq *args;
2411 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 expr_ty vararg = NULL, kwarg = NULL;
2413
2414 REQ(n, arglist);
2415
2416 nargs = 0;
2417 nkeywords = 0;
2418 ngens = 0;
2419 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 node *ch = CHILD(n, i);
2421 if (TYPE(ch) == argument) {
2422 if (NCH(ch) == 1)
2423 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002424 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002425 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 nkeywords++;
2428 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 }
2430 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002431 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 "if not sole argument");
2433 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 }
2435
2436 if (nargs + nkeywords + ngens > 255) {
2437 ast_error(n, "more than 255 arguments");
2438 return NULL;
2439 }
2440
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002441 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002443 return NULL;
2444 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002446 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 nargs = 0;
2448 nkeywords = 0;
2449 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002450 node *ch = CHILD(n, i);
2451 if (TYPE(ch) == argument) {
2452 expr_ty e;
2453 if (NCH(ch) == 1) {
2454 if (nkeywords) {
2455 ast_error(CHILD(ch, 0),
2456 "non-keyword arg after keyword arg");
2457 return NULL;
2458 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002459 if (vararg) {
2460 ast_error(CHILD(ch, 0),
2461 "only named arguments may follow *expression");
2462 return NULL;
2463 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002466 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002469 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002472 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002475 else {
2476 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002477 identifier key, tmp;
2478 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002483 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 /* f(lambda x: x[0] = 3) ends up getting parsed with
2485 * LHS test = lambda x: x[0], and RHS test = 3.
2486 * SF bug 132313 points out that complaining about a keyword
2487 * then is very confusing.
2488 */
2489 if (e->kind == Lambda_kind) {
2490 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002491 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 } else if (e->kind != Name_kind) {
2493 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002494 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002495 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 return NULL;
2497 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002499 for (k = 0; k < nkeywords; k++) {
2500 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2501 if (!PyUnicode_Compare(tmp, key)) {
2502 ast_error(CHILD(ch, 0), "keyword argument repeated");
2503 return NULL;
2504 }
2505 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002508 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002509 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002512 asdl_seq_SET(keywords, nkeywords++, kw);
2513 }
2514 }
2515 else if (TYPE(ch) == STAR) {
2516 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002517 if (!vararg)
2518 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 i++;
2520 }
2521 else if (TYPE(ch) == DOUBLESTAR) {
2522 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002523 if (!kwarg)
2524 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002525 i++;
2526 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 }
2528
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002529 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530}
2531
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002533ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002535 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002536 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002538 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002539 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002540 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002541 }
2542 else {
2543 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002544 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002545 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002547 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 else {
2549 asdl_seq *tmp = seq_for_testlist(c, n);
2550 if (!tmp)
2551 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002552 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002554}
2555
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556static stmt_ty
2557ast_for_expr_stmt(struct compiling *c, const node *n)
2558{
2559 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002562 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 test: ... here starts the operator precendence dance
2566 */
2567
2568 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002569 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 if (!e)
2571 return NULL;
2572
Thomas Wouters89f507f2006-12-13 04:49:30 +00002573 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 }
2575 else if (TYPE(CHILD(n, 1)) == augassign) {
2576 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002577 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002578 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 if (!expr1)
2582 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002583 if(!set_context(c, expr1, Store, ch))
2584 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002585 /* set_context checks that most expressions are not the left side.
2586 Augmented assignments can only have a name, a subscript, or an
2587 attribute on the left, though, so we have to explicitly check for
2588 those. */
2589 switch (expr1->kind) {
2590 case Name_kind:
2591 case Attribute_kind:
2592 case Subscript_kind:
2593 break;
2594 default:
2595 ast_error(ch, "illegal expression for augmented assignment");
2596 return NULL;
2597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598
Thomas Wouters89f507f2006-12-13 04:49:30 +00002599 ch = CHILD(n, 2);
2600 if (TYPE(ch) == testlist)
2601 expr2 = ast_for_testlist(c, ch);
2602 else
2603 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002604 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 return NULL;
2606
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002607 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002608 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609 return NULL;
2610
Thomas Wouters89f507f2006-12-13 04:49:30 +00002611 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 }
2613 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 int i;
2615 asdl_seq *targets;
2616 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 expr_ty expression;
2618
Thomas Wouters89f507f2006-12-13 04:49:30 +00002619 /* a normal assignment */
2620 REQ(CHILD(n, 1), EQUAL);
2621 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2622 if (!targets)
2623 return NULL;
2624 for (i = 0; i < NCH(n) - 2; i += 2) {
2625 expr_ty e;
2626 node *ch = CHILD(n, i);
2627 if (TYPE(ch) == yield_expr) {
2628 ast_error(ch, "assignment to yield expression not possible");
2629 return NULL;
2630 }
2631 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002635 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002636 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002637 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 asdl_seq_SET(targets, i / 2, e);
2640 }
2641 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002642 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002643 expression = ast_for_testlist(c, value);
2644 else
2645 expression = ast_for_expr(c, value);
2646 if (!expression)
2647 return NULL;
2648 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650}
2651
Benjamin Peterson78565b22009-06-28 19:19:51 +00002652
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002654ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655{
2656 asdl_seq *seq;
2657 int i;
2658 expr_ty e;
2659
2660 REQ(n, exprlist);
2661
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002662 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002664 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002666 e = ast_for_expr(c, CHILD(n, i));
2667 if (!e)
2668 return NULL;
2669 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002670 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002671 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 }
2673 return seq;
2674}
2675
2676static stmt_ty
2677ast_for_del_stmt(struct compiling *c, const node *n)
2678{
2679 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 /* del_stmt: 'del' exprlist */
2682 REQ(n, del_stmt);
2683
2684 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2685 if (!expr_list)
2686 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002687 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688}
2689
2690static stmt_ty
2691ast_for_flow_stmt(struct compiling *c, const node *n)
2692{
2693 /*
2694 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2695 | yield_stmt
2696 break_stmt: 'break'
2697 continue_stmt: 'continue'
2698 return_stmt: 'return' [testlist]
2699 yield_stmt: yield_expr
2700 yield_expr: 'yield' testlist
2701 raise_stmt: 'raise' [test [',' test [',' test]]]
2702 */
2703 node *ch;
2704
2705 REQ(n, flow_stmt);
2706 ch = CHILD(n, 0);
2707 switch (TYPE(ch)) {
2708 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002709 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002711 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002713 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2714 if (!exp)
2715 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002716 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 }
2718 case return_stmt:
2719 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002720 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002722 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 if (!expression)
2724 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002725 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 }
2727 case raise_stmt:
2728 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002729 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2730 else if (NCH(ch) >= 2) {
2731 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2733 if (!expression)
2734 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002735 if (NCH(ch) == 4) {
2736 cause = ast_for_expr(c, CHILD(ch, 3));
2737 if (!cause)
2738 return NULL;
2739 }
2740 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 }
2742 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002743 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 "unexpected flow_stmt: %d", TYPE(ch));
2745 return NULL;
2746 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747
2748 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750}
2751
2752static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002753alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754{
2755 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002756 import_as_name: NAME ['as' NAME]
2757 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 dotted_name: NAME ('.' NAME)*
2759 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002760 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002761
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 loop:
2763 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002764 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002765 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002766 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002767 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002768 if (!name)
2769 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002770 if (NCH(n) == 3) {
2771 node *str_node = CHILD(n, 2);
2772 str = NEW_IDENTIFIER(str_node);
2773 if (!str)
2774 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002775 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002776 return NULL;
2777 }
2778 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002779 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002780 return NULL;
2781 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002782 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002783 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 case dotted_as_name:
2785 if (NCH(n) == 1) {
2786 n = CHILD(n, 0);
2787 goto loop;
2788 }
2789 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002790 node *asname_node = CHILD(n, 2);
2791 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002792 if (!a)
2793 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002795 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002796 if (!a->asname)
2797 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002798 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 return a;
2801 }
2802 break;
2803 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002804 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002805 node *name_node = CHILD(n, 0);
2806 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002807 if (!name)
2808 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002809 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002810 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002811 return alias(name, NULL, c->c_arena);
2812 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 else {
2814 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002815 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002816 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
2820 len = 0;
2821 for (i = 0; i < NCH(n); i += 2)
2822 /* length of string plus one for the dot */
2823 len += strlen(STR(CHILD(n, i))) + 1;
2824 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002825 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 if (!str)
2827 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002828 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 if (!s)
2830 return NULL;
2831 for (i = 0; i < NCH(n); i += 2) {
2832 char *sch = STR(CHILD(n, i));
2833 strcpy(s, STR(CHILD(n, i)));
2834 s += strlen(sch);
2835 *s++ = '.';
2836 }
2837 --s;
2838 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2840 PyBytes_GET_SIZE(str),
2841 NULL);
2842 Py_DECREF(str);
2843 if (!uni)
2844 return NULL;
2845 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002846 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002847 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002848 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 }
2850 break;
2851 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002852 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002853 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002854 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002856 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 "unexpected import name: %d", TYPE(n));
2858 return NULL;
2859 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860
2861 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 return NULL;
2863}
2864
2865static stmt_ty
2866ast_for_import_stmt(struct compiling *c, const node *n)
2867{
2868 /*
2869 import_stmt: import_name | import_from
2870 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002871 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2872 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002874 int lineno;
2875 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 int i;
2877 asdl_seq *aliases;
2878
2879 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002880 lineno = LINENO(n);
2881 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002883 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002885 REQ(n, dotted_as_names);
2886 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2887 if (!aliases)
2888 return NULL;
2889 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002890 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002891 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002895 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002897 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002899 int idx, ndots = 0;
2900 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002901 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002903 /* Count the number of dots (for relative imports) and check for the
2904 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 for (idx = 1; idx < NCH(n); idx++) {
2906 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002907 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2908 if (!mod)
2909 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002910 idx++;
2911 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002912 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002914 ndots += 3;
2915 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002916 } else if (TYPE(CHILD(n, idx)) != DOT) {
2917 break;
2918 }
2919 ndots++;
2920 }
2921 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002922 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002923 case STAR:
2924 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002925 n = CHILD(n, idx);
2926 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002927 break;
2928 case LPAR:
2929 /* from ... import (x, y, z) */
2930 n = CHILD(n, idx + 1);
2931 n_children = NCH(n);
2932 break;
2933 case import_as_names:
2934 /* from ... import x, y, z */
2935 n = CHILD(n, idx);
2936 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002937 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 ast_error(n, "trailing comma not allowed without"
2939 " surrounding parentheses");
2940 return NULL;
2941 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002942 break;
2943 default:
2944 ast_error(n, "Unexpected node-type in from-import");
2945 return NULL;
2946 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2949 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951
2952 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002953 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002954 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002955 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002957 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002959 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002961 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002962 if (!import_alias)
2963 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002965 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002967 if (mod != NULL)
2968 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002969 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002970 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 }
Neal Norwitz79792652005-11-14 04:25:03 +00002972 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 "unknown import statement: starts with command '%s'",
2974 STR(CHILD(n, 0)));
2975 return NULL;
2976}
2977
2978static stmt_ty
2979ast_for_global_stmt(struct compiling *c, const node *n)
2980{
2981 /* global_stmt: 'global' NAME (',' NAME)* */
2982 identifier name;
2983 asdl_seq *s;
2984 int i;
2985
2986 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002987 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002988 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002989 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 name = NEW_IDENTIFIER(CHILD(n, i));
2992 if (!name)
2993 return NULL;
2994 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002996 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997}
2998
2999static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003000ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3001{
3002 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3003 identifier name;
3004 asdl_seq *s;
3005 int i;
3006
3007 REQ(n, nonlocal_stmt);
3008 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3009 if (!s)
3010 return NULL;
3011 for (i = 1; i < NCH(n); i += 2) {
3012 name = NEW_IDENTIFIER(CHILD(n, i));
3013 if (!name)
3014 return NULL;
3015 asdl_seq_SET(s, i / 2, name);
3016 }
3017 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3018}
3019
3020static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021ast_for_assert_stmt(struct compiling *c, const node *n)
3022{
3023 /* assert_stmt: 'assert' test [',' test] */
3024 REQ(n, assert_stmt);
3025 if (NCH(n) == 2) {
3026 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3027 if (!expression)
3028 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003029 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 }
3031 else if (NCH(n) == 4) {
3032 expr_ty expr1, expr2;
3033
3034 expr1 = ast_for_expr(c, CHILD(n, 1));
3035 if (!expr1)
3036 return NULL;
3037 expr2 = ast_for_expr(c, CHILD(n, 3));
3038 if (!expr2)
3039 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040
Thomas Wouters89f507f2006-12-13 04:49:30 +00003041 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 }
Neal Norwitz79792652005-11-14 04:25:03 +00003043 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 "improper number of parts to 'assert' statement: %d",
3045 NCH(n));
3046 return NULL;
3047}
3048
3049static asdl_seq *
3050ast_for_suite(struct compiling *c, const node *n)
3051{
3052 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003053 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054 stmt_ty s;
3055 int i, total, num, end, pos = 0;
3056 node *ch;
3057
3058 REQ(n, suite);
3059
3060 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003061 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003065 n = CHILD(n, 0);
3066 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 */
3069 end = NCH(n) - 1;
3070 if (TYPE(CHILD(n, end - 1)) == SEMI)
3071 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003073 for (i = 0; i < end; i += 2) {
3074 ch = CHILD(n, i);
3075 s = ast_for_stmt(c, ch);
3076 if (!s)
3077 return NULL;
3078 asdl_seq_SET(seq, pos++, s);
3079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 }
3081 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003082 for (i = 2; i < (NCH(n) - 1); i++) {
3083 ch = CHILD(n, i);
3084 REQ(ch, stmt);
3085 num = num_stmts(ch);
3086 if (num == 1) {
3087 /* small_stmt or compound_stmt with only one child */
3088 s = ast_for_stmt(c, ch);
3089 if (!s)
3090 return NULL;
3091 asdl_seq_SET(seq, pos++, s);
3092 }
3093 else {
3094 int j;
3095 ch = CHILD(ch, 0);
3096 REQ(ch, simple_stmt);
3097 for (j = 0; j < NCH(ch); j += 2) {
3098 /* statement terminates with a semi-colon ';' */
3099 if (NCH(CHILD(ch, j)) == 0) {
3100 assert((j + 1) == NCH(ch));
3101 break;
3102 }
3103 s = ast_for_stmt(c, CHILD(ch, j));
3104 if (!s)
3105 return NULL;
3106 asdl_seq_SET(seq, pos++, s);
3107 }
3108 }
3109 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 }
3111 assert(pos == seq->size);
3112 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113}
3114
3115static stmt_ty
3116ast_for_if_stmt(struct compiling *c, const node *n)
3117{
3118 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3119 ['else' ':' suite]
3120 */
3121 char *s;
3122
3123 REQ(n, if_stmt);
3124
3125 if (NCH(n) == 4) {
3126 expr_ty expression;
3127 asdl_seq *suite_seq;
3128
3129 expression = ast_for_expr(c, CHILD(n, 1));
3130 if (!expression)
3131 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003133 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135
Guido van Rossumd8faa362007-04-27 19:54:29 +00003136 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3137 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003139
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140 s = STR(CHILD(n, 4));
3141 /* s[2], the third character in the string, will be
3142 's' for el_s_e, or
3143 'i' for el_i_f
3144 */
3145 if (s[2] == 's') {
3146 expr_ty expression;
3147 asdl_seq *seq1, *seq2;
3148
3149 expression = ast_for_expr(c, CHILD(n, 1));
3150 if (!expression)
3151 return NULL;
3152 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003153 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 return NULL;
3155 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003156 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157 return NULL;
3158
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3160 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161 }
3162 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003163 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003164 expr_ty expression;
3165 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003166 asdl_seq *orelse = NULL;
3167 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168 /* must reference the child n_elif+1 since 'else' token is third,
3169 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003170 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3171 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3172 has_else = 1;
3173 n_elif -= 3;
3174 }
3175 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176
Thomas Wouters89f507f2006-12-13 04:49:30 +00003177 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179
Thomas Wouters89f507f2006-12-13 04:49:30 +00003180 orelse = asdl_seq_new(1, c->c_arena);
3181 if (!orelse)
3182 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003184 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3187 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003189 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3190 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 asdl_seq_SET(orelse, 0,
3194 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003195 LINENO(CHILD(n, NCH(n) - 6)),
3196 CHILD(n, NCH(n) - 6)->n_col_offset,
3197 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003198 /* the just-created orelse handled the last elif */
3199 n_elif--;
3200 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201
Thomas Wouters89f507f2006-12-13 04:49:30 +00003202 for (i = 0; i < n_elif; i++) {
3203 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3205 if (!newobj)
3206 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003208 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003211 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 LINENO(CHILD(n, off)),
3217 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 orelse = newobj;
3219 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003220 expression = ast_for_expr(c, CHILD(n, 1));
3221 if (!expression)
3222 return NULL;
3223 suite_seq = ast_for_suite(c, CHILD(n, 3));
3224 if (!suite_seq)
3225 return NULL;
3226 return If(expression, suite_seq, orelse,
3227 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003229
3230 PyErr_Format(PyExc_SystemError,
3231 "unexpected token in 'if' statement: %s", s);
3232 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233}
3234
3235static stmt_ty
3236ast_for_while_stmt(struct compiling *c, const node *n)
3237{
3238 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3239 REQ(n, while_stmt);
3240
3241 if (NCH(n) == 4) {
3242 expr_ty expression;
3243 asdl_seq *suite_seq;
3244
3245 expression = ast_for_expr(c, CHILD(n, 1));
3246 if (!expression)
3247 return NULL;
3248 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003249 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003251 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 }
3253 else if (NCH(n) == 7) {
3254 expr_ty expression;
3255 asdl_seq *seq1, *seq2;
3256
3257 expression = ast_for_expr(c, CHILD(n, 1));
3258 if (!expression)
3259 return NULL;
3260 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003261 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262 return NULL;
3263 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003264 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 return NULL;
3266
Thomas Wouters89f507f2006-12-13 04:49:30 +00003267 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003269
3270 PyErr_Format(PyExc_SystemError,
3271 "wrong number of tokens for 'while' statement: %d",
3272 NCH(n));
3273 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274}
3275
3276static stmt_ty
3277ast_for_for_stmt(struct compiling *c, const node *n)
3278{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003279 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003281 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003282 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3284 REQ(n, for_stmt);
3285
3286 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003287 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288 if (!seq)
3289 return NULL;
3290 }
3291
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003292 node_target = CHILD(n, 1);
3293 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003294 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003296 /* Check the # of children rather than the length of _target, since
3297 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003298 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003299 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003300 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003302 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003304 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003305 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306 return NULL;
3307 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003308 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309 return NULL;
3310
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003311 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3312 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313}
3314
3315static excepthandler_ty
3316ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3317{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003318 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319 REQ(exc, except_clause);
3320 REQ(body, suite);
3321
3322 if (NCH(exc) == 1) {
3323 asdl_seq *suite_seq = ast_for_suite(c, body);
3324 if (!suite_seq)
3325 return NULL;
3326
Neal Norwitzad74aa82008-03-31 05:14:30 +00003327 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003328 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329 }
3330 else if (NCH(exc) == 2) {
3331 expr_ty expression;
3332 asdl_seq *suite_seq;
3333
3334 expression = ast_for_expr(c, CHILD(exc, 1));
3335 if (!expression)
3336 return NULL;
3337 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003338 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339 return NULL;
3340
Neal Norwitzad74aa82008-03-31 05:14:30 +00003341 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003342 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343 }
3344 else if (NCH(exc) == 4) {
3345 asdl_seq *suite_seq;
3346 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003347 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003348 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003349 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003350 if (forbidden_name(e, CHILD(exc, 3), 0))
3351 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003353 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354 return NULL;
3355 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003356 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 return NULL;
3358
Neal Norwitzad74aa82008-03-31 05:14:30 +00003359 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003360 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003362
3363 PyErr_Format(PyExc_SystemError,
3364 "wrong number of children for 'except' clause: %d",
3365 NCH(exc));
3366 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367}
3368
3369static stmt_ty
3370ast_for_try_stmt(struct compiling *c, const node *n)
3371{
Neal Norwitzf599f422005-12-17 21:33:47 +00003372 const int nch = NCH(n);
3373 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003374 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003375
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 REQ(n, try_stmt);
3377
Neal Norwitzf599f422005-12-17 21:33:47 +00003378 body = ast_for_suite(c, CHILD(n, 2));
3379 if (body == NULL)
3380 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381
Neal Norwitzf599f422005-12-17 21:33:47 +00003382 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3383 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3384 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3385 /* we can assume it's an "else",
3386 because nch >= 9 for try-else-finally and
3387 it would otherwise have a type of except_clause */
3388 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3389 if (orelse == NULL)
3390 return NULL;
3391 n_except--;
3392 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393
Neal Norwitzf599f422005-12-17 21:33:47 +00003394 finally = ast_for_suite(c, CHILD(n, nch - 1));
3395 if (finally == NULL)
3396 return NULL;
3397 n_except--;
3398 }
3399 else {
3400 /* we can assume it's an "else",
3401 otherwise it would have a type of except_clause */
3402 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3403 if (orelse == NULL)
3404 return NULL;
3405 n_except--;
3406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003408 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003409 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003410 return NULL;
3411 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412
Neal Norwitzf599f422005-12-17 21:33:47 +00003413 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003414 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003416 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003417 if (handlers == NULL)
3418 return NULL;
3419
3420 for (i = 0; i < n_except; i++) {
3421 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3422 CHILD(n, 5 + i * 3));
3423 if (!e)
3424 return NULL;
3425 asdl_seq_SET(handlers, i, e);
3426 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003427 }
3428
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003429 assert(finally != NULL || asdl_seq_LEN(handlers));
3430 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003431}
3432
Georg Brandl0c315622009-05-25 21:10:36 +00003433/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003434static withitem_ty
3435ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003436{
3437 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003438
Georg Brandl0c315622009-05-25 21:10:36 +00003439 REQ(n, with_item);
3440 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003441 if (!context_expr)
3442 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003443 if (NCH(n) == 3) {
3444 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003445
3446 if (!optional_vars) {
3447 return NULL;
3448 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003449 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003450 return NULL;
3451 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452 }
3453
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003454 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003455}
3456
Georg Brandl0c315622009-05-25 21:10:36 +00003457/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3458static stmt_ty
3459ast_for_with_stmt(struct compiling *c, const node *n)
3460{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003461 int i, n_items;
3462 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003463
3464 REQ(n, with_stmt);
3465
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003466 n_items = (NCH(n) - 2) / 2;
3467 items = asdl_seq_new(n_items, c->c_arena);
3468 for (i = 1; i < NCH(n) - 2; i += 2) {
3469 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3470 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003471 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003472 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003473 }
3474
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003475 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3476 if (!body)
3477 return NULL;
3478
3479 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003480}
3481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003482static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003483ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003484{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003485 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003486 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003487 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003488 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003489
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003490 REQ(n, classdef);
3491
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003492 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003493 s = ast_for_suite(c, CHILD(n, 3));
3494 if (!s)
3495 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003496 classname = NEW_IDENTIFIER(CHILD(n, 1));
3497 if (!classname)
3498 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003499 if (forbidden_name(classname, CHILD(n, 3), 0))
3500 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003501 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3502 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003503 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003504
3505 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003506 s = ast_for_suite(c, CHILD(n,5));
3507 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003508 return NULL;
3509 classname = NEW_IDENTIFIER(CHILD(n, 1));
3510 if (!classname)
3511 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003512 if (forbidden_name(classname, CHILD(n, 3), 0))
3513 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003514 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3515 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003516 }
3517
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003518 /* class NAME '(' arglist ')' ':' suite */
3519 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003520 {
3521 PyObject *dummy_name;
3522 expr_ty dummy;
3523 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3524 if (!dummy_name)
3525 return NULL;
3526 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3527 call = ast_for_call(c, CHILD(n, 3), dummy);
3528 if (!call)
3529 return NULL;
3530 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003531 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003532 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003534 classname = NEW_IDENTIFIER(CHILD(n, 1));
3535 if (!classname)
3536 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003537 if (forbidden_name(classname, CHILD(n, 1), 0))
3538 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003539
Benjamin Peterson30760062008-11-25 04:02:28 +00003540 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003541 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003542 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003543}
3544
3545static stmt_ty
3546ast_for_stmt(struct compiling *c, const node *n)
3547{
3548 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003549 assert(NCH(n) == 1);
3550 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 }
3552 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003553 assert(num_stmts(n) == 1);
3554 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003555 }
3556 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003557 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003558 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3559 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003560 */
3561 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 case expr_stmt:
3563 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 case del_stmt:
3565 return ast_for_del_stmt(c, n);
3566 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003567 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 case flow_stmt:
3569 return ast_for_flow_stmt(c, n);
3570 case import_stmt:
3571 return ast_for_import_stmt(c, n);
3572 case global_stmt:
3573 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003574 case nonlocal_stmt:
3575 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 case assert_stmt:
3577 return ast_for_assert_stmt(c, n);
3578 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003579 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3581 TYPE(n), NCH(n));
3582 return NULL;
3583 }
3584 }
3585 else {
3586 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003587 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003588 */
3589 node *ch = CHILD(n, 0);
3590 REQ(n, compound_stmt);
3591 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 case if_stmt:
3593 return ast_for_if_stmt(c, ch);
3594 case while_stmt:
3595 return ast_for_while_stmt(c, ch);
3596 case for_stmt:
3597 return ast_for_for_stmt(c, ch);
3598 case try_stmt:
3599 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003600 case with_stmt:
3601 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003603 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003605 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 case decorated:
3607 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003609 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3611 TYPE(n), NCH(n));
3612 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003613 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614 }
3615}
3616
3617static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003618parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003620 const char *end;
3621 long x;
3622 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003623 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003624 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003625
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003626 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003627 errno = 0;
3628 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003629 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003630 if (s[0] == '0') {
3631 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3632 if (x < 0 && errno == 0) {
3633 return PyLong_FromString((char *)s,
3634 (char **)0,
3635 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003636 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003637 }
3638 else
3639 x = PyOS_strtol((char *)s, (char **)&end, 0);
3640 if (*end == '\0') {
3641 if (errno != 0)
3642 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003643 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644 }
3645 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003646 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003647 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003648 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3649 if (compl.imag == -1.0 && PyErr_Occurred())
3650 return NULL;
3651 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003652 }
3653 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003654 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003655 dx = PyOS_string_to_double(s, NULL, NULL);
3656 if (dx == -1.0 && PyErr_Occurred())
3657 return NULL;
3658 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003659 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660}
3661
3662static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003663decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003664{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003665 PyObject *u, *v;
3666 char *s, *t;
3667 t = s = (char *)*sPtr;
3668 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3669 while (s < end && (*s & 0x80)) s++;
3670 *sPtr = s;
3671 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3672 if (u == NULL)
3673 return NULL;
3674 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3675 Py_DECREF(u);
3676 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003677}
3678
3679static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003680decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003681{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003682 PyObject *v, *u;
3683 char *buf;
3684 char *p;
3685 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003686
Guido van Rossumd8faa362007-04-27 19:54:29 +00003687 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003688 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003689 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003690 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003691 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003692 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003693 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3694 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3695 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 if (u == NULL)
3697 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003698 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 end = s + len;
3700 while (s < end) {
3701 if (*s == '\\') {
3702 *p++ = *s++;
3703 if (*s & 0x80) {
3704 strcpy(p, "u005c");
3705 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003706 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003707 }
3708 if (*s & 0x80) { /* XXX inefficient */
3709 PyObject *w;
3710 char *r;
3711 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003712 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003713 if (w == NULL) {
3714 Py_DECREF(u);
3715 return NULL;
3716 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003717 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003718 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003719 assert(rn % 4 == 0);
3720 for (i = 0; i < rn; i += 4) {
3721 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003722 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003723 r[i + 1] & 0xFF,
3724 r[i + 2] & 0xFF,
3725 r[i + 3] & 0xFF);
3726 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003727 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003728 /* Should be impossible to overflow */
3729 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003730 Py_DECREF(w);
3731 } else {
3732 *p++ = *s++;
3733 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003734 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003735 len = p - buf;
3736 s = buf;
3737 }
3738 if (rawmode)
3739 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3740 else
3741 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3742 Py_XDECREF(u);
3743 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003744}
3745
3746/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003747 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003748 * parsestr parses it, and returns the decoded Python string object.
3749 */
3750static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003751parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003752{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003753 size_t len;
3754 const char *s = STR(n);
3755 int quote = Py_CHARMASK(*s);
3756 int rawmode = 0;
3757 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003758 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003759 if (quote == 'b' || quote == 'B') {
3760 quote = *++s;
3761 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003763 if (quote == 'r' || quote == 'R') {
3764 quote = *++s;
3765 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003766 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003767 }
3768 if (quote != '\'' && quote != '\"') {
3769 PyErr_BadInternalCall();
3770 return NULL;
3771 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003772 s++;
3773 len = strlen(s);
3774 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003776 "string to parse is too long");
3777 return NULL;
3778 }
3779 if (s[--len] != quote) {
3780 PyErr_BadInternalCall();
3781 return NULL;
3782 }
3783 if (len >= 4 && s[0] == quote && s[1] == quote) {
3784 s += 2;
3785 len -= 2;
3786 if (s[--len] != quote || s[--len] != quote) {
3787 PyErr_BadInternalCall();
3788 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003789 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003791 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003792 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003793 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 if (*bytesmode) {
3795 /* Disallow non-ascii characters (but not escapes) */
3796 const char *c;
3797 for (c = s; *c; c++) {
3798 if (Py_CHARMASK(*c) >= 0x80) {
3799 ast_error(n, "bytes can only contain ASCII "
3800 "literal characters.");
3801 return NULL;
3802 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003803 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003805 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003806 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003807 if (rawmode || strchr(s, '\\') == NULL) {
3808 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003809 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003810 if (u == NULL || !*bytesmode)
3811 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003812 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003813 Py_DECREF(u);
3814 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003815 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003816 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003817 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003818 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003819 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003820 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003821 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003823 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003824 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003825}
3826
Guido van Rossum29fd7122007-11-12 01:13:56 +00003827/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828 * compile-time literal catenation, calling parsestr() on each piece, and
3829 * pasting the intermediate results together.
3830 */
3831static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003832parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003833{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003834 PyObject *v;
3835 int i;
3836 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003837 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003838 if (v != NULL) {
3839 /* String literal concatenation */
3840 for (i = 1; i < NCH(n); i++) {
3841 PyObject *s;
3842 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003843 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003844 if (s == NULL)
3845 goto onError;
3846 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003847 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003848 goto onError;
3849 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003850 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3851 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 if (v == NULL)
3853 goto onError;
3854 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003855 else {
3856 PyObject *temp = PyUnicode_Concat(v, s);
3857 Py_DECREF(s);
3858 Py_DECREF(v);
3859 v = temp;
3860 if (v == NULL)
3861 goto onError;
3862 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003863 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003864 }
3865 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003866
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 onError:
3868 Py_XDECREF(v);
3869 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870}