blob: 9639350bc7f7b2513c84bfbb0db3168eb0158c72 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
Christian Heimes3c608332008-03-26 22:01:37 +000021 int c_future_unicode; /* __future__ unicode literals flag */
Neal Norwitzadb69fc2005-12-17 20:54:49 +000022 PyArena *c_arena; /* arena for allocating memeory */
Christian Heimesffcd1e12007-11-24 01:36:02 +000023 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024};
25
26static asdl_seq *seq_for_testlist(struct compiling *, const node *);
27static expr_ty ast_for_expr(struct compiling *, const node *);
28static stmt_ty ast_for_stmt(struct compiling *, const node *);
29static asdl_seq *ast_for_suite(struct compiling *, const node *);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000030static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
31 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000032static expr_ty ast_for_testlist(struct compiling *, const node *);
Christian Heimes5224d282008-02-23 15:01:05 +000033static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000034static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000035
36/* Note different signature for ast_for_call */
37static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
38
Benjamin Peterson2b30ea02008-05-03 15:56:42 +000039static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes3c608332008-03-26 22:01:37 +000040static PyObject *parsestr(struct compiling *, const char *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041static PyObject *parsestrplus(struct compiling *, const node *n);
42
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#ifndef LINENO
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000044#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#endif
46
Neal Norwitzadb69fc2005-12-17 20:54:49 +000047static identifier
48new_identifier(const char* n, PyArena *arena) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000049 PyObject* id = PyString_InternFromString(n);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +000050 if (id != NULL)
51 PyArena_AddPyObject(arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000052 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000053}
54
Neal Norwitzadb69fc2005-12-17 20:54:49 +000055#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056
57/* This routine provides an invalid object for the syntax error.
58 The outermost routine must unpack this error and create the
59 proper object. We do this so that we don't have to pass
60 the filename to everything function.
61
62 XXX Maybe we should just pass the filename...
63*/
64
65static int
66ast_error(const node *n, const char *errstr)
67{
68 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
69 if (!u)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000070 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000071 PyErr_SetObject(PyExc_SyntaxError, u);
72 Py_DECREF(u);
73 return 0;
74}
75
76static void
77ast_error_finish(const char *filename)
78{
79 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000080 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82 assert(PyErr_Occurred());
83 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000084 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085
86 PyErr_Fetch(&type, &value, &tback);
87 errstr = PyTuple_GetItem(value, 0);
88 if (!errstr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000089 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000090 Py_INCREF(errstr);
91 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000092 if (lineno == -1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000093 Py_DECREF(errstr);
94 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000095 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 Py_DECREF(value);
97
98 loc = PyErr_ProgramText(filename, lineno);
99 if (!loc) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000100 Py_INCREF(Py_None);
101 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000102 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000103 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000105 if (!tmp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000106 Py_DECREF(errstr);
107 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000108 }
Georg Brandl7784f122006-05-26 20:04:44 +0000109 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110 Py_DECREF(errstr);
111 Py_DECREF(tmp);
112 if (!value)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000113 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114 PyErr_Restore(type, value, tback);
115}
116
Benjamin Petersoncbd78132008-06-08 15:45:23 +0000117static int
118ast_warn(struct compiling *c, const node *n, char *msg)
119{
120 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, LINENO(n),
121 NULL, NULL) < 0) {
122 /* if -Werr, change it to a SyntaxError */
123 if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning))
124 ast_error(n, msg);
125 return 0;
126 }
127 return 1;
128}
129
Benjamin Petersond5efd202008-06-08 22:52:37 +0000130static int
131forbidden_check(struct compiling *c, const node *n, const char *x)
132{
133 if (!strcmp(x, "None"))
Benjamin Peterson2c98faa2008-11-08 18:38:54 +0000134 return ast_error(n, "cannot assign to None");
135 if (!strcmp(x, "__debug__"))
136 return ast_error(n, "cannot assign to __debug__");
Benjamin Peterson399b1fe2008-10-25 02:53:28 +0000137 if (Py_Py3kWarningFlag) {
138 if (!(strcmp(x, "True") && strcmp(x, "False")) &&
139 !ast_warn(c, n, "assignment to True or False is forbidden in 3.x"))
140 return 0;
141 if (!strcmp(x, "nonlocal") &&
142 !ast_warn(c, n, "nonlocal is a keyword in 3.x"))
143 return 0;
144 }
Benjamin Petersond5efd202008-06-08 22:52:37 +0000145 return 1;
146}
147
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000148/* num_stmts() returns number of contained statements.
149
150 Use this routine to determine how big a sequence is needed for
151 the statements in a parse tree. Its raison d'etre is this bit of
152 grammar:
153
154 stmt: simple_stmt | compound_stmt
155 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
156
157 A simple_stmt can contain multiple small_stmt elements joined
158 by semicolons. If the arg is a simple_stmt, the number of
159 small_stmt elements is returned.
160*/
161
162static int
163num_stmts(const node *n)
164{
165 int i, l;
166 node *ch;
167
168 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000169 case single_input:
170 if (TYPE(CHILD(n, 0)) == NEWLINE)
171 return 0;
172 else
173 return num_stmts(CHILD(n, 0));
174 case file_input:
175 l = 0;
176 for (i = 0; i < NCH(n); i++) {
177 ch = CHILD(n, i);
178 if (TYPE(ch) == stmt)
179 l += num_stmts(ch);
180 }
181 return l;
182 case stmt:
183 return num_stmts(CHILD(n, 0));
184 case compound_stmt:
185 return 1;
186 case simple_stmt:
187 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
188 case suite:
189 if (NCH(n) == 1)
190 return num_stmts(CHILD(n, 0));
191 else {
192 l = 0;
193 for (i = 2; i < (NCH(n) - 1); i++)
194 l += num_stmts(CHILD(n, i));
195 return l;
196 }
197 default: {
198 char buf[128];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000199
Amaury Forgeot d'Arc59ce0422009-01-17 20:18:59 +0000200 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000201 TYPE(n), NCH(n));
202 Py_FatalError(buf);
203 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000204 }
205 assert(0);
206 return 0;
207}
208
209/* Transform the CST rooted at node * to the appropriate AST
210*/
211
212mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000213PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000214 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000216 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000217 asdl_seq *stmts = NULL;
218 stmt_ty s;
219 node *ch;
220 struct compiling c;
221
222 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000223 c.c_encoding = "utf-8";
224 if (TYPE(n) == encoding_decl) {
225 ast_error(n, "encoding declaration in Unicode string");
226 goto error;
227 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228 } else if (TYPE(n) == encoding_decl) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000229 c.c_encoding = STR(n);
230 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 } else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000232 c.c_encoding = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 }
Christian Heimes3c608332008-03-26 22:01:37 +0000234 c.c_future_unicode = flags && flags->cf_flags & CO_FUTURE_UNICODE_LITERALS;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 c.c_arena = arena;
Christian Heimesffcd1e12007-11-24 01:36:02 +0000236 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000237
Jeremy Hyltona8293132006-02-28 17:58:27 +0000238 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000240 case file_input:
241 stmts = asdl_seq_new(num_stmts(n), arena);
242 if (!stmts)
243 return NULL;
244 for (i = 0; i < NCH(n) - 1; i++) {
245 ch = CHILD(n, i);
246 if (TYPE(ch) == NEWLINE)
247 continue;
248 REQ(ch, stmt);
249 num = num_stmts(ch);
250 if (num == 1) {
251 s = ast_for_stmt(&c, ch);
252 if (!s)
253 goto error;
254 asdl_seq_SET(stmts, k++, s);
255 }
256 else {
257 ch = CHILD(ch, 0);
258 REQ(ch, simple_stmt);
259 for (j = 0; j < num; j++) {
260 s = ast_for_stmt(&c, CHILD(ch, j * 2));
261 if (!s)
262 goto error;
263 asdl_seq_SET(stmts, k++, s);
264 }
265 }
266 }
267 return Module(stmts, arena);
268 case eval_input: {
269 expr_ty testlist_ast;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000271 /* XXX Why not gen_for here? */
272 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
273 if (!testlist_ast)
274 goto error;
275 return Expression(testlist_ast, arena);
276 }
277 case single_input:
278 if (TYPE(CHILD(n, 0)) == NEWLINE) {
279 stmts = asdl_seq_new(1, arena);
280 if (!stmts)
281 goto error;
282 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
283 arena));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000284 if (!asdl_seq_GET(stmts, 0))
285 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000286 return Interactive(stmts, arena);
287 }
288 else {
289 n = CHILD(n, 0);
290 num = num_stmts(n);
291 stmts = asdl_seq_new(num, arena);
292 if (!stmts)
293 goto error;
294 if (num == 1) {
295 s = ast_for_stmt(&c, n);
296 if (!s)
297 goto error;
298 asdl_seq_SET(stmts, 0, s);
299 }
300 else {
301 /* Only a simple_stmt can contain multiple statements. */
302 REQ(n, simple_stmt);
303 for (i = 0; i < NCH(n); i += 2) {
304 if (TYPE(CHILD(n, i)) == NEWLINE)
305 break;
306 s = ast_for_stmt(&c, CHILD(n, i));
307 if (!s)
308 goto error;
309 asdl_seq_SET(stmts, i / 2, s);
310 }
311 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000313 return Interactive(stmts, arena);
314 }
315 default:
Georg Brandlb8ae3d02007-05-02 20:02:29 +0000316 PyErr_Format(PyExc_SystemError,
317 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000318 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319 }
320 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321 ast_error_finish(filename);
322 return NULL;
323}
324
325/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
326*/
327
328static operator_ty
329get_operator(const node *n)
330{
331 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000332 case VBAR:
333 return BitOr;
334 case CIRCUMFLEX:
335 return BitXor;
336 case AMPER:
337 return BitAnd;
338 case LEFTSHIFT:
339 return LShift;
340 case RIGHTSHIFT:
341 return RShift;
342 case PLUS:
343 return Add;
344 case MINUS:
345 return Sub;
346 case STAR:
347 return Mult;
348 case SLASH:
349 return Div;
350 case DOUBLESLASH:
351 return FloorDiv;
352 case PERCENT:
353 return Mod;
354 default:
355 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356 }
357}
358
Jeremy Hyltona8293132006-02-28 17:58:27 +0000359/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000360
361 Only sets context for expr kinds that "can appear in assignment context"
362 (according to ../Parser/Python.asdl). For other expr kinds, it sets
363 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000364*/
365
366static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000367set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368{
369 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000370 /* If a particular expression type can't be used for assign / delete,
371 set expr_name to its name and an error message will be generated.
372 */
373 const char* expr_name = NULL;
374
375 /* The ast defines augmented store and load contexts, but the
376 implementation here doesn't actually use them. The code may be
377 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000378 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000379 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000380 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000381 */
382 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383
384 switch (e->kind) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000385 case Attribute_kind:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000386 if (ctx == Store && !forbidden_check(c, n,
387 PyBytes_AS_STRING(e->v.Attribute.attr)))
388 return 0;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000389 e->v.Attribute.ctx = ctx;
390 break;
391 case Subscript_kind:
392 e->v.Subscript.ctx = ctx;
393 break;
394 case Name_kind:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000395 if (ctx == Store && !forbidden_check(c, n,
396 PyBytes_AS_STRING(e->v.Name.id)))
397 return 0;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000398 e->v.Name.ctx = ctx;
399 break;
400 case List_kind:
401 e->v.List.ctx = ctx;
402 s = e->v.List.elts;
403 break;
404 case Tuple_kind:
405 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
406 return ast_error(n, "can't assign to ()");
407 e->v.Tuple.ctx = ctx;
408 s = e->v.Tuple.elts;
409 break;
410 case Lambda_kind:
411 expr_name = "lambda";
412 break;
413 case Call_kind:
414 expr_name = "function call";
415 break;
416 case BoolOp_kind:
417 case BinOp_kind:
418 case UnaryOp_kind:
419 expr_name = "operator";
420 break;
421 case GeneratorExp_kind:
422 expr_name = "generator expression";
423 break;
424 case Yield_kind:
425 expr_name = "yield expression";
426 break;
427 case ListComp_kind:
428 expr_name = "list comprehension";
429 break;
430 case Dict_kind:
431 case Num_kind:
432 case Str_kind:
433 expr_name = "literal";
434 break;
435 case Compare_kind:
436 expr_name = "comparison";
437 break;
438 case Repr_kind:
439 expr_name = "repr";
440 break;
441 case IfExp_kind:
442 expr_name = "conditional expression";
443 break;
444 default:
445 PyErr_Format(PyExc_SystemError,
446 "unexpected expression in assignment %d (line %d)",
447 e->kind, e->lineno);
448 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 /* Check for error string set by switch */
451 if (expr_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000452 char buf[300];
453 PyOS_snprintf(buf, sizeof(buf),
454 "can't %s %s",
455 ctx == Store ? "assign to" : "delete",
456 expr_name);
457 return ast_error(n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 }
459
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000461 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000462 */
463 if (s) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000464 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000465
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000466 for (i = 0; i < asdl_seq_LEN(s); i++) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000467 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000468 return 0;
469 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 }
471 return 1;
472}
473
474static operator_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000475ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000476{
477 REQ(n, augassign);
478 n = CHILD(n, 0);
479 switch (STR(n)[0]) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000480 case '+':
481 return Add;
482 case '-':
483 return Sub;
484 case '/':
485 if (STR(n)[1] == '/')
486 return FloorDiv;
487 else
488 return Div;
489 case '%':
490 return Mod;
491 case '<':
492 return LShift;
493 case '>':
494 return RShift;
495 case '&':
496 return BitAnd;
497 case '^':
498 return BitXor;
499 case '|':
500 return BitOr;
501 case '*':
502 if (STR(n)[1] == '*')
503 return Pow;
504 else
505 return Mult;
506 default:
507 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
508 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510}
511
512static cmpop_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000513ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514{
515 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000516 |'is' 'not'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000517 */
518 REQ(n, comp_op);
519 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000520 n = CHILD(n, 0);
521 switch (TYPE(n)) {
522 case LESS:
523 return Lt;
524 case GREATER:
525 return Gt;
526 case EQEQUAL: /* == */
527 return Eq;
528 case LESSEQUAL:
529 return LtE;
530 case GREATEREQUAL:
531 return GtE;
532 case NOTEQUAL:
533 return NotEq;
534 case NAME:
535 if (strcmp(STR(n), "in") == 0)
536 return In;
537 if (strcmp(STR(n), "is") == 0)
538 return Is;
539 default:
540 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
541 STR(n));
542 return (cmpop_ty)0;
543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 }
545 else if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000546 /* handle "not in" and "is not" */
547 switch (TYPE(CHILD(n, 0))) {
548 case NAME:
549 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
550 return NotIn;
551 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
552 return IsNot;
553 default:
554 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
555 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
556 return (cmpop_ty)0;
557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558 }
Neal Norwitz79792652005-11-14 04:25:03 +0000559 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000560 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000561 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562}
563
564static asdl_seq *
565seq_for_testlist(struct compiling *c, const node *n)
566{
567 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000568 asdl_seq *seq;
569 expr_ty expression;
570 int i;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000571 assert(TYPE(n) == testlist ||
572 TYPE(n) == listmaker ||
573 TYPE(n) == testlist_gexp ||
574 TYPE(n) == testlist_safe ||
575 TYPE(n) == testlist1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000577 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000579 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580
581 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000582 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000584 expression = ast_for_expr(c, CHILD(n, i));
585 if (!expression)
586 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000588 assert(i / 2 < seq->size);
589 asdl_seq_SET(seq, i / 2, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590 }
591 return seq;
592}
593
594static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000595compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000596{
597 int i, len = (NCH(n) + 1) / 2;
598 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000599 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000601 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
Neal Norwitz3a230172006-09-22 08:18:10 +0000603 /* fpdef: NAME | '(' fplist ')'
604 fplist: fpdef (',' fpdef)* [',']
605 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 for (i = 0; i < len; i++) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000608 PyObject *arg_id;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000609 const node *fpdef_node = CHILD(n, 2*i);
610 const node *child;
611 expr_ty arg;
Neal Norwitz3a230172006-09-22 08:18:10 +0000612set_name:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000613 /* fpdef_node is either a NAME or an fplist */
614 child = CHILD(fpdef_node, 0);
615 if (TYPE(child) == NAME) {
Benjamin Petersond5efd202008-06-08 22:52:37 +0000616 if (!forbidden_check(c, n, STR(child)))
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000617 return NULL;
618 arg_id = NEW_IDENTIFIER(child);
619 if (!arg_id)
620 return NULL;
621 arg = Name(arg_id, Store, LINENO(child), child->n_col_offset,
622 c->c_arena);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000623 }
624 else {
625 assert(TYPE(fpdef_node) == fpdef);
626 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
627 child = CHILD(fpdef_node, 1);
628 assert(TYPE(child) == fplist);
629 /* NCH == 1 means we have (x), we need to elide the extra parens */
630 if (NCH(child) == 1) {
631 fpdef_node = CHILD(child, 0);
632 assert(TYPE(fpdef_node) == fpdef);
633 goto set_name;
634 }
635 arg = compiler_complex_args(c, child);
636 }
637 asdl_seq_SET(args, i, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638 }
639
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000640 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000641 if (!set_context(c, result, Store, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000642 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000643 return result;
644}
645
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000646
Jeremy Hyltona8293132006-02-28 17:58:27 +0000647/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000648
649static arguments_ty
650ast_for_arguments(struct compiling *c, const node *n)
651{
652 /* parameters: '(' [varargslist] ')'
653 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000654 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000655 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000656 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657 asdl_seq *args, *defaults;
658 identifier vararg = NULL, kwarg = NULL;
659 node *ch;
660
661 if (TYPE(n) == parameters) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000662 if (NCH(n) == 2) /* () as argument list */
663 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
664 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665 }
666 REQ(n, varargslist);
667
668 /* first count the number of normal args & defaults */
669 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000670 ch = CHILD(n, i);
671 if (TYPE(ch) == fpdef)
672 n_args++;
673 if (TYPE(ch) == EQUAL)
674 n_defaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000675 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000676 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 if (!args && n_args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000678 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000679 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680 if (!defaults && n_defaults)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000681 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000682
683 /* fpdef: NAME | '(' fplist ')'
684 fplist: fpdef (',' fpdef)* [',']
685 */
686 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000687 j = 0; /* index for defaults */
688 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689 while (i < NCH(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000690 ch = CHILD(n, i);
691 switch (TYPE(ch)) {
692 case fpdef:
693 handle_fpdef:
694 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
695 anything other than EQUAL or a comma? */
696 /* XXX Should NCH(n) check be made a separate check? */
697 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
698 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
699 if (!expression)
700 goto error;
701 assert(defaults != NULL);
702 asdl_seq_SET(defaults, j++, expression);
703 i += 2;
704 found_default = 1;
705 }
706 else if (found_default) {
707 ast_error(n,
708 "non-default argument follows default argument");
709 goto error;
710 }
711 if (NCH(ch) == 3) {
712 ch = CHILD(ch, 1);
713 /* def foo((x)): is not complex, special case. */
714 if (NCH(ch) != 1) {
715 /* We have complex arguments, setup for unpacking. */
Benjamin Petersonf4fcdb62008-06-08 23:00:00 +0000716 if (Py_Py3kWarningFlag && !ast_warn(c, ch,
717 "tuple parameter unpacking has been removed in 3.x"))
718 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000719 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000720 if (!asdl_seq_GET(args, k-1))
721 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000722 } else {
723 /* def foo((x)): setup for checking NAME below. */
724 /* Loop because there can be many parens and tuple
725 unpacking mixed in. */
726 ch = CHILD(ch, 0);
727 assert(TYPE(ch) == fpdef);
728 goto handle_fpdef;
729 }
730 }
731 if (TYPE(CHILD(ch, 0)) == NAME) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000732 PyObject *id;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000733 expr_ty name;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000734 if (!forbidden_check(c, n, STR(CHILD(ch, 0))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000735 goto error;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000736 id = NEW_IDENTIFIER(CHILD(ch, 0));
737 if (!id)
738 goto error;
739 name = Name(id, Param, LINENO(ch), ch->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000740 c->c_arena);
741 if (!name)
742 goto error;
743 asdl_seq_SET(args, k++, name);
744
745 }
746 i += 2; /* the name and the comma */
747 break;
748 case STAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000749 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000750 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000751 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000752 if (!vararg)
753 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000754 i += 3;
755 break;
756 case DOUBLESTAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000757 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000758 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000759 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000760 if (!kwarg)
761 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000762 i += 3;
763 break;
764 default:
765 PyErr_Format(PyExc_SystemError,
766 "unexpected node in varargslist: %d @ %d",
767 TYPE(ch), i);
768 goto error;
769 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 }
771
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000772 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773
774 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000775 Py_XDECREF(vararg);
776 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 return NULL;
778}
779
780static expr_ty
781ast_for_dotted_name(struct compiling *c, const node *n)
782{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000783 expr_ty e;
784 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000785 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 int i;
787
788 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000789
790 lineno = LINENO(n);
791 col_offset = n->n_col_offset;
792
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 id = NEW_IDENTIFIER(CHILD(n, 0));
794 if (!id)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000795 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000796 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000797 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000798 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799
800 for (i = 2; i < NCH(n); i+=2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000801 id = NEW_IDENTIFIER(CHILD(n, i));
802 if (!id)
803 return NULL;
804 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
805 if (!e)
806 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807 }
808
809 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810}
811
812static expr_ty
813ast_for_decorator(struct compiling *c, const node *n)
814{
815 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
816 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000817 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818
819 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000820 REQ(CHILD(n, 0), AT);
821 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822
823 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
824 if (!name_expr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000825 return NULL;
826
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 if (NCH(n) == 3) { /* No arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000828 d = name_expr;
829 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 }
831 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000832 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
833 n->n_col_offset, c->c_arena);
834 if (!d)
835 return NULL;
836 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 }
838 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000839 d = ast_for_call(c, CHILD(n, 3), name_expr);
840 if (!d)
841 return NULL;
842 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843 }
844
845 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846}
847
848static asdl_seq*
849ast_for_decorators(struct compiling *c, const node *n)
850{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000851 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000852 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 int i;
854
855 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000856 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857 if (!decorator_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000858 return NULL;
859
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000861 d = ast_for_decorator(c, CHILD(n, i));
862 if (!d)
863 return NULL;
864 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865 }
866 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867}
868
869static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +0000870ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871{
Christian Heimes5224d282008-02-23 15:01:05 +0000872 /* funcdef: 'def' NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000873 identifier name;
874 arguments_ty args;
875 asdl_seq *body;
Christian Heimes5224d282008-02-23 15:01:05 +0000876 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877
878 REQ(n, funcdef);
879
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 name = NEW_IDENTIFIER(CHILD(n, name_i));
881 if (!name)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000882 return NULL;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000883 else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000884 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885 args = ast_for_arguments(c, CHILD(n, name_i + 1));
886 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 body = ast_for_suite(c, CHILD(n, name_i + 3));
889 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000890 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000892 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000893 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894}
895
Christian Heimes5224d282008-02-23 15:01:05 +0000896static stmt_ty
897ast_for_decorated(struct compiling *c, const node *n)
898{
899 /* decorated: decorators (classdef | funcdef) */
900 stmt_ty thing = NULL;
901 asdl_seq *decorator_seq = NULL;
902
903 REQ(n, decorated);
904
905 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
906 if (!decorator_seq)
907 return NULL;
908
909 assert(TYPE(CHILD(n, 1)) == funcdef ||
910 TYPE(CHILD(n, 1)) == classdef);
911
912 if (TYPE(CHILD(n, 1)) == funcdef) {
913 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
914 } else if (TYPE(CHILD(n, 1)) == classdef) {
915 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
916 }
917 /* we count the decorators in when talking about the class' or
918 function's line number */
919 if (thing) {
920 thing->lineno = LINENO(n);
921 thing->col_offset = n->n_col_offset;
922 }
923 return thing;
924}
925
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926static expr_ty
927ast_for_lambdef(struct compiling *c, const node *n)
928{
929 /* lambdef: 'lambda' [varargslist] ':' test */
930 arguments_ty args;
931 expr_ty expression;
932
933 if (NCH(n) == 3) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000934 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
935 if (!args)
936 return NULL;
937 expression = ast_for_expr(c, CHILD(n, 2));
938 if (!expression)
939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 }
941 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000942 args = ast_for_arguments(c, CHILD(n, 1));
943 if (!args)
944 return NULL;
945 expression = ast_for_expr(c, CHILD(n, 3));
946 if (!expression)
947 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948 }
949
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000950 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951}
952
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000953static expr_ty
954ast_for_ifexpr(struct compiling *c, const node *n)
955{
956 /* test: or_test 'if' or_test 'else' test */
957 expr_ty expression, body, orelse;
958
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000959 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000960 body = ast_for_expr(c, CHILD(n, 0));
961 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000962 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000963 expression = ast_for_expr(c, CHILD(n, 2));
964 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000965 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000966 orelse = ast_for_expr(c, CHILD(n, 4));
967 if (!orelse)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000968 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000969 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000970 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000971}
972
Neal Norwitze4d4f002006-09-05 03:58:26 +0000973/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
974 so there is only a single version. Possibly for loops can also re-use
975 the code.
976*/
977
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978/* Count the number of 'for' loop in a list comprehension.
979
980 Helper for ast_for_listcomp().
981*/
982
983static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000984count_list_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985{
986 int n_fors = 0;
987 node *ch = CHILD(n, 1);
988
989 count_list_for:
990 n_fors++;
991 REQ(ch, list_for);
992 if (NCH(ch) == 5)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000993 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000995 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 count_list_iter:
997 REQ(ch, list_iter);
998 ch = CHILD(ch, 0);
999 if (TYPE(ch) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001000 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 else if (TYPE(ch) == list_if) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001002 if (NCH(ch) == 3) {
1003 ch = CHILD(ch, 2);
1004 goto count_list_iter;
1005 }
1006 else
1007 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001009
1010 /* Should never be reached */
1011 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
1012 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013}
1014
1015/* Count the number of 'if' statements in a list comprehension.
1016
1017 Helper for ast_for_listcomp().
1018*/
1019
1020static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001021count_list_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022{
1023 int n_ifs = 0;
1024
1025 count_list_iter:
1026 REQ(n, list_iter);
1027 if (TYPE(CHILD(n, 0)) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001028 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029 n = CHILD(n, 0);
1030 REQ(n, list_if);
1031 n_ifs++;
1032 if (NCH(n) == 2)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001033 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 n = CHILD(n, 2);
1035 goto count_list_iter;
1036}
1037
1038static expr_ty
1039ast_for_listcomp(struct compiling *c, const node *n)
1040{
1041 /* listmaker: test ( list_for | (',' test)* [','] )
1042 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1043 list_iter: list_for | list_if
1044 list_if: 'if' test [list_iter]
1045 testlist_safe: test [(',' test)+ [',']]
1046 */
1047 expr_ty elt;
1048 asdl_seq *listcomps;
1049 int i, n_fors;
1050 node *ch;
1051
1052 REQ(n, listmaker);
1053 assert(NCH(n) > 1);
1054
1055 elt = ast_for_expr(c, CHILD(n, 0));
1056 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001057 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001059 n_fors = count_list_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001061 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001062
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001063 listcomps = asdl_seq_new(n_fors, c->c_arena);
1064 if (!listcomps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001065 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001066
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067 ch = CHILD(n, 1);
1068 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001069 comprehension_ty lc;
1070 asdl_seq *t;
1071 expr_ty expression;
1072 node *for_ch;
1073
1074 REQ(ch, list_for);
1075
1076 for_ch = CHILD(ch, 1);
1077 t = ast_for_exprlist(c, for_ch, Store);
1078 if (!t)
1079 return NULL;
1080 expression = ast_for_testlist(c, CHILD(ch, 3));
1081 if (!expression)
1082 return NULL;
1083
1084 /* Check the # of children rather than the length of t, since
1085 [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1086 */
1087 if (NCH(for_ch) == 1)
1088 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
1089 c->c_arena);
1090 else
1091 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1092 c->c_arena),
1093 expression, NULL, c->c_arena);
1094 if (!lc)
1095 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001097 if (NCH(ch) == 5) {
1098 int j, n_ifs;
1099 asdl_seq *ifs;
1100 expr_ty list_for_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001102 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001103 n_ifs = count_list_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001104 if (n_ifs == -1)
1105 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001107 ifs = asdl_seq_new(n_ifs, c->c_arena);
1108 if (!ifs)
1109 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001111 for (j = 0; j < n_ifs; j++) {
1112 REQ(ch, list_iter);
1113 ch = CHILD(ch, 0);
1114 REQ(ch, list_if);
1115
1116 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1117 if (!list_for_expr)
1118 return NULL;
1119
1120 asdl_seq_SET(ifs, j, list_for_expr);
1121 if (NCH(ch) == 3)
1122 ch = CHILD(ch, 2);
1123 }
1124 /* on exit, must guarantee that ch is a list_for */
1125 if (TYPE(ch) == list_iter)
1126 ch = CHILD(ch, 0);
1127 lc->ifs = ifs;
1128 }
1129 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130 }
1131
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001132 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133}
1134
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001135/* Count the number of 'for' loops in a generator expression.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
1137 Helper for ast_for_genexp().
1138*/
1139
1140static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001141count_gen_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001143 int n_fors = 0;
1144 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145
1146 count_gen_for:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001147 n_fors++;
1148 REQ(ch, gen_for);
1149 if (NCH(ch) == 5)
1150 ch = CHILD(ch, 4);
1151 else
1152 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 count_gen_iter:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001154 REQ(ch, gen_iter);
1155 ch = CHILD(ch, 0);
1156 if (TYPE(ch) == gen_for)
1157 goto count_gen_for;
1158 else if (TYPE(ch) == gen_if) {
1159 if (NCH(ch) == 3) {
1160 ch = CHILD(ch, 2);
1161 goto count_gen_iter;
1162 }
1163 else
1164 return n_fors;
1165 }
1166
1167 /* Should never be reached */
1168 PyErr_SetString(PyExc_SystemError,
1169 "logic error in count_gen_fors");
1170 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171}
1172
1173/* Count the number of 'if' statements in a generator expression.
1174
1175 Helper for ast_for_genexp().
1176*/
1177
1178static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001179count_gen_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001181 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001183 while (1) {
1184 REQ(n, gen_iter);
1185 if (TYPE(CHILD(n, 0)) == gen_for)
1186 return n_ifs;
1187 n = CHILD(n, 0);
1188 REQ(n, gen_if);
1189 n_ifs++;
1190 if (NCH(n) == 2)
1191 return n_ifs;
1192 n = CHILD(n, 2);
1193 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194}
1195
Jeremy Hyltona8293132006-02-28 17:58:27 +00001196/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197static expr_ty
1198ast_for_genexp(struct compiling *c, const node *n)
1199{
1200 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001201 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 expr_ty elt;
1203 asdl_seq *genexps;
1204 int i, n_fors;
1205 node *ch;
1206
1207 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1208 assert(NCH(n) > 1);
1209
1210 elt = ast_for_expr(c, CHILD(n, 0));
1211 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001212 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001214 n_fors = count_gen_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001216 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217
1218 genexps = asdl_seq_new(n_fors, c->c_arena);
1219 if (!genexps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001220 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001221
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 ch = CHILD(n, 1);
1223 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001224 comprehension_ty ge;
1225 asdl_seq *t;
1226 expr_ty expression;
1227 node *for_ch;
1228
1229 REQ(ch, gen_for);
1230
1231 for_ch = CHILD(ch, 1);
1232 t = ast_for_exprlist(c, for_ch, Store);
1233 if (!t)
1234 return NULL;
1235 expression = ast_for_expr(c, CHILD(ch, 3));
1236 if (!expression)
1237 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001238
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001239 /* Check the # of children rather than the length of t, since
1240 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1241 if (NCH(for_ch) == 1)
1242 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1243 NULL, c->c_arena);
1244 else
1245 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1246 c->c_arena),
1247 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001248
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001249 if (!ge)
1250 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001251
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001252 if (NCH(ch) == 5) {
1253 int j, n_ifs;
1254 asdl_seq *ifs;
1255
1256 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001257 n_ifs = count_gen_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001258 if (n_ifs == -1)
1259 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001260
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001261 ifs = asdl_seq_new(n_ifs, c->c_arena);
1262 if (!ifs)
1263 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001264
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001265 for (j = 0; j < n_ifs; j++) {
1266 REQ(ch, gen_iter);
1267 ch = CHILD(ch, 0);
1268 REQ(ch, gen_if);
1269
1270 expression = ast_for_expr(c, CHILD(ch, 1));
1271 if (!expression)
1272 return NULL;
1273 asdl_seq_SET(ifs, j, expression);
1274 if (NCH(ch) == 3)
1275 ch = CHILD(ch, 2);
1276 }
1277 /* on exit, must guarantee that ch is a gen_for */
1278 if (TYPE(ch) == gen_iter)
1279 ch = CHILD(ch, 0);
1280 ge->ifs = ifs;
1281 }
1282 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 }
1284
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001285 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286}
1287
1288static expr_ty
1289ast_for_atom(struct compiling *c, const node *n)
1290{
1291 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1292 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1293 */
1294 node *ch = CHILD(n, 0);
1295
1296 switch (TYPE(ch)) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001297 case NAME: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001298 /* All names start in Load context, but may later be
1299 changed. */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001300 PyObject *name = NEW_IDENTIFIER(ch);
1301 if (!name)
1302 return NULL;
1303 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1304 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 case STRING: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001306 PyObject *str = parsestrplus(c, n);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001307 if (!str) {
Georg Brandldfe5dc82008-01-07 18:16:36 +00001308#ifdef Py_USING_UNICODE
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001309 if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
1310 PyObject *type, *value, *tback, *errstr;
1311 PyErr_Fetch(&type, &value, &tback);
Benjamin Petersonc078f922008-11-21 22:27:24 +00001312 errstr = PyObject_Str(value);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001313 if (errstr) {
1314 char *s = "";
1315 char buf[128];
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001316 s = PyString_AsString(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001317 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1318 ast_error(n, buf);
Benjamin Petersonc078f922008-11-21 22:27:24 +00001319 Py_DECREF(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001320 } else {
1321 ast_error(n, "(unicode error) unknown error");
1322 }
1323 Py_DECREF(type);
1324 Py_DECREF(value);
1325 Py_XDECREF(tback);
1326 }
Georg Brandldfe5dc82008-01-07 18:16:36 +00001327#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001328 return NULL;
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001329 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001330 PyArena_AddPyObject(c->c_arena, str);
1331 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 }
1333 case NUMBER: {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001334 PyObject *pynum = parsenumber(c, STR(ch));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001335 if (!pynum)
1336 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001337
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001338 PyArena_AddPyObject(c->c_arena, pynum);
1339 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 }
1341 case LPAR: /* some parenthesized expressions */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001342 ch = CHILD(n, 1);
1343
1344 if (TYPE(ch) == RPAR)
1345 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1346
1347 if (TYPE(ch) == yield_expr)
1348 return ast_for_expr(c, ch);
1349
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001350 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 case LSQB: /* list (or list comprehension) */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001352 ch = CHILD(n, 1);
1353
1354 if (TYPE(ch) == RSQB)
1355 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1356
1357 REQ(ch, listmaker);
1358 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1359 asdl_seq *elts = seq_for_testlist(c, ch);
1360 if (!elts)
1361 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001362
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001363 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1364 }
1365 else
1366 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367 case LBRACE: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001368 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1369 int i, size;
1370 asdl_seq *keys, *values;
1371
1372 ch = CHILD(n, 1);
1373 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1374 keys = asdl_seq_new(size, c->c_arena);
1375 if (!keys)
1376 return NULL;
1377
1378 values = asdl_seq_new(size, c->c_arena);
1379 if (!values)
1380 return NULL;
1381
1382 for (i = 0; i < NCH(ch); i += 4) {
1383 expr_ty expression;
1384
1385 expression = ast_for_expr(c, CHILD(ch, i));
1386 if (!expression)
1387 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001388
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001389 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001390
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001391 expression = ast_for_expr(c, CHILD(ch, i + 2));
1392 if (!expression)
1393 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001394
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001395 asdl_seq_SET(values, i / 4, expression);
1396 }
1397 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 }
1399 case BACKQUOTE: { /* repr */
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001400 expr_ty expression;
Benjamin Petersoncbd78132008-06-08 15:45:23 +00001401 if (Py_Py3kWarningFlag &&
1402 !ast_warn(c, n, "backquote not supported in 3.x; use repr()"))
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001403 return NULL;
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001404 expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001405 if (!expression)
1406 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001407
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001408 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 }
1410 default:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001411 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 }
1414}
1415
1416static slice_ty
1417ast_for_slice(struct compiling *c, const node *n)
1418{
1419 node *ch;
1420 expr_ty lower = NULL, upper = NULL, step = NULL;
1421
1422 REQ(n, subscript);
1423
1424 /*
1425 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1426 sliceop: ':' [test]
1427 */
1428 ch = CHILD(n, 0);
1429 if (TYPE(ch) == DOT)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001430 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431
1432 if (NCH(n) == 1 && TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001433 /* 'step' variable hold no significance in terms of being used over
1434 other vars */
1435 step = ast_for_expr(c, ch);
1436 if (!step)
1437 return NULL;
1438
1439 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 }
1441
1442 if (TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001443 lower = ast_for_expr(c, ch);
1444 if (!lower)
1445 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 }
1447
1448 /* If there's an upper bound it's in the second or third position. */
1449 if (TYPE(ch) == COLON) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001450 if (NCH(n) > 1) {
1451 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001453 if (TYPE(n2) == test) {
1454 upper = ast_for_expr(c, n2);
1455 if (!upper)
1456 return NULL;
1457 }
1458 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 } else if (NCH(n) > 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001460 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001462 if (TYPE(n2) == test) {
1463 upper = ast_for_expr(c, n2);
1464 if (!upper)
1465 return NULL;
1466 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 }
1468
1469 ch = CHILD(n, NCH(n) - 1);
1470 if (TYPE(ch) == sliceop) {
Benjamin Peterson4afbba32009-06-13 01:40:00 +00001471 if (NCH(ch) != 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001472 ch = CHILD(ch, 1);
1473 if (TYPE(ch) == test) {
1474 step = ast_for_expr(c, ch);
1475 if (!step)
1476 return NULL;
1477 }
1478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 }
1480
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001481 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482}
1483
1484static expr_ty
1485ast_for_binop(struct compiling *c, const node *n)
1486{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001487 /* Must account for a sequence of expressions.
1488 How should A op B op C by represented?
1489 BinOp(BinOp(A, op, B), op, C).
1490 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001492 int i, nops;
1493 expr_ty expr1, expr2, result;
1494 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001496 expr1 = ast_for_expr(c, CHILD(n, 0));
1497 if (!expr1)
1498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001500 expr2 = ast_for_expr(c, CHILD(n, 2));
1501 if (!expr2)
1502 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001504 newoperator = get_operator(CHILD(n, 1));
1505 if (!newoperator)
1506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001508 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1509 c->c_arena);
1510 if (!result)
1511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001513 nops = (NCH(n) - 1) / 2;
1514 for (i = 1; i < nops; i++) {
1515 expr_ty tmp_result, tmp;
1516 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001518 newoperator = get_operator(next_oper);
1519 if (!newoperator)
1520 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001522 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1523 if (!tmp)
1524 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001526 tmp_result = BinOp(result, newoperator, tmp,
1527 LINENO(next_oper), next_oper->n_col_offset,
1528 c->c_arena);
Neal Norwitz3adac212007-10-05 03:41:19 +00001529 if (!tmp_result)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001530 return NULL;
1531 result = tmp_result;
1532 }
1533 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534}
1535
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001536static expr_ty
1537ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1538{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001539 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1540 subscriptlist: subscript (',' subscript)* [',']
1541 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1542 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001543 REQ(n, trailer);
1544 if (TYPE(CHILD(n, 0)) == LPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001545 if (NCH(n) == 2)
1546 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1547 n->n_col_offset, c->c_arena);
1548 else
1549 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001550 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001551 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001552 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1553 if (!attr_id)
1554 return NULL;
1555 return Attribute(left_expr, attr_id, Load,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001556 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001557 }
1558 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001559 REQ(CHILD(n, 0), LSQB);
1560 REQ(CHILD(n, 2), RSQB);
1561 n = CHILD(n, 1);
1562 if (NCH(n) == 1) {
1563 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1564 if (!slc)
1565 return NULL;
1566 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1567 c->c_arena);
1568 }
1569 else {
1570 /* The grammar is ambiguous here. The ambiguity is resolved
1571 by treating the sequence as a tuple literal if there are
1572 no slice features.
1573 */
1574 int j;
1575 slice_ty slc;
1576 expr_ty e;
1577 bool simple = true;
1578 asdl_seq *slices, *elts;
1579 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1580 if (!slices)
1581 return NULL;
1582 for (j = 0; j < NCH(n); j += 2) {
1583 slc = ast_for_slice(c, CHILD(n, j));
1584 if (!slc)
1585 return NULL;
1586 if (slc->kind != Index_kind)
1587 simple = false;
1588 asdl_seq_SET(slices, j / 2, slc);
1589 }
1590 if (!simple) {
1591 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1592 Load, LINENO(n), n->n_col_offset, c->c_arena);
1593 }
1594 /* extract Index values and put them in a Tuple */
1595 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1596 if (!elts)
1597 return NULL;
1598 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1599 slc = (slice_ty)asdl_seq_GET(slices, j);
1600 assert(slc->kind == Index_kind && slc->v.Index.value);
1601 asdl_seq_SET(elts, j, slc->v.Index.value);
1602 }
1603 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1604 if (!e)
1605 return NULL;
1606 return Subscript(left_expr, Index(e, c->c_arena),
1607 Load, LINENO(n), n->n_col_offset, c->c_arena);
1608 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001610}
1611
1612static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001613ast_for_factor(struct compiling *c, const node *n)
1614{
1615 node *pfactor, *ppower, *patom, *pnum;
1616 expr_ty expression;
1617
1618 /* If the unary - operator is applied to a constant, don't generate
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001619 a UNARY_NEGATIVE opcode. Just store the approriate value as a
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001620 constant. The peephole optimizer already does something like
1621 this but it doesn't handle the case where the constant is
1622 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1623 PyLongObject.
1624 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001625 if (TYPE(CHILD(n, 0)) == MINUS &&
1626 NCH(n) == 2 &&
1627 TYPE((pfactor = CHILD(n, 1))) == factor &&
1628 NCH(pfactor) == 1 &&
1629 TYPE((ppower = CHILD(pfactor, 0))) == power &&
1630 NCH(ppower) == 1 &&
1631 TYPE((patom = CHILD(ppower, 0))) == atom &&
1632 TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1633 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1634 if (s == NULL)
1635 return NULL;
1636 s[0] = '-';
1637 strcpy(s + 1, STR(pnum));
1638 PyObject_FREE(STR(pnum));
1639 STR(pnum) = s;
1640 return ast_for_atom(c, patom);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001641 }
1642
1643 expression = ast_for_expr(c, CHILD(n, 1));
1644 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001645 return NULL;
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001646
1647 switch (TYPE(CHILD(n, 0))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001648 case PLUS:
1649 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1650 c->c_arena);
1651 case MINUS:
1652 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1653 c->c_arena);
1654 case TILDE:
1655 return UnaryOp(Invert, expression, LINENO(n),
1656 n->n_col_offset, c->c_arena);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001657 }
1658 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001659 TYPE(CHILD(n, 0)));
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001660 return NULL;
1661}
1662
1663static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001664ast_for_power(struct compiling *c, const node *n)
1665{
1666 /* power: atom trailer* ('**' factor)*
1667 */
1668 int i;
1669 expr_ty e, tmp;
1670 REQ(n, power);
1671 e = ast_for_atom(c, CHILD(n, 0));
1672 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001673 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001674 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001675 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001676 for (i = 1; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001677 node *ch = CHILD(n, i);
1678 if (TYPE(ch) != trailer)
1679 break;
1680 tmp = ast_for_trailer(c, ch, e);
1681 if (!tmp)
1682 return NULL;
1683 tmp->lineno = e->lineno;
1684 tmp->col_offset = e->col_offset;
1685 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001686 }
1687 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001688 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1689 if (!f)
1690 return NULL;
1691 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1692 if (!tmp)
1693 return NULL;
1694 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001695 }
1696 return e;
1697}
1698
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699/* Do not name a variable 'expr'! Will cause a compile error.
1700*/
1701
1702static expr_ty
1703ast_for_expr(struct compiling *c, const node *n)
1704{
1705 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001706 test: or_test ['if' or_test 'else' test] | lambdef
1707 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 and_test: not_test ('and' not_test)*
1709 not_test: 'not' not_test | comparison
1710 comparison: expr (comp_op expr)*
1711 expr: xor_expr ('|' xor_expr)*
1712 xor_expr: and_expr ('^' and_expr)*
1713 and_expr: shift_expr ('&' shift_expr)*
1714 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1715 arith_expr: term (('+'|'-') term)*
1716 term: factor (('*'|'/'|'%'|'//') factor)*
1717 factor: ('+'|'-'|'~') factor | power
1718 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001719
1720 As well as modified versions that exist for backward compatibility,
1721 to explicitly allow:
1722 [ x for x in lambda: 0, lambda: 1 ]
1723 (which would be ambiguous without these extra rules)
1724
1725 old_test: or_test | old_lambdef
1726 old_lambdef: 'lambda' [vararglist] ':' old_test
1727
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 */
1729
1730 asdl_seq *seq;
1731 int i;
1732
1733 loop:
1734 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001735 case test:
1736 case old_test:
1737 if (TYPE(CHILD(n, 0)) == lambdef ||
1738 TYPE(CHILD(n, 0)) == old_lambdef)
1739 return ast_for_lambdef(c, CHILD(n, 0));
1740 else if (NCH(n) > 1)
1741 return ast_for_ifexpr(c, n);
1742 /* Fallthrough */
1743 case or_test:
1744 case and_test:
1745 if (NCH(n) == 1) {
1746 n = CHILD(n, 0);
1747 goto loop;
1748 }
1749 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1750 if (!seq)
1751 return NULL;
1752 for (i = 0; i < NCH(n); i += 2) {
1753 expr_ty e = ast_for_expr(c, CHILD(n, i));
1754 if (!e)
1755 return NULL;
1756 asdl_seq_SET(seq, i / 2, e);
1757 }
1758 if (!strcmp(STR(CHILD(n, 1)), "and"))
1759 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1760 c->c_arena);
1761 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1762 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1763 case not_test:
1764 if (NCH(n) == 1) {
1765 n = CHILD(n, 0);
1766 goto loop;
1767 }
1768 else {
1769 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1770 if (!expression)
1771 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001772
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001773 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1774 c->c_arena);
1775 }
1776 case comparison:
1777 if (NCH(n) == 1) {
1778 n = CHILD(n, 0);
1779 goto loop;
1780 }
1781 else {
1782 expr_ty expression;
1783 asdl_int_seq *ops;
1784 asdl_seq *cmps;
1785 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1786 if (!ops)
1787 return NULL;
1788 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1789 if (!cmps) {
1790 return NULL;
1791 }
1792 for (i = 1; i < NCH(n); i += 2) {
1793 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001795 newoperator = ast_for_comp_op(c, CHILD(n, i));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001796 if (!newoperator) {
1797 return NULL;
1798 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001800 expression = ast_for_expr(c, CHILD(n, i + 1));
1801 if (!expression) {
1802 return NULL;
1803 }
1804
1805 asdl_seq_SET(ops, i / 2, newoperator);
1806 asdl_seq_SET(cmps, i / 2, expression);
1807 }
1808 expression = ast_for_expr(c, CHILD(n, 0));
1809 if (!expression) {
1810 return NULL;
1811 }
1812
1813 return Compare(expression, ops, cmps, LINENO(n),
1814 n->n_col_offset, c->c_arena);
1815 }
1816 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001818 /* The next five cases all handle BinOps. The main body of code
1819 is the same in each case, but the switch turned inside out to
1820 reuse the code for each type of operator.
1821 */
1822 case expr:
1823 case xor_expr:
1824 case and_expr:
1825 case shift_expr:
1826 case arith_expr:
1827 case term:
1828 if (NCH(n) == 1) {
1829 n = CHILD(n, 0);
1830 goto loop;
1831 }
1832 return ast_for_binop(c, n);
1833 case yield_expr: {
1834 expr_ty exp = NULL;
1835 if (NCH(n) == 2) {
1836 exp = ast_for_testlist(c, CHILD(n, 1));
1837 if (!exp)
1838 return NULL;
1839 }
1840 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1841 }
1842 case factor:
1843 if (NCH(n) == 1) {
1844 n = CHILD(n, 0);
1845 goto loop;
1846 }
1847 return ast_for_factor(c, n);
1848 case power:
1849 return ast_for_power(c, n);
1850 default:
1851 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1852 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001854 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 return NULL;
1856}
1857
1858static expr_ty
1859ast_for_call(struct compiling *c, const node *n, expr_ty func)
1860{
1861 /*
1862 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001863 | '**' test)
1864 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 */
1866
1867 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001868 asdl_seq *args;
1869 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 expr_ty vararg = NULL, kwarg = NULL;
1871
1872 REQ(n, arglist);
1873
1874 nargs = 0;
1875 nkeywords = 0;
1876 ngens = 0;
1877 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001878 node *ch = CHILD(n, i);
1879 if (TYPE(ch) == argument) {
1880 if (NCH(ch) == 1)
1881 nargs++;
1882 else if (TYPE(CHILD(ch, 1)) == gen_for)
1883 ngens++;
1884 else
1885 nkeywords++;
1886 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 }
1888 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001889 ast_error(n, "Generator expression must be parenthesized "
1890 "if not sole argument");
1891 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 }
1893
1894 if (nargs + nkeywords + ngens > 255) {
1895 ast_error(n, "more than 255 arguments");
1896 return NULL;
1897 }
1898
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001899 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001901 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001902 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 if (!keywords)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001904 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 nargs = 0;
1906 nkeywords = 0;
1907 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001908 node *ch = CHILD(n, i);
1909 if (TYPE(ch) == argument) {
1910 expr_ty e;
1911 if (NCH(ch) == 1) {
1912 if (nkeywords) {
1913 ast_error(CHILD(ch, 0),
1914 "non-keyword arg after keyword arg");
1915 return NULL;
1916 }
Benjamin Peterson80f0ed52008-08-19 19:52:46 +00001917 if (vararg) {
1918 ast_error(CHILD(ch, 0),
1919 "only named arguments may follow *expression");
1920 return NULL;
1921 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001922 e = ast_for_expr(c, CHILD(ch, 0));
1923 if (!e)
1924 return NULL;
1925 asdl_seq_SET(args, nargs++, e);
1926 }
1927 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1928 e = ast_for_genexp(c, ch);
1929 if (!e)
1930 return NULL;
1931 asdl_seq_SET(args, nargs++, e);
1932 }
1933 else {
1934 keyword_ty kw;
1935 identifier key;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001936 int k;
1937 char *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001939 /* CHILD(ch, 0) is test, but must be an identifier? */
1940 e = ast_for_expr(c, CHILD(ch, 0));
1941 if (!e)
1942 return NULL;
1943 /* f(lambda x: x[0] = 3) ends up getting parsed with
1944 * LHS test = lambda x: x[0], and RHS test = 3.
1945 * SF bug 132313 points out that complaining about a keyword
1946 * then is very confusing.
1947 */
1948 if (e->kind == Lambda_kind) {
1949 ast_error(CHILD(ch, 0),
1950 "lambda cannot contain assignment");
1951 return NULL;
1952 } else if (e->kind != Name_kind) {
1953 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1954 return NULL;
1955 }
1956 key = e->v.Name.id;
Benjamin Petersond5efd202008-06-08 22:52:37 +00001957 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
Georg Brandle06cf452007-06-07 13:23:24 +00001958 return NULL;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001959 for (k = 0; k < nkeywords; k++) {
1960 tmp = PyString_AS_STRING(
1961 ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
1962 if (!strcmp(tmp, PyString_AS_STRING(key))) {
1963 ast_error(CHILD(ch, 0), "keyword argument repeated");
1964 return NULL;
1965 }
1966 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001967 e = ast_for_expr(c, CHILD(ch, 2));
1968 if (!e)
1969 return NULL;
1970 kw = keyword(key, e, c->c_arena);
1971 if (!kw)
1972 return NULL;
1973 asdl_seq_SET(keywords, nkeywords++, kw);
1974 }
1975 }
1976 else if (TYPE(ch) == STAR) {
1977 vararg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001978 if (!vararg)
1979 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001980 i++;
1981 }
1982 else if (TYPE(ch) == DOUBLESTAR) {
1983 kwarg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001984 if (!kwarg)
1985 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001986 i++;
1987 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 }
1989
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001990 return Call(func, args, keywords, vararg, kwarg, func->lineno,
1991 func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992}
1993
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001995ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001997 /* testlist_gexp: test (',' test)* [','] */
1998 /* testlist: test (',' test)* [','] */
1999 /* testlist_safe: test (',' test)+ [','] */
2000 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002002 if (TYPE(n) == testlist_gexp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002003 if (NCH(n) > 1)
2004 assert(TYPE(CHILD(n, 1)) != gen_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002005 }
2006 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002007 assert(TYPE(n) == testlist ||
2008 TYPE(n) == testlist_safe ||
2009 TYPE(n) == testlist1);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002010 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002012 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002014 asdl_seq *tmp = seq_for_testlist(c, n);
2015 if (!tmp)
2016 return NULL;
2017 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002019}
2020
2021static expr_ty
2022ast_for_testlist_gexp(struct compiling *c, const node* n)
2023{
2024 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2025 /* argument: test [ gen_for ] */
2026 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002027 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002028 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002029 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002030}
2031
2032/* like ast_for_testlist() but returns a sequence */
2033static asdl_seq*
2034ast_for_class_bases(struct compiling *c, const node* n)
2035{
2036 /* testlist: test (',' test)* [','] */
2037 assert(NCH(n) > 0);
2038 REQ(n, testlist);
2039 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002040 expr_ty base;
2041 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
2042 if (!bases)
2043 return NULL;
2044 base = ast_for_expr(c, CHILD(n, 0));
2045 if (!base)
2046 return NULL;
2047 asdl_seq_SET(bases, 0, base);
2048 return bases;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002049 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002050
2051 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052}
2053
2054static stmt_ty
2055ast_for_expr_stmt(struct compiling *c, const node *n)
2056{
2057 REQ(n, expr_stmt);
2058 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002059 | ('=' (yield_expr|testlist))*)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 testlist: test (',' test)* [',']
2061 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002062 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063 test: ... here starts the operator precendence dance
2064 */
2065
2066 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002067 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
2068 if (!e)
2069 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002071 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 }
2073 else if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002074 expr_ty expr1, expr2;
2075 operator_ty newoperator;
2076 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002078 expr1 = ast_for_testlist(c, ch);
2079 if (!expr1)
2080 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002081 if(!set_context(c, expr1, Store, ch))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002082 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002084 ch = CHILD(n, 2);
2085 if (TYPE(ch) == testlist)
2086 expr2 = ast_for_testlist(c, ch);
2087 else
2088 expr2 = ast_for_expr(c, ch);
2089 if (!expr2)
2090 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002092 newoperator = ast_for_augassign(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002093 if (!newoperator)
2094 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002096 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2097 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 }
2099 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002100 int i;
2101 asdl_seq *targets;
2102 node *value;
2103 expr_ty expression;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002105 /* a normal assignment */
2106 REQ(CHILD(n, 1), EQUAL);
2107 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2108 if (!targets)
2109 return NULL;
2110 for (i = 0; i < NCH(n) - 2; i += 2) {
2111 expr_ty e;
2112 node *ch = CHILD(n, i);
Benjamin Petersonb2664812009-06-11 17:49:38 +00002113 if (TYPE(ch) == yield_expr) {
2114 ast_error(ch, "assignment to yield expression not possible");
2115 return NULL;
2116 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002117 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002119 /* set context to assign */
2120 if (!e)
2121 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002123 if (!set_context(c, e, Store, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002124 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002126 asdl_seq_SET(targets, i / 2, e);
2127 }
2128 value = CHILD(n, NCH(n) - 1);
2129 if (TYPE(value) == testlist)
2130 expression = ast_for_testlist(c, value);
2131 else
2132 expression = ast_for_expr(c, value);
2133 if (!expression)
2134 return NULL;
2135 return Assign(targets, expression, LINENO(n), n->n_col_offset,
2136 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138}
2139
2140static stmt_ty
2141ast_for_print_stmt(struct compiling *c, const node *n)
2142{
2143 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002144 | '>>' test [ (',' test)+ [','] ] )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 */
2146 expr_ty dest = NULL, expression;
2147 asdl_seq *seq;
2148 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002149 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150
2151 REQ(n, print_stmt);
2152 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002153 dest = ast_for_expr(c, CHILD(n, 2));
2154 if (!dest)
2155 return NULL;
2156 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002158 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002160 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002161 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002162 expression = ast_for_expr(c, CHILD(n, i));
2163 if (!expression)
2164 return NULL;
2165 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166 }
2167 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002168 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169}
2170
2171static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002172ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173{
2174 asdl_seq *seq;
2175 int i;
2176 expr_ty e;
2177
2178 REQ(n, exprlist);
2179
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002180 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002182 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002184 e = ast_for_expr(c, CHILD(n, i));
2185 if (!e)
2186 return NULL;
2187 asdl_seq_SET(seq, i / 2, e);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002188 if (context && !set_context(c, e, context, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002189 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 }
2191 return seq;
2192}
2193
2194static stmt_ty
2195ast_for_del_stmt(struct compiling *c, const node *n)
2196{
2197 asdl_seq *expr_list;
2198
2199 /* del_stmt: 'del' exprlist */
2200 REQ(n, del_stmt);
2201
2202 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2203 if (!expr_list)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002204 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002205 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206}
2207
2208static stmt_ty
2209ast_for_flow_stmt(struct compiling *c, const node *n)
2210{
2211 /*
2212 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002213 | yield_stmt
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214 break_stmt: 'break'
2215 continue_stmt: 'continue'
2216 return_stmt: 'return' [testlist]
2217 yield_stmt: yield_expr
2218 yield_expr: 'yield' testlist
2219 raise_stmt: 'raise' [test [',' test [',' test]]]
2220 */
2221 node *ch;
2222
2223 REQ(n, flow_stmt);
2224 ch = CHILD(n, 0);
2225 switch (TYPE(ch)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002226 case break_stmt:
2227 return Break(LINENO(n), n->n_col_offset, c->c_arena);
2228 case continue_stmt:
2229 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2230 case yield_stmt: { /* will reduce to yield_expr */
2231 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2232 if (!exp)
2233 return NULL;
2234 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2235 }
2236 case return_stmt:
2237 if (NCH(ch) == 1)
2238 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2239 else {
2240 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2241 if (!expression)
2242 return NULL;
2243 return Return(expression, LINENO(n), n->n_col_offset,
2244 c->c_arena);
2245 }
2246 case raise_stmt:
2247 if (NCH(ch) == 1)
2248 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2249 c->c_arena);
2250 else if (NCH(ch) == 2) {
2251 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2252 if (!expression)
2253 return NULL;
2254 return Raise(expression, NULL, NULL, LINENO(n),
2255 n->n_col_offset, c->c_arena);
2256 }
2257 else if (NCH(ch) == 4) {
2258 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002260 expr1 = ast_for_expr(c, CHILD(ch, 1));
2261 if (!expr1)
2262 return NULL;
2263 expr2 = ast_for_expr(c, CHILD(ch, 3));
2264 if (!expr2)
2265 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002267 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2268 c->c_arena);
2269 }
2270 else if (NCH(ch) == 6) {
2271 expr_ty expr1, expr2, expr3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002273 expr1 = ast_for_expr(c, CHILD(ch, 1));
2274 if (!expr1)
2275 return NULL;
2276 expr2 = ast_for_expr(c, CHILD(ch, 3));
2277 if (!expr2)
2278 return NULL;
2279 expr3 = ast_for_expr(c, CHILD(ch, 5));
2280 if (!expr3)
2281 return NULL;
2282
2283 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2284 c->c_arena);
2285 }
2286 default:
2287 PyErr_Format(PyExc_SystemError,
2288 "unexpected flow_stmt: %d", TYPE(ch));
2289 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002291
2292 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2293 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294}
2295
2296static alias_ty
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002297alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298{
2299 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002300 import_as_name: NAME ['as' NAME]
2301 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302 dotted_name: NAME ('.' NAME)*
2303 */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002304 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002305
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 loop:
2307 switch (TYPE(n)) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002308 case import_as_name: {
2309 node *name_node = CHILD(n, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002310 str = NULL;
2311 if (NCH(n) == 3) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002312 node *str_node = CHILD(n, 2);
2313 if (store && !forbidden_check(c, str_node, STR(str_node)))
2314 return NULL;
2315 str = NEW_IDENTIFIER(str_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002316 if (!str)
2317 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002318 }
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002319 if (!forbidden_check(c, name_node, STR(name_node)))
2320 return NULL;
2321 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002322 if (!name)
2323 return NULL;
2324 return alias(name, str, c->c_arena);
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002325 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002326 case dotted_as_name:
2327 if (NCH(n) == 1) {
2328 n = CHILD(n, 0);
2329 goto loop;
2330 }
2331 else {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002332 node *asname_node = CHILD(n, 2);
2333 alias_ty a = alias_for_import_name(c, CHILD(n, 0), store);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002334 if (!a)
2335 return NULL;
2336 assert(!a->asname);
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002337 if (store && !forbidden_check(c, asname_node, STR(asname_node)))
2338 return NULL;
2339 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002340 if (!a->asname)
2341 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002342 return a;
2343 }
2344 break;
2345 case dotted_name:
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002346 if (NCH(n) == 1) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002347 node *name_node = CHILD(n, 0);
2348 if (store && !forbidden_check(c, name_node, STR(name_node)))
2349 return NULL;
2350 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002351 if (!name)
2352 return NULL;
2353 return alias(name, NULL, c->c_arena);
2354 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002355 else {
2356 /* Create a string of the form "a.b.c" */
2357 int i;
2358 size_t len;
2359 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002360
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002361 len = 0;
2362 for (i = 0; i < NCH(n); i += 2)
2363 /* length of string plus one for the dot */
2364 len += strlen(STR(CHILD(n, i))) + 1;
2365 len--; /* the last name doesn't have a dot */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002366 str = PyString_FromStringAndSize(NULL, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002367 if (!str)
2368 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002369 s = PyString_AS_STRING(str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002370 if (!s)
2371 return NULL;
2372 for (i = 0; i < NCH(n); i += 2) {
2373 char *sch = STR(CHILD(n, i));
2374 strcpy(s, STR(CHILD(n, i)));
2375 s += strlen(sch);
2376 *s++ = '.';
2377 }
2378 --s;
2379 *s = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002380 PyString_InternInPlace(&str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002381 PyArena_AddPyObject(c->c_arena, str);
2382 return alias(str, NULL, c->c_arena);
2383 }
2384 break;
2385 case STAR:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002386 str = PyString_InternFromString("*");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002387 PyArena_AddPyObject(c->c_arena, str);
2388 return alias(str, NULL, c->c_arena);
2389 default:
2390 PyErr_Format(PyExc_SystemError,
2391 "unexpected import name: %d", TYPE(n));
2392 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002394
2395 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 return NULL;
2397}
2398
2399static stmt_ty
2400ast_for_import_stmt(struct compiling *c, const node *n)
2401{
2402 /*
2403 import_stmt: import_name | import_from
2404 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002405 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002406 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002408 int lineno;
2409 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 int i;
2411 asdl_seq *aliases;
2412
2413 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002414 lineno = LINENO(n);
2415 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002417 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002418 n = CHILD(n, 1);
2419 REQ(n, dotted_as_names);
2420 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2421 if (!aliases)
2422 return NULL;
2423 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002424 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002425 if (!import_alias)
2426 return NULL;
2427 asdl_seq_SET(aliases, i / 2, import_alias);
2428 }
2429 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002431 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002432 int n_children;
2433 int idx, ndots = 0;
2434 alias_ty mod = NULL;
2435 identifier modname;
2436
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002437 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002438 optional module name */
2439 for (idx = 1; idx < NCH(n); idx++) {
2440 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002441 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2442 if (!mod)
2443 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002444 idx++;
2445 break;
2446 } else if (TYPE(CHILD(n, idx)) != DOT) {
2447 break;
2448 }
2449 ndots++;
2450 }
2451 idx++; /* skip over the 'import' keyword */
2452 switch (TYPE(CHILD(n, idx))) {
2453 case STAR:
2454 /* from ... import * */
2455 n = CHILD(n, idx);
2456 n_children = 1;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002457 break;
2458 case LPAR:
2459 /* from ... import (x, y, z) */
2460 n = CHILD(n, idx + 1);
2461 n_children = NCH(n);
2462 break;
2463 case import_as_names:
2464 /* from ... import x, y, z */
2465 n = CHILD(n, idx);
2466 n_children = NCH(n);
2467 if (n_children % 2 == 0) {
2468 ast_error(n, "trailing comma not allowed without"
2469 " surrounding parentheses");
2470 return NULL;
2471 }
2472 break;
2473 default:
2474 ast_error(n, "Unexpected node-type in from-import");
2475 return NULL;
2476 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002478 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2479 if (!aliases)
2480 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002482 /* handle "from ... import *" special b/c there's no children */
2483 if (TYPE(n) == STAR) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002484 alias_ty import_alias = alias_for_import_name(c, n, 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002485 if (!import_alias)
2486 return NULL;
2487 asdl_seq_SET(aliases, 0, import_alias);
2488 }
2489 else {
2490 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002491 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002492 if (!import_alias)
2493 return NULL;
2494 asdl_seq_SET(aliases, i / 2, import_alias);
2495 }
2496 }
2497 if (mod != NULL)
2498 modname = mod->name;
2499 else
2500 modname = new_identifier("", c->c_arena);
2501 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2502 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 }
Neal Norwitz79792652005-11-14 04:25:03 +00002504 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002505 "unknown import statement: starts with command '%s'",
2506 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 return NULL;
2508}
2509
2510static stmt_ty
2511ast_for_global_stmt(struct compiling *c, const node *n)
2512{
2513 /* global_stmt: 'global' NAME (',' NAME)* */
2514 identifier name;
2515 asdl_seq *s;
2516 int i;
2517
2518 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002519 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002520 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002521 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002523 name = NEW_IDENTIFIER(CHILD(n, i));
2524 if (!name)
2525 return NULL;
2526 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002528 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529}
2530
2531static stmt_ty
2532ast_for_exec_stmt(struct compiling *c, const node *n)
2533{
2534 expr_ty expr1, globals = NULL, locals = NULL;
2535 int n_children = NCH(n);
2536 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002537 PyErr_Format(PyExc_SystemError,
2538 "poorly formed 'exec' statement: %d parts to statement",
2539 n_children);
2540 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 }
2542
2543 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2544 REQ(n, exec_stmt);
2545 expr1 = ast_for_expr(c, CHILD(n, 1));
2546 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002547 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002549 globals = ast_for_expr(c, CHILD(n, 3));
2550 if (!globals)
2551 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 }
2553 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002554 locals = ast_for_expr(c, CHILD(n, 5));
2555 if (!locals)
2556 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 }
2558
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002559 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2560 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561}
2562
2563static stmt_ty
2564ast_for_assert_stmt(struct compiling *c, const node *n)
2565{
2566 /* assert_stmt: 'assert' test [',' test] */
2567 REQ(n, assert_stmt);
2568 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002569 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2570 if (!expression)
2571 return NULL;
2572 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2573 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 }
2575 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002576 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002578 expr1 = ast_for_expr(c, CHILD(n, 1));
2579 if (!expr1)
2580 return NULL;
2581 expr2 = ast_for_expr(c, CHILD(n, 3));
2582 if (!expr2)
2583 return NULL;
2584
2585 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 }
Neal Norwitz79792652005-11-14 04:25:03 +00002587 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002588 "improper number of parts to 'assert' statement: %d",
2589 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 return NULL;
2591}
2592
2593static asdl_seq *
2594ast_for_suite(struct compiling *c, const node *n)
2595{
2596 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002597 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 stmt_ty s;
2599 int i, total, num, end, pos = 0;
2600 node *ch;
2601
2602 REQ(n, suite);
2603
2604 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002605 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002609 n = CHILD(n, 0);
2610 /* simple_stmt always ends with a NEWLINE,
2611 and may have a trailing SEMI
2612 */
2613 end = NCH(n) - 1;
2614 if (TYPE(CHILD(n, end - 1)) == SEMI)
2615 end--;
2616 /* loop by 2 to skip semi-colons */
2617 for (i = 0; i < end; i += 2) {
2618 ch = CHILD(n, i);
2619 s = ast_for_stmt(c, ch);
2620 if (!s)
2621 return NULL;
2622 asdl_seq_SET(seq, pos++, s);
2623 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 }
2625 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002626 for (i = 2; i < (NCH(n) - 1); i++) {
2627 ch = CHILD(n, i);
2628 REQ(ch, stmt);
2629 num = num_stmts(ch);
2630 if (num == 1) {
2631 /* small_stmt or compound_stmt with only one child */
2632 s = ast_for_stmt(c, ch);
2633 if (!s)
2634 return NULL;
2635 asdl_seq_SET(seq, pos++, s);
2636 }
2637 else {
2638 int j;
2639 ch = CHILD(ch, 0);
2640 REQ(ch, simple_stmt);
2641 for (j = 0; j < NCH(ch); j += 2) {
2642 /* statement terminates with a semi-colon ';' */
2643 if (NCH(CHILD(ch, j)) == 0) {
2644 assert((j + 1) == NCH(ch));
2645 break;
2646 }
2647 s = ast_for_stmt(c, CHILD(ch, j));
2648 if (!s)
2649 return NULL;
2650 asdl_seq_SET(seq, pos++, s);
2651 }
2652 }
2653 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 }
2655 assert(pos == seq->size);
2656 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657}
2658
2659static stmt_ty
2660ast_for_if_stmt(struct compiling *c, const node *n)
2661{
2662 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2663 ['else' ':' suite]
2664 */
2665 char *s;
2666
2667 REQ(n, if_stmt);
2668
2669 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002670 expr_ty expression;
2671 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002673 expression = ast_for_expr(c, CHILD(n, 1));
2674 if (!expression)
2675 return NULL;
2676 suite_seq = ast_for_suite(c, CHILD(n, 3));
2677 if (!suite_seq)
2678 return NULL;
2679
2680 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2681 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002683
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 s = STR(CHILD(n, 4));
2685 /* s[2], the third character in the string, will be
2686 's' for el_s_e, or
2687 'i' for el_i_f
2688 */
2689 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002690 expr_ty expression;
2691 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002693 expression = ast_for_expr(c, CHILD(n, 1));
2694 if (!expression)
2695 return NULL;
2696 seq1 = ast_for_suite(c, CHILD(n, 3));
2697 if (!seq1)
2698 return NULL;
2699 seq2 = ast_for_suite(c, CHILD(n, 6));
2700 if (!seq2)
2701 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002703 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2704 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 }
2706 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002707 int i, n_elif, has_else = 0;
2708 expr_ty expression;
2709 asdl_seq *suite_seq;
2710 asdl_seq *orelse = NULL;
2711 n_elif = NCH(n) - 4;
2712 /* must reference the child n_elif+1 since 'else' token is third,
2713 not fourth, child from the end. */
2714 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2715 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2716 has_else = 1;
2717 n_elif -= 3;
2718 }
2719 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002721 if (has_else) {
2722 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002724 orelse = asdl_seq_new(1, c->c_arena);
2725 if (!orelse)
2726 return NULL;
2727 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2728 if (!expression)
2729 return NULL;
2730 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2731 if (!suite_seq)
2732 return NULL;
2733 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2734 if (!suite_seq2)
2735 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002737 asdl_seq_SET(orelse, 0,
2738 If(expression, suite_seq, suite_seq2,
2739 LINENO(CHILD(n, NCH(n) - 6)),
2740 CHILD(n, NCH(n) - 6)->n_col_offset,
2741 c->c_arena));
2742 /* the just-created orelse handled the last elif */
2743 n_elif--;
2744 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002746 for (i = 0; i < n_elif; i++) {
2747 int off = 5 + (n_elif - i - 1) * 4;
2748 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2749 if (!newobj)
2750 return NULL;
2751 expression = ast_for_expr(c, CHILD(n, off));
2752 if (!expression)
2753 return NULL;
2754 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2755 if (!suite_seq)
2756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002758 asdl_seq_SET(newobj, 0,
2759 If(expression, suite_seq, orelse,
2760 LINENO(CHILD(n, off)),
2761 CHILD(n, off)->n_col_offset, c->c_arena));
2762 orelse = newobj;
2763 }
2764 expression = ast_for_expr(c, CHILD(n, 1));
2765 if (!expression)
2766 return NULL;
2767 suite_seq = ast_for_suite(c, CHILD(n, 3));
2768 if (!suite_seq)
2769 return NULL;
2770 return If(expression, suite_seq, orelse,
2771 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002773
2774 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002775 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777}
2778
2779static stmt_ty
2780ast_for_while_stmt(struct compiling *c, const node *n)
2781{
2782 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2783 REQ(n, while_stmt);
2784
2785 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002786 expr_ty expression;
2787 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002788
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002789 expression = ast_for_expr(c, CHILD(n, 1));
2790 if (!expression)
2791 return NULL;
2792 suite_seq = ast_for_suite(c, CHILD(n, 3));
2793 if (!suite_seq)
2794 return NULL;
2795 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2796 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 }
2798 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002799 expr_ty expression;
2800 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002802 expression = ast_for_expr(c, CHILD(n, 1));
2803 if (!expression)
2804 return NULL;
2805 seq1 = ast_for_suite(c, CHILD(n, 3));
2806 if (!seq1)
2807 return NULL;
2808 seq2 = ast_for_suite(c, CHILD(n, 6));
2809 if (!seq2)
2810 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002812 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2813 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002814 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002815
2816 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002817 "wrong number of tokens for 'while' statement: %d",
2818 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002819 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820}
2821
2822static stmt_ty
2823ast_for_for_stmt(struct compiling *c, const node *n)
2824{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002825 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 expr_ty expression;
2827 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002828 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2830 REQ(n, for_stmt);
2831
2832 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002833 seq = ast_for_suite(c, CHILD(n, 8));
2834 if (!seq)
2835 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 }
2837
Neal Norwitzedef2be2006-07-12 05:26:17 +00002838 node_target = CHILD(n, 1);
2839 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002840 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002841 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002842 /* Check the # of children rather than the length of _target, since
2843 for x, in ... has 1 element in _target, but still requires a Tuple. */
2844 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002845 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002847 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002849 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002850 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002851 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002852 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002853 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002854 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002856 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002857 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858}
2859
2860static excepthandler_ty
2861ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2862{
Collin Winter62903052007-05-18 23:11:24 +00002863 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 REQ(exc, except_clause);
2865 REQ(body, suite);
2866
2867 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002868 asdl_seq *suite_seq = ast_for_suite(c, body);
2869 if (!suite_seq)
2870 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871
Georg Brandla48f3ab2008-03-30 06:40:17 +00002872 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002873 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 }
2875 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002876 expr_ty expression;
2877 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002879 expression = ast_for_expr(c, CHILD(exc, 1));
2880 if (!expression)
2881 return NULL;
2882 suite_seq = ast_for_suite(c, body);
2883 if (!suite_seq)
2884 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885
Georg Brandla48f3ab2008-03-30 06:40:17 +00002886 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002887 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 }
2889 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002890 asdl_seq *suite_seq;
2891 expr_ty expression;
2892 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2893 if (!e)
2894 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002895 if (!set_context(c, e, Store, CHILD(exc, 3)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002896 return NULL;
2897 expression = ast_for_expr(c, CHILD(exc, 1));
2898 if (!expression)
2899 return NULL;
2900 suite_seq = ast_for_suite(c, body);
2901 if (!suite_seq)
2902 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903
Georg Brandla48f3ab2008-03-30 06:40:17 +00002904 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002905 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002907
2908 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002909 "wrong number of children for 'except' clause: %d",
2910 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002911 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912}
2913
2914static stmt_ty
2915ast_for_try_stmt(struct compiling *c, const node *n)
2916{
Neal Norwitzf599f422005-12-17 21:33:47 +00002917 const int nch = NCH(n);
2918 int n_except = (nch - 3)/3;
2919 asdl_seq *body, *orelse = NULL, *finally = NULL;
2920
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 REQ(n, try_stmt);
2922
Neal Norwitzf599f422005-12-17 21:33:47 +00002923 body = ast_for_suite(c, CHILD(n, 2));
2924 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002925 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926
Neal Norwitzf599f422005-12-17 21:33:47 +00002927 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002928 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2929 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2930 /* we can assume it's an "else",
2931 because nch >= 9 for try-else-finally and
2932 it would otherwise have a type of except_clause */
2933 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2934 if (orelse == NULL)
2935 return NULL;
2936 n_except--;
2937 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002939 finally = ast_for_suite(c, CHILD(n, nch - 1));
2940 if (finally == NULL)
2941 return NULL;
2942 n_except--;
2943 }
2944 else {
2945 /* we can assume it's an "else",
2946 otherwise it would have a type of except_clause */
2947 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2948 if (orelse == NULL)
2949 return NULL;
2950 n_except--;
2951 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002953 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002954 ast_error(n, "malformed 'try' statement");
2955 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002957
2958 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002959 int i;
2960 stmt_ty except_st;
2961 /* process except statements to create a try ... except */
2962 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2963 if (handlers == NULL)
2964 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002965
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002966 for (i = 0; i < n_except; i++) {
2967 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2968 CHILD(n, 5 + i * 3));
2969 if (!e)
2970 return NULL;
2971 asdl_seq_SET(handlers, i, e);
2972 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002973
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002974 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2975 n->n_col_offset, c->c_arena);
2976 if (!finally)
2977 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002978
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002979 /* if a 'finally' is present too, we nest the TryExcept within a
2980 TryFinally to emulate try ... except ... finally */
2981 body = asdl_seq_new(1, c->c_arena);
2982 if (body == NULL)
2983 return NULL;
2984 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002985 }
2986
2987 /* must be a try ... finally (except clauses are in body, if any exist) */
2988 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002989 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990}
2991
Georg Brandl944f6842009-05-25 21:02:56 +00002992/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002993static stmt_ty
Georg Brandl944f6842009-05-25 21:02:56 +00002994ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002995{
2996 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002997
Georg Brandl944f6842009-05-25 21:02:56 +00002998 REQ(n, with_item);
2999 context_expr = ast_for_expr(c, CHILD(n, 0));
Collin Winter77c67bd2007-03-16 04:11:30 +00003000 if (!context_expr)
3001 return NULL;
Georg Brandl944f6842009-05-25 21:02:56 +00003002 if (NCH(n) == 3) {
3003 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003004
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003005 if (!optional_vars) {
3006 return NULL;
3007 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003008 if (!set_context(c, optional_vars, Store, n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003009 return NULL;
3010 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003011 }
3012
Georg Brandl944f6842009-05-25 21:02:56 +00003013 return With(context_expr, optional_vars, content, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003014 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003015}
3016
Georg Brandl944f6842009-05-25 21:02:56 +00003017/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3018static stmt_ty
3019ast_for_with_stmt(struct compiling *c, const node *n)
3020{
3021 int i;
3022 stmt_ty ret;
3023 asdl_seq *inner;
3024
3025 REQ(n, with_stmt);
3026
3027 /* process the with items inside-out */
3028 i = NCH(n) - 1;
3029 /* the suite of the innermost with item is the suite of the with stmt */
3030 inner = ast_for_suite(c, CHILD(n, i));
3031 if (!inner)
3032 return NULL;
3033
3034 for (;;) {
3035 i -= 2;
3036 ret = ast_for_with_item(c, CHILD(n, i), inner);
3037 if (!ret)
3038 return NULL;
3039 /* was this the last item? */
3040 if (i == 1)
3041 break;
3042 /* if not, wrap the result so far in a new sequence */
3043 inner = asdl_seq_new(1, c->c_arena);
3044 if (!inner)
3045 return NULL;
3046 asdl_seq_SET(inner, 0, ret);
3047 }
3048
3049 return ret;
3050}
3051
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +00003053ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054{
3055 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003056 PyObject *classname;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 asdl_seq *bases, *s;
3058
3059 REQ(n, classdef);
3060
Benjamin Petersond5efd202008-06-08 22:52:37 +00003061 if (!forbidden_check(c, n, STR(CHILD(n, 1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003062 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063
3064 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003065 s = ast_for_suite(c, CHILD(n, 3));
3066 if (!s)
3067 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003068 classname = NEW_IDENTIFIER(CHILD(n, 1));
3069 if (!classname)
3070 return NULL;
3071 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3072 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 }
3074 /* check for empty base list */
3075 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003076 s = ast_for_suite(c, CHILD(n,5));
3077 if (!s)
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003078 return NULL;
3079 classname = NEW_IDENTIFIER(CHILD(n, 1));
3080 if (!classname)
3081 return NULL;
3082 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3083 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 }
3085
3086 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003087 bases = ast_for_class_bases(c, CHILD(n, 3));
3088 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003089 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090
3091 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003092 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003093 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003094 classname = NEW_IDENTIFIER(CHILD(n, 1));
3095 if (!classname)
3096 return NULL;
3097 return ClassDef(classname, bases, s, decorator_seq,
Christian Heimes5224d282008-02-23 15:01:05 +00003098 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099}
3100
3101static stmt_ty
3102ast_for_stmt(struct compiling *c, const node *n)
3103{
3104 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003105 assert(NCH(n) == 1);
3106 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 }
3108 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003109 assert(num_stmts(n) == 1);
3110 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111 }
3112 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003113 n = CHILD(n, 0);
3114 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3115 | flow_stmt | import_stmt | global_stmt | exec_stmt
3116 | assert_stmt
3117 */
3118 switch (TYPE(n)) {
3119 case expr_stmt:
3120 return ast_for_expr_stmt(c, n);
3121 case print_stmt:
3122 return ast_for_print_stmt(c, n);
3123 case del_stmt:
3124 return ast_for_del_stmt(c, n);
3125 case pass_stmt:
3126 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3127 case flow_stmt:
3128 return ast_for_flow_stmt(c, n);
3129 case import_stmt:
3130 return ast_for_import_stmt(c, n);
3131 case global_stmt:
3132 return ast_for_global_stmt(c, n);
3133 case exec_stmt:
3134 return ast_for_exec_stmt(c, n);
3135 case assert_stmt:
3136 return ast_for_assert_stmt(c, n);
3137 default:
3138 PyErr_Format(PyExc_SystemError,
3139 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3140 TYPE(n), NCH(n));
3141 return NULL;
3142 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003143 }
3144 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003145 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Christian Heimes5224d282008-02-23 15:01:05 +00003146 | funcdef | classdef | decorated
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003147 */
3148 node *ch = CHILD(n, 0);
3149 REQ(n, compound_stmt);
3150 switch (TYPE(ch)) {
3151 case if_stmt:
3152 return ast_for_if_stmt(c, ch);
3153 case while_stmt:
3154 return ast_for_while_stmt(c, ch);
3155 case for_stmt:
3156 return ast_for_for_stmt(c, ch);
3157 case try_stmt:
3158 return ast_for_try_stmt(c, ch);
3159 case with_stmt:
3160 return ast_for_with_stmt(c, ch);
3161 case funcdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003162 return ast_for_funcdef(c, ch, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003163 case classdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003164 return ast_for_classdef(c, ch, NULL);
3165 case decorated:
3166 return ast_for_decorated(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003167 default:
3168 PyErr_Format(PyExc_SystemError,
3169 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3170 TYPE(n), NCH(n));
3171 return NULL;
3172 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173 }
3174}
3175
3176static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003177parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003179 const char *end;
3180 long x;
3181 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182#ifndef WITHOUT_COMPLEX
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003183 Py_complex complex;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003184 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185#endif
3186
Mark Dickinson422ce062008-12-05 17:59:46 +00003187 assert(s != NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003188 errno = 0;
3189 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003191 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003193 if (*end == 'l' || *end == 'L')
3194 return PyLong_FromString((char *)s, (char **)0, 0);
Mark Dickinson64b7e502008-07-16 09:40:03 +00003195 x = PyOS_strtol((char *)s, (char **)&end, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003196 if (*end == '\0') {
3197 if (errno != 0)
3198 return PyLong_FromString((char *)s, (char **)0, 0);
3199 return PyInt_FromLong(x);
3200 }
3201 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003203 if (imflag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003204 complex.real = 0.;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003205 PyFPE_START_PROTECT("atof", return 0)
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003206 complex.imag = PyOS_ascii_atof(s);
3207 PyFPE_END_PROTECT(complex)
3208 return PyComplex_FromCComplex(complex);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003209 }
3210 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003212 {
3213 PyFPE_START_PROTECT("atof", return 0)
3214 dx = PyOS_ascii_atof(s);
3215 PyFPE_END_PROTECT(dx)
3216 return PyFloat_FromDouble(dx);
3217 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218}
3219
3220static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003221decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222{
3223#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003224 Py_FatalError("decode_utf8 should not be called in this build.");
3225 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003227 PyObject *u, *v;
3228 char *s, *t;
3229 t = s = (char *)*sPtr;
3230 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3231 while (s < end && (*s & 0x80)) s++;
3232 *sPtr = s;
3233 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3234 if (u == NULL)
3235 return NULL;
3236 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3237 Py_DECREF(u);
3238 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003239#endif
3240}
3241
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003242#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003244decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003246 PyObject *v, *u;
3247 char *buf;
3248 char *p;
3249 const char *end;
3250 if (encoding == NULL) {
3251 buf = (char *)s;
3252 u = NULL;
3253 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3254 buf = (char *)s;
3255 u = NULL;
3256 } else {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003257 /* check for integer overflow */
3258 if (len > PY_SIZE_MAX / 4)
3259 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003260 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003261 u = PyString_FromStringAndSize((char *)NULL, len * 4);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003262 if (u == NULL)
3263 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003264 p = buf = PyString_AsString(u);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003265 end = s + len;
3266 while (s < end) {
3267 if (*s == '\\') {
3268 *p++ = *s++;
3269 if (*s & 0x80) {
3270 strcpy(p, "u005c");
3271 p += 5;
3272 }
3273 }
3274 if (*s & 0x80) { /* XXX inefficient */
3275 PyObject *w;
3276 char *r;
3277 Py_ssize_t rn, i;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003278 w = decode_utf8(c, &s, end, "utf-16-be");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003279 if (w == NULL) {
3280 Py_DECREF(u);
3281 return NULL;
3282 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003283 r = PyString_AsString(w);
3284 rn = PyString_Size(w);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003285 assert(rn % 2 == 0);
3286 for (i = 0; i < rn; i += 2) {
3287 sprintf(p, "\\u%02x%02x",
3288 r[i + 0] & 0xFF,
3289 r[i + 1] & 0xFF);
3290 p += 6;
3291 }
3292 Py_DECREF(w);
3293 } else {
3294 *p++ = *s++;
3295 }
3296 }
3297 len = p - buf;
3298 s = buf;
3299 }
3300 if (rawmode)
3301 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3302 else
3303 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3304 Py_XDECREF(u);
3305 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003307#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308
3309/* s is a Python string literal, including the bracketing quote characters,
3310 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3311 * parsestr parses it, and returns the decoded Python string object.
3312 */
3313static PyObject *
Christian Heimes3c608332008-03-26 22:01:37 +00003314parsestr(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003316 size_t len;
3317 int quote = Py_CHARMASK(*s);
3318 int rawmode = 0;
3319 int need_encoding;
Christian Heimes3c608332008-03-26 22:01:37 +00003320 int unicode = c->c_future_unicode;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003322 if (isalpha(quote) || quote == '_') {
3323 if (quote == 'u' || quote == 'U') {
3324 quote = *++s;
3325 unicode = 1;
3326 }
Christian Heimes288e89a2008-01-18 18:24:07 +00003327 if (quote == 'b' || quote == 'B') {
3328 quote = *++s;
Christian Heimes3c608332008-03-26 22:01:37 +00003329 unicode = 0;
Christian Heimes288e89a2008-01-18 18:24:07 +00003330 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003331 if (quote == 'r' || quote == 'R') {
3332 quote = *++s;
3333 rawmode = 1;
3334 }
3335 }
3336 if (quote != '\'' && quote != '\"') {
3337 PyErr_BadInternalCall();
3338 return NULL;
3339 }
3340 s++;
3341 len = strlen(s);
3342 if (len > INT_MAX) {
3343 PyErr_SetString(PyExc_OverflowError,
3344 "string to parse is too long");
3345 return NULL;
3346 }
3347 if (s[--len] != quote) {
3348 PyErr_BadInternalCall();
3349 return NULL;
3350 }
3351 if (len >= 4 && s[0] == quote && s[1] == quote) {
3352 s += 2;
3353 len -= 2;
3354 if (s[--len] != quote || s[--len] != quote) {
3355 PyErr_BadInternalCall();
3356 return NULL;
3357 }
3358 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003360 if (unicode || Py_UnicodeFlag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003361 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003362 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363#endif
Christian Heimes3c608332008-03-26 22:01:37 +00003364 need_encoding = (c->c_encoding != NULL &&
3365 strcmp(c->c_encoding, "utf-8") != 0 &&
3366 strcmp(c->c_encoding, "iso-8859-1") != 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003367 if (rawmode || strchr(s, '\\') == NULL) {
3368 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003370 /* This should not happen - we never see any other
3371 encoding. */
3372 Py_FatalError(
3373 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003375 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3376 if (u == NULL)
3377 return NULL;
Christian Heimes3c608332008-03-26 22:01:37 +00003378 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003379 Py_DECREF(u);
3380 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003382 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003383 return PyString_FromStringAndSize(s, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003384 }
3385 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003387 return PyString_DecodeEscape(s, len, NULL, unicode,
Christian Heimes3c608332008-03-26 22:01:37 +00003388 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389}
3390
3391/* Build a Python string object out of a STRING atom. This takes care of
3392 * compile-time literal catenation, calling parsestr() on each piece, and
3393 * pasting the intermediate results together.
3394 */
3395static PyObject *
3396parsestrplus(struct compiling *c, const node *n)
3397{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003398 PyObject *v;
3399 int i;
3400 REQ(CHILD(n, 0), STRING);
Christian Heimes3c608332008-03-26 22:01:37 +00003401 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003402 /* String literal concatenation */
3403 for (i = 1; i < NCH(n); i++) {
3404 PyObject *s;
Christian Heimes3c608332008-03-26 22:01:37 +00003405 s = parsestr(c, STR(CHILD(n, i)));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003406 if (s == NULL)
3407 goto onError;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003408 if (PyString_Check(v) && PyString_Check(s)) {
3409 PyString_ConcatAndDel(&v, s);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003410 if (v == NULL)
3411 goto onError;
3412 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003414 else {
3415 PyObject *temp = PyUnicode_Concat(v, s);
3416 Py_DECREF(s);
3417 Py_DECREF(v);
3418 v = temp;
3419 if (v == NULL)
3420 goto onError;
3421 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003422#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003423 }
3424 }
3425 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426
3427 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003428 Py_XDECREF(v);
3429 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430}