blob: 772047fc4b069a5fd93ccd4039c8590fe85b32b7 [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
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002297alias_for_import_name(struct compiling *c, const node *n)
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)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002308 case import_as_name:
2309 str = NULL;
2310 if (NCH(n) == 3) {
2311 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002312 if (!str)
2313 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002314 }
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002315 name = NEW_IDENTIFIER(CHILD(n, 0));
2316 if (!name)
2317 return NULL;
2318 return alias(name, str, c->c_arena);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002319 case dotted_as_name:
2320 if (NCH(n) == 1) {
2321 n = CHILD(n, 0);
2322 goto loop;
2323 }
2324 else {
2325 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
2326 if (!a)
2327 return NULL;
2328 assert(!a->asname);
2329 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002330 if (!a->asname)
2331 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002332 return a;
2333 }
2334 break;
2335 case dotted_name:
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002336 if (NCH(n) == 1) {
2337 name = NEW_IDENTIFIER(CHILD(n, 0));
2338 if (!name)
2339 return NULL;
2340 return alias(name, NULL, c->c_arena);
2341 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002342 else {
2343 /* Create a string of the form "a.b.c" */
2344 int i;
2345 size_t len;
2346 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002348 len = 0;
2349 for (i = 0; i < NCH(n); i += 2)
2350 /* length of string plus one for the dot */
2351 len += strlen(STR(CHILD(n, i))) + 1;
2352 len--; /* the last name doesn't have a dot */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002353 str = PyString_FromStringAndSize(NULL, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002354 if (!str)
2355 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002356 s = PyString_AS_STRING(str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002357 if (!s)
2358 return NULL;
2359 for (i = 0; i < NCH(n); i += 2) {
2360 char *sch = STR(CHILD(n, i));
2361 strcpy(s, STR(CHILD(n, i)));
2362 s += strlen(sch);
2363 *s++ = '.';
2364 }
2365 --s;
2366 *s = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002367 PyString_InternInPlace(&str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002368 PyArena_AddPyObject(c->c_arena, str);
2369 return alias(str, NULL, c->c_arena);
2370 }
2371 break;
2372 case STAR:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002373 str = PyString_InternFromString("*");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002374 PyArena_AddPyObject(c->c_arena, str);
2375 return alias(str, NULL, c->c_arena);
2376 default:
2377 PyErr_Format(PyExc_SystemError,
2378 "unexpected import name: %d", TYPE(n));
2379 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002381
2382 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 return NULL;
2384}
2385
2386static stmt_ty
2387ast_for_import_stmt(struct compiling *c, const node *n)
2388{
2389 /*
2390 import_stmt: import_name | import_from
2391 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002392 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002393 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002395 int lineno;
2396 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 int i;
2398 asdl_seq *aliases;
2399
2400 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002401 lineno = LINENO(n);
2402 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002404 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002405 n = CHILD(n, 1);
2406 REQ(n, dotted_as_names);
2407 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2408 if (!aliases)
2409 return NULL;
2410 for (i = 0; i < NCH(n); i += 2) {
2411 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2412 if (!import_alias)
2413 return NULL;
2414 asdl_seq_SET(aliases, i / 2, import_alias);
2415 }
2416 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002418 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002419 int n_children;
2420 int idx, ndots = 0;
2421 alias_ty mod = NULL;
2422 identifier modname;
2423
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002424 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002425 optional module name */
2426 for (idx = 1; idx < NCH(n); idx++) {
2427 if (TYPE(CHILD(n, idx)) == dotted_name) {
2428 mod = alias_for_import_name(c, CHILD(n, idx));
2429 idx++;
2430 break;
2431 } else if (TYPE(CHILD(n, idx)) != DOT) {
2432 break;
2433 }
2434 ndots++;
2435 }
2436 idx++; /* skip over the 'import' keyword */
2437 switch (TYPE(CHILD(n, idx))) {
2438 case STAR:
2439 /* from ... import * */
2440 n = CHILD(n, idx);
2441 n_children = 1;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002442 break;
2443 case LPAR:
2444 /* from ... import (x, y, z) */
2445 n = CHILD(n, idx + 1);
2446 n_children = NCH(n);
2447 break;
2448 case import_as_names:
2449 /* from ... import x, y, z */
2450 n = CHILD(n, idx);
2451 n_children = NCH(n);
2452 if (n_children % 2 == 0) {
2453 ast_error(n, "trailing comma not allowed without"
2454 " surrounding parentheses");
2455 return NULL;
2456 }
2457 break;
2458 default:
2459 ast_error(n, "Unexpected node-type in from-import");
2460 return NULL;
2461 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002463 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2464 if (!aliases)
2465 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002467 /* handle "from ... import *" special b/c there's no children */
2468 if (TYPE(n) == STAR) {
2469 alias_ty import_alias = alias_for_import_name(c, n);
2470 if (!import_alias)
2471 return NULL;
2472 asdl_seq_SET(aliases, 0, import_alias);
2473 }
2474 else {
2475 for (i = 0; i < NCH(n); i += 2) {
2476 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2477 if (!import_alias)
2478 return NULL;
2479 asdl_seq_SET(aliases, i / 2, import_alias);
2480 }
2481 }
2482 if (mod != NULL)
2483 modname = mod->name;
2484 else
2485 modname = new_identifier("", c->c_arena);
2486 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2487 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
Neal Norwitz79792652005-11-14 04:25:03 +00002489 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002490 "unknown import statement: starts with command '%s'",
2491 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 return NULL;
2493}
2494
2495static stmt_ty
2496ast_for_global_stmt(struct compiling *c, const node *n)
2497{
2498 /* global_stmt: 'global' NAME (',' NAME)* */
2499 identifier name;
2500 asdl_seq *s;
2501 int i;
2502
2503 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002504 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002508 name = NEW_IDENTIFIER(CHILD(n, i));
2509 if (!name)
2510 return NULL;
2511 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002513 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514}
2515
2516static stmt_ty
2517ast_for_exec_stmt(struct compiling *c, const node *n)
2518{
2519 expr_ty expr1, globals = NULL, locals = NULL;
2520 int n_children = NCH(n);
2521 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002522 PyErr_Format(PyExc_SystemError,
2523 "poorly formed 'exec' statement: %d parts to statement",
2524 n_children);
2525 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 }
2527
2528 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2529 REQ(n, exec_stmt);
2530 expr1 = ast_for_expr(c, CHILD(n, 1));
2531 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002532 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002534 globals = ast_for_expr(c, CHILD(n, 3));
2535 if (!globals)
2536 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 }
2538 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002539 locals = ast_for_expr(c, CHILD(n, 5));
2540 if (!locals)
2541 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 }
2543
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002544 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2545 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546}
2547
2548static stmt_ty
2549ast_for_assert_stmt(struct compiling *c, const node *n)
2550{
2551 /* assert_stmt: 'assert' test [',' test] */
2552 REQ(n, assert_stmt);
2553 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002554 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2555 if (!expression)
2556 return NULL;
2557 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2558 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 }
2560 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002561 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002563 expr1 = ast_for_expr(c, CHILD(n, 1));
2564 if (!expr1)
2565 return NULL;
2566 expr2 = ast_for_expr(c, CHILD(n, 3));
2567 if (!expr2)
2568 return NULL;
2569
2570 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 }
Neal Norwitz79792652005-11-14 04:25:03 +00002572 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002573 "improper number of parts to 'assert' statement: %d",
2574 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 return NULL;
2576}
2577
2578static asdl_seq *
2579ast_for_suite(struct compiling *c, const node *n)
2580{
2581 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002582 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 stmt_ty s;
2584 int i, total, num, end, pos = 0;
2585 node *ch;
2586
2587 REQ(n, suite);
2588
2589 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002590 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002592 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002594 n = CHILD(n, 0);
2595 /* simple_stmt always ends with a NEWLINE,
2596 and may have a trailing SEMI
2597 */
2598 end = NCH(n) - 1;
2599 if (TYPE(CHILD(n, end - 1)) == SEMI)
2600 end--;
2601 /* loop by 2 to skip semi-colons */
2602 for (i = 0; i < end; i += 2) {
2603 ch = CHILD(n, i);
2604 s = ast_for_stmt(c, ch);
2605 if (!s)
2606 return NULL;
2607 asdl_seq_SET(seq, pos++, s);
2608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609 }
2610 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002611 for (i = 2; i < (NCH(n) - 1); i++) {
2612 ch = CHILD(n, i);
2613 REQ(ch, stmt);
2614 num = num_stmts(ch);
2615 if (num == 1) {
2616 /* small_stmt or compound_stmt with only one child */
2617 s = ast_for_stmt(c, ch);
2618 if (!s)
2619 return NULL;
2620 asdl_seq_SET(seq, pos++, s);
2621 }
2622 else {
2623 int j;
2624 ch = CHILD(ch, 0);
2625 REQ(ch, simple_stmt);
2626 for (j = 0; j < NCH(ch); j += 2) {
2627 /* statement terminates with a semi-colon ';' */
2628 if (NCH(CHILD(ch, j)) == 0) {
2629 assert((j + 1) == NCH(ch));
2630 break;
2631 }
2632 s = ast_for_stmt(c, CHILD(ch, j));
2633 if (!s)
2634 return NULL;
2635 asdl_seq_SET(seq, pos++, s);
2636 }
2637 }
2638 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 }
2640 assert(pos == seq->size);
2641 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642}
2643
2644static stmt_ty
2645ast_for_if_stmt(struct compiling *c, const node *n)
2646{
2647 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2648 ['else' ':' suite]
2649 */
2650 char *s;
2651
2652 REQ(n, if_stmt);
2653
2654 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002655 expr_ty expression;
2656 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002658 expression = ast_for_expr(c, CHILD(n, 1));
2659 if (!expression)
2660 return NULL;
2661 suite_seq = ast_for_suite(c, CHILD(n, 3));
2662 if (!suite_seq)
2663 return NULL;
2664
2665 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2666 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002668
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 s = STR(CHILD(n, 4));
2670 /* s[2], the third character in the string, will be
2671 's' for el_s_e, or
2672 'i' for el_i_f
2673 */
2674 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002675 expr_ty expression;
2676 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002678 expression = ast_for_expr(c, CHILD(n, 1));
2679 if (!expression)
2680 return NULL;
2681 seq1 = ast_for_suite(c, CHILD(n, 3));
2682 if (!seq1)
2683 return NULL;
2684 seq2 = ast_for_suite(c, CHILD(n, 6));
2685 if (!seq2)
2686 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002688 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2689 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 }
2691 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002692 int i, n_elif, has_else = 0;
2693 expr_ty expression;
2694 asdl_seq *suite_seq;
2695 asdl_seq *orelse = NULL;
2696 n_elif = NCH(n) - 4;
2697 /* must reference the child n_elif+1 since 'else' token is third,
2698 not fourth, child from the end. */
2699 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2700 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2701 has_else = 1;
2702 n_elif -= 3;
2703 }
2704 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002706 if (has_else) {
2707 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002709 orelse = asdl_seq_new(1, c->c_arena);
2710 if (!orelse)
2711 return NULL;
2712 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2713 if (!expression)
2714 return NULL;
2715 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2716 if (!suite_seq)
2717 return NULL;
2718 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2719 if (!suite_seq2)
2720 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002722 asdl_seq_SET(orelse, 0,
2723 If(expression, suite_seq, suite_seq2,
2724 LINENO(CHILD(n, NCH(n) - 6)),
2725 CHILD(n, NCH(n) - 6)->n_col_offset,
2726 c->c_arena));
2727 /* the just-created orelse handled the last elif */
2728 n_elif--;
2729 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002731 for (i = 0; i < n_elif; i++) {
2732 int off = 5 + (n_elif - i - 1) * 4;
2733 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2734 if (!newobj)
2735 return NULL;
2736 expression = ast_for_expr(c, CHILD(n, off));
2737 if (!expression)
2738 return NULL;
2739 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2740 if (!suite_seq)
2741 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002743 asdl_seq_SET(newobj, 0,
2744 If(expression, suite_seq, orelse,
2745 LINENO(CHILD(n, off)),
2746 CHILD(n, off)->n_col_offset, c->c_arena));
2747 orelse = newobj;
2748 }
2749 expression = ast_for_expr(c, CHILD(n, 1));
2750 if (!expression)
2751 return NULL;
2752 suite_seq = ast_for_suite(c, CHILD(n, 3));
2753 if (!suite_seq)
2754 return NULL;
2755 return If(expression, suite_seq, orelse,
2756 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002758
2759 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002760 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762}
2763
2764static stmt_ty
2765ast_for_while_stmt(struct compiling *c, const node *n)
2766{
2767 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2768 REQ(n, while_stmt);
2769
2770 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002771 expr_ty expression;
2772 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002774 expression = ast_for_expr(c, CHILD(n, 1));
2775 if (!expression)
2776 return NULL;
2777 suite_seq = ast_for_suite(c, CHILD(n, 3));
2778 if (!suite_seq)
2779 return NULL;
2780 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2781 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 }
2783 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002784 expr_ty expression;
2785 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002787 expression = ast_for_expr(c, CHILD(n, 1));
2788 if (!expression)
2789 return NULL;
2790 seq1 = ast_for_suite(c, CHILD(n, 3));
2791 if (!seq1)
2792 return NULL;
2793 seq2 = ast_for_suite(c, CHILD(n, 6));
2794 if (!seq2)
2795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002797 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2798 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002800
2801 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002802 "wrong number of tokens for 'while' statement: %d",
2803 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002804 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805}
2806
2807static stmt_ty
2808ast_for_for_stmt(struct compiling *c, const node *n)
2809{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002810 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 expr_ty expression;
2812 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002813 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002814 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2815 REQ(n, for_stmt);
2816
2817 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002818 seq = ast_for_suite(c, CHILD(n, 8));
2819 if (!seq)
2820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 }
2822
Neal Norwitzedef2be2006-07-12 05:26:17 +00002823 node_target = CHILD(n, 1);
2824 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002825 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002826 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002827 /* Check the # of children rather than the length of _target, since
2828 for x, in ... has 1 element in _target, but still requires a Tuple. */
2829 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002830 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002832 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002834 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002835 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002838 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002839 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002841 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002842 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843}
2844
2845static excepthandler_ty
2846ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2847{
Collin Winter62903052007-05-18 23:11:24 +00002848 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 REQ(exc, except_clause);
2850 REQ(body, suite);
2851
2852 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002853 asdl_seq *suite_seq = ast_for_suite(c, body);
2854 if (!suite_seq)
2855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856
Georg Brandla48f3ab2008-03-30 06:40:17 +00002857 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002858 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 }
2860 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002861 expr_ty expression;
2862 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002864 expression = ast_for_expr(c, CHILD(exc, 1));
2865 if (!expression)
2866 return NULL;
2867 suite_seq = ast_for_suite(c, body);
2868 if (!suite_seq)
2869 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870
Georg Brandla48f3ab2008-03-30 06:40:17 +00002871 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002872 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 }
2874 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002875 asdl_seq *suite_seq;
2876 expr_ty expression;
2877 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2878 if (!e)
2879 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002880 if (!set_context(c, e, Store, CHILD(exc, 3)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002881 return NULL;
2882 expression = ast_for_expr(c, CHILD(exc, 1));
2883 if (!expression)
2884 return NULL;
2885 suite_seq = ast_for_suite(c, body);
2886 if (!suite_seq)
2887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888
Georg Brandla48f3ab2008-03-30 06:40:17 +00002889 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002890 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002892
2893 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002894 "wrong number of children for 'except' clause: %d",
2895 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002896 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897}
2898
2899static stmt_ty
2900ast_for_try_stmt(struct compiling *c, const node *n)
2901{
Neal Norwitzf599f422005-12-17 21:33:47 +00002902 const int nch = NCH(n);
2903 int n_except = (nch - 3)/3;
2904 asdl_seq *body, *orelse = NULL, *finally = NULL;
2905
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 REQ(n, try_stmt);
2907
Neal Norwitzf599f422005-12-17 21:33:47 +00002908 body = ast_for_suite(c, CHILD(n, 2));
2909 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002910 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911
Neal Norwitzf599f422005-12-17 21:33:47 +00002912 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002913 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2914 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2915 /* we can assume it's an "else",
2916 because nch >= 9 for try-else-finally and
2917 it would otherwise have a type of except_clause */
2918 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2919 if (orelse == NULL)
2920 return NULL;
2921 n_except--;
2922 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002924 finally = ast_for_suite(c, CHILD(n, nch - 1));
2925 if (finally == NULL)
2926 return NULL;
2927 n_except--;
2928 }
2929 else {
2930 /* we can assume it's an "else",
2931 otherwise it would have a type of except_clause */
2932 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2933 if (orelse == NULL)
2934 return NULL;
2935 n_except--;
2936 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002938 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002939 ast_error(n, "malformed 'try' statement");
2940 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002942
2943 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002944 int i;
2945 stmt_ty except_st;
2946 /* process except statements to create a try ... except */
2947 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2948 if (handlers == NULL)
2949 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002950
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002951 for (i = 0; i < n_except; i++) {
2952 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2953 CHILD(n, 5 + i * 3));
2954 if (!e)
2955 return NULL;
2956 asdl_seq_SET(handlers, i, e);
2957 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002958
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002959 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2960 n->n_col_offset, c->c_arena);
2961 if (!finally)
2962 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002963
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002964 /* if a 'finally' is present too, we nest the TryExcept within a
2965 TryFinally to emulate try ... except ... finally */
2966 body = asdl_seq_new(1, c->c_arena);
2967 if (body == NULL)
2968 return NULL;
2969 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002970 }
2971
2972 /* must be a try ... finally (except clauses are in body, if any exist) */
2973 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002974 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975}
2976
Georg Brandl944f6842009-05-25 21:02:56 +00002977/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002978static stmt_ty
Georg Brandl944f6842009-05-25 21:02:56 +00002979ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002980{
2981 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002982
Georg Brandl944f6842009-05-25 21:02:56 +00002983 REQ(n, with_item);
2984 context_expr = ast_for_expr(c, CHILD(n, 0));
Collin Winter77c67bd2007-03-16 04:11:30 +00002985 if (!context_expr)
2986 return NULL;
Georg Brandl944f6842009-05-25 21:02:56 +00002987 if (NCH(n) == 3) {
2988 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002989
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002990 if (!optional_vars) {
2991 return NULL;
2992 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002993 if (!set_context(c, optional_vars, Store, n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002994 return NULL;
2995 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002996 }
2997
Georg Brandl944f6842009-05-25 21:02:56 +00002998 return With(context_expr, optional_vars, content, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002999 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003000}
3001
Georg Brandl944f6842009-05-25 21:02:56 +00003002/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3003static stmt_ty
3004ast_for_with_stmt(struct compiling *c, const node *n)
3005{
3006 int i;
3007 stmt_ty ret;
3008 asdl_seq *inner;
3009
3010 REQ(n, with_stmt);
3011
3012 /* process the with items inside-out */
3013 i = NCH(n) - 1;
3014 /* the suite of the innermost with item is the suite of the with stmt */
3015 inner = ast_for_suite(c, CHILD(n, i));
3016 if (!inner)
3017 return NULL;
3018
3019 for (;;) {
3020 i -= 2;
3021 ret = ast_for_with_item(c, CHILD(n, i), inner);
3022 if (!ret)
3023 return NULL;
3024 /* was this the last item? */
3025 if (i == 1)
3026 break;
3027 /* if not, wrap the result so far in a new sequence */
3028 inner = asdl_seq_new(1, c->c_arena);
3029 if (!inner)
3030 return NULL;
3031 asdl_seq_SET(inner, 0, ret);
3032 }
3033
3034 return ret;
3035}
3036
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +00003038ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039{
3040 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003041 PyObject *classname;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 asdl_seq *bases, *s;
3043
3044 REQ(n, classdef);
3045
Benjamin Petersond5efd202008-06-08 22:52:37 +00003046 if (!forbidden_check(c, n, STR(CHILD(n, 1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003047 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048
3049 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003050 s = ast_for_suite(c, CHILD(n, 3));
3051 if (!s)
3052 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003053 classname = NEW_IDENTIFIER(CHILD(n, 1));
3054 if (!classname)
3055 return NULL;
3056 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3057 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 }
3059 /* check for empty base list */
3060 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003061 s = ast_for_suite(c, CHILD(n,5));
3062 if (!s)
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003063 return NULL;
3064 classname = NEW_IDENTIFIER(CHILD(n, 1));
3065 if (!classname)
3066 return NULL;
3067 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3068 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 }
3070
3071 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003072 bases = ast_for_class_bases(c, CHILD(n, 3));
3073 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003074 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075
3076 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003077 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003078 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003079 classname = NEW_IDENTIFIER(CHILD(n, 1));
3080 if (!classname)
3081 return NULL;
3082 return ClassDef(classname, bases, s, decorator_seq,
Christian Heimes5224d282008-02-23 15:01:05 +00003083 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084}
3085
3086static stmt_ty
3087ast_for_stmt(struct compiling *c, const node *n)
3088{
3089 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003090 assert(NCH(n) == 1);
3091 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 }
3093 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003094 assert(num_stmts(n) == 1);
3095 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 }
3097 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003098 n = CHILD(n, 0);
3099 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3100 | flow_stmt | import_stmt | global_stmt | exec_stmt
3101 | assert_stmt
3102 */
3103 switch (TYPE(n)) {
3104 case expr_stmt:
3105 return ast_for_expr_stmt(c, n);
3106 case print_stmt:
3107 return ast_for_print_stmt(c, n);
3108 case del_stmt:
3109 return ast_for_del_stmt(c, n);
3110 case pass_stmt:
3111 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3112 case flow_stmt:
3113 return ast_for_flow_stmt(c, n);
3114 case import_stmt:
3115 return ast_for_import_stmt(c, n);
3116 case global_stmt:
3117 return ast_for_global_stmt(c, n);
3118 case exec_stmt:
3119 return ast_for_exec_stmt(c, n);
3120 case assert_stmt:
3121 return ast_for_assert_stmt(c, n);
3122 default:
3123 PyErr_Format(PyExc_SystemError,
3124 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3125 TYPE(n), NCH(n));
3126 return NULL;
3127 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 }
3129 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003130 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Christian Heimes5224d282008-02-23 15:01:05 +00003131 | funcdef | classdef | decorated
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003132 */
3133 node *ch = CHILD(n, 0);
3134 REQ(n, compound_stmt);
3135 switch (TYPE(ch)) {
3136 case if_stmt:
3137 return ast_for_if_stmt(c, ch);
3138 case while_stmt:
3139 return ast_for_while_stmt(c, ch);
3140 case for_stmt:
3141 return ast_for_for_stmt(c, ch);
3142 case try_stmt:
3143 return ast_for_try_stmt(c, ch);
3144 case with_stmt:
3145 return ast_for_with_stmt(c, ch);
3146 case funcdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003147 return ast_for_funcdef(c, ch, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003148 case classdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003149 return ast_for_classdef(c, ch, NULL);
3150 case decorated:
3151 return ast_for_decorated(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003152 default:
3153 PyErr_Format(PyExc_SystemError,
3154 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3155 TYPE(n), NCH(n));
3156 return NULL;
3157 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 }
3159}
3160
3161static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003162parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003164 const char *end;
3165 long x;
3166 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167#ifndef WITHOUT_COMPLEX
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003168 Py_complex complex;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003169 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170#endif
3171
Mark Dickinson422ce062008-12-05 17:59:46 +00003172 assert(s != NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003173 errno = 0;
3174 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003176 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003178 if (*end == 'l' || *end == 'L')
3179 return PyLong_FromString((char *)s, (char **)0, 0);
Mark Dickinson64b7e502008-07-16 09:40:03 +00003180 x = PyOS_strtol((char *)s, (char **)&end, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003181 if (*end == '\0') {
3182 if (errno != 0)
3183 return PyLong_FromString((char *)s, (char **)0, 0);
3184 return PyInt_FromLong(x);
3185 }
3186 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003188 if (imflag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003189 complex.real = 0.;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003190 PyFPE_START_PROTECT("atof", return 0)
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003191 complex.imag = PyOS_ascii_atof(s);
3192 PyFPE_END_PROTECT(complex)
3193 return PyComplex_FromCComplex(complex);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003194 }
3195 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003197 {
3198 PyFPE_START_PROTECT("atof", return 0)
3199 dx = PyOS_ascii_atof(s);
3200 PyFPE_END_PROTECT(dx)
3201 return PyFloat_FromDouble(dx);
3202 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203}
3204
3205static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003206decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207{
3208#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003209 Py_FatalError("decode_utf8 should not be called in this build.");
3210 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003212 PyObject *u, *v;
3213 char *s, *t;
3214 t = s = (char *)*sPtr;
3215 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3216 while (s < end && (*s & 0x80)) s++;
3217 *sPtr = s;
3218 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3219 if (u == NULL)
3220 return NULL;
3221 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3222 Py_DECREF(u);
3223 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224#endif
3225}
3226
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003227#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003229decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003231 PyObject *v, *u;
3232 char *buf;
3233 char *p;
3234 const char *end;
3235 if (encoding == NULL) {
3236 buf = (char *)s;
3237 u = NULL;
3238 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3239 buf = (char *)s;
3240 u = NULL;
3241 } else {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003242 /* check for integer overflow */
3243 if (len > PY_SIZE_MAX / 4)
3244 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003245 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003246 u = PyString_FromStringAndSize((char *)NULL, len * 4);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003247 if (u == NULL)
3248 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003249 p = buf = PyString_AsString(u);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003250 end = s + len;
3251 while (s < end) {
3252 if (*s == '\\') {
3253 *p++ = *s++;
3254 if (*s & 0x80) {
3255 strcpy(p, "u005c");
3256 p += 5;
3257 }
3258 }
3259 if (*s & 0x80) { /* XXX inefficient */
3260 PyObject *w;
3261 char *r;
3262 Py_ssize_t rn, i;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003263 w = decode_utf8(c, &s, end, "utf-16-be");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003264 if (w == NULL) {
3265 Py_DECREF(u);
3266 return NULL;
3267 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003268 r = PyString_AsString(w);
3269 rn = PyString_Size(w);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003270 assert(rn % 2 == 0);
3271 for (i = 0; i < rn; i += 2) {
3272 sprintf(p, "\\u%02x%02x",
3273 r[i + 0] & 0xFF,
3274 r[i + 1] & 0xFF);
3275 p += 6;
3276 }
3277 Py_DECREF(w);
3278 } else {
3279 *p++ = *s++;
3280 }
3281 }
3282 len = p - buf;
3283 s = buf;
3284 }
3285 if (rawmode)
3286 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3287 else
3288 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3289 Py_XDECREF(u);
3290 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003292#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293
3294/* s is a Python string literal, including the bracketing quote characters,
3295 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3296 * parsestr parses it, and returns the decoded Python string object.
3297 */
3298static PyObject *
Christian Heimes3c608332008-03-26 22:01:37 +00003299parsestr(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003301 size_t len;
3302 int quote = Py_CHARMASK(*s);
3303 int rawmode = 0;
3304 int need_encoding;
Christian Heimes3c608332008-03-26 22:01:37 +00003305 int unicode = c->c_future_unicode;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003307 if (isalpha(quote) || quote == '_') {
3308 if (quote == 'u' || quote == 'U') {
3309 quote = *++s;
3310 unicode = 1;
3311 }
Christian Heimes288e89a2008-01-18 18:24:07 +00003312 if (quote == 'b' || quote == 'B') {
3313 quote = *++s;
Christian Heimes3c608332008-03-26 22:01:37 +00003314 unicode = 0;
Christian Heimes288e89a2008-01-18 18:24:07 +00003315 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003316 if (quote == 'r' || quote == 'R') {
3317 quote = *++s;
3318 rawmode = 1;
3319 }
3320 }
3321 if (quote != '\'' && quote != '\"') {
3322 PyErr_BadInternalCall();
3323 return NULL;
3324 }
3325 s++;
3326 len = strlen(s);
3327 if (len > INT_MAX) {
3328 PyErr_SetString(PyExc_OverflowError,
3329 "string to parse is too long");
3330 return NULL;
3331 }
3332 if (s[--len] != quote) {
3333 PyErr_BadInternalCall();
3334 return NULL;
3335 }
3336 if (len >= 4 && s[0] == quote && s[1] == quote) {
3337 s += 2;
3338 len -= 2;
3339 if (s[--len] != quote || s[--len] != quote) {
3340 PyErr_BadInternalCall();
3341 return NULL;
3342 }
3343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003345 if (unicode || Py_UnicodeFlag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003346 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003347 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348#endif
Christian Heimes3c608332008-03-26 22:01:37 +00003349 need_encoding = (c->c_encoding != NULL &&
3350 strcmp(c->c_encoding, "utf-8") != 0 &&
3351 strcmp(c->c_encoding, "iso-8859-1") != 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003352 if (rawmode || strchr(s, '\\') == NULL) {
3353 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003355 /* This should not happen - we never see any other
3356 encoding. */
3357 Py_FatalError(
3358 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003360 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3361 if (u == NULL)
3362 return NULL;
Christian Heimes3c608332008-03-26 22:01:37 +00003363 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003364 Py_DECREF(u);
3365 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003367 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003368 return PyString_FromStringAndSize(s, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003369 }
3370 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003372 return PyString_DecodeEscape(s, len, NULL, unicode,
Christian Heimes3c608332008-03-26 22:01:37 +00003373 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374}
3375
3376/* Build a Python string object out of a STRING atom. This takes care of
3377 * compile-time literal catenation, calling parsestr() on each piece, and
3378 * pasting the intermediate results together.
3379 */
3380static PyObject *
3381parsestrplus(struct compiling *c, const node *n)
3382{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003383 PyObject *v;
3384 int i;
3385 REQ(CHILD(n, 0), STRING);
Christian Heimes3c608332008-03-26 22:01:37 +00003386 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003387 /* String literal concatenation */
3388 for (i = 1; i < NCH(n); i++) {
3389 PyObject *s;
Christian Heimes3c608332008-03-26 22:01:37 +00003390 s = parsestr(c, STR(CHILD(n, i)));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003391 if (s == NULL)
3392 goto onError;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003393 if (PyString_Check(v) && PyString_Check(s)) {
3394 PyString_ConcatAndDel(&v, s);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003395 if (v == NULL)
3396 goto onError;
3397 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003398#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003399 else {
3400 PyObject *temp = PyUnicode_Concat(v, s);
3401 Py_DECREF(s);
3402 Py_DECREF(v);
3403 v = temp;
3404 if (v == NULL)
3405 goto onError;
3406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003408 }
3409 }
3410 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411
3412 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003413 Py_XDECREF(v);
3414 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003415}