blob: d25925944aeadbcf1e601b6afd2de7965c4ad4e0 [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 Petersond1f5a592009-06-13 13:06:21 +00002319 else {
2320 if (!forbidden_check(c, name_node, STR(name_node)))
2321 return NULL;
2322 }
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002323 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002324 if (!name)
2325 return NULL;
2326 return alias(name, str, c->c_arena);
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002327 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002328 case dotted_as_name:
2329 if (NCH(n) == 1) {
2330 n = CHILD(n, 0);
2331 goto loop;
2332 }
2333 else {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002334 node *asname_node = CHILD(n, 2);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002335 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002336 if (!a)
2337 return NULL;
2338 assert(!a->asname);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002339 if (!forbidden_check(c, asname_node, STR(asname_node)))
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002340 return NULL;
2341 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002342 if (!a->asname)
2343 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002344 return a;
2345 }
2346 break;
2347 case dotted_name:
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002348 if (NCH(n) == 1) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002349 node *name_node = CHILD(n, 0);
2350 if (store && !forbidden_check(c, name_node, STR(name_node)))
2351 return NULL;
2352 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002353 if (!name)
2354 return NULL;
2355 return alias(name, NULL, c->c_arena);
2356 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002357 else {
2358 /* Create a string of the form "a.b.c" */
2359 int i;
2360 size_t len;
2361 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002363 len = 0;
2364 for (i = 0; i < NCH(n); i += 2)
2365 /* length of string plus one for the dot */
2366 len += strlen(STR(CHILD(n, i))) + 1;
2367 len--; /* the last name doesn't have a dot */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002368 str = PyString_FromStringAndSize(NULL, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002369 if (!str)
2370 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002371 s = PyString_AS_STRING(str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002372 if (!s)
2373 return NULL;
2374 for (i = 0; i < NCH(n); i += 2) {
2375 char *sch = STR(CHILD(n, i));
2376 strcpy(s, STR(CHILD(n, i)));
2377 s += strlen(sch);
2378 *s++ = '.';
2379 }
2380 --s;
2381 *s = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002382 PyString_InternInPlace(&str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002383 PyArena_AddPyObject(c->c_arena, str);
2384 return alias(str, NULL, c->c_arena);
2385 }
2386 break;
2387 case STAR:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002388 str = PyString_InternFromString("*");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002389 PyArena_AddPyObject(c->c_arena, str);
2390 return alias(str, NULL, c->c_arena);
2391 default:
2392 PyErr_Format(PyExc_SystemError,
2393 "unexpected import name: %d", TYPE(n));
2394 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002396
2397 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 return NULL;
2399}
2400
2401static stmt_ty
2402ast_for_import_stmt(struct compiling *c, const node *n)
2403{
2404 /*
2405 import_stmt: import_name | import_from
2406 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002407 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002408 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002410 int lineno;
2411 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 int i;
2413 asdl_seq *aliases;
2414
2415 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002416 lineno = LINENO(n);
2417 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002419 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002420 n = CHILD(n, 1);
2421 REQ(n, dotted_as_names);
2422 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2423 if (!aliases)
2424 return NULL;
2425 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002426 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002427 if (!import_alias)
2428 return NULL;
2429 asdl_seq_SET(aliases, i / 2, import_alias);
2430 }
2431 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002433 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002434 int n_children;
2435 int idx, ndots = 0;
2436 alias_ty mod = NULL;
2437 identifier modname;
2438
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002439 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002440 optional module name */
2441 for (idx = 1; idx < NCH(n); idx++) {
2442 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002443 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2444 if (!mod)
2445 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002446 idx++;
2447 break;
2448 } else if (TYPE(CHILD(n, idx)) != DOT) {
2449 break;
2450 }
2451 ndots++;
2452 }
2453 idx++; /* skip over the 'import' keyword */
2454 switch (TYPE(CHILD(n, idx))) {
2455 case STAR:
2456 /* from ... import * */
2457 n = CHILD(n, idx);
2458 n_children = 1;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002459 break;
2460 case LPAR:
2461 /* from ... import (x, y, z) */
2462 n = CHILD(n, idx + 1);
2463 n_children = NCH(n);
2464 break;
2465 case import_as_names:
2466 /* from ... import x, y, z */
2467 n = CHILD(n, idx);
2468 n_children = NCH(n);
2469 if (n_children % 2 == 0) {
2470 ast_error(n, "trailing comma not allowed without"
2471 " surrounding parentheses");
2472 return NULL;
2473 }
2474 break;
2475 default:
2476 ast_error(n, "Unexpected node-type in from-import");
2477 return NULL;
2478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002480 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2481 if (!aliases)
2482 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002484 /* handle "from ... import *" special b/c there's no children */
2485 if (TYPE(n) == STAR) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002486 alias_ty import_alias = alias_for_import_name(c, n, 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002487 if (!import_alias)
2488 return NULL;
2489 asdl_seq_SET(aliases, 0, import_alias);
2490 }
2491 else {
2492 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002493 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002494 if (!import_alias)
2495 return NULL;
2496 asdl_seq_SET(aliases, i / 2, import_alias);
2497 }
2498 }
2499 if (mod != NULL)
2500 modname = mod->name;
2501 else
2502 modname = new_identifier("", c->c_arena);
2503 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2504 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 }
Neal Norwitz79792652005-11-14 04:25:03 +00002506 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002507 "unknown import statement: starts with command '%s'",
2508 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 return NULL;
2510}
2511
2512static stmt_ty
2513ast_for_global_stmt(struct compiling *c, const node *n)
2514{
2515 /* global_stmt: 'global' NAME (',' NAME)* */
2516 identifier name;
2517 asdl_seq *s;
2518 int i;
2519
2520 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002521 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002523 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002525 name = NEW_IDENTIFIER(CHILD(n, i));
2526 if (!name)
2527 return NULL;
2528 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002530 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531}
2532
2533static stmt_ty
2534ast_for_exec_stmt(struct compiling *c, const node *n)
2535{
2536 expr_ty expr1, globals = NULL, locals = NULL;
2537 int n_children = NCH(n);
2538 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002539 PyErr_Format(PyExc_SystemError,
2540 "poorly formed 'exec' statement: %d parts to statement",
2541 n_children);
2542 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543 }
2544
2545 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2546 REQ(n, exec_stmt);
2547 expr1 = ast_for_expr(c, CHILD(n, 1));
2548 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002549 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002551 globals = ast_for_expr(c, CHILD(n, 3));
2552 if (!globals)
2553 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 }
2555 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002556 locals = ast_for_expr(c, CHILD(n, 5));
2557 if (!locals)
2558 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 }
2560
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002561 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2562 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563}
2564
2565static stmt_ty
2566ast_for_assert_stmt(struct compiling *c, const node *n)
2567{
2568 /* assert_stmt: 'assert' test [',' test] */
2569 REQ(n, assert_stmt);
2570 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002571 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2572 if (!expression)
2573 return NULL;
2574 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2575 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 }
2577 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002578 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002580 expr1 = ast_for_expr(c, CHILD(n, 1));
2581 if (!expr1)
2582 return NULL;
2583 expr2 = ast_for_expr(c, CHILD(n, 3));
2584 if (!expr2)
2585 return NULL;
2586
2587 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 }
Neal Norwitz79792652005-11-14 04:25:03 +00002589 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002590 "improper number of parts to 'assert' statement: %d",
2591 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 return NULL;
2593}
2594
2595static asdl_seq *
2596ast_for_suite(struct compiling *c, const node *n)
2597{
2598 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002599 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 stmt_ty s;
2601 int i, total, num, end, pos = 0;
2602 node *ch;
2603
2604 REQ(n, suite);
2605
2606 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002607 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002609 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002611 n = CHILD(n, 0);
2612 /* simple_stmt always ends with a NEWLINE,
2613 and may have a trailing SEMI
2614 */
2615 end = NCH(n) - 1;
2616 if (TYPE(CHILD(n, end - 1)) == SEMI)
2617 end--;
2618 /* loop by 2 to skip semi-colons */
2619 for (i = 0; i < end; i += 2) {
2620 ch = CHILD(n, i);
2621 s = ast_for_stmt(c, ch);
2622 if (!s)
2623 return NULL;
2624 asdl_seq_SET(seq, pos++, s);
2625 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 }
2627 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002628 for (i = 2; i < (NCH(n) - 1); i++) {
2629 ch = CHILD(n, i);
2630 REQ(ch, stmt);
2631 num = num_stmts(ch);
2632 if (num == 1) {
2633 /* small_stmt or compound_stmt with only one child */
2634 s = ast_for_stmt(c, ch);
2635 if (!s)
2636 return NULL;
2637 asdl_seq_SET(seq, pos++, s);
2638 }
2639 else {
2640 int j;
2641 ch = CHILD(ch, 0);
2642 REQ(ch, simple_stmt);
2643 for (j = 0; j < NCH(ch); j += 2) {
2644 /* statement terminates with a semi-colon ';' */
2645 if (NCH(CHILD(ch, j)) == 0) {
2646 assert((j + 1) == NCH(ch));
2647 break;
2648 }
2649 s = ast_for_stmt(c, CHILD(ch, j));
2650 if (!s)
2651 return NULL;
2652 asdl_seq_SET(seq, pos++, s);
2653 }
2654 }
2655 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 }
2657 assert(pos == seq->size);
2658 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659}
2660
2661static stmt_ty
2662ast_for_if_stmt(struct compiling *c, const node *n)
2663{
2664 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2665 ['else' ':' suite]
2666 */
2667 char *s;
2668
2669 REQ(n, if_stmt);
2670
2671 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002672 expr_ty expression;
2673 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002675 expression = ast_for_expr(c, CHILD(n, 1));
2676 if (!expression)
2677 return NULL;
2678 suite_seq = ast_for_suite(c, CHILD(n, 3));
2679 if (!suite_seq)
2680 return NULL;
2681
2682 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2683 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002685
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 s = STR(CHILD(n, 4));
2687 /* s[2], the third character in the string, will be
2688 's' for el_s_e, or
2689 'i' for el_i_f
2690 */
2691 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002692 expr_ty expression;
2693 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002695 expression = ast_for_expr(c, CHILD(n, 1));
2696 if (!expression)
2697 return NULL;
2698 seq1 = ast_for_suite(c, CHILD(n, 3));
2699 if (!seq1)
2700 return NULL;
2701 seq2 = ast_for_suite(c, CHILD(n, 6));
2702 if (!seq2)
2703 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002705 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2706 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 }
2708 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002709 int i, n_elif, has_else = 0;
2710 expr_ty expression;
2711 asdl_seq *suite_seq;
2712 asdl_seq *orelse = NULL;
2713 n_elif = NCH(n) - 4;
2714 /* must reference the child n_elif+1 since 'else' token is third,
2715 not fourth, child from the end. */
2716 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2717 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2718 has_else = 1;
2719 n_elif -= 3;
2720 }
2721 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002723 if (has_else) {
2724 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002726 orelse = asdl_seq_new(1, c->c_arena);
2727 if (!orelse)
2728 return NULL;
2729 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2730 if (!expression)
2731 return NULL;
2732 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2733 if (!suite_seq)
2734 return NULL;
2735 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2736 if (!suite_seq2)
2737 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002739 asdl_seq_SET(orelse, 0,
2740 If(expression, suite_seq, suite_seq2,
2741 LINENO(CHILD(n, NCH(n) - 6)),
2742 CHILD(n, NCH(n) - 6)->n_col_offset,
2743 c->c_arena));
2744 /* the just-created orelse handled the last elif */
2745 n_elif--;
2746 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002748 for (i = 0; i < n_elif; i++) {
2749 int off = 5 + (n_elif - i - 1) * 4;
2750 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2751 if (!newobj)
2752 return NULL;
2753 expression = ast_for_expr(c, CHILD(n, off));
2754 if (!expression)
2755 return NULL;
2756 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2757 if (!suite_seq)
2758 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002760 asdl_seq_SET(newobj, 0,
2761 If(expression, suite_seq, orelse,
2762 LINENO(CHILD(n, off)),
2763 CHILD(n, off)->n_col_offset, c->c_arena));
2764 orelse = newobj;
2765 }
2766 expression = ast_for_expr(c, CHILD(n, 1));
2767 if (!expression)
2768 return NULL;
2769 suite_seq = ast_for_suite(c, CHILD(n, 3));
2770 if (!suite_seq)
2771 return NULL;
2772 return If(expression, suite_seq, orelse,
2773 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002775
2776 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002777 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002778 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779}
2780
2781static stmt_ty
2782ast_for_while_stmt(struct compiling *c, const node *n)
2783{
2784 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2785 REQ(n, while_stmt);
2786
2787 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002788 expr_ty expression;
2789 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002791 expression = ast_for_expr(c, CHILD(n, 1));
2792 if (!expression)
2793 return NULL;
2794 suite_seq = ast_for_suite(c, CHILD(n, 3));
2795 if (!suite_seq)
2796 return NULL;
2797 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2798 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 }
2800 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002801 expr_ty expression;
2802 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002804 expression = ast_for_expr(c, CHILD(n, 1));
2805 if (!expression)
2806 return NULL;
2807 seq1 = ast_for_suite(c, CHILD(n, 3));
2808 if (!seq1)
2809 return NULL;
2810 seq2 = ast_for_suite(c, CHILD(n, 6));
2811 if (!seq2)
2812 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002814 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2815 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002817
2818 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002819 "wrong number of tokens for 'while' statement: %d",
2820 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002821 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822}
2823
2824static stmt_ty
2825ast_for_for_stmt(struct compiling *c, const node *n)
2826{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002827 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 expr_ty expression;
2829 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002830 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2832 REQ(n, for_stmt);
2833
2834 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002835 seq = ast_for_suite(c, CHILD(n, 8));
2836 if (!seq)
2837 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838 }
2839
Neal Norwitzedef2be2006-07-12 05:26:17 +00002840 node_target = CHILD(n, 1);
2841 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002842 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002843 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002844 /* Check the # of children rather than the length of _target, since
2845 for x, in ... has 1 element in _target, but still requires a Tuple. */
2846 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002847 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002849 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002851 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002852 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002853 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002855 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002856 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002858 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002859 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860}
2861
2862static excepthandler_ty
2863ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2864{
Collin Winter62903052007-05-18 23:11:24 +00002865 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 REQ(exc, except_clause);
2867 REQ(body, suite);
2868
2869 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002870 asdl_seq *suite_seq = ast_for_suite(c, body);
2871 if (!suite_seq)
2872 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873
Georg Brandla48f3ab2008-03-30 06:40:17 +00002874 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002875 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 }
2877 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002878 expr_ty expression;
2879 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002881 expression = ast_for_expr(c, CHILD(exc, 1));
2882 if (!expression)
2883 return NULL;
2884 suite_seq = ast_for_suite(c, body);
2885 if (!suite_seq)
2886 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887
Georg Brandla48f3ab2008-03-30 06:40:17 +00002888 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002889 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 }
2891 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002892 asdl_seq *suite_seq;
2893 expr_ty expression;
2894 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2895 if (!e)
2896 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002897 if (!set_context(c, e, Store, CHILD(exc, 3)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002898 return NULL;
2899 expression = ast_for_expr(c, CHILD(exc, 1));
2900 if (!expression)
2901 return NULL;
2902 suite_seq = ast_for_suite(c, body);
2903 if (!suite_seq)
2904 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905
Georg Brandla48f3ab2008-03-30 06:40:17 +00002906 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002907 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002909
2910 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002911 "wrong number of children for 'except' clause: %d",
2912 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002913 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914}
2915
2916static stmt_ty
2917ast_for_try_stmt(struct compiling *c, const node *n)
2918{
Neal Norwitzf599f422005-12-17 21:33:47 +00002919 const int nch = NCH(n);
2920 int n_except = (nch - 3)/3;
2921 asdl_seq *body, *orelse = NULL, *finally = NULL;
2922
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 REQ(n, try_stmt);
2924
Neal Norwitzf599f422005-12-17 21:33:47 +00002925 body = ast_for_suite(c, CHILD(n, 2));
2926 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002927 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928
Neal Norwitzf599f422005-12-17 21:33:47 +00002929 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002930 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2931 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2932 /* we can assume it's an "else",
2933 because nch >= 9 for try-else-finally and
2934 it would otherwise have a type of except_clause */
2935 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2936 if (orelse == NULL)
2937 return NULL;
2938 n_except--;
2939 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002941 finally = ast_for_suite(c, CHILD(n, nch - 1));
2942 if (finally == NULL)
2943 return NULL;
2944 n_except--;
2945 }
2946 else {
2947 /* we can assume it's an "else",
2948 otherwise it would have a type of except_clause */
2949 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2950 if (orelse == NULL)
2951 return NULL;
2952 n_except--;
2953 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002955 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002956 ast_error(n, "malformed 'try' statement");
2957 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002959
2960 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002961 int i;
2962 stmt_ty except_st;
2963 /* process except statements to create a try ... except */
2964 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2965 if (handlers == NULL)
2966 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002967
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002968 for (i = 0; i < n_except; i++) {
2969 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2970 CHILD(n, 5 + i * 3));
2971 if (!e)
2972 return NULL;
2973 asdl_seq_SET(handlers, i, e);
2974 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002975
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002976 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2977 n->n_col_offset, c->c_arena);
2978 if (!finally)
2979 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002980
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002981 /* if a 'finally' is present too, we nest the TryExcept within a
2982 TryFinally to emulate try ... except ... finally */
2983 body = asdl_seq_new(1, c->c_arena);
2984 if (body == NULL)
2985 return NULL;
2986 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002987 }
2988
2989 /* must be a try ... finally (except clauses are in body, if any exist) */
2990 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002991 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992}
2993
Georg Brandl944f6842009-05-25 21:02:56 +00002994/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002995static stmt_ty
Georg Brandl944f6842009-05-25 21:02:56 +00002996ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002997{
2998 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002999
Georg Brandl944f6842009-05-25 21:02:56 +00003000 REQ(n, with_item);
3001 context_expr = ast_for_expr(c, CHILD(n, 0));
Collin Winter77c67bd2007-03-16 04:11:30 +00003002 if (!context_expr)
3003 return NULL;
Georg Brandl944f6842009-05-25 21:02:56 +00003004 if (NCH(n) == 3) {
3005 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003006
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003007 if (!optional_vars) {
3008 return NULL;
3009 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003010 if (!set_context(c, optional_vars, Store, n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003011 return NULL;
3012 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003013 }
3014
Georg Brandl944f6842009-05-25 21:02:56 +00003015 return With(context_expr, optional_vars, content, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003016 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003017}
3018
Georg Brandl944f6842009-05-25 21:02:56 +00003019/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3020static stmt_ty
3021ast_for_with_stmt(struct compiling *c, const node *n)
3022{
3023 int i;
3024 stmt_ty ret;
3025 asdl_seq *inner;
3026
3027 REQ(n, with_stmt);
3028
3029 /* process the with items inside-out */
3030 i = NCH(n) - 1;
3031 /* the suite of the innermost with item is the suite of the with stmt */
3032 inner = ast_for_suite(c, CHILD(n, i));
3033 if (!inner)
3034 return NULL;
3035
3036 for (;;) {
3037 i -= 2;
3038 ret = ast_for_with_item(c, CHILD(n, i), inner);
3039 if (!ret)
3040 return NULL;
3041 /* was this the last item? */
3042 if (i == 1)
3043 break;
3044 /* if not, wrap the result so far in a new sequence */
3045 inner = asdl_seq_new(1, c->c_arena);
3046 if (!inner)
3047 return NULL;
3048 asdl_seq_SET(inner, 0, ret);
3049 }
3050
3051 return ret;
3052}
3053
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +00003055ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056{
3057 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003058 PyObject *classname;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059 asdl_seq *bases, *s;
3060
3061 REQ(n, classdef);
3062
Benjamin Petersond5efd202008-06-08 22:52:37 +00003063 if (!forbidden_check(c, n, STR(CHILD(n, 1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065
3066 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003067 s = ast_for_suite(c, CHILD(n, 3));
3068 if (!s)
3069 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003070 classname = NEW_IDENTIFIER(CHILD(n, 1));
3071 if (!classname)
3072 return NULL;
3073 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3074 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 }
3076 /* check for empty base list */
3077 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003078 s = ast_for_suite(c, CHILD(n,5));
3079 if (!s)
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003080 return NULL;
3081 classname = NEW_IDENTIFIER(CHILD(n, 1));
3082 if (!classname)
3083 return NULL;
3084 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3085 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 }
3087
3088 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003089 bases = ast_for_class_bases(c, CHILD(n, 3));
3090 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092
3093 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003094 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003095 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003096 classname = NEW_IDENTIFIER(CHILD(n, 1));
3097 if (!classname)
3098 return NULL;
3099 return ClassDef(classname, bases, s, decorator_seq,
Christian Heimes5224d282008-02-23 15:01:05 +00003100 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101}
3102
3103static stmt_ty
3104ast_for_stmt(struct compiling *c, const node *n)
3105{
3106 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003107 assert(NCH(n) == 1);
3108 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 }
3110 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003111 assert(num_stmts(n) == 1);
3112 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 }
3114 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003115 n = CHILD(n, 0);
3116 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3117 | flow_stmt | import_stmt | global_stmt | exec_stmt
3118 | assert_stmt
3119 */
3120 switch (TYPE(n)) {
3121 case expr_stmt:
3122 return ast_for_expr_stmt(c, n);
3123 case print_stmt:
3124 return ast_for_print_stmt(c, n);
3125 case del_stmt:
3126 return ast_for_del_stmt(c, n);
3127 case pass_stmt:
3128 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3129 case flow_stmt:
3130 return ast_for_flow_stmt(c, n);
3131 case import_stmt:
3132 return ast_for_import_stmt(c, n);
3133 case global_stmt:
3134 return ast_for_global_stmt(c, n);
3135 case exec_stmt:
3136 return ast_for_exec_stmt(c, n);
3137 case assert_stmt:
3138 return ast_for_assert_stmt(c, n);
3139 default:
3140 PyErr_Format(PyExc_SystemError,
3141 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3142 TYPE(n), NCH(n));
3143 return NULL;
3144 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145 }
3146 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003147 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Christian Heimes5224d282008-02-23 15:01:05 +00003148 | funcdef | classdef | decorated
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003149 */
3150 node *ch = CHILD(n, 0);
3151 REQ(n, compound_stmt);
3152 switch (TYPE(ch)) {
3153 case if_stmt:
3154 return ast_for_if_stmt(c, ch);
3155 case while_stmt:
3156 return ast_for_while_stmt(c, ch);
3157 case for_stmt:
3158 return ast_for_for_stmt(c, ch);
3159 case try_stmt:
3160 return ast_for_try_stmt(c, ch);
3161 case with_stmt:
3162 return ast_for_with_stmt(c, ch);
3163 case funcdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003164 return ast_for_funcdef(c, ch, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003165 case classdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003166 return ast_for_classdef(c, ch, NULL);
3167 case decorated:
3168 return ast_for_decorated(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003169 default:
3170 PyErr_Format(PyExc_SystemError,
3171 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3172 TYPE(n), NCH(n));
3173 return NULL;
3174 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175 }
3176}
3177
3178static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003179parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003181 const char *end;
3182 long x;
3183 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184#ifndef WITHOUT_COMPLEX
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003185 Py_complex complex;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003186 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187#endif
3188
Mark Dickinson422ce062008-12-05 17:59:46 +00003189 assert(s != NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003190 errno = 0;
3191 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003193 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003195 if (*end == 'l' || *end == 'L')
3196 return PyLong_FromString((char *)s, (char **)0, 0);
Mark Dickinson64b7e502008-07-16 09:40:03 +00003197 x = PyOS_strtol((char *)s, (char **)&end, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003198 if (*end == '\0') {
3199 if (errno != 0)
3200 return PyLong_FromString((char *)s, (char **)0, 0);
3201 return PyInt_FromLong(x);
3202 }
3203 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003205 if (imflag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003206 complex.real = 0.;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003207 PyFPE_START_PROTECT("atof", return 0)
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003208 complex.imag = PyOS_ascii_atof(s);
3209 PyFPE_END_PROTECT(complex)
3210 return PyComplex_FromCComplex(complex);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003211 }
3212 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003214 {
3215 PyFPE_START_PROTECT("atof", return 0)
3216 dx = PyOS_ascii_atof(s);
3217 PyFPE_END_PROTECT(dx)
3218 return PyFloat_FromDouble(dx);
3219 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220}
3221
3222static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003223decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224{
3225#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003226 Py_FatalError("decode_utf8 should not be called in this build.");
3227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003229 PyObject *u, *v;
3230 char *s, *t;
3231 t = s = (char *)*sPtr;
3232 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3233 while (s < end && (*s & 0x80)) s++;
3234 *sPtr = s;
3235 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3236 if (u == NULL)
3237 return NULL;
3238 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3239 Py_DECREF(u);
3240 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003241#endif
3242}
3243
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003244#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003246decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003248 PyObject *v, *u;
3249 char *buf;
3250 char *p;
3251 const char *end;
3252 if (encoding == NULL) {
3253 buf = (char *)s;
3254 u = NULL;
3255 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3256 buf = (char *)s;
3257 u = NULL;
3258 } else {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003259 /* check for integer overflow */
3260 if (len > PY_SIZE_MAX / 4)
3261 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003262 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003263 u = PyString_FromStringAndSize((char *)NULL, len * 4);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003264 if (u == NULL)
3265 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003266 p = buf = PyString_AsString(u);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003267 end = s + len;
3268 while (s < end) {
3269 if (*s == '\\') {
3270 *p++ = *s++;
3271 if (*s & 0x80) {
3272 strcpy(p, "u005c");
3273 p += 5;
3274 }
3275 }
3276 if (*s & 0x80) { /* XXX inefficient */
3277 PyObject *w;
3278 char *r;
3279 Py_ssize_t rn, i;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003280 w = decode_utf8(c, &s, end, "utf-16-be");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003281 if (w == NULL) {
3282 Py_DECREF(u);
3283 return NULL;
3284 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003285 r = PyString_AsString(w);
3286 rn = PyString_Size(w);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003287 assert(rn % 2 == 0);
3288 for (i = 0; i < rn; i += 2) {
3289 sprintf(p, "\\u%02x%02x",
3290 r[i + 0] & 0xFF,
3291 r[i + 1] & 0xFF);
3292 p += 6;
3293 }
3294 Py_DECREF(w);
3295 } else {
3296 *p++ = *s++;
3297 }
3298 }
3299 len = p - buf;
3300 s = buf;
3301 }
3302 if (rawmode)
3303 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3304 else
3305 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3306 Py_XDECREF(u);
3307 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003309#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310
3311/* s is a Python string literal, including the bracketing quote characters,
3312 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3313 * parsestr parses it, and returns the decoded Python string object.
3314 */
3315static PyObject *
Christian Heimes3c608332008-03-26 22:01:37 +00003316parsestr(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003318 size_t len;
3319 int quote = Py_CHARMASK(*s);
3320 int rawmode = 0;
3321 int need_encoding;
Christian Heimes3c608332008-03-26 22:01:37 +00003322 int unicode = c->c_future_unicode;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003323
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003324 if (isalpha(quote) || quote == '_') {
3325 if (quote == 'u' || quote == 'U') {
3326 quote = *++s;
3327 unicode = 1;
3328 }
Christian Heimes288e89a2008-01-18 18:24:07 +00003329 if (quote == 'b' || quote == 'B') {
3330 quote = *++s;
Christian Heimes3c608332008-03-26 22:01:37 +00003331 unicode = 0;
Christian Heimes288e89a2008-01-18 18:24:07 +00003332 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003333 if (quote == 'r' || quote == 'R') {
3334 quote = *++s;
3335 rawmode = 1;
3336 }
3337 }
3338 if (quote != '\'' && quote != '\"') {
3339 PyErr_BadInternalCall();
3340 return NULL;
3341 }
3342 s++;
3343 len = strlen(s);
3344 if (len > INT_MAX) {
3345 PyErr_SetString(PyExc_OverflowError,
3346 "string to parse is too long");
3347 return NULL;
3348 }
3349 if (s[--len] != quote) {
3350 PyErr_BadInternalCall();
3351 return NULL;
3352 }
3353 if (len >= 4 && s[0] == quote && s[1] == quote) {
3354 s += 2;
3355 len -= 2;
3356 if (s[--len] != quote || s[--len] != quote) {
3357 PyErr_BadInternalCall();
3358 return NULL;
3359 }
3360 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003362 if (unicode || Py_UnicodeFlag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003363 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003364 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365#endif
Christian Heimes3c608332008-03-26 22:01:37 +00003366 need_encoding = (c->c_encoding != NULL &&
3367 strcmp(c->c_encoding, "utf-8") != 0 &&
3368 strcmp(c->c_encoding, "iso-8859-1") != 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003369 if (rawmode || strchr(s, '\\') == NULL) {
3370 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003372 /* This should not happen - we never see any other
3373 encoding. */
3374 Py_FatalError(
3375 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003377 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3378 if (u == NULL)
3379 return NULL;
Christian Heimes3c608332008-03-26 22:01:37 +00003380 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003381 Py_DECREF(u);
3382 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003384 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003385 return PyString_FromStringAndSize(s, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003386 }
3387 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003389 return PyString_DecodeEscape(s, len, NULL, unicode,
Christian Heimes3c608332008-03-26 22:01:37 +00003390 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391}
3392
3393/* Build a Python string object out of a STRING atom. This takes care of
3394 * compile-time literal catenation, calling parsestr() on each piece, and
3395 * pasting the intermediate results together.
3396 */
3397static PyObject *
3398parsestrplus(struct compiling *c, const node *n)
3399{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003400 PyObject *v;
3401 int i;
3402 REQ(CHILD(n, 0), STRING);
Christian Heimes3c608332008-03-26 22:01:37 +00003403 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003404 /* String literal concatenation */
3405 for (i = 1; i < NCH(n); i++) {
3406 PyObject *s;
Christian Heimes3c608332008-03-26 22:01:37 +00003407 s = parsestr(c, STR(CHILD(n, i)));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003408 if (s == NULL)
3409 goto onError;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003410 if (PyString_Check(v) && PyString_Check(s)) {
3411 PyString_ConcatAndDel(&v, s);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003412 if (v == NULL)
3413 goto onError;
3414 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003415#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003416 else {
3417 PyObject *temp = PyUnicode_Concat(v, s);
3418 Py_DECREF(s);
3419 Py_DECREF(v);
3420 v = temp;
3421 if (v == NULL)
3422 goto onError;
3423 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003425 }
3426 }
3427 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003428
3429 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003430 Py_XDECREF(v);
3431 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432}