blob: 2f975ac8e0a286c9155eee6b92870195432c8955 [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:
Benjamin Peterson52c4bec2009-06-13 17:08:53 +0000405 if (asdl_seq_LEN(e->v.Tuple.elts)) {
406 e->v.Tuple.ctx = ctx;
407 s = e->v.Tuple.elts;
408 }
409 else {
410 expr_name = "()";
411 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000412 break;
413 case Lambda_kind:
414 expr_name = "lambda";
415 break;
416 case Call_kind:
417 expr_name = "function call";
418 break;
419 case BoolOp_kind:
420 case BinOp_kind:
421 case UnaryOp_kind:
422 expr_name = "operator";
423 break;
424 case GeneratorExp_kind:
425 expr_name = "generator expression";
426 break;
427 case Yield_kind:
428 expr_name = "yield expression";
429 break;
430 case ListComp_kind:
431 expr_name = "list comprehension";
432 break;
433 case Dict_kind:
434 case Num_kind:
435 case Str_kind:
436 expr_name = "literal";
437 break;
438 case Compare_kind:
439 expr_name = "comparison";
440 break;
441 case Repr_kind:
442 expr_name = "repr";
443 break;
444 case IfExp_kind:
445 expr_name = "conditional expression";
446 break;
447 default:
448 PyErr_Format(PyExc_SystemError,
449 "unexpected expression in assignment %d (line %d)",
450 e->kind, e->lineno);
451 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000452 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000453 /* Check for error string set by switch */
454 if (expr_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000455 char buf[300];
456 PyOS_snprintf(buf, sizeof(buf),
457 "can't %s %s",
458 ctx == Store ? "assign to" : "delete",
459 expr_name);
460 return ast_error(n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000461 }
462
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000464 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000465 */
466 if (s) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000467 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000468
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000469 for (i = 0; i < asdl_seq_LEN(s); i++) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000470 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000471 return 0;
472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000473 }
474 return 1;
475}
476
477static operator_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000478ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000479{
480 REQ(n, augassign);
481 n = CHILD(n, 0);
482 switch (STR(n)[0]) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000483 case '+':
484 return Add;
485 case '-':
486 return Sub;
487 case '/':
488 if (STR(n)[1] == '/')
489 return FloorDiv;
490 else
491 return Div;
492 case '%':
493 return Mod;
494 case '<':
495 return LShift;
496 case '>':
497 return RShift;
498 case '&':
499 return BitAnd;
500 case '^':
501 return BitXor;
502 case '|':
503 return BitOr;
504 case '*':
505 if (STR(n)[1] == '*')
506 return Pow;
507 else
508 return Mult;
509 default:
510 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
511 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000512 }
513}
514
515static cmpop_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000516ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000517{
518 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000519 |'is' 'not'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520 */
521 REQ(n, comp_op);
522 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000523 n = CHILD(n, 0);
524 switch (TYPE(n)) {
525 case LESS:
526 return Lt;
527 case GREATER:
528 return Gt;
529 case EQEQUAL: /* == */
530 return Eq;
531 case LESSEQUAL:
532 return LtE;
533 case GREATEREQUAL:
534 return GtE;
535 case NOTEQUAL:
536 return NotEq;
537 case NAME:
538 if (strcmp(STR(n), "in") == 0)
539 return In;
540 if (strcmp(STR(n), "is") == 0)
541 return Is;
542 default:
543 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
544 STR(n));
545 return (cmpop_ty)0;
546 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547 }
548 else if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000549 /* handle "not in" and "is not" */
550 switch (TYPE(CHILD(n, 0))) {
551 case NAME:
552 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
553 return NotIn;
554 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
555 return IsNot;
556 default:
557 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
558 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
559 return (cmpop_ty)0;
560 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561 }
Neal Norwitz79792652005-11-14 04:25:03 +0000562 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000563 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000564 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000565}
566
567static asdl_seq *
568seq_for_testlist(struct compiling *c, const node *n)
569{
570 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000571 asdl_seq *seq;
572 expr_ty expression;
573 int i;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000574 assert(TYPE(n) == testlist ||
575 TYPE(n) == listmaker ||
576 TYPE(n) == testlist_gexp ||
577 TYPE(n) == testlist_safe ||
578 TYPE(n) == testlist1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000580 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000582 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
584 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000585 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000587 expression = ast_for_expr(c, CHILD(n, i));
588 if (!expression)
589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000591 assert(i / 2 < seq->size);
592 asdl_seq_SET(seq, i / 2, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593 }
594 return seq;
595}
596
597static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000598compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599{
600 int i, len = (NCH(n) + 1) / 2;
601 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000602 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000604 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000605
Neal Norwitz3a230172006-09-22 08:18:10 +0000606 /* fpdef: NAME | '(' fplist ')'
607 fplist: fpdef (',' fpdef)* [',']
608 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610 for (i = 0; i < len; i++) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000611 PyObject *arg_id;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000612 const node *fpdef_node = CHILD(n, 2*i);
613 const node *child;
614 expr_ty arg;
Neal Norwitz3a230172006-09-22 08:18:10 +0000615set_name:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000616 /* fpdef_node is either a NAME or an fplist */
617 child = CHILD(fpdef_node, 0);
618 if (TYPE(child) == NAME) {
Benjamin Petersond5efd202008-06-08 22:52:37 +0000619 if (!forbidden_check(c, n, STR(child)))
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000620 return NULL;
621 arg_id = NEW_IDENTIFIER(child);
622 if (!arg_id)
623 return NULL;
624 arg = Name(arg_id, Store, LINENO(child), child->n_col_offset,
625 c->c_arena);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000626 }
627 else {
628 assert(TYPE(fpdef_node) == fpdef);
629 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
630 child = CHILD(fpdef_node, 1);
631 assert(TYPE(child) == fplist);
632 /* NCH == 1 means we have (x), we need to elide the extra parens */
633 if (NCH(child) == 1) {
634 fpdef_node = CHILD(child, 0);
635 assert(TYPE(fpdef_node) == fpdef);
636 goto set_name;
637 }
638 arg = compiler_complex_args(c, child);
639 }
640 asdl_seq_SET(args, i, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000641 }
642
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000643 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000644 if (!set_context(c, result, Store, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000645 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000646 return result;
647}
648
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649
Jeremy Hyltona8293132006-02-28 17:58:27 +0000650/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000651
652static arguments_ty
653ast_for_arguments(struct compiling *c, const node *n)
654{
655 /* parameters: '(' [varargslist] ')'
656 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000657 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000658 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000659 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660 asdl_seq *args, *defaults;
661 identifier vararg = NULL, kwarg = NULL;
662 node *ch;
663
664 if (TYPE(n) == parameters) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000665 if (NCH(n) == 2) /* () as argument list */
666 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
667 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000668 }
669 REQ(n, varargslist);
670
671 /* first count the number of normal args & defaults */
672 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000673 ch = CHILD(n, i);
674 if (TYPE(ch) == fpdef)
675 n_args++;
676 if (TYPE(ch) == EQUAL)
677 n_defaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000678 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000679 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680 if (!args && n_args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000681 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000682 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683 if (!defaults && n_defaults)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000684 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685
686 /* fpdef: NAME | '(' fplist ')'
687 fplist: fpdef (',' fpdef)* [',']
688 */
689 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000690 j = 0; /* index for defaults */
691 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000692 while (i < NCH(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000693 ch = CHILD(n, i);
694 switch (TYPE(ch)) {
695 case fpdef:
696 handle_fpdef:
697 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
698 anything other than EQUAL or a comma? */
699 /* XXX Should NCH(n) check be made a separate check? */
700 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
701 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
702 if (!expression)
703 goto error;
704 assert(defaults != NULL);
705 asdl_seq_SET(defaults, j++, expression);
706 i += 2;
707 found_default = 1;
708 }
709 else if (found_default) {
710 ast_error(n,
711 "non-default argument follows default argument");
712 goto error;
713 }
714 if (NCH(ch) == 3) {
715 ch = CHILD(ch, 1);
716 /* def foo((x)): is not complex, special case. */
717 if (NCH(ch) != 1) {
718 /* We have complex arguments, setup for unpacking. */
Benjamin Petersonf4fcdb62008-06-08 23:00:00 +0000719 if (Py_Py3kWarningFlag && !ast_warn(c, ch,
720 "tuple parameter unpacking has been removed in 3.x"))
721 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000722 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000723 if (!asdl_seq_GET(args, k-1))
724 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000725 } else {
726 /* def foo((x)): setup for checking NAME below. */
727 /* Loop because there can be many parens and tuple
728 unpacking mixed in. */
729 ch = CHILD(ch, 0);
730 assert(TYPE(ch) == fpdef);
731 goto handle_fpdef;
732 }
733 }
734 if (TYPE(CHILD(ch, 0)) == NAME) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000735 PyObject *id;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000736 expr_ty name;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000737 if (!forbidden_check(c, n, STR(CHILD(ch, 0))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000738 goto error;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000739 id = NEW_IDENTIFIER(CHILD(ch, 0));
740 if (!id)
741 goto error;
742 name = Name(id, Param, LINENO(ch), ch->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000743 c->c_arena);
744 if (!name)
745 goto error;
746 asdl_seq_SET(args, k++, name);
747
748 }
749 i += 2; /* the name and the comma */
750 break;
751 case STAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000752 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000753 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000754 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000755 if (!vararg)
756 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000757 i += 3;
758 break;
759 case DOUBLESTAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000760 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000761 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000762 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000763 if (!kwarg)
764 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000765 i += 3;
766 break;
767 default:
768 PyErr_Format(PyExc_SystemError,
769 "unexpected node in varargslist: %d @ %d",
770 TYPE(ch), i);
771 goto error;
772 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 }
774
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000775 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776
777 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000778 Py_XDECREF(vararg);
779 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 return NULL;
781}
782
783static expr_ty
784ast_for_dotted_name(struct compiling *c, const node *n)
785{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000786 expr_ty e;
787 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000788 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 int i;
790
791 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000792
793 lineno = LINENO(n);
794 col_offset = n->n_col_offset;
795
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796 id = NEW_IDENTIFIER(CHILD(n, 0));
797 if (!id)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000798 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000799 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000801 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802
803 for (i = 2; i < NCH(n); i+=2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000804 id = NEW_IDENTIFIER(CHILD(n, i));
805 if (!id)
806 return NULL;
807 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
808 if (!e)
809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810 }
811
812 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813}
814
815static expr_ty
816ast_for_decorator(struct compiling *c, const node *n)
817{
818 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
819 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000820 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821
822 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000823 REQ(CHILD(n, 0), AT);
824 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825
826 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
827 if (!name_expr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000828 return NULL;
829
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 if (NCH(n) == 3) { /* No arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000831 d = name_expr;
832 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833 }
834 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000835 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
836 n->n_col_offset, c->c_arena);
837 if (!d)
838 return NULL;
839 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 }
841 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000842 d = ast_for_call(c, CHILD(n, 3), name_expr);
843 if (!d)
844 return NULL;
845 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846 }
847
848 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000849}
850
851static asdl_seq*
852ast_for_decorators(struct compiling *c, const node *n)
853{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000854 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000855 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 int i;
857
858 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000859 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 if (!decorator_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000861 return NULL;
862
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000864 d = ast_for_decorator(c, CHILD(n, i));
865 if (!d)
866 return NULL;
867 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868 }
869 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870}
871
872static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +0000873ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000874{
Christian Heimes5224d282008-02-23 15:01:05 +0000875 /* funcdef: 'def' NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000876 identifier name;
877 arguments_ty args;
878 asdl_seq *body;
Christian Heimes5224d282008-02-23 15:01:05 +0000879 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880
881 REQ(n, funcdef);
882
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883 name = NEW_IDENTIFIER(CHILD(n, name_i));
884 if (!name)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000885 return NULL;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000886 else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 args = ast_for_arguments(c, CHILD(n, name_i + 1));
889 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000890 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 body = ast_for_suite(c, CHILD(n, name_i + 3));
892 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000895 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000896 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897}
898
Christian Heimes5224d282008-02-23 15:01:05 +0000899static stmt_ty
900ast_for_decorated(struct compiling *c, const node *n)
901{
902 /* decorated: decorators (classdef | funcdef) */
903 stmt_ty thing = NULL;
904 asdl_seq *decorator_seq = NULL;
905
906 REQ(n, decorated);
907
908 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
909 if (!decorator_seq)
910 return NULL;
911
912 assert(TYPE(CHILD(n, 1)) == funcdef ||
913 TYPE(CHILD(n, 1)) == classdef);
914
915 if (TYPE(CHILD(n, 1)) == funcdef) {
916 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
917 } else if (TYPE(CHILD(n, 1)) == classdef) {
918 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
919 }
920 /* we count the decorators in when talking about the class' or
921 function's line number */
922 if (thing) {
923 thing->lineno = LINENO(n);
924 thing->col_offset = n->n_col_offset;
925 }
926 return thing;
927}
928
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929static expr_ty
930ast_for_lambdef(struct compiling *c, const node *n)
931{
932 /* lambdef: 'lambda' [varargslist] ':' test */
933 arguments_ty args;
934 expr_ty expression;
935
936 if (NCH(n) == 3) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000937 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
938 if (!args)
939 return NULL;
940 expression = ast_for_expr(c, CHILD(n, 2));
941 if (!expression)
942 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 }
944 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000945 args = ast_for_arguments(c, CHILD(n, 1));
946 if (!args)
947 return NULL;
948 expression = ast_for_expr(c, CHILD(n, 3));
949 if (!expression)
950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951 }
952
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000953 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954}
955
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000956static expr_ty
957ast_for_ifexpr(struct compiling *c, const node *n)
958{
959 /* test: or_test 'if' or_test 'else' test */
960 expr_ty expression, body, orelse;
961
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000962 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000963 body = ast_for_expr(c, CHILD(n, 0));
964 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000965 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000966 expression = ast_for_expr(c, CHILD(n, 2));
967 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000968 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000969 orelse = ast_for_expr(c, CHILD(n, 4));
970 if (!orelse)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000971 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000972 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000973 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000974}
975
Neal Norwitze4d4f002006-09-05 03:58:26 +0000976/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
977 so there is only a single version. Possibly for loops can also re-use
978 the code.
979*/
980
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981/* Count the number of 'for' loop in a list comprehension.
982
983 Helper for ast_for_listcomp().
984*/
985
986static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000987count_list_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988{
989 int n_fors = 0;
990 node *ch = CHILD(n, 1);
991
992 count_list_for:
993 n_fors++;
994 REQ(ch, list_for);
995 if (NCH(ch) == 5)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000996 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000998 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 count_list_iter:
1000 REQ(ch, list_iter);
1001 ch = CHILD(ch, 0);
1002 if (TYPE(ch) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001003 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 else if (TYPE(ch) == list_if) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001005 if (NCH(ch) == 3) {
1006 ch = CHILD(ch, 2);
1007 goto count_list_iter;
1008 }
1009 else
1010 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001012
1013 /* Should never be reached */
1014 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
1015 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016}
1017
1018/* Count the number of 'if' statements in a list comprehension.
1019
1020 Helper for ast_for_listcomp().
1021*/
1022
1023static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001024count_list_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025{
1026 int n_ifs = 0;
1027
1028 count_list_iter:
1029 REQ(n, list_iter);
1030 if (TYPE(CHILD(n, 0)) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001031 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 n = CHILD(n, 0);
1033 REQ(n, list_if);
1034 n_ifs++;
1035 if (NCH(n) == 2)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001036 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 n = CHILD(n, 2);
1038 goto count_list_iter;
1039}
1040
1041static expr_ty
1042ast_for_listcomp(struct compiling *c, const node *n)
1043{
1044 /* listmaker: test ( list_for | (',' test)* [','] )
1045 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1046 list_iter: list_for | list_if
1047 list_if: 'if' test [list_iter]
1048 testlist_safe: test [(',' test)+ [',']]
1049 */
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001050 expr_ty elt, first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051 asdl_seq *listcomps;
1052 int i, n_fors;
1053 node *ch;
1054
1055 REQ(n, listmaker);
1056 assert(NCH(n) > 1);
1057
1058 elt = ast_for_expr(c, CHILD(n, 0));
1059 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001061
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001062 n_fors = count_list_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001066 listcomps = asdl_seq_new(n_fors, c->c_arena);
1067 if (!listcomps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001068 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001069
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070 ch = CHILD(n, 1);
1071 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001072 comprehension_ty lc;
1073 asdl_seq *t;
1074 expr_ty expression;
1075 node *for_ch;
1076
1077 REQ(ch, list_for);
1078
1079 for_ch = CHILD(ch, 1);
1080 t = ast_for_exprlist(c, for_ch, Store);
1081 if (!t)
1082 return NULL;
1083 expression = ast_for_testlist(c, CHILD(ch, 3));
1084 if (!expression)
1085 return NULL;
1086
1087 /* Check the # of children rather than the length of t, since
1088 [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1089 */
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001090 first = (expr_ty)asdl_seq_GET(t, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001091 if (NCH(for_ch) == 1)
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001092 lc = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001093 else
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001094 lc = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001095 c->c_arena),
1096 expression, NULL, c->c_arena);
1097 if (!lc)
1098 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001100 if (NCH(ch) == 5) {
1101 int j, n_ifs;
1102 asdl_seq *ifs;
1103 expr_ty list_for_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001105 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001106 n_ifs = count_list_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001107 if (n_ifs == -1)
1108 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001110 ifs = asdl_seq_new(n_ifs, c->c_arena);
1111 if (!ifs)
1112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001114 for (j = 0; j < n_ifs; j++) {
1115 REQ(ch, list_iter);
1116 ch = CHILD(ch, 0);
1117 REQ(ch, list_if);
1118
1119 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1120 if (!list_for_expr)
1121 return NULL;
1122
1123 asdl_seq_SET(ifs, j, list_for_expr);
1124 if (NCH(ch) == 3)
1125 ch = CHILD(ch, 2);
1126 }
1127 /* on exit, must guarantee that ch is a list_for */
1128 if (TYPE(ch) == list_iter)
1129 ch = CHILD(ch, 0);
1130 lc->ifs = ifs;
1131 }
1132 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133 }
1134
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001135 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136}
1137
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001138/* Count the number of 'for' loops in a generator expression.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139
1140 Helper for ast_for_genexp().
1141*/
1142
1143static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001144count_gen_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001146 int n_fors = 0;
1147 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148
1149 count_gen_for:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001150 n_fors++;
1151 REQ(ch, gen_for);
1152 if (NCH(ch) == 5)
1153 ch = CHILD(ch, 4);
1154 else
1155 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 count_gen_iter:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001157 REQ(ch, gen_iter);
1158 ch = CHILD(ch, 0);
1159 if (TYPE(ch) == gen_for)
1160 goto count_gen_for;
1161 else if (TYPE(ch) == gen_if) {
1162 if (NCH(ch) == 3) {
1163 ch = CHILD(ch, 2);
1164 goto count_gen_iter;
1165 }
1166 else
1167 return n_fors;
1168 }
1169
1170 /* Should never be reached */
1171 PyErr_SetString(PyExc_SystemError,
1172 "logic error in count_gen_fors");
1173 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174}
1175
1176/* Count the number of 'if' statements in a generator expression.
1177
1178 Helper for ast_for_genexp().
1179*/
1180
1181static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001182count_gen_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001184 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001186 while (1) {
1187 REQ(n, gen_iter);
1188 if (TYPE(CHILD(n, 0)) == gen_for)
1189 return n_ifs;
1190 n = CHILD(n, 0);
1191 REQ(n, gen_if);
1192 n_ifs++;
1193 if (NCH(n) == 2)
1194 return n_ifs;
1195 n = CHILD(n, 2);
1196 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197}
1198
Jeremy Hyltona8293132006-02-28 17:58:27 +00001199/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200static expr_ty
1201ast_for_genexp(struct compiling *c, const node *n)
1202{
1203 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001204 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 expr_ty elt;
1206 asdl_seq *genexps;
1207 int i, n_fors;
1208 node *ch;
1209
1210 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1211 assert(NCH(n) > 1);
1212
1213 elt = ast_for_expr(c, CHILD(n, 0));
1214 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001215 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001217 n_fors = count_gen_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001219 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220
1221 genexps = asdl_seq_new(n_fors, c->c_arena);
1222 if (!genexps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001223 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001224
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 ch = CHILD(n, 1);
1226 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001227 comprehension_ty ge;
1228 asdl_seq *t;
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001229 expr_ty expression, first;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001230 node *for_ch;
1231
1232 REQ(ch, gen_for);
1233
1234 for_ch = CHILD(ch, 1);
1235 t = ast_for_exprlist(c, for_ch, Store);
1236 if (!t)
1237 return NULL;
1238 expression = ast_for_expr(c, CHILD(ch, 3));
1239 if (!expression)
1240 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001241
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001242 /* Check the # of children rather than the length of t, since
1243 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001244 first = (expr_ty)asdl_seq_GET(t, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001245 if (NCH(for_ch) == 1)
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001246 ge = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001247 else
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00001248 ge = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001249 c->c_arena),
1250 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001251
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001252 if (!ge)
1253 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001254
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001255 if (NCH(ch) == 5) {
1256 int j, n_ifs;
1257 asdl_seq *ifs;
1258
1259 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001260 n_ifs = count_gen_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001261 if (n_ifs == -1)
1262 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001263
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001264 ifs = asdl_seq_new(n_ifs, c->c_arena);
1265 if (!ifs)
1266 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001267
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001268 for (j = 0; j < n_ifs; j++) {
1269 REQ(ch, gen_iter);
1270 ch = CHILD(ch, 0);
1271 REQ(ch, gen_if);
1272
1273 expression = ast_for_expr(c, CHILD(ch, 1));
1274 if (!expression)
1275 return NULL;
1276 asdl_seq_SET(ifs, j, expression);
1277 if (NCH(ch) == 3)
1278 ch = CHILD(ch, 2);
1279 }
1280 /* on exit, must guarantee that ch is a gen_for */
1281 if (TYPE(ch) == gen_iter)
1282 ch = CHILD(ch, 0);
1283 ge->ifs = ifs;
1284 }
1285 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 }
1287
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001288 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289}
1290
1291static expr_ty
1292ast_for_atom(struct compiling *c, const node *n)
1293{
1294 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1295 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1296 */
1297 node *ch = CHILD(n, 0);
1298
1299 switch (TYPE(ch)) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001300 case NAME: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001301 /* All names start in Load context, but may later be
1302 changed. */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001303 PyObject *name = NEW_IDENTIFIER(ch);
1304 if (!name)
1305 return NULL;
1306 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1307 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 case STRING: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001309 PyObject *str = parsestrplus(c, n);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001310 if (!str) {
Georg Brandldfe5dc82008-01-07 18:16:36 +00001311#ifdef Py_USING_UNICODE
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001312 if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
1313 PyObject *type, *value, *tback, *errstr;
1314 PyErr_Fetch(&type, &value, &tback);
Benjamin Petersonc078f922008-11-21 22:27:24 +00001315 errstr = PyObject_Str(value);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001316 if (errstr) {
1317 char *s = "";
1318 char buf[128];
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001319 s = PyString_AsString(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001320 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1321 ast_error(n, buf);
Benjamin Petersonc078f922008-11-21 22:27:24 +00001322 Py_DECREF(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001323 } else {
1324 ast_error(n, "(unicode error) unknown error");
1325 }
1326 Py_DECREF(type);
1327 Py_DECREF(value);
1328 Py_XDECREF(tback);
1329 }
Georg Brandldfe5dc82008-01-07 18:16:36 +00001330#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001331 return NULL;
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001332 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001333 PyArena_AddPyObject(c->c_arena, str);
1334 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 }
1336 case NUMBER: {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001337 PyObject *pynum = parsenumber(c, STR(ch));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001338 if (!pynum)
1339 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001340
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001341 PyArena_AddPyObject(c->c_arena, pynum);
1342 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 }
1344 case LPAR: /* some parenthesized expressions */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001345 ch = CHILD(n, 1);
1346
1347 if (TYPE(ch) == RPAR)
1348 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1349
1350 if (TYPE(ch) == yield_expr)
1351 return ast_for_expr(c, ch);
1352
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001353 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354 case LSQB: /* list (or list comprehension) */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001355 ch = CHILD(n, 1);
1356
1357 if (TYPE(ch) == RSQB)
1358 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1359
1360 REQ(ch, listmaker);
1361 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1362 asdl_seq *elts = seq_for_testlist(c, ch);
1363 if (!elts)
1364 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001365
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001366 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1367 }
1368 else
1369 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 case LBRACE: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001371 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1372 int i, size;
1373 asdl_seq *keys, *values;
1374
1375 ch = CHILD(n, 1);
1376 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1377 keys = asdl_seq_new(size, c->c_arena);
1378 if (!keys)
1379 return NULL;
1380
1381 values = asdl_seq_new(size, c->c_arena);
1382 if (!values)
1383 return NULL;
1384
1385 for (i = 0; i < NCH(ch); i += 4) {
1386 expr_ty expression;
1387
1388 expression = ast_for_expr(c, CHILD(ch, i));
1389 if (!expression)
1390 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001391
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001392 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001393
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001394 expression = ast_for_expr(c, CHILD(ch, i + 2));
1395 if (!expression)
1396 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001397
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001398 asdl_seq_SET(values, i / 4, expression);
1399 }
1400 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 }
1402 case BACKQUOTE: { /* repr */
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001403 expr_ty expression;
Benjamin Petersoncbd78132008-06-08 15:45:23 +00001404 if (Py_Py3kWarningFlag &&
1405 !ast_warn(c, n, "backquote not supported in 3.x; use repr()"))
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001406 return NULL;
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001407 expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001408 if (!expression)
1409 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001410
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001411 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 }
1413 default:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001414 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1415 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 }
1417}
1418
1419static slice_ty
1420ast_for_slice(struct compiling *c, const node *n)
1421{
1422 node *ch;
1423 expr_ty lower = NULL, upper = NULL, step = NULL;
1424
1425 REQ(n, subscript);
1426
1427 /*
1428 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1429 sliceop: ':' [test]
1430 */
1431 ch = CHILD(n, 0);
1432 if (TYPE(ch) == DOT)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001433 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434
1435 if (NCH(n) == 1 && TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001436 /* 'step' variable hold no significance in terms of being used over
1437 other vars */
1438 step = ast_for_expr(c, ch);
1439 if (!step)
1440 return NULL;
1441
1442 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 }
1444
1445 if (TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001446 lower = ast_for_expr(c, ch);
1447 if (!lower)
1448 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 }
1450
1451 /* If there's an upper bound it's in the second or third position. */
1452 if (TYPE(ch) == COLON) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001453 if (NCH(n) > 1) {
1454 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001456 if (TYPE(n2) == test) {
1457 upper = ast_for_expr(c, n2);
1458 if (!upper)
1459 return NULL;
1460 }
1461 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 } else if (NCH(n) > 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001463 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001465 if (TYPE(n2) == test) {
1466 upper = ast_for_expr(c, n2);
1467 if (!upper)
1468 return NULL;
1469 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 }
1471
1472 ch = CHILD(n, NCH(n) - 1);
1473 if (TYPE(ch) == sliceop) {
Benjamin Peterson4879c902009-07-20 20:28:08 +00001474 if (NCH(ch) == 1) {
1475 /*
1476 This is an extended slice (ie "x[::]") with no expression in the
1477 step field. We set this literally to "None" in order to
1478 disambiguate it from x[:]. (The interpreter might have to call
1479 __getslice__ for x[:], but it must call __getitem__ for x[::].)
1480 */
1481 identifier none = new_identifier("None", c->c_arena);
1482 if (!none)
1483 return NULL;
1484 ch = CHILD(ch, 0);
1485 step = Name(none, Load, LINENO(ch), ch->n_col_offset, c->c_arena);
1486 if (!step)
1487 return NULL;
1488 } else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001489 ch = CHILD(ch, 1);
1490 if (TYPE(ch) == test) {
1491 step = ast_for_expr(c, ch);
1492 if (!step)
1493 return NULL;
1494 }
1495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 }
1497
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001498 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499}
1500
1501static expr_ty
1502ast_for_binop(struct compiling *c, const node *n)
1503{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001504 /* Must account for a sequence of expressions.
1505 How should A op B op C by represented?
1506 BinOp(BinOp(A, op, B), op, C).
1507 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001509 int i, nops;
1510 expr_ty expr1, expr2, result;
1511 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001513 expr1 = ast_for_expr(c, CHILD(n, 0));
1514 if (!expr1)
1515 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001517 expr2 = ast_for_expr(c, CHILD(n, 2));
1518 if (!expr2)
1519 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001521 newoperator = get_operator(CHILD(n, 1));
1522 if (!newoperator)
1523 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001525 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1526 c->c_arena);
1527 if (!result)
1528 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001530 nops = (NCH(n) - 1) / 2;
1531 for (i = 1; i < nops; i++) {
1532 expr_ty tmp_result, tmp;
1533 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001535 newoperator = get_operator(next_oper);
1536 if (!newoperator)
1537 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001539 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1540 if (!tmp)
1541 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001543 tmp_result = BinOp(result, newoperator, tmp,
1544 LINENO(next_oper), next_oper->n_col_offset,
1545 c->c_arena);
Neal Norwitz3adac212007-10-05 03:41:19 +00001546 if (!tmp_result)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001547 return NULL;
1548 result = tmp_result;
1549 }
1550 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551}
1552
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001553static expr_ty
1554ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1555{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001556 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1557 subscriptlist: subscript (',' subscript)* [',']
1558 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1559 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001560 REQ(n, trailer);
1561 if (TYPE(CHILD(n, 0)) == LPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001562 if (NCH(n) == 2)
1563 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1564 n->n_col_offset, c->c_arena);
1565 else
1566 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001567 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001568 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001569 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1570 if (!attr_id)
1571 return NULL;
1572 return Attribute(left_expr, attr_id, Load,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001573 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001574 }
1575 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001576 REQ(CHILD(n, 0), LSQB);
1577 REQ(CHILD(n, 2), RSQB);
1578 n = CHILD(n, 1);
1579 if (NCH(n) == 1) {
1580 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1581 if (!slc)
1582 return NULL;
1583 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1584 c->c_arena);
1585 }
1586 else {
1587 /* The grammar is ambiguous here. The ambiguity is resolved
1588 by treating the sequence as a tuple literal if there are
1589 no slice features.
1590 */
1591 int j;
1592 slice_ty slc;
1593 expr_ty e;
1594 bool simple = true;
1595 asdl_seq *slices, *elts;
1596 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1597 if (!slices)
1598 return NULL;
1599 for (j = 0; j < NCH(n); j += 2) {
1600 slc = ast_for_slice(c, CHILD(n, j));
1601 if (!slc)
1602 return NULL;
1603 if (slc->kind != Index_kind)
1604 simple = false;
1605 asdl_seq_SET(slices, j / 2, slc);
1606 }
1607 if (!simple) {
1608 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1609 Load, LINENO(n), n->n_col_offset, c->c_arena);
1610 }
1611 /* extract Index values and put them in a Tuple */
1612 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1613 if (!elts)
1614 return NULL;
1615 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1616 slc = (slice_ty)asdl_seq_GET(slices, j);
1617 assert(slc->kind == Index_kind && slc->v.Index.value);
1618 asdl_seq_SET(elts, j, slc->v.Index.value);
1619 }
1620 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1621 if (!e)
1622 return NULL;
1623 return Subscript(left_expr, Index(e, c->c_arena),
1624 Load, LINENO(n), n->n_col_offset, c->c_arena);
1625 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001627}
1628
1629static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001630ast_for_factor(struct compiling *c, const node *n)
1631{
1632 node *pfactor, *ppower, *patom, *pnum;
1633 expr_ty expression;
1634
1635 /* If the unary - operator is applied to a constant, don't generate
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001636 a UNARY_NEGATIVE opcode. Just store the approriate value as a
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001637 constant. The peephole optimizer already does something like
1638 this but it doesn't handle the case where the constant is
1639 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1640 PyLongObject.
1641 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001642 if (TYPE(CHILD(n, 0)) == MINUS &&
1643 NCH(n) == 2 &&
1644 TYPE((pfactor = CHILD(n, 1))) == factor &&
1645 NCH(pfactor) == 1 &&
1646 TYPE((ppower = CHILD(pfactor, 0))) == power &&
1647 NCH(ppower) == 1 &&
1648 TYPE((patom = CHILD(ppower, 0))) == atom &&
1649 TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1650 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1651 if (s == NULL)
1652 return NULL;
1653 s[0] = '-';
1654 strcpy(s + 1, STR(pnum));
1655 PyObject_FREE(STR(pnum));
1656 STR(pnum) = s;
1657 return ast_for_atom(c, patom);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001658 }
1659
1660 expression = ast_for_expr(c, CHILD(n, 1));
1661 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001662 return NULL;
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001663
1664 switch (TYPE(CHILD(n, 0))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001665 case PLUS:
1666 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1667 c->c_arena);
1668 case MINUS:
1669 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1670 c->c_arena);
1671 case TILDE:
1672 return UnaryOp(Invert, expression, LINENO(n),
1673 n->n_col_offset, c->c_arena);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001674 }
1675 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001676 TYPE(CHILD(n, 0)));
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001677 return NULL;
1678}
1679
1680static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001681ast_for_power(struct compiling *c, const node *n)
1682{
1683 /* power: atom trailer* ('**' factor)*
1684 */
1685 int i;
1686 expr_ty e, tmp;
1687 REQ(n, power);
1688 e = ast_for_atom(c, CHILD(n, 0));
1689 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001690 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001691 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001692 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001693 for (i = 1; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001694 node *ch = CHILD(n, i);
1695 if (TYPE(ch) != trailer)
1696 break;
1697 tmp = ast_for_trailer(c, ch, e);
1698 if (!tmp)
1699 return NULL;
1700 tmp->lineno = e->lineno;
1701 tmp->col_offset = e->col_offset;
1702 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001703 }
1704 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001705 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1706 if (!f)
1707 return NULL;
1708 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1709 if (!tmp)
1710 return NULL;
1711 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001712 }
1713 return e;
1714}
1715
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716/* Do not name a variable 'expr'! Will cause a compile error.
1717*/
1718
1719static expr_ty
1720ast_for_expr(struct compiling *c, const node *n)
1721{
1722 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001723 test: or_test ['if' or_test 'else' test] | lambdef
1724 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725 and_test: not_test ('and' not_test)*
1726 not_test: 'not' not_test | comparison
1727 comparison: expr (comp_op expr)*
1728 expr: xor_expr ('|' xor_expr)*
1729 xor_expr: and_expr ('^' and_expr)*
1730 and_expr: shift_expr ('&' shift_expr)*
1731 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1732 arith_expr: term (('+'|'-') term)*
1733 term: factor (('*'|'/'|'%'|'//') factor)*
1734 factor: ('+'|'-'|'~') factor | power
1735 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001736
1737 As well as modified versions that exist for backward compatibility,
1738 to explicitly allow:
1739 [ x for x in lambda: 0, lambda: 1 ]
1740 (which would be ambiguous without these extra rules)
1741
1742 old_test: or_test | old_lambdef
1743 old_lambdef: 'lambda' [vararglist] ':' old_test
1744
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 */
1746
1747 asdl_seq *seq;
1748 int i;
1749
1750 loop:
1751 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001752 case test:
1753 case old_test:
1754 if (TYPE(CHILD(n, 0)) == lambdef ||
1755 TYPE(CHILD(n, 0)) == old_lambdef)
1756 return ast_for_lambdef(c, CHILD(n, 0));
1757 else if (NCH(n) > 1)
1758 return ast_for_ifexpr(c, n);
1759 /* Fallthrough */
1760 case or_test:
1761 case and_test:
1762 if (NCH(n) == 1) {
1763 n = CHILD(n, 0);
1764 goto loop;
1765 }
1766 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1767 if (!seq)
1768 return NULL;
1769 for (i = 0; i < NCH(n); i += 2) {
1770 expr_ty e = ast_for_expr(c, CHILD(n, i));
1771 if (!e)
1772 return NULL;
1773 asdl_seq_SET(seq, i / 2, e);
1774 }
1775 if (!strcmp(STR(CHILD(n, 1)), "and"))
1776 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1777 c->c_arena);
1778 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1779 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1780 case not_test:
1781 if (NCH(n) == 1) {
1782 n = CHILD(n, 0);
1783 goto loop;
1784 }
1785 else {
1786 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1787 if (!expression)
1788 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001789
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001790 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1791 c->c_arena);
1792 }
1793 case comparison:
1794 if (NCH(n) == 1) {
1795 n = CHILD(n, 0);
1796 goto loop;
1797 }
1798 else {
1799 expr_ty expression;
1800 asdl_int_seq *ops;
1801 asdl_seq *cmps;
1802 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1803 if (!ops)
1804 return NULL;
1805 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1806 if (!cmps) {
1807 return NULL;
1808 }
1809 for (i = 1; i < NCH(n); i += 2) {
1810 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001812 newoperator = ast_for_comp_op(c, CHILD(n, i));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001813 if (!newoperator) {
1814 return NULL;
1815 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001817 expression = ast_for_expr(c, CHILD(n, i + 1));
1818 if (!expression) {
1819 return NULL;
1820 }
1821
1822 asdl_seq_SET(ops, i / 2, newoperator);
1823 asdl_seq_SET(cmps, i / 2, expression);
1824 }
1825 expression = ast_for_expr(c, CHILD(n, 0));
1826 if (!expression) {
1827 return NULL;
1828 }
1829
1830 return Compare(expression, ops, cmps, LINENO(n),
1831 n->n_col_offset, c->c_arena);
1832 }
1833 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001835 /* The next five cases all handle BinOps. The main body of code
1836 is the same in each case, but the switch turned inside out to
1837 reuse the code for each type of operator.
1838 */
1839 case expr:
1840 case xor_expr:
1841 case and_expr:
1842 case shift_expr:
1843 case arith_expr:
1844 case term:
1845 if (NCH(n) == 1) {
1846 n = CHILD(n, 0);
1847 goto loop;
1848 }
1849 return ast_for_binop(c, n);
1850 case yield_expr: {
1851 expr_ty exp = NULL;
1852 if (NCH(n) == 2) {
1853 exp = ast_for_testlist(c, CHILD(n, 1));
1854 if (!exp)
1855 return NULL;
1856 }
1857 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1858 }
1859 case factor:
1860 if (NCH(n) == 1) {
1861 n = CHILD(n, 0);
1862 goto loop;
1863 }
1864 return ast_for_factor(c, n);
1865 case power:
1866 return ast_for_power(c, n);
1867 default:
1868 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1869 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001871 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 return NULL;
1873}
1874
1875static expr_ty
1876ast_for_call(struct compiling *c, const node *n, expr_ty func)
1877{
1878 /*
1879 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001880 | '**' test)
1881 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 */
1883
1884 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001885 asdl_seq *args;
1886 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 expr_ty vararg = NULL, kwarg = NULL;
1888
1889 REQ(n, arglist);
1890
1891 nargs = 0;
1892 nkeywords = 0;
1893 ngens = 0;
1894 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001895 node *ch = CHILD(n, i);
1896 if (TYPE(ch) == argument) {
1897 if (NCH(ch) == 1)
1898 nargs++;
1899 else if (TYPE(CHILD(ch, 1)) == gen_for)
1900 ngens++;
1901 else
1902 nkeywords++;
1903 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 }
1905 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001906 ast_error(n, "Generator expression must be parenthesized "
1907 "if not sole argument");
1908 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 }
1910
1911 if (nargs + nkeywords + ngens > 255) {
1912 ast_error(n, "more than 255 arguments");
1913 return NULL;
1914 }
1915
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001916 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001918 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001919 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001920 if (!keywords)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001921 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 nargs = 0;
1923 nkeywords = 0;
1924 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001925 node *ch = CHILD(n, i);
1926 if (TYPE(ch) == argument) {
1927 expr_ty e;
1928 if (NCH(ch) == 1) {
1929 if (nkeywords) {
1930 ast_error(CHILD(ch, 0),
1931 "non-keyword arg after keyword arg");
1932 return NULL;
1933 }
Benjamin Peterson80f0ed52008-08-19 19:52:46 +00001934 if (vararg) {
1935 ast_error(CHILD(ch, 0),
1936 "only named arguments may follow *expression");
1937 return NULL;
1938 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001939 e = ast_for_expr(c, CHILD(ch, 0));
1940 if (!e)
1941 return NULL;
1942 asdl_seq_SET(args, nargs++, e);
1943 }
1944 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1945 e = ast_for_genexp(c, ch);
1946 if (!e)
1947 return NULL;
1948 asdl_seq_SET(args, nargs++, e);
1949 }
1950 else {
1951 keyword_ty kw;
1952 identifier key;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001953 int k;
1954 char *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001956 /* CHILD(ch, 0) is test, but must be an identifier? */
1957 e = ast_for_expr(c, CHILD(ch, 0));
1958 if (!e)
1959 return NULL;
1960 /* f(lambda x: x[0] = 3) ends up getting parsed with
1961 * LHS test = lambda x: x[0], and RHS test = 3.
1962 * SF bug 132313 points out that complaining about a keyword
1963 * then is very confusing.
1964 */
1965 if (e->kind == Lambda_kind) {
1966 ast_error(CHILD(ch, 0),
1967 "lambda cannot contain assignment");
1968 return NULL;
1969 } else if (e->kind != Name_kind) {
1970 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1971 return NULL;
1972 }
1973 key = e->v.Name.id;
Benjamin Petersond5efd202008-06-08 22:52:37 +00001974 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
Georg Brandle06cf452007-06-07 13:23:24 +00001975 return NULL;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001976 for (k = 0; k < nkeywords; k++) {
1977 tmp = PyString_AS_STRING(
1978 ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
1979 if (!strcmp(tmp, PyString_AS_STRING(key))) {
1980 ast_error(CHILD(ch, 0), "keyword argument repeated");
1981 return NULL;
1982 }
1983 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001984 e = ast_for_expr(c, CHILD(ch, 2));
1985 if (!e)
1986 return NULL;
1987 kw = keyword(key, e, c->c_arena);
1988 if (!kw)
1989 return NULL;
1990 asdl_seq_SET(keywords, nkeywords++, kw);
1991 }
1992 }
1993 else if (TYPE(ch) == STAR) {
1994 vararg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001995 if (!vararg)
1996 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001997 i++;
1998 }
1999 else if (TYPE(ch) == DOUBLESTAR) {
2000 kwarg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00002001 if (!kwarg)
2002 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002003 i++;
2004 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 }
2006
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002007 return Call(func, args, keywords, vararg, kwarg, func->lineno,
2008 func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009}
2010
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002012ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002014 /* testlist_gexp: test (',' test)* [','] */
2015 /* testlist: test (',' test)* [','] */
2016 /* testlist_safe: test (',' test)+ [','] */
2017 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002019 if (TYPE(n) == testlist_gexp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002020 if (NCH(n) > 1)
2021 assert(TYPE(CHILD(n, 1)) != gen_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002022 }
2023 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002024 assert(TYPE(n) == testlist ||
2025 TYPE(n) == testlist_safe ||
2026 TYPE(n) == testlist1);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002027 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002029 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002031 asdl_seq *tmp = seq_for_testlist(c, n);
2032 if (!tmp)
2033 return NULL;
2034 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002036}
2037
2038static expr_ty
2039ast_for_testlist_gexp(struct compiling *c, const node* n)
2040{
2041 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2042 /* argument: test [ gen_for ] */
2043 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002044 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002045 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002046 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002047}
2048
2049/* like ast_for_testlist() but returns a sequence */
2050static asdl_seq*
2051ast_for_class_bases(struct compiling *c, const node* n)
2052{
2053 /* testlist: test (',' test)* [','] */
2054 assert(NCH(n) > 0);
2055 REQ(n, testlist);
2056 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002057 expr_ty base;
2058 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
2059 if (!bases)
2060 return NULL;
2061 base = ast_for_expr(c, CHILD(n, 0));
2062 if (!base)
2063 return NULL;
2064 asdl_seq_SET(bases, 0, base);
2065 return bases;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002066 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002067
2068 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069}
2070
2071static stmt_ty
2072ast_for_expr_stmt(struct compiling *c, const node *n)
2073{
2074 REQ(n, expr_stmt);
2075 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002076 | ('=' (yield_expr|testlist))*)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 testlist: test (',' test)* [',']
2078 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002079 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 test: ... here starts the operator precendence dance
2081 */
2082
2083 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002084 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
2085 if (!e)
2086 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002088 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 }
2090 else if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002091 expr_ty expr1, expr2;
2092 operator_ty newoperator;
2093 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002095 expr1 = ast_for_testlist(c, ch);
2096 if (!expr1)
2097 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002098 if(!set_context(c, expr1, Store, ch))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002099 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002101 ch = CHILD(n, 2);
2102 if (TYPE(ch) == testlist)
2103 expr2 = ast_for_testlist(c, ch);
2104 else
2105 expr2 = ast_for_expr(c, ch);
2106 if (!expr2)
2107 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002109 newoperator = ast_for_augassign(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002110 if (!newoperator)
2111 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002113 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2114 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 }
2116 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002117 int i;
2118 asdl_seq *targets;
2119 node *value;
2120 expr_ty expression;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002122 /* a normal assignment */
2123 REQ(CHILD(n, 1), EQUAL);
2124 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2125 if (!targets)
2126 return NULL;
2127 for (i = 0; i < NCH(n) - 2; i += 2) {
2128 expr_ty e;
2129 node *ch = CHILD(n, i);
Benjamin Petersonb2664812009-06-11 17:49:38 +00002130 if (TYPE(ch) == yield_expr) {
2131 ast_error(ch, "assignment to yield expression not possible");
2132 return NULL;
2133 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002134 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002136 /* set context to assign */
2137 if (!e)
2138 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002140 if (!set_context(c, e, Store, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002141 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002143 asdl_seq_SET(targets, i / 2, e);
2144 }
2145 value = CHILD(n, NCH(n) - 1);
2146 if (TYPE(value) == testlist)
2147 expression = ast_for_testlist(c, value);
2148 else
2149 expression = ast_for_expr(c, value);
2150 if (!expression)
2151 return NULL;
2152 return Assign(targets, expression, LINENO(n), n->n_col_offset,
2153 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155}
2156
2157static stmt_ty
2158ast_for_print_stmt(struct compiling *c, const node *n)
2159{
2160 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002161 | '>>' test [ (',' test)+ [','] ] )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 */
2163 expr_ty dest = NULL, expression;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002164 asdl_seq *seq = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165 bool nl;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002166 int i, j, values_count, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167
2168 REQ(n, print_stmt);
2169 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002170 dest = ast_for_expr(c, CHILD(n, 2));
2171 if (!dest)
2172 return NULL;
2173 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174 }
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002175 values_count = (NCH(n) + 1 - start) / 2;
2176 if (values_count) {
2177 seq = asdl_seq_new(values_count, c->c_arena);
2178 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002179 return NULL;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002180 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
2181 expression = ast_for_expr(c, CHILD(n, i));
2182 if (!expression)
2183 return NULL;
2184 asdl_seq_SET(seq, j, expression);
2185 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 }
2187 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002188 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189}
2190
2191static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002192ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193{
2194 asdl_seq *seq;
2195 int i;
2196 expr_ty e;
2197
2198 REQ(n, exprlist);
2199
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002200 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002202 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002204 e = ast_for_expr(c, CHILD(n, i));
2205 if (!e)
2206 return NULL;
2207 asdl_seq_SET(seq, i / 2, e);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002208 if (context && !set_context(c, e, context, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002209 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002210 }
2211 return seq;
2212}
2213
2214static stmt_ty
2215ast_for_del_stmt(struct compiling *c, const node *n)
2216{
2217 asdl_seq *expr_list;
2218
2219 /* del_stmt: 'del' exprlist */
2220 REQ(n, del_stmt);
2221
2222 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2223 if (!expr_list)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002224 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002225 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226}
2227
2228static stmt_ty
2229ast_for_flow_stmt(struct compiling *c, const node *n)
2230{
2231 /*
2232 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002233 | yield_stmt
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 break_stmt: 'break'
2235 continue_stmt: 'continue'
2236 return_stmt: 'return' [testlist]
2237 yield_stmt: yield_expr
2238 yield_expr: 'yield' testlist
2239 raise_stmt: 'raise' [test [',' test [',' test]]]
2240 */
2241 node *ch;
2242
2243 REQ(n, flow_stmt);
2244 ch = CHILD(n, 0);
2245 switch (TYPE(ch)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002246 case break_stmt:
2247 return Break(LINENO(n), n->n_col_offset, c->c_arena);
2248 case continue_stmt:
2249 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2250 case yield_stmt: { /* will reduce to yield_expr */
2251 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2252 if (!exp)
2253 return NULL;
2254 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2255 }
2256 case return_stmt:
2257 if (NCH(ch) == 1)
2258 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2259 else {
2260 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2261 if (!expression)
2262 return NULL;
2263 return Return(expression, LINENO(n), n->n_col_offset,
2264 c->c_arena);
2265 }
2266 case raise_stmt:
2267 if (NCH(ch) == 1)
2268 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2269 c->c_arena);
2270 else if (NCH(ch) == 2) {
2271 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2272 if (!expression)
2273 return NULL;
2274 return Raise(expression, NULL, NULL, LINENO(n),
2275 n->n_col_offset, c->c_arena);
2276 }
2277 else if (NCH(ch) == 4) {
2278 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002280 expr1 = ast_for_expr(c, CHILD(ch, 1));
2281 if (!expr1)
2282 return NULL;
2283 expr2 = ast_for_expr(c, CHILD(ch, 3));
2284 if (!expr2)
2285 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002287 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2288 c->c_arena);
2289 }
2290 else if (NCH(ch) == 6) {
2291 expr_ty expr1, expr2, expr3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002293 expr1 = ast_for_expr(c, CHILD(ch, 1));
2294 if (!expr1)
2295 return NULL;
2296 expr2 = ast_for_expr(c, CHILD(ch, 3));
2297 if (!expr2)
2298 return NULL;
2299 expr3 = ast_for_expr(c, CHILD(ch, 5));
2300 if (!expr3)
2301 return NULL;
2302
2303 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2304 c->c_arena);
2305 }
2306 default:
2307 PyErr_Format(PyExc_SystemError,
2308 "unexpected flow_stmt: %d", TYPE(ch));
2309 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002311
2312 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2313 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314}
2315
2316static alias_ty
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002317alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318{
2319 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002320 import_as_name: NAME ['as' NAME]
2321 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 dotted_name: NAME ('.' NAME)*
2323 */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002324 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002325
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 loop:
2327 switch (TYPE(n)) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002328 case import_as_name: {
2329 node *name_node = CHILD(n, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002330 str = NULL;
2331 if (NCH(n) == 3) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002332 node *str_node = CHILD(n, 2);
2333 if (store && !forbidden_check(c, str_node, STR(str_node)))
2334 return NULL;
2335 str = NEW_IDENTIFIER(str_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002336 if (!str)
2337 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002338 }
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002339 else {
2340 if (!forbidden_check(c, name_node, STR(name_node)))
2341 return NULL;
2342 }
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002343 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002344 if (!name)
2345 return NULL;
2346 return alias(name, str, c->c_arena);
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002347 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002348 case dotted_as_name:
2349 if (NCH(n) == 1) {
2350 n = CHILD(n, 0);
2351 goto loop;
2352 }
2353 else {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002354 node *asname_node = CHILD(n, 2);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002355 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002356 if (!a)
2357 return NULL;
2358 assert(!a->asname);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002359 if (!forbidden_check(c, asname_node, STR(asname_node)))
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002360 return NULL;
2361 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002362 if (!a->asname)
2363 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002364 return a;
2365 }
2366 break;
2367 case dotted_name:
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002368 if (NCH(n) == 1) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002369 node *name_node = CHILD(n, 0);
2370 if (store && !forbidden_check(c, name_node, STR(name_node)))
2371 return NULL;
2372 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002373 if (!name)
2374 return NULL;
2375 return alias(name, NULL, c->c_arena);
2376 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002377 else {
2378 /* Create a string of the form "a.b.c" */
2379 int i;
2380 size_t len;
2381 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002382
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002383 len = 0;
2384 for (i = 0; i < NCH(n); i += 2)
2385 /* length of string plus one for the dot */
2386 len += strlen(STR(CHILD(n, i))) + 1;
2387 len--; /* the last name doesn't have a dot */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002388 str = PyString_FromStringAndSize(NULL, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002389 if (!str)
2390 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002391 s = PyString_AS_STRING(str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002392 if (!s)
2393 return NULL;
2394 for (i = 0; i < NCH(n); i += 2) {
2395 char *sch = STR(CHILD(n, i));
2396 strcpy(s, STR(CHILD(n, i)));
2397 s += strlen(sch);
2398 *s++ = '.';
2399 }
2400 --s;
2401 *s = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002402 PyString_InternInPlace(&str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002403 PyArena_AddPyObject(c->c_arena, str);
2404 return alias(str, NULL, c->c_arena);
2405 }
2406 break;
2407 case STAR:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002408 str = PyString_InternFromString("*");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002409 PyArena_AddPyObject(c->c_arena, str);
2410 return alias(str, NULL, c->c_arena);
2411 default:
2412 PyErr_Format(PyExc_SystemError,
2413 "unexpected import name: %d", TYPE(n));
2414 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002416
2417 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 return NULL;
2419}
2420
2421static stmt_ty
2422ast_for_import_stmt(struct compiling *c, const node *n)
2423{
2424 /*
2425 import_stmt: import_name | import_from
2426 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002427 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002428 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002430 int lineno;
2431 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 int i;
2433 asdl_seq *aliases;
2434
2435 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002436 lineno = LINENO(n);
2437 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002439 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002440 n = CHILD(n, 1);
2441 REQ(n, dotted_as_names);
2442 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2443 if (!aliases)
2444 return NULL;
2445 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002446 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002447 if (!import_alias)
2448 return NULL;
2449 asdl_seq_SET(aliases, i / 2, import_alias);
2450 }
2451 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002453 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002454 int n_children;
2455 int idx, ndots = 0;
2456 alias_ty mod = NULL;
Benjamin Petersona72be3b2009-06-13 20:23:33 +00002457 identifier modname = NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002458
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002459 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002460 optional module name */
2461 for (idx = 1; idx < NCH(n); idx++) {
2462 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002463 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2464 if (!mod)
2465 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002466 idx++;
2467 break;
2468 } else if (TYPE(CHILD(n, idx)) != DOT) {
2469 break;
2470 }
2471 ndots++;
2472 }
2473 idx++; /* skip over the 'import' keyword */
2474 switch (TYPE(CHILD(n, idx))) {
2475 case STAR:
2476 /* from ... import * */
2477 n = CHILD(n, idx);
2478 n_children = 1;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002479 break;
2480 case LPAR:
2481 /* from ... import (x, y, z) */
2482 n = CHILD(n, idx + 1);
2483 n_children = NCH(n);
2484 break;
2485 case import_as_names:
2486 /* from ... import x, y, z */
2487 n = CHILD(n, idx);
2488 n_children = NCH(n);
2489 if (n_children % 2 == 0) {
2490 ast_error(n, "trailing comma not allowed without"
2491 " surrounding parentheses");
2492 return NULL;
2493 }
2494 break;
2495 default:
2496 ast_error(n, "Unexpected node-type in from-import");
2497 return NULL;
2498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002500 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2501 if (!aliases)
2502 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002504 /* handle "from ... import *" special b/c there's no children */
2505 if (TYPE(n) == STAR) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002506 alias_ty import_alias = alias_for_import_name(c, n, 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002507 if (!import_alias)
2508 return NULL;
2509 asdl_seq_SET(aliases, 0, import_alias);
2510 }
2511 else {
2512 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002513 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002514 if (!import_alias)
2515 return NULL;
2516 asdl_seq_SET(aliases, i / 2, import_alias);
2517 }
2518 }
2519 if (mod != NULL)
2520 modname = mod->name;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002521 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2522 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 }
Neal Norwitz79792652005-11-14 04:25:03 +00002524 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002525 "unknown import statement: starts with command '%s'",
2526 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 return NULL;
2528}
2529
2530static stmt_ty
2531ast_for_global_stmt(struct compiling *c, const node *n)
2532{
2533 /* global_stmt: 'global' NAME (',' NAME)* */
2534 identifier name;
2535 asdl_seq *s;
2536 int i;
2537
2538 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002539 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002541 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002543 name = NEW_IDENTIFIER(CHILD(n, i));
2544 if (!name)
2545 return NULL;
2546 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002548 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549}
2550
2551static stmt_ty
2552ast_for_exec_stmt(struct compiling *c, const node *n)
2553{
2554 expr_ty expr1, globals = NULL, locals = NULL;
2555 int n_children = NCH(n);
2556 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002557 PyErr_Format(PyExc_SystemError,
2558 "poorly formed 'exec' statement: %d parts to statement",
2559 n_children);
2560 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 }
2562
2563 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2564 REQ(n, exec_stmt);
2565 expr1 = ast_for_expr(c, CHILD(n, 1));
2566 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002567 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002569 globals = ast_for_expr(c, CHILD(n, 3));
2570 if (!globals)
2571 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 }
2573 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002574 locals = ast_for_expr(c, CHILD(n, 5));
2575 if (!locals)
2576 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 }
2578
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002579 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2580 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581}
2582
2583static stmt_ty
2584ast_for_assert_stmt(struct compiling *c, const node *n)
2585{
2586 /* assert_stmt: 'assert' test [',' test] */
2587 REQ(n, assert_stmt);
2588 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002589 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2590 if (!expression)
2591 return NULL;
2592 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2593 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 }
2595 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002596 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002598 expr1 = ast_for_expr(c, CHILD(n, 1));
2599 if (!expr1)
2600 return NULL;
2601 expr2 = ast_for_expr(c, CHILD(n, 3));
2602 if (!expr2)
2603 return NULL;
2604
2605 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 }
Neal Norwitz79792652005-11-14 04:25:03 +00002607 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002608 "improper number of parts to 'assert' statement: %d",
2609 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 return NULL;
2611}
2612
2613static asdl_seq *
2614ast_for_suite(struct compiling *c, const node *n)
2615{
2616 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002617 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 stmt_ty s;
2619 int i, total, num, end, pos = 0;
2620 node *ch;
2621
2622 REQ(n, suite);
2623
2624 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002625 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002627 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002629 n = CHILD(n, 0);
2630 /* simple_stmt always ends with a NEWLINE,
2631 and may have a trailing SEMI
2632 */
2633 end = NCH(n) - 1;
2634 if (TYPE(CHILD(n, end - 1)) == SEMI)
2635 end--;
2636 /* loop by 2 to skip semi-colons */
2637 for (i = 0; i < end; i += 2) {
2638 ch = CHILD(n, i);
2639 s = ast_for_stmt(c, ch);
2640 if (!s)
2641 return NULL;
2642 asdl_seq_SET(seq, pos++, s);
2643 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 }
2645 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002646 for (i = 2; i < (NCH(n) - 1); i++) {
2647 ch = CHILD(n, i);
2648 REQ(ch, stmt);
2649 num = num_stmts(ch);
2650 if (num == 1) {
2651 /* small_stmt or compound_stmt with only one child */
2652 s = ast_for_stmt(c, ch);
2653 if (!s)
2654 return NULL;
2655 asdl_seq_SET(seq, pos++, s);
2656 }
2657 else {
2658 int j;
2659 ch = CHILD(ch, 0);
2660 REQ(ch, simple_stmt);
2661 for (j = 0; j < NCH(ch); j += 2) {
2662 /* statement terminates with a semi-colon ';' */
2663 if (NCH(CHILD(ch, j)) == 0) {
2664 assert((j + 1) == NCH(ch));
2665 break;
2666 }
2667 s = ast_for_stmt(c, CHILD(ch, j));
2668 if (!s)
2669 return NULL;
2670 asdl_seq_SET(seq, pos++, s);
2671 }
2672 }
2673 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 }
2675 assert(pos == seq->size);
2676 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677}
2678
2679static stmt_ty
2680ast_for_if_stmt(struct compiling *c, const node *n)
2681{
2682 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2683 ['else' ':' suite]
2684 */
2685 char *s;
2686
2687 REQ(n, if_stmt);
2688
2689 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002690 expr_ty expression;
2691 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002693 expression = ast_for_expr(c, CHILD(n, 1));
2694 if (!expression)
2695 return NULL;
2696 suite_seq = ast_for_suite(c, CHILD(n, 3));
2697 if (!suite_seq)
2698 return NULL;
2699
2700 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2701 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002703
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 s = STR(CHILD(n, 4));
2705 /* s[2], the third character in the string, will be
2706 's' for el_s_e, or
2707 'i' for el_i_f
2708 */
2709 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002710 expr_ty expression;
2711 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002713 expression = ast_for_expr(c, CHILD(n, 1));
2714 if (!expression)
2715 return NULL;
2716 seq1 = ast_for_suite(c, CHILD(n, 3));
2717 if (!seq1)
2718 return NULL;
2719 seq2 = ast_for_suite(c, CHILD(n, 6));
2720 if (!seq2)
2721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002723 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2724 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 }
2726 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002727 int i, n_elif, has_else = 0;
2728 expr_ty expression;
2729 asdl_seq *suite_seq;
2730 asdl_seq *orelse = NULL;
2731 n_elif = NCH(n) - 4;
2732 /* must reference the child n_elif+1 since 'else' token is third,
2733 not fourth, child from the end. */
2734 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2735 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2736 has_else = 1;
2737 n_elif -= 3;
2738 }
2739 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002741 if (has_else) {
2742 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002744 orelse = asdl_seq_new(1, c->c_arena);
2745 if (!orelse)
2746 return NULL;
2747 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2748 if (!expression)
2749 return NULL;
2750 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2751 if (!suite_seq)
2752 return NULL;
2753 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2754 if (!suite_seq2)
2755 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002757 asdl_seq_SET(orelse, 0,
2758 If(expression, suite_seq, suite_seq2,
2759 LINENO(CHILD(n, NCH(n) - 6)),
2760 CHILD(n, NCH(n) - 6)->n_col_offset,
2761 c->c_arena));
2762 /* the just-created orelse handled the last elif */
2763 n_elif--;
2764 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002766 for (i = 0; i < n_elif; i++) {
2767 int off = 5 + (n_elif - i - 1) * 4;
2768 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2769 if (!newobj)
2770 return NULL;
2771 expression = ast_for_expr(c, CHILD(n, off));
2772 if (!expression)
2773 return NULL;
2774 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2775 if (!suite_seq)
2776 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002778 asdl_seq_SET(newobj, 0,
2779 If(expression, suite_seq, orelse,
2780 LINENO(CHILD(n, off)),
2781 CHILD(n, off)->n_col_offset, c->c_arena));
2782 orelse = newobj;
2783 }
2784 expression = ast_for_expr(c, CHILD(n, 1));
2785 if (!expression)
2786 return NULL;
2787 suite_seq = ast_for_suite(c, CHILD(n, 3));
2788 if (!suite_seq)
2789 return NULL;
2790 return If(expression, suite_seq, orelse,
2791 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002793
2794 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002795 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002796 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797}
2798
2799static stmt_ty
2800ast_for_while_stmt(struct compiling *c, const node *n)
2801{
2802 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2803 REQ(n, while_stmt);
2804
2805 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002806 expr_ty expression;
2807 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002809 expression = ast_for_expr(c, CHILD(n, 1));
2810 if (!expression)
2811 return NULL;
2812 suite_seq = ast_for_suite(c, CHILD(n, 3));
2813 if (!suite_seq)
2814 return NULL;
2815 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2816 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 }
2818 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002819 expr_ty expression;
2820 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002822 expression = ast_for_expr(c, CHILD(n, 1));
2823 if (!expression)
2824 return NULL;
2825 seq1 = ast_for_suite(c, CHILD(n, 3));
2826 if (!seq1)
2827 return NULL;
2828 seq2 = ast_for_suite(c, CHILD(n, 6));
2829 if (!seq2)
2830 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002832 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2833 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002835
2836 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002837 "wrong number of tokens for 'while' statement: %d",
2838 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002839 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840}
2841
2842static stmt_ty
2843ast_for_for_stmt(struct compiling *c, const node *n)
2844{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002845 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 expr_ty expression;
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00002847 expr_ty target, first;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002848 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2850 REQ(n, for_stmt);
2851
2852 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002853 seq = ast_for_suite(c, CHILD(n, 8));
2854 if (!seq)
2855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 }
2857
Neal Norwitzedef2be2006-07-12 05:26:17 +00002858 node_target = CHILD(n, 1);
2859 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002861 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002862 /* Check the # of children rather than the length of _target, since
2863 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00002864 first = (expr_ty)asdl_seq_GET(_target, 0);
Neal Norwitzedef2be2006-07-12 05:26:17 +00002865 if (NCH(node_target) == 1)
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00002866 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 else
Benjamin Petersonc0ba8282009-08-15 22:59:21 +00002868 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002870 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002871 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002872 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002874 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002875 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002877 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002878 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879}
2880
2881static excepthandler_ty
2882ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2883{
Collin Winter62903052007-05-18 23:11:24 +00002884 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885 REQ(exc, except_clause);
2886 REQ(body, suite);
2887
2888 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002889 asdl_seq *suite_seq = ast_for_suite(c, body);
2890 if (!suite_seq)
2891 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892
Georg Brandla48f3ab2008-03-30 06:40:17 +00002893 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002894 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895 }
2896 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002897 expr_ty expression;
2898 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002900 expression = ast_for_expr(c, CHILD(exc, 1));
2901 if (!expression)
2902 return NULL;
2903 suite_seq = ast_for_suite(c, body);
2904 if (!suite_seq)
2905 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906
Georg Brandla48f3ab2008-03-30 06:40:17 +00002907 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002908 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 }
2910 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002911 asdl_seq *suite_seq;
2912 expr_ty expression;
2913 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2914 if (!e)
2915 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002916 if (!set_context(c, e, Store, CHILD(exc, 3)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002917 return NULL;
2918 expression = ast_for_expr(c, CHILD(exc, 1));
2919 if (!expression)
2920 return NULL;
2921 suite_seq = ast_for_suite(c, body);
2922 if (!suite_seq)
2923 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924
Georg Brandla48f3ab2008-03-30 06:40:17 +00002925 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002926 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002928
2929 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002930 "wrong number of children for 'except' clause: %d",
2931 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002932 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933}
2934
2935static stmt_ty
2936ast_for_try_stmt(struct compiling *c, const node *n)
2937{
Neal Norwitzf599f422005-12-17 21:33:47 +00002938 const int nch = NCH(n);
2939 int n_except = (nch - 3)/3;
2940 asdl_seq *body, *orelse = NULL, *finally = NULL;
2941
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 REQ(n, try_stmt);
2943
Neal Norwitzf599f422005-12-17 21:33:47 +00002944 body = ast_for_suite(c, CHILD(n, 2));
2945 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002946 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947
Neal Norwitzf599f422005-12-17 21:33:47 +00002948 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002949 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2950 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2951 /* we can assume it's an "else",
2952 because nch >= 9 for try-else-finally and
2953 it would otherwise have a type of except_clause */
2954 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2955 if (orelse == NULL)
2956 return NULL;
2957 n_except--;
2958 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002960 finally = ast_for_suite(c, CHILD(n, nch - 1));
2961 if (finally == NULL)
2962 return NULL;
2963 n_except--;
2964 }
2965 else {
2966 /* we can assume it's an "else",
2967 otherwise it would have a type of except_clause */
2968 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2969 if (orelse == NULL)
2970 return NULL;
2971 n_except--;
2972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002974 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002975 ast_error(n, "malformed 'try' statement");
2976 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002978
2979 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002980 int i;
2981 stmt_ty except_st;
2982 /* process except statements to create a try ... except */
2983 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2984 if (handlers == NULL)
2985 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002986
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002987 for (i = 0; i < n_except; i++) {
2988 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2989 CHILD(n, 5 + i * 3));
2990 if (!e)
2991 return NULL;
2992 asdl_seq_SET(handlers, i, e);
2993 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002994
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002995 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2996 n->n_col_offset, c->c_arena);
2997 if (!finally)
2998 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002999
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003000 /* if a 'finally' is present too, we nest the TryExcept within a
3001 TryFinally to emulate try ... except ... finally */
3002 body = asdl_seq_new(1, c->c_arena);
3003 if (body == NULL)
3004 return NULL;
3005 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00003006 }
3007
3008 /* must be a try ... finally (except clauses are in body, if any exist) */
3009 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003010 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011}
3012
Georg Brandl944f6842009-05-25 21:02:56 +00003013/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003014static stmt_ty
Georg Brandl944f6842009-05-25 21:02:56 +00003015ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003016{
3017 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003018
Georg Brandl944f6842009-05-25 21:02:56 +00003019 REQ(n, with_item);
3020 context_expr = ast_for_expr(c, CHILD(n, 0));
Collin Winter77c67bd2007-03-16 04:11:30 +00003021 if (!context_expr)
3022 return NULL;
Georg Brandl944f6842009-05-25 21:02:56 +00003023 if (NCH(n) == 3) {
3024 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003025
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003026 if (!optional_vars) {
3027 return NULL;
3028 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003029 if (!set_context(c, optional_vars, Store, n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003030 return NULL;
3031 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003032 }
3033
Georg Brandl944f6842009-05-25 21:02:56 +00003034 return With(context_expr, optional_vars, content, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003035 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003036}
3037
Georg Brandl944f6842009-05-25 21:02:56 +00003038/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3039static stmt_ty
3040ast_for_with_stmt(struct compiling *c, const node *n)
3041{
3042 int i;
3043 stmt_ty ret;
3044 asdl_seq *inner;
3045
3046 REQ(n, with_stmt);
3047
3048 /* process the with items inside-out */
3049 i = NCH(n) - 1;
3050 /* the suite of the innermost with item is the suite of the with stmt */
3051 inner = ast_for_suite(c, CHILD(n, i));
3052 if (!inner)
3053 return NULL;
3054
3055 for (;;) {
3056 i -= 2;
3057 ret = ast_for_with_item(c, CHILD(n, i), inner);
3058 if (!ret)
3059 return NULL;
3060 /* was this the last item? */
3061 if (i == 1)
3062 break;
3063 /* if not, wrap the result so far in a new sequence */
3064 inner = asdl_seq_new(1, c->c_arena);
3065 if (!inner)
3066 return NULL;
3067 asdl_seq_SET(inner, 0, ret);
3068 }
3069
3070 return ret;
3071}
3072
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +00003074ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075{
3076 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003077 PyObject *classname;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 asdl_seq *bases, *s;
3079
3080 REQ(n, classdef);
3081
Benjamin Petersond5efd202008-06-08 22:52:37 +00003082 if (!forbidden_check(c, n, STR(CHILD(n, 1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003083 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084
3085 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003086 s = ast_for_suite(c, CHILD(n, 3));
3087 if (!s)
3088 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003089 classname = NEW_IDENTIFIER(CHILD(n, 1));
3090 if (!classname)
3091 return NULL;
3092 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3093 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094 }
3095 /* check for empty base list */
3096 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003097 s = ast_for_suite(c, CHILD(n,5));
3098 if (!s)
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003099 return NULL;
3100 classname = NEW_IDENTIFIER(CHILD(n, 1));
3101 if (!classname)
3102 return NULL;
3103 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3104 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 }
3106
3107 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003108 bases = ast_for_class_bases(c, CHILD(n, 3));
3109 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003110 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111
3112 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003113 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003114 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003115 classname = NEW_IDENTIFIER(CHILD(n, 1));
3116 if (!classname)
3117 return NULL;
3118 return ClassDef(classname, bases, s, decorator_seq,
Christian Heimes5224d282008-02-23 15:01:05 +00003119 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003120}
3121
3122static stmt_ty
3123ast_for_stmt(struct compiling *c, const node *n)
3124{
3125 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003126 assert(NCH(n) == 1);
3127 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 }
3129 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003130 assert(num_stmts(n) == 1);
3131 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132 }
3133 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003134 n = CHILD(n, 0);
3135 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3136 | flow_stmt | import_stmt | global_stmt | exec_stmt
3137 | assert_stmt
3138 */
3139 switch (TYPE(n)) {
3140 case expr_stmt:
3141 return ast_for_expr_stmt(c, n);
3142 case print_stmt:
3143 return ast_for_print_stmt(c, n);
3144 case del_stmt:
3145 return ast_for_del_stmt(c, n);
3146 case pass_stmt:
3147 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3148 case flow_stmt:
3149 return ast_for_flow_stmt(c, n);
3150 case import_stmt:
3151 return ast_for_import_stmt(c, n);
3152 case global_stmt:
3153 return ast_for_global_stmt(c, n);
3154 case exec_stmt:
3155 return ast_for_exec_stmt(c, n);
3156 case assert_stmt:
3157 return ast_for_assert_stmt(c, n);
3158 default:
3159 PyErr_Format(PyExc_SystemError,
3160 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3161 TYPE(n), NCH(n));
3162 return NULL;
3163 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164 }
3165 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003166 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Christian Heimes5224d282008-02-23 15:01:05 +00003167 | funcdef | classdef | decorated
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003168 */
3169 node *ch = CHILD(n, 0);
3170 REQ(n, compound_stmt);
3171 switch (TYPE(ch)) {
3172 case if_stmt:
3173 return ast_for_if_stmt(c, ch);
3174 case while_stmt:
3175 return ast_for_while_stmt(c, ch);
3176 case for_stmt:
3177 return ast_for_for_stmt(c, ch);
3178 case try_stmt:
3179 return ast_for_try_stmt(c, ch);
3180 case with_stmt:
3181 return ast_for_with_stmt(c, ch);
3182 case funcdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003183 return ast_for_funcdef(c, ch, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003184 case classdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003185 return ast_for_classdef(c, ch, NULL);
3186 case decorated:
3187 return ast_for_decorated(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003188 default:
3189 PyErr_Format(PyExc_SystemError,
3190 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3191 TYPE(n), NCH(n));
3192 return NULL;
3193 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194 }
3195}
3196
3197static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003198parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003200 const char *end;
3201 long x;
3202 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203#ifndef WITHOUT_COMPLEX
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003204 Py_complex complex;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003205 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206#endif
3207
Mark Dickinson422ce062008-12-05 17:59:46 +00003208 assert(s != NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003209 errno = 0;
3210 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003212 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003214 if (*end == 'l' || *end == 'L')
3215 return PyLong_FromString((char *)s, (char **)0, 0);
Mark Dickinson64b7e502008-07-16 09:40:03 +00003216 x = PyOS_strtol((char *)s, (char **)&end, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003217 if (*end == '\0') {
3218 if (errno != 0)
3219 return PyLong_FromString((char *)s, (char **)0, 0);
3220 return PyInt_FromLong(x);
3221 }
3222 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003224 if (imflag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003225 complex.real = 0.;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003226 PyFPE_START_PROTECT("atof", return 0)
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003227 complex.imag = PyOS_ascii_atof(s);
3228 PyFPE_END_PROTECT(complex)
3229 return PyComplex_FromCComplex(complex);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003230 }
3231 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003233 {
3234 PyFPE_START_PROTECT("atof", return 0)
3235 dx = PyOS_ascii_atof(s);
3236 PyFPE_END_PROTECT(dx)
3237 return PyFloat_FromDouble(dx);
3238 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003239}
3240
3241static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003242decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243{
3244#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003245 Py_FatalError("decode_utf8 should not be called in this build.");
3246 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003248 PyObject *u, *v;
3249 char *s, *t;
3250 t = s = (char *)*sPtr;
3251 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3252 while (s < end && (*s & 0x80)) s++;
3253 *sPtr = s;
3254 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3255 if (u == NULL)
3256 return NULL;
3257 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3258 Py_DECREF(u);
3259 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003260#endif
3261}
3262
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003263#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003265decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003267 PyObject *v, *u;
3268 char *buf;
3269 char *p;
3270 const char *end;
3271 if (encoding == NULL) {
3272 buf = (char *)s;
3273 u = NULL;
3274 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3275 buf = (char *)s;
3276 u = NULL;
3277 } else {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003278 /* check for integer overflow */
3279 if (len > PY_SIZE_MAX / 4)
3280 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003281 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003282 u = PyString_FromStringAndSize((char *)NULL, len * 4);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003283 if (u == NULL)
3284 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003285 p = buf = PyString_AsString(u);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003286 end = s + len;
3287 while (s < end) {
3288 if (*s == '\\') {
3289 *p++ = *s++;
3290 if (*s & 0x80) {
3291 strcpy(p, "u005c");
3292 p += 5;
3293 }
3294 }
3295 if (*s & 0x80) { /* XXX inefficient */
3296 PyObject *w;
3297 char *r;
3298 Py_ssize_t rn, i;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003299 w = decode_utf8(c, &s, end, "utf-16-be");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003300 if (w == NULL) {
3301 Py_DECREF(u);
3302 return NULL;
3303 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003304 r = PyString_AsString(w);
3305 rn = PyString_Size(w);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003306 assert(rn % 2 == 0);
3307 for (i = 0; i < rn; i += 2) {
3308 sprintf(p, "\\u%02x%02x",
3309 r[i + 0] & 0xFF,
3310 r[i + 1] & 0xFF);
3311 p += 6;
3312 }
3313 Py_DECREF(w);
3314 } else {
3315 *p++ = *s++;
3316 }
3317 }
3318 len = p - buf;
3319 s = buf;
3320 }
3321 if (rawmode)
3322 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3323 else
3324 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3325 Py_XDECREF(u);
3326 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003328#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329
3330/* s is a Python string literal, including the bracketing quote characters,
3331 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3332 * parsestr parses it, and returns the decoded Python string object.
3333 */
3334static PyObject *
Christian Heimes3c608332008-03-26 22:01:37 +00003335parsestr(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003337 size_t len;
3338 int quote = Py_CHARMASK(*s);
3339 int rawmode = 0;
3340 int need_encoding;
Christian Heimes3c608332008-03-26 22:01:37 +00003341 int unicode = c->c_future_unicode;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003343 if (isalpha(quote) || quote == '_') {
3344 if (quote == 'u' || quote == 'U') {
3345 quote = *++s;
3346 unicode = 1;
3347 }
Christian Heimes288e89a2008-01-18 18:24:07 +00003348 if (quote == 'b' || quote == 'B') {
3349 quote = *++s;
Christian Heimes3c608332008-03-26 22:01:37 +00003350 unicode = 0;
Christian Heimes288e89a2008-01-18 18:24:07 +00003351 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003352 if (quote == 'r' || quote == 'R') {
3353 quote = *++s;
3354 rawmode = 1;
3355 }
3356 }
3357 if (quote != '\'' && quote != '\"') {
3358 PyErr_BadInternalCall();
3359 return NULL;
3360 }
3361 s++;
3362 len = strlen(s);
3363 if (len > INT_MAX) {
3364 PyErr_SetString(PyExc_OverflowError,
3365 "string to parse is too long");
3366 return NULL;
3367 }
3368 if (s[--len] != quote) {
3369 PyErr_BadInternalCall();
3370 return NULL;
3371 }
3372 if (len >= 4 && s[0] == quote && s[1] == quote) {
3373 s += 2;
3374 len -= 2;
3375 if (s[--len] != quote || s[--len] != quote) {
3376 PyErr_BadInternalCall();
3377 return NULL;
3378 }
3379 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003381 if (unicode || Py_UnicodeFlag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003382 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003383 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384#endif
Christian Heimes3c608332008-03-26 22:01:37 +00003385 need_encoding = (c->c_encoding != NULL &&
3386 strcmp(c->c_encoding, "utf-8") != 0 &&
3387 strcmp(c->c_encoding, "iso-8859-1") != 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003388 if (rawmode || strchr(s, '\\') == NULL) {
3389 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003391 /* This should not happen - we never see any other
3392 encoding. */
3393 Py_FatalError(
3394 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003396 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3397 if (u == NULL)
3398 return NULL;
Christian Heimes3c608332008-03-26 22:01:37 +00003399 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003400 Py_DECREF(u);
3401 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003402#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003403 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003404 return PyString_FromStringAndSize(s, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003405 }
3406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003408 return PyString_DecodeEscape(s, len, NULL, unicode,
Christian Heimes3c608332008-03-26 22:01:37 +00003409 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003410}
3411
3412/* Build a Python string object out of a STRING atom. This takes care of
3413 * compile-time literal catenation, calling parsestr() on each piece, and
3414 * pasting the intermediate results together.
3415 */
3416static PyObject *
3417parsestrplus(struct compiling *c, const node *n)
3418{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003419 PyObject *v;
3420 int i;
3421 REQ(CHILD(n, 0), STRING);
Christian Heimes3c608332008-03-26 22:01:37 +00003422 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003423 /* String literal concatenation */
3424 for (i = 1; i < NCH(n); i++) {
3425 PyObject *s;
Christian Heimes3c608332008-03-26 22:01:37 +00003426 s = parsestr(c, STR(CHILD(n, i)));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003427 if (s == NULL)
3428 goto onError;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003429 if (PyString_Check(v) && PyString_Check(s)) {
3430 PyString_ConcatAndDel(&v, s);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003431 if (v == NULL)
3432 goto onError;
3433 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003434#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003435 else {
3436 PyObject *temp = PyUnicode_Concat(v, s);
3437 Py_DECREF(s);
3438 Py_DECREF(v);
3439 v = temp;
3440 if (v == NULL)
3441 goto onError;
3442 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003443#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003444 }
3445 }
3446 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447
3448 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003449 Py_XDECREF(v);
3450 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003451}