blob: 4a85164d8cd5557440a7abdb5f169ebd9b1e54d9 [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 */
1050 expr_ty elt;
1051 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 */
1090 if (NCH(for_ch) == 1)
1091 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
1092 c->c_arena);
1093 else
1094 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1095 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;
1229 expr_ty expression;
1230 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. */
1244 if (NCH(for_ch) == 1)
1245 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1246 NULL, c->c_arena);
1247 else
1248 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1249 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 Peterson4afbba32009-06-13 01:40:00 +00001474 if (NCH(ch) != 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001475 ch = CHILD(ch, 1);
1476 if (TYPE(ch) == test) {
1477 step = ast_for_expr(c, ch);
1478 if (!step)
1479 return NULL;
1480 }
1481 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 }
1483
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001484 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485}
1486
1487static expr_ty
1488ast_for_binop(struct compiling *c, const node *n)
1489{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001490 /* Must account for a sequence of expressions.
1491 How should A op B op C by represented?
1492 BinOp(BinOp(A, op, B), op, C).
1493 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001495 int i, nops;
1496 expr_ty expr1, expr2, result;
1497 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001499 expr1 = ast_for_expr(c, CHILD(n, 0));
1500 if (!expr1)
1501 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001503 expr2 = ast_for_expr(c, CHILD(n, 2));
1504 if (!expr2)
1505 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001507 newoperator = get_operator(CHILD(n, 1));
1508 if (!newoperator)
1509 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001511 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1512 c->c_arena);
1513 if (!result)
1514 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001516 nops = (NCH(n) - 1) / 2;
1517 for (i = 1; i < nops; i++) {
1518 expr_ty tmp_result, tmp;
1519 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001521 newoperator = get_operator(next_oper);
1522 if (!newoperator)
1523 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001525 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1526 if (!tmp)
1527 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001529 tmp_result = BinOp(result, newoperator, tmp,
1530 LINENO(next_oper), next_oper->n_col_offset,
1531 c->c_arena);
Neal Norwitz3adac212007-10-05 03:41:19 +00001532 if (!tmp_result)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001533 return NULL;
1534 result = tmp_result;
1535 }
1536 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537}
1538
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001539static expr_ty
1540ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1541{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001542 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1543 subscriptlist: subscript (',' subscript)* [',']
1544 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1545 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001546 REQ(n, trailer);
1547 if (TYPE(CHILD(n, 0)) == LPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001548 if (NCH(n) == 2)
1549 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1550 n->n_col_offset, c->c_arena);
1551 else
1552 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001553 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001554 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001555 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1556 if (!attr_id)
1557 return NULL;
1558 return Attribute(left_expr, attr_id, Load,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001559 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001560 }
1561 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001562 REQ(CHILD(n, 0), LSQB);
1563 REQ(CHILD(n, 2), RSQB);
1564 n = CHILD(n, 1);
1565 if (NCH(n) == 1) {
1566 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1567 if (!slc)
1568 return NULL;
1569 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1570 c->c_arena);
1571 }
1572 else {
1573 /* The grammar is ambiguous here. The ambiguity is resolved
1574 by treating the sequence as a tuple literal if there are
1575 no slice features.
1576 */
1577 int j;
1578 slice_ty slc;
1579 expr_ty e;
1580 bool simple = true;
1581 asdl_seq *slices, *elts;
1582 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1583 if (!slices)
1584 return NULL;
1585 for (j = 0; j < NCH(n); j += 2) {
1586 slc = ast_for_slice(c, CHILD(n, j));
1587 if (!slc)
1588 return NULL;
1589 if (slc->kind != Index_kind)
1590 simple = false;
1591 asdl_seq_SET(slices, j / 2, slc);
1592 }
1593 if (!simple) {
1594 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1595 Load, LINENO(n), n->n_col_offset, c->c_arena);
1596 }
1597 /* extract Index values and put them in a Tuple */
1598 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1599 if (!elts)
1600 return NULL;
1601 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1602 slc = (slice_ty)asdl_seq_GET(slices, j);
1603 assert(slc->kind == Index_kind && slc->v.Index.value);
1604 asdl_seq_SET(elts, j, slc->v.Index.value);
1605 }
1606 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1607 if (!e)
1608 return NULL;
1609 return Subscript(left_expr, Index(e, c->c_arena),
1610 Load, LINENO(n), n->n_col_offset, c->c_arena);
1611 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001613}
1614
1615static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001616ast_for_factor(struct compiling *c, const node *n)
1617{
1618 node *pfactor, *ppower, *patom, *pnum;
1619 expr_ty expression;
1620
1621 /* If the unary - operator is applied to a constant, don't generate
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001622 a UNARY_NEGATIVE opcode. Just store the approriate value as a
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001623 constant. The peephole optimizer already does something like
1624 this but it doesn't handle the case where the constant is
1625 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1626 PyLongObject.
1627 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001628 if (TYPE(CHILD(n, 0)) == MINUS &&
1629 NCH(n) == 2 &&
1630 TYPE((pfactor = CHILD(n, 1))) == factor &&
1631 NCH(pfactor) == 1 &&
1632 TYPE((ppower = CHILD(pfactor, 0))) == power &&
1633 NCH(ppower) == 1 &&
1634 TYPE((patom = CHILD(ppower, 0))) == atom &&
1635 TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1636 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1637 if (s == NULL)
1638 return NULL;
1639 s[0] = '-';
1640 strcpy(s + 1, STR(pnum));
1641 PyObject_FREE(STR(pnum));
1642 STR(pnum) = s;
1643 return ast_for_atom(c, patom);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001644 }
1645
1646 expression = ast_for_expr(c, CHILD(n, 1));
1647 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001648 return NULL;
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001649
1650 switch (TYPE(CHILD(n, 0))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001651 case PLUS:
1652 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1653 c->c_arena);
1654 case MINUS:
1655 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1656 c->c_arena);
1657 case TILDE:
1658 return UnaryOp(Invert, expression, LINENO(n),
1659 n->n_col_offset, c->c_arena);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001660 }
1661 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001662 TYPE(CHILD(n, 0)));
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001663 return NULL;
1664}
1665
1666static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001667ast_for_power(struct compiling *c, const node *n)
1668{
1669 /* power: atom trailer* ('**' factor)*
1670 */
1671 int i;
1672 expr_ty e, tmp;
1673 REQ(n, power);
1674 e = ast_for_atom(c, CHILD(n, 0));
1675 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001676 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001677 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001678 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001679 for (i = 1; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001680 node *ch = CHILD(n, i);
1681 if (TYPE(ch) != trailer)
1682 break;
1683 tmp = ast_for_trailer(c, ch, e);
1684 if (!tmp)
1685 return NULL;
1686 tmp->lineno = e->lineno;
1687 tmp->col_offset = e->col_offset;
1688 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001689 }
1690 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001691 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1692 if (!f)
1693 return NULL;
1694 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1695 if (!tmp)
1696 return NULL;
1697 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001698 }
1699 return e;
1700}
1701
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702/* Do not name a variable 'expr'! Will cause a compile error.
1703*/
1704
1705static expr_ty
1706ast_for_expr(struct compiling *c, const node *n)
1707{
1708 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001709 test: or_test ['if' or_test 'else' test] | lambdef
1710 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711 and_test: not_test ('and' not_test)*
1712 not_test: 'not' not_test | comparison
1713 comparison: expr (comp_op expr)*
1714 expr: xor_expr ('|' xor_expr)*
1715 xor_expr: and_expr ('^' and_expr)*
1716 and_expr: shift_expr ('&' shift_expr)*
1717 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1718 arith_expr: term (('+'|'-') term)*
1719 term: factor (('*'|'/'|'%'|'//') factor)*
1720 factor: ('+'|'-'|'~') factor | power
1721 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001722
1723 As well as modified versions that exist for backward compatibility,
1724 to explicitly allow:
1725 [ x for x in lambda: 0, lambda: 1 ]
1726 (which would be ambiguous without these extra rules)
1727
1728 old_test: or_test | old_lambdef
1729 old_lambdef: 'lambda' [vararglist] ':' old_test
1730
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 */
1732
1733 asdl_seq *seq;
1734 int i;
1735
1736 loop:
1737 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001738 case test:
1739 case old_test:
1740 if (TYPE(CHILD(n, 0)) == lambdef ||
1741 TYPE(CHILD(n, 0)) == old_lambdef)
1742 return ast_for_lambdef(c, CHILD(n, 0));
1743 else if (NCH(n) > 1)
1744 return ast_for_ifexpr(c, n);
1745 /* Fallthrough */
1746 case or_test:
1747 case and_test:
1748 if (NCH(n) == 1) {
1749 n = CHILD(n, 0);
1750 goto loop;
1751 }
1752 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1753 if (!seq)
1754 return NULL;
1755 for (i = 0; i < NCH(n); i += 2) {
1756 expr_ty e = ast_for_expr(c, CHILD(n, i));
1757 if (!e)
1758 return NULL;
1759 asdl_seq_SET(seq, i / 2, e);
1760 }
1761 if (!strcmp(STR(CHILD(n, 1)), "and"))
1762 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1763 c->c_arena);
1764 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1765 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1766 case not_test:
1767 if (NCH(n) == 1) {
1768 n = CHILD(n, 0);
1769 goto loop;
1770 }
1771 else {
1772 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1773 if (!expression)
1774 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001776 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1777 c->c_arena);
1778 }
1779 case comparison:
1780 if (NCH(n) == 1) {
1781 n = CHILD(n, 0);
1782 goto loop;
1783 }
1784 else {
1785 expr_ty expression;
1786 asdl_int_seq *ops;
1787 asdl_seq *cmps;
1788 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1789 if (!ops)
1790 return NULL;
1791 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1792 if (!cmps) {
1793 return NULL;
1794 }
1795 for (i = 1; i < NCH(n); i += 2) {
1796 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001798 newoperator = ast_for_comp_op(c, CHILD(n, i));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001799 if (!newoperator) {
1800 return NULL;
1801 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001803 expression = ast_for_expr(c, CHILD(n, i + 1));
1804 if (!expression) {
1805 return NULL;
1806 }
1807
1808 asdl_seq_SET(ops, i / 2, newoperator);
1809 asdl_seq_SET(cmps, i / 2, expression);
1810 }
1811 expression = ast_for_expr(c, CHILD(n, 0));
1812 if (!expression) {
1813 return NULL;
1814 }
1815
1816 return Compare(expression, ops, cmps, LINENO(n),
1817 n->n_col_offset, c->c_arena);
1818 }
1819 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001821 /* The next five cases all handle BinOps. The main body of code
1822 is the same in each case, but the switch turned inside out to
1823 reuse the code for each type of operator.
1824 */
1825 case expr:
1826 case xor_expr:
1827 case and_expr:
1828 case shift_expr:
1829 case arith_expr:
1830 case term:
1831 if (NCH(n) == 1) {
1832 n = CHILD(n, 0);
1833 goto loop;
1834 }
1835 return ast_for_binop(c, n);
1836 case yield_expr: {
1837 expr_ty exp = NULL;
1838 if (NCH(n) == 2) {
1839 exp = ast_for_testlist(c, CHILD(n, 1));
1840 if (!exp)
1841 return NULL;
1842 }
1843 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1844 }
1845 case factor:
1846 if (NCH(n) == 1) {
1847 n = CHILD(n, 0);
1848 goto loop;
1849 }
1850 return ast_for_factor(c, n);
1851 case power:
1852 return ast_for_power(c, n);
1853 default:
1854 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001857 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 return NULL;
1859}
1860
1861static expr_ty
1862ast_for_call(struct compiling *c, const node *n, expr_ty func)
1863{
1864 /*
1865 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001866 | '**' test)
1867 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 */
1869
1870 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001871 asdl_seq *args;
1872 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 expr_ty vararg = NULL, kwarg = NULL;
1874
1875 REQ(n, arglist);
1876
1877 nargs = 0;
1878 nkeywords = 0;
1879 ngens = 0;
1880 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001881 node *ch = CHILD(n, i);
1882 if (TYPE(ch) == argument) {
1883 if (NCH(ch) == 1)
1884 nargs++;
1885 else if (TYPE(CHILD(ch, 1)) == gen_for)
1886 ngens++;
1887 else
1888 nkeywords++;
1889 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 }
1891 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001892 ast_error(n, "Generator expression must be parenthesized "
1893 "if not sole argument");
1894 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001895 }
1896
1897 if (nargs + nkeywords + ngens > 255) {
1898 ast_error(n, "more than 255 arguments");
1899 return NULL;
1900 }
1901
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001902 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001904 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001905 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 if (!keywords)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001907 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 nargs = 0;
1909 nkeywords = 0;
1910 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001911 node *ch = CHILD(n, i);
1912 if (TYPE(ch) == argument) {
1913 expr_ty e;
1914 if (NCH(ch) == 1) {
1915 if (nkeywords) {
1916 ast_error(CHILD(ch, 0),
1917 "non-keyword arg after keyword arg");
1918 return NULL;
1919 }
Benjamin Peterson80f0ed52008-08-19 19:52:46 +00001920 if (vararg) {
1921 ast_error(CHILD(ch, 0),
1922 "only named arguments may follow *expression");
1923 return NULL;
1924 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001925 e = ast_for_expr(c, CHILD(ch, 0));
1926 if (!e)
1927 return NULL;
1928 asdl_seq_SET(args, nargs++, e);
1929 }
1930 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1931 e = ast_for_genexp(c, ch);
1932 if (!e)
1933 return NULL;
1934 asdl_seq_SET(args, nargs++, e);
1935 }
1936 else {
1937 keyword_ty kw;
1938 identifier key;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001939 int k;
1940 char *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001942 /* CHILD(ch, 0) is test, but must be an identifier? */
1943 e = ast_for_expr(c, CHILD(ch, 0));
1944 if (!e)
1945 return NULL;
1946 /* f(lambda x: x[0] = 3) ends up getting parsed with
1947 * LHS test = lambda x: x[0], and RHS test = 3.
1948 * SF bug 132313 points out that complaining about a keyword
1949 * then is very confusing.
1950 */
1951 if (e->kind == Lambda_kind) {
1952 ast_error(CHILD(ch, 0),
1953 "lambda cannot contain assignment");
1954 return NULL;
1955 } else if (e->kind != Name_kind) {
1956 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1957 return NULL;
1958 }
1959 key = e->v.Name.id;
Benjamin Petersond5efd202008-06-08 22:52:37 +00001960 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
Georg Brandle06cf452007-06-07 13:23:24 +00001961 return NULL;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001962 for (k = 0; k < nkeywords; k++) {
1963 tmp = PyString_AS_STRING(
1964 ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
1965 if (!strcmp(tmp, PyString_AS_STRING(key))) {
1966 ast_error(CHILD(ch, 0), "keyword argument repeated");
1967 return NULL;
1968 }
1969 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001970 e = ast_for_expr(c, CHILD(ch, 2));
1971 if (!e)
1972 return NULL;
1973 kw = keyword(key, e, c->c_arena);
1974 if (!kw)
1975 return NULL;
1976 asdl_seq_SET(keywords, nkeywords++, kw);
1977 }
1978 }
1979 else if (TYPE(ch) == STAR) {
1980 vararg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001981 if (!vararg)
1982 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001983 i++;
1984 }
1985 else if (TYPE(ch) == DOUBLESTAR) {
1986 kwarg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001987 if (!kwarg)
1988 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001989 i++;
1990 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 }
1992
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001993 return Call(func, args, keywords, vararg, kwarg, func->lineno,
1994 func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995}
1996
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001998ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002000 /* testlist_gexp: test (',' test)* [','] */
2001 /* testlist: test (',' test)* [','] */
2002 /* testlist_safe: test (',' test)+ [','] */
2003 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002005 if (TYPE(n) == testlist_gexp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002006 if (NCH(n) > 1)
2007 assert(TYPE(CHILD(n, 1)) != gen_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002008 }
2009 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002010 assert(TYPE(n) == testlist ||
2011 TYPE(n) == testlist_safe ||
2012 TYPE(n) == testlist1);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002013 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002015 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002017 asdl_seq *tmp = seq_for_testlist(c, n);
2018 if (!tmp)
2019 return NULL;
2020 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002022}
2023
2024static expr_ty
2025ast_for_testlist_gexp(struct compiling *c, const node* n)
2026{
2027 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2028 /* argument: test [ gen_for ] */
2029 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002030 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002031 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002032 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002033}
2034
2035/* like ast_for_testlist() but returns a sequence */
2036static asdl_seq*
2037ast_for_class_bases(struct compiling *c, const node* n)
2038{
2039 /* testlist: test (',' test)* [','] */
2040 assert(NCH(n) > 0);
2041 REQ(n, testlist);
2042 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002043 expr_ty base;
2044 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
2045 if (!bases)
2046 return NULL;
2047 base = ast_for_expr(c, CHILD(n, 0));
2048 if (!base)
2049 return NULL;
2050 asdl_seq_SET(bases, 0, base);
2051 return bases;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002052 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002053
2054 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055}
2056
2057static stmt_ty
2058ast_for_expr_stmt(struct compiling *c, const node *n)
2059{
2060 REQ(n, expr_stmt);
2061 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002062 | ('=' (yield_expr|testlist))*)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063 testlist: test (',' test)* [',']
2064 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002065 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002066 test: ... here starts the operator precendence dance
2067 */
2068
2069 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002070 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
2071 if (!e)
2072 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002074 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 }
2076 else if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002077 expr_ty expr1, expr2;
2078 operator_ty newoperator;
2079 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002081 expr1 = ast_for_testlist(c, ch);
2082 if (!expr1)
2083 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002084 if(!set_context(c, expr1, Store, ch))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002085 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002087 ch = CHILD(n, 2);
2088 if (TYPE(ch) == testlist)
2089 expr2 = ast_for_testlist(c, ch);
2090 else
2091 expr2 = ast_for_expr(c, ch);
2092 if (!expr2)
2093 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002095 newoperator = ast_for_augassign(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002096 if (!newoperator)
2097 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002099 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2100 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 }
2102 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002103 int i;
2104 asdl_seq *targets;
2105 node *value;
2106 expr_ty expression;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002108 /* a normal assignment */
2109 REQ(CHILD(n, 1), EQUAL);
2110 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2111 if (!targets)
2112 return NULL;
2113 for (i = 0; i < NCH(n) - 2; i += 2) {
2114 expr_ty e;
2115 node *ch = CHILD(n, i);
Benjamin Petersonb2664812009-06-11 17:49:38 +00002116 if (TYPE(ch) == yield_expr) {
2117 ast_error(ch, "assignment to yield expression not possible");
2118 return NULL;
2119 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002120 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002122 /* set context to assign */
2123 if (!e)
2124 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002126 if (!set_context(c, e, Store, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002127 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002129 asdl_seq_SET(targets, i / 2, e);
2130 }
2131 value = CHILD(n, NCH(n) - 1);
2132 if (TYPE(value) == testlist)
2133 expression = ast_for_testlist(c, value);
2134 else
2135 expression = ast_for_expr(c, value);
2136 if (!expression)
2137 return NULL;
2138 return Assign(targets, expression, LINENO(n), n->n_col_offset,
2139 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141}
2142
2143static stmt_ty
2144ast_for_print_stmt(struct compiling *c, const node *n)
2145{
2146 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002147 | '>>' test [ (',' test)+ [','] ] )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 */
2149 expr_ty dest = NULL, expression;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002150 asdl_seq *seq = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 bool nl;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002152 int i, j, values_count, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153
2154 REQ(n, print_stmt);
2155 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002156 dest = ast_for_expr(c, CHILD(n, 2));
2157 if (!dest)
2158 return NULL;
2159 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 }
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002161 values_count = (NCH(n) + 1 - start) / 2;
2162 if (values_count) {
2163 seq = asdl_seq_new(values_count, c->c_arena);
2164 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002165 return NULL;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002166 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
2167 expression = ast_for_expr(c, CHILD(n, i));
2168 if (!expression)
2169 return NULL;
2170 asdl_seq_SET(seq, j, expression);
2171 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 }
2173 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002174 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002175}
2176
2177static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002178ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179{
2180 asdl_seq *seq;
2181 int i;
2182 expr_ty e;
2183
2184 REQ(n, exprlist);
2185
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002186 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002188 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002190 e = ast_for_expr(c, CHILD(n, i));
2191 if (!e)
2192 return NULL;
2193 asdl_seq_SET(seq, i / 2, e);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002194 if (context && !set_context(c, e, context, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002195 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 }
2197 return seq;
2198}
2199
2200static stmt_ty
2201ast_for_del_stmt(struct compiling *c, const node *n)
2202{
2203 asdl_seq *expr_list;
2204
2205 /* del_stmt: 'del' exprlist */
2206 REQ(n, del_stmt);
2207
2208 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2209 if (!expr_list)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002210 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002211 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212}
2213
2214static stmt_ty
2215ast_for_flow_stmt(struct compiling *c, const node *n)
2216{
2217 /*
2218 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002219 | yield_stmt
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 break_stmt: 'break'
2221 continue_stmt: 'continue'
2222 return_stmt: 'return' [testlist]
2223 yield_stmt: yield_expr
2224 yield_expr: 'yield' testlist
2225 raise_stmt: 'raise' [test [',' test [',' test]]]
2226 */
2227 node *ch;
2228
2229 REQ(n, flow_stmt);
2230 ch = CHILD(n, 0);
2231 switch (TYPE(ch)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002232 case break_stmt:
2233 return Break(LINENO(n), n->n_col_offset, c->c_arena);
2234 case continue_stmt:
2235 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2236 case yield_stmt: { /* will reduce to yield_expr */
2237 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2238 if (!exp)
2239 return NULL;
2240 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2241 }
2242 case return_stmt:
2243 if (NCH(ch) == 1)
2244 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2245 else {
2246 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2247 if (!expression)
2248 return NULL;
2249 return Return(expression, LINENO(n), n->n_col_offset,
2250 c->c_arena);
2251 }
2252 case raise_stmt:
2253 if (NCH(ch) == 1)
2254 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2255 c->c_arena);
2256 else if (NCH(ch) == 2) {
2257 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2258 if (!expression)
2259 return NULL;
2260 return Raise(expression, NULL, NULL, LINENO(n),
2261 n->n_col_offset, c->c_arena);
2262 }
2263 else if (NCH(ch) == 4) {
2264 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002266 expr1 = ast_for_expr(c, CHILD(ch, 1));
2267 if (!expr1)
2268 return NULL;
2269 expr2 = ast_for_expr(c, CHILD(ch, 3));
2270 if (!expr2)
2271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002273 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2274 c->c_arena);
2275 }
2276 else if (NCH(ch) == 6) {
2277 expr_ty expr1, expr2, expr3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002279 expr1 = ast_for_expr(c, CHILD(ch, 1));
2280 if (!expr1)
2281 return NULL;
2282 expr2 = ast_for_expr(c, CHILD(ch, 3));
2283 if (!expr2)
2284 return NULL;
2285 expr3 = ast_for_expr(c, CHILD(ch, 5));
2286 if (!expr3)
2287 return NULL;
2288
2289 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2290 c->c_arena);
2291 }
2292 default:
2293 PyErr_Format(PyExc_SystemError,
2294 "unexpected flow_stmt: %d", TYPE(ch));
2295 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002297
2298 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2299 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300}
2301
2302static alias_ty
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002303alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304{
2305 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002306 import_as_name: NAME ['as' NAME]
2307 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 dotted_name: NAME ('.' NAME)*
2309 */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002310 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002311
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 loop:
2313 switch (TYPE(n)) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002314 case import_as_name: {
2315 node *name_node = CHILD(n, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002316 str = NULL;
2317 if (NCH(n) == 3) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002318 node *str_node = CHILD(n, 2);
2319 if (store && !forbidden_check(c, str_node, STR(str_node)))
2320 return NULL;
2321 str = NEW_IDENTIFIER(str_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002322 if (!str)
2323 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002324 }
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002325 else {
2326 if (!forbidden_check(c, name_node, STR(name_node)))
2327 return NULL;
2328 }
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002329 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002330 if (!name)
2331 return NULL;
2332 return alias(name, str, c->c_arena);
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002333 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002334 case dotted_as_name:
2335 if (NCH(n) == 1) {
2336 n = CHILD(n, 0);
2337 goto loop;
2338 }
2339 else {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002340 node *asname_node = CHILD(n, 2);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002341 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002342 if (!a)
2343 return NULL;
2344 assert(!a->asname);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002345 if (!forbidden_check(c, asname_node, STR(asname_node)))
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002346 return NULL;
2347 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002348 if (!a->asname)
2349 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002350 return a;
2351 }
2352 break;
2353 case dotted_name:
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002354 if (NCH(n) == 1) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002355 node *name_node = CHILD(n, 0);
2356 if (store && !forbidden_check(c, name_node, STR(name_node)))
2357 return NULL;
2358 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002359 if (!name)
2360 return NULL;
2361 return alias(name, NULL, c->c_arena);
2362 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002363 else {
2364 /* Create a string of the form "a.b.c" */
2365 int i;
2366 size_t len;
2367 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002369 len = 0;
2370 for (i = 0; i < NCH(n); i += 2)
2371 /* length of string plus one for the dot */
2372 len += strlen(STR(CHILD(n, i))) + 1;
2373 len--; /* the last name doesn't have a dot */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002374 str = PyString_FromStringAndSize(NULL, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002375 if (!str)
2376 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002377 s = PyString_AS_STRING(str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002378 if (!s)
2379 return NULL;
2380 for (i = 0; i < NCH(n); i += 2) {
2381 char *sch = STR(CHILD(n, i));
2382 strcpy(s, STR(CHILD(n, i)));
2383 s += strlen(sch);
2384 *s++ = '.';
2385 }
2386 --s;
2387 *s = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002388 PyString_InternInPlace(&str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002389 PyArena_AddPyObject(c->c_arena, str);
2390 return alias(str, NULL, c->c_arena);
2391 }
2392 break;
2393 case STAR:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002394 str = PyString_InternFromString("*");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002395 PyArena_AddPyObject(c->c_arena, str);
2396 return alias(str, NULL, c->c_arena);
2397 default:
2398 PyErr_Format(PyExc_SystemError,
2399 "unexpected import name: %d", TYPE(n));
2400 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002402
2403 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 return NULL;
2405}
2406
2407static stmt_ty
2408ast_for_import_stmt(struct compiling *c, const node *n)
2409{
2410 /*
2411 import_stmt: import_name | import_from
2412 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002413 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002414 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002416 int lineno;
2417 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 int i;
2419 asdl_seq *aliases;
2420
2421 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002422 lineno = LINENO(n);
2423 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002425 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002426 n = CHILD(n, 1);
2427 REQ(n, dotted_as_names);
2428 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2429 if (!aliases)
2430 return NULL;
2431 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002432 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002433 if (!import_alias)
2434 return NULL;
2435 asdl_seq_SET(aliases, i / 2, import_alias);
2436 }
2437 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002439 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002440 int n_children;
2441 int idx, ndots = 0;
2442 alias_ty mod = NULL;
2443 identifier modname;
2444
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002445 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002446 optional module name */
2447 for (idx = 1; idx < NCH(n); idx++) {
2448 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002449 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2450 if (!mod)
2451 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002452 idx++;
2453 break;
2454 } else if (TYPE(CHILD(n, idx)) != DOT) {
2455 break;
2456 }
2457 ndots++;
2458 }
2459 idx++; /* skip over the 'import' keyword */
2460 switch (TYPE(CHILD(n, idx))) {
2461 case STAR:
2462 /* from ... import * */
2463 n = CHILD(n, idx);
2464 n_children = 1;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002465 break;
2466 case LPAR:
2467 /* from ... import (x, y, z) */
2468 n = CHILD(n, idx + 1);
2469 n_children = NCH(n);
2470 break;
2471 case import_as_names:
2472 /* from ... import x, y, z */
2473 n = CHILD(n, idx);
2474 n_children = NCH(n);
2475 if (n_children % 2 == 0) {
2476 ast_error(n, "trailing comma not allowed without"
2477 " surrounding parentheses");
2478 return NULL;
2479 }
2480 break;
2481 default:
2482 ast_error(n, "Unexpected node-type in from-import");
2483 return NULL;
2484 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002486 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2487 if (!aliases)
2488 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002490 /* handle "from ... import *" special b/c there's no children */
2491 if (TYPE(n) == STAR) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002492 alias_ty import_alias = alias_for_import_name(c, n, 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002493 if (!import_alias)
2494 return NULL;
2495 asdl_seq_SET(aliases, 0, import_alias);
2496 }
2497 else {
2498 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002499 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002500 if (!import_alias)
2501 return NULL;
2502 asdl_seq_SET(aliases, i / 2, import_alias);
2503 }
2504 }
2505 if (mod != NULL)
2506 modname = mod->name;
2507 else
2508 modname = new_identifier("", c->c_arena);
2509 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2510 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 }
Neal Norwitz79792652005-11-14 04:25:03 +00002512 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002513 "unknown import statement: starts with command '%s'",
2514 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 return NULL;
2516}
2517
2518static stmt_ty
2519ast_for_global_stmt(struct compiling *c, const node *n)
2520{
2521 /* global_stmt: 'global' NAME (',' NAME)* */
2522 identifier name;
2523 asdl_seq *s;
2524 int i;
2525
2526 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002527 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002529 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002531 name = NEW_IDENTIFIER(CHILD(n, i));
2532 if (!name)
2533 return NULL;
2534 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002536 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537}
2538
2539static stmt_ty
2540ast_for_exec_stmt(struct compiling *c, const node *n)
2541{
2542 expr_ty expr1, globals = NULL, locals = NULL;
2543 int n_children = NCH(n);
2544 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002545 PyErr_Format(PyExc_SystemError,
2546 "poorly formed 'exec' statement: %d parts to statement",
2547 n_children);
2548 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 }
2550
2551 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2552 REQ(n, exec_stmt);
2553 expr1 = ast_for_expr(c, CHILD(n, 1));
2554 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002555 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002557 globals = ast_for_expr(c, CHILD(n, 3));
2558 if (!globals)
2559 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 }
2561 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002562 locals = ast_for_expr(c, CHILD(n, 5));
2563 if (!locals)
2564 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 }
2566
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002567 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2568 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569}
2570
2571static stmt_ty
2572ast_for_assert_stmt(struct compiling *c, const node *n)
2573{
2574 /* assert_stmt: 'assert' test [',' test] */
2575 REQ(n, assert_stmt);
2576 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002577 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2578 if (!expression)
2579 return NULL;
2580 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2581 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 }
2583 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002584 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002586 expr1 = ast_for_expr(c, CHILD(n, 1));
2587 if (!expr1)
2588 return NULL;
2589 expr2 = ast_for_expr(c, CHILD(n, 3));
2590 if (!expr2)
2591 return NULL;
2592
2593 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 }
Neal Norwitz79792652005-11-14 04:25:03 +00002595 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002596 "improper number of parts to 'assert' statement: %d",
2597 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 return NULL;
2599}
2600
2601static asdl_seq *
2602ast_for_suite(struct compiling *c, const node *n)
2603{
2604 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002605 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 stmt_ty s;
2607 int i, total, num, end, pos = 0;
2608 node *ch;
2609
2610 REQ(n, suite);
2611
2612 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002613 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002615 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002617 n = CHILD(n, 0);
2618 /* simple_stmt always ends with a NEWLINE,
2619 and may have a trailing SEMI
2620 */
2621 end = NCH(n) - 1;
2622 if (TYPE(CHILD(n, end - 1)) == SEMI)
2623 end--;
2624 /* loop by 2 to skip semi-colons */
2625 for (i = 0; i < end; i += 2) {
2626 ch = CHILD(n, i);
2627 s = ast_for_stmt(c, ch);
2628 if (!s)
2629 return NULL;
2630 asdl_seq_SET(seq, pos++, s);
2631 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 }
2633 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002634 for (i = 2; i < (NCH(n) - 1); i++) {
2635 ch = CHILD(n, i);
2636 REQ(ch, stmt);
2637 num = num_stmts(ch);
2638 if (num == 1) {
2639 /* small_stmt or compound_stmt with only one child */
2640 s = ast_for_stmt(c, ch);
2641 if (!s)
2642 return NULL;
2643 asdl_seq_SET(seq, pos++, s);
2644 }
2645 else {
2646 int j;
2647 ch = CHILD(ch, 0);
2648 REQ(ch, simple_stmt);
2649 for (j = 0; j < NCH(ch); j += 2) {
2650 /* statement terminates with a semi-colon ';' */
2651 if (NCH(CHILD(ch, j)) == 0) {
2652 assert((j + 1) == NCH(ch));
2653 break;
2654 }
2655 s = ast_for_stmt(c, CHILD(ch, j));
2656 if (!s)
2657 return NULL;
2658 asdl_seq_SET(seq, pos++, s);
2659 }
2660 }
2661 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 }
2663 assert(pos == seq->size);
2664 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665}
2666
2667static stmt_ty
2668ast_for_if_stmt(struct compiling *c, const node *n)
2669{
2670 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2671 ['else' ':' suite]
2672 */
2673 char *s;
2674
2675 REQ(n, if_stmt);
2676
2677 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002678 expr_ty expression;
2679 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002681 expression = ast_for_expr(c, CHILD(n, 1));
2682 if (!expression)
2683 return NULL;
2684 suite_seq = ast_for_suite(c, CHILD(n, 3));
2685 if (!suite_seq)
2686 return NULL;
2687
2688 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2689 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002691
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 s = STR(CHILD(n, 4));
2693 /* s[2], the third character in the string, will be
2694 's' for el_s_e, or
2695 'i' for el_i_f
2696 */
2697 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002698 expr_ty expression;
2699 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002701 expression = ast_for_expr(c, CHILD(n, 1));
2702 if (!expression)
2703 return NULL;
2704 seq1 = ast_for_suite(c, CHILD(n, 3));
2705 if (!seq1)
2706 return NULL;
2707 seq2 = ast_for_suite(c, CHILD(n, 6));
2708 if (!seq2)
2709 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002711 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2712 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 }
2714 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002715 int i, n_elif, has_else = 0;
2716 expr_ty expression;
2717 asdl_seq *suite_seq;
2718 asdl_seq *orelse = NULL;
2719 n_elif = NCH(n) - 4;
2720 /* must reference the child n_elif+1 since 'else' token is third,
2721 not fourth, child from the end. */
2722 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2723 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2724 has_else = 1;
2725 n_elif -= 3;
2726 }
2727 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002729 if (has_else) {
2730 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002732 orelse = asdl_seq_new(1, c->c_arena);
2733 if (!orelse)
2734 return NULL;
2735 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2736 if (!expression)
2737 return NULL;
2738 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2739 if (!suite_seq)
2740 return NULL;
2741 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2742 if (!suite_seq2)
2743 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002745 asdl_seq_SET(orelse, 0,
2746 If(expression, suite_seq, suite_seq2,
2747 LINENO(CHILD(n, NCH(n) - 6)),
2748 CHILD(n, NCH(n) - 6)->n_col_offset,
2749 c->c_arena));
2750 /* the just-created orelse handled the last elif */
2751 n_elif--;
2752 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002754 for (i = 0; i < n_elif; i++) {
2755 int off = 5 + (n_elif - i - 1) * 4;
2756 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2757 if (!newobj)
2758 return NULL;
2759 expression = ast_for_expr(c, CHILD(n, off));
2760 if (!expression)
2761 return NULL;
2762 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2763 if (!suite_seq)
2764 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002766 asdl_seq_SET(newobj, 0,
2767 If(expression, suite_seq, orelse,
2768 LINENO(CHILD(n, off)),
2769 CHILD(n, off)->n_col_offset, c->c_arena));
2770 orelse = newobj;
2771 }
2772 expression = ast_for_expr(c, CHILD(n, 1));
2773 if (!expression)
2774 return NULL;
2775 suite_seq = ast_for_suite(c, CHILD(n, 3));
2776 if (!suite_seq)
2777 return NULL;
2778 return If(expression, suite_seq, orelse,
2779 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002781
2782 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002783 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002784 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785}
2786
2787static stmt_ty
2788ast_for_while_stmt(struct compiling *c, const node *n)
2789{
2790 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2791 REQ(n, while_stmt);
2792
2793 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002794 expr_ty expression;
2795 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002797 expression = ast_for_expr(c, CHILD(n, 1));
2798 if (!expression)
2799 return NULL;
2800 suite_seq = ast_for_suite(c, CHILD(n, 3));
2801 if (!suite_seq)
2802 return NULL;
2803 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2804 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 }
2806 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002807 expr_ty expression;
2808 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002810 expression = ast_for_expr(c, CHILD(n, 1));
2811 if (!expression)
2812 return NULL;
2813 seq1 = ast_for_suite(c, CHILD(n, 3));
2814 if (!seq1)
2815 return NULL;
2816 seq2 = ast_for_suite(c, CHILD(n, 6));
2817 if (!seq2)
2818 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002820 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2821 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002823
2824 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002825 "wrong number of tokens for 'while' statement: %d",
2826 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002827 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828}
2829
2830static stmt_ty
2831ast_for_for_stmt(struct compiling *c, const node *n)
2832{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002833 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 expr_ty expression;
2835 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002836 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2838 REQ(n, for_stmt);
2839
2840 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002841 seq = ast_for_suite(c, CHILD(n, 8));
2842 if (!seq)
2843 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844 }
2845
Neal Norwitzedef2be2006-07-12 05:26:17 +00002846 node_target = CHILD(n, 1);
2847 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002848 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002849 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002850 /* Check the # of children rather than the length of _target, since
2851 for x, in ... has 1 element in _target, but still requires a Tuple. */
2852 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002853 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002855 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002857 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002858 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002861 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002862 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002864 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002865 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866}
2867
2868static excepthandler_ty
2869ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2870{
Collin Winter62903052007-05-18 23:11:24 +00002871 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 REQ(exc, except_clause);
2873 REQ(body, suite);
2874
2875 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002876 asdl_seq *suite_seq = ast_for_suite(c, body);
2877 if (!suite_seq)
2878 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879
Georg Brandla48f3ab2008-03-30 06:40:17 +00002880 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002881 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 }
2883 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002884 expr_ty expression;
2885 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002887 expression = ast_for_expr(c, CHILD(exc, 1));
2888 if (!expression)
2889 return NULL;
2890 suite_seq = ast_for_suite(c, body);
2891 if (!suite_seq)
2892 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893
Georg Brandla48f3ab2008-03-30 06:40:17 +00002894 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002895 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 }
2897 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002898 asdl_seq *suite_seq;
2899 expr_ty expression;
2900 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2901 if (!e)
2902 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002903 if (!set_context(c, e, Store, CHILD(exc, 3)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002904 return NULL;
2905 expression = ast_for_expr(c, CHILD(exc, 1));
2906 if (!expression)
2907 return NULL;
2908 suite_seq = ast_for_suite(c, body);
2909 if (!suite_seq)
2910 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911
Georg Brandla48f3ab2008-03-30 06:40:17 +00002912 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002913 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002915
2916 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002917 "wrong number of children for 'except' clause: %d",
2918 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002919 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920}
2921
2922static stmt_ty
2923ast_for_try_stmt(struct compiling *c, const node *n)
2924{
Neal Norwitzf599f422005-12-17 21:33:47 +00002925 const int nch = NCH(n);
2926 int n_except = (nch - 3)/3;
2927 asdl_seq *body, *orelse = NULL, *finally = NULL;
2928
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929 REQ(n, try_stmt);
2930
Neal Norwitzf599f422005-12-17 21:33:47 +00002931 body = ast_for_suite(c, CHILD(n, 2));
2932 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002933 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934
Neal Norwitzf599f422005-12-17 21:33:47 +00002935 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002936 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2937 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2938 /* we can assume it's an "else",
2939 because nch >= 9 for try-else-finally and
2940 it would otherwise have a type of except_clause */
2941 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2942 if (orelse == NULL)
2943 return NULL;
2944 n_except--;
2945 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002947 finally = ast_for_suite(c, CHILD(n, nch - 1));
2948 if (finally == NULL)
2949 return NULL;
2950 n_except--;
2951 }
2952 else {
2953 /* we can assume it's an "else",
2954 otherwise it would have a type of except_clause */
2955 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2956 if (orelse == NULL)
2957 return NULL;
2958 n_except--;
2959 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002961 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002962 ast_error(n, "malformed 'try' statement");
2963 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002965
2966 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002967 int i;
2968 stmt_ty except_st;
2969 /* process except statements to create a try ... except */
2970 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2971 if (handlers == NULL)
2972 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002973
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002974 for (i = 0; i < n_except; i++) {
2975 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2976 CHILD(n, 5 + i * 3));
2977 if (!e)
2978 return NULL;
2979 asdl_seq_SET(handlers, i, e);
2980 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002981
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002982 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2983 n->n_col_offset, c->c_arena);
2984 if (!finally)
2985 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002986
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002987 /* if a 'finally' is present too, we nest the TryExcept within a
2988 TryFinally to emulate try ... except ... finally */
2989 body = asdl_seq_new(1, c->c_arena);
2990 if (body == NULL)
2991 return NULL;
2992 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002993 }
2994
2995 /* must be a try ... finally (except clauses are in body, if any exist) */
2996 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002997 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998}
2999
Georg Brandl944f6842009-05-25 21:02:56 +00003000/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003001static stmt_ty
Georg Brandl944f6842009-05-25 21:02:56 +00003002ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003003{
3004 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003005
Georg Brandl944f6842009-05-25 21:02:56 +00003006 REQ(n, with_item);
3007 context_expr = ast_for_expr(c, CHILD(n, 0));
Collin Winter77c67bd2007-03-16 04:11:30 +00003008 if (!context_expr)
3009 return NULL;
Georg Brandl944f6842009-05-25 21:02:56 +00003010 if (NCH(n) == 3) {
3011 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003012
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003013 if (!optional_vars) {
3014 return NULL;
3015 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003016 if (!set_context(c, optional_vars, Store, n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003017 return NULL;
3018 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003019 }
3020
Georg Brandl944f6842009-05-25 21:02:56 +00003021 return With(context_expr, optional_vars, content, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003022 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003023}
3024
Georg Brandl944f6842009-05-25 21:02:56 +00003025/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3026static stmt_ty
3027ast_for_with_stmt(struct compiling *c, const node *n)
3028{
3029 int i;
3030 stmt_ty ret;
3031 asdl_seq *inner;
3032
3033 REQ(n, with_stmt);
3034
3035 /* process the with items inside-out */
3036 i = NCH(n) - 1;
3037 /* the suite of the innermost with item is the suite of the with stmt */
3038 inner = ast_for_suite(c, CHILD(n, i));
3039 if (!inner)
3040 return NULL;
3041
3042 for (;;) {
3043 i -= 2;
3044 ret = ast_for_with_item(c, CHILD(n, i), inner);
3045 if (!ret)
3046 return NULL;
3047 /* was this the last item? */
3048 if (i == 1)
3049 break;
3050 /* if not, wrap the result so far in a new sequence */
3051 inner = asdl_seq_new(1, c->c_arena);
3052 if (!inner)
3053 return NULL;
3054 asdl_seq_SET(inner, 0, ret);
3055 }
3056
3057 return ret;
3058}
3059
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +00003061ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062{
3063 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003064 PyObject *classname;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 asdl_seq *bases, *s;
3066
3067 REQ(n, classdef);
3068
Benjamin Petersond5efd202008-06-08 22:52:37 +00003069 if (!forbidden_check(c, n, STR(CHILD(n, 1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003070 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071
3072 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003073 s = ast_for_suite(c, CHILD(n, 3));
3074 if (!s)
3075 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003076 classname = NEW_IDENTIFIER(CHILD(n, 1));
3077 if (!classname)
3078 return NULL;
3079 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3080 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081 }
3082 /* check for empty base list */
3083 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003084 s = ast_for_suite(c, CHILD(n,5));
3085 if (!s)
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003086 return NULL;
3087 classname = NEW_IDENTIFIER(CHILD(n, 1));
3088 if (!classname)
3089 return NULL;
3090 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3091 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 }
3093
3094 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003095 bases = ast_for_class_bases(c, CHILD(n, 3));
3096 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003097 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098
3099 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003100 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003101 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003102 classname = NEW_IDENTIFIER(CHILD(n, 1));
3103 if (!classname)
3104 return NULL;
3105 return ClassDef(classname, bases, s, decorator_seq,
Christian Heimes5224d282008-02-23 15:01:05 +00003106 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107}
3108
3109static stmt_ty
3110ast_for_stmt(struct compiling *c, const node *n)
3111{
3112 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003113 assert(NCH(n) == 1);
3114 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115 }
3116 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003117 assert(num_stmts(n) == 1);
3118 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119 }
3120 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003121 n = CHILD(n, 0);
3122 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3123 | flow_stmt | import_stmt | global_stmt | exec_stmt
3124 | assert_stmt
3125 */
3126 switch (TYPE(n)) {
3127 case expr_stmt:
3128 return ast_for_expr_stmt(c, n);
3129 case print_stmt:
3130 return ast_for_print_stmt(c, n);
3131 case del_stmt:
3132 return ast_for_del_stmt(c, n);
3133 case pass_stmt:
3134 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3135 case flow_stmt:
3136 return ast_for_flow_stmt(c, n);
3137 case import_stmt:
3138 return ast_for_import_stmt(c, n);
3139 case global_stmt:
3140 return ast_for_global_stmt(c, n);
3141 case exec_stmt:
3142 return ast_for_exec_stmt(c, n);
3143 case assert_stmt:
3144 return ast_for_assert_stmt(c, n);
3145 default:
3146 PyErr_Format(PyExc_SystemError,
3147 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3148 TYPE(n), NCH(n));
3149 return NULL;
3150 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151 }
3152 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003153 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Christian Heimes5224d282008-02-23 15:01:05 +00003154 | funcdef | classdef | decorated
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003155 */
3156 node *ch = CHILD(n, 0);
3157 REQ(n, compound_stmt);
3158 switch (TYPE(ch)) {
3159 case if_stmt:
3160 return ast_for_if_stmt(c, ch);
3161 case while_stmt:
3162 return ast_for_while_stmt(c, ch);
3163 case for_stmt:
3164 return ast_for_for_stmt(c, ch);
3165 case try_stmt:
3166 return ast_for_try_stmt(c, ch);
3167 case with_stmt:
3168 return ast_for_with_stmt(c, ch);
3169 case funcdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003170 return ast_for_funcdef(c, ch, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003171 case classdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003172 return ast_for_classdef(c, ch, NULL);
3173 case decorated:
3174 return ast_for_decorated(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003175 default:
3176 PyErr_Format(PyExc_SystemError,
3177 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3178 TYPE(n), NCH(n));
3179 return NULL;
3180 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181 }
3182}
3183
3184static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003185parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003187 const char *end;
3188 long x;
3189 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190#ifndef WITHOUT_COMPLEX
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003191 Py_complex complex;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003192 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193#endif
3194
Mark Dickinson422ce062008-12-05 17:59:46 +00003195 assert(s != NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003196 errno = 0;
3197 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003199 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003201 if (*end == 'l' || *end == 'L')
3202 return PyLong_FromString((char *)s, (char **)0, 0);
Mark Dickinson64b7e502008-07-16 09:40:03 +00003203 x = PyOS_strtol((char *)s, (char **)&end, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003204 if (*end == '\0') {
3205 if (errno != 0)
3206 return PyLong_FromString((char *)s, (char **)0, 0);
3207 return PyInt_FromLong(x);
3208 }
3209 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003211 if (imflag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003212 complex.real = 0.;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003213 PyFPE_START_PROTECT("atof", return 0)
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003214 complex.imag = PyOS_ascii_atof(s);
3215 PyFPE_END_PROTECT(complex)
3216 return PyComplex_FromCComplex(complex);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003217 }
3218 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003220 {
3221 PyFPE_START_PROTECT("atof", return 0)
3222 dx = PyOS_ascii_atof(s);
3223 PyFPE_END_PROTECT(dx)
3224 return PyFloat_FromDouble(dx);
3225 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226}
3227
3228static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003229decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230{
3231#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003232 Py_FatalError("decode_utf8 should not be called in this build.");
3233 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003235 PyObject *u, *v;
3236 char *s, *t;
3237 t = s = (char *)*sPtr;
3238 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3239 while (s < end && (*s & 0x80)) s++;
3240 *sPtr = s;
3241 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3242 if (u == NULL)
3243 return NULL;
3244 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3245 Py_DECREF(u);
3246 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247#endif
3248}
3249
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003250#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003252decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003254 PyObject *v, *u;
3255 char *buf;
3256 char *p;
3257 const char *end;
3258 if (encoding == NULL) {
3259 buf = (char *)s;
3260 u = NULL;
3261 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3262 buf = (char *)s;
3263 u = NULL;
3264 } else {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003265 /* check for integer overflow */
3266 if (len > PY_SIZE_MAX / 4)
3267 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003268 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003269 u = PyString_FromStringAndSize((char *)NULL, len * 4);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003270 if (u == NULL)
3271 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003272 p = buf = PyString_AsString(u);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003273 end = s + len;
3274 while (s < end) {
3275 if (*s == '\\') {
3276 *p++ = *s++;
3277 if (*s & 0x80) {
3278 strcpy(p, "u005c");
3279 p += 5;
3280 }
3281 }
3282 if (*s & 0x80) { /* XXX inefficient */
3283 PyObject *w;
3284 char *r;
3285 Py_ssize_t rn, i;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003286 w = decode_utf8(c, &s, end, "utf-16-be");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003287 if (w == NULL) {
3288 Py_DECREF(u);
3289 return NULL;
3290 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003291 r = PyString_AsString(w);
3292 rn = PyString_Size(w);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003293 assert(rn % 2 == 0);
3294 for (i = 0; i < rn; i += 2) {
3295 sprintf(p, "\\u%02x%02x",
3296 r[i + 0] & 0xFF,
3297 r[i + 1] & 0xFF);
3298 p += 6;
3299 }
3300 Py_DECREF(w);
3301 } else {
3302 *p++ = *s++;
3303 }
3304 }
3305 len = p - buf;
3306 s = buf;
3307 }
3308 if (rawmode)
3309 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3310 else
3311 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3312 Py_XDECREF(u);
3313 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003315#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316
3317/* s is a Python string literal, including the bracketing quote characters,
3318 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3319 * parsestr parses it, and returns the decoded Python string object.
3320 */
3321static PyObject *
Christian Heimes3c608332008-03-26 22:01:37 +00003322parsestr(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003323{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003324 size_t len;
3325 int quote = Py_CHARMASK(*s);
3326 int rawmode = 0;
3327 int need_encoding;
Christian Heimes3c608332008-03-26 22:01:37 +00003328 int unicode = c->c_future_unicode;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003330 if (isalpha(quote) || quote == '_') {
3331 if (quote == 'u' || quote == 'U') {
3332 quote = *++s;
3333 unicode = 1;
3334 }
Christian Heimes288e89a2008-01-18 18:24:07 +00003335 if (quote == 'b' || quote == 'B') {
3336 quote = *++s;
Christian Heimes3c608332008-03-26 22:01:37 +00003337 unicode = 0;
Christian Heimes288e89a2008-01-18 18:24:07 +00003338 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003339 if (quote == 'r' || quote == 'R') {
3340 quote = *++s;
3341 rawmode = 1;
3342 }
3343 }
3344 if (quote != '\'' && quote != '\"') {
3345 PyErr_BadInternalCall();
3346 return NULL;
3347 }
3348 s++;
3349 len = strlen(s);
3350 if (len > INT_MAX) {
3351 PyErr_SetString(PyExc_OverflowError,
3352 "string to parse is too long");
3353 return NULL;
3354 }
3355 if (s[--len] != quote) {
3356 PyErr_BadInternalCall();
3357 return NULL;
3358 }
3359 if (len >= 4 && s[0] == quote && s[1] == quote) {
3360 s += 2;
3361 len -= 2;
3362 if (s[--len] != quote || s[--len] != quote) {
3363 PyErr_BadInternalCall();
3364 return NULL;
3365 }
3366 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003368 if (unicode || Py_UnicodeFlag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003369 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003370 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371#endif
Christian Heimes3c608332008-03-26 22:01:37 +00003372 need_encoding = (c->c_encoding != NULL &&
3373 strcmp(c->c_encoding, "utf-8") != 0 &&
3374 strcmp(c->c_encoding, "iso-8859-1") != 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003375 if (rawmode || strchr(s, '\\') == NULL) {
3376 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003378 /* This should not happen - we never see any other
3379 encoding. */
3380 Py_FatalError(
3381 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003382#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003383 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3384 if (u == NULL)
3385 return NULL;
Christian Heimes3c608332008-03-26 22:01:37 +00003386 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003387 Py_DECREF(u);
3388 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003390 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003391 return PyString_FromStringAndSize(s, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003392 }
3393 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003395 return PyString_DecodeEscape(s, len, NULL, unicode,
Christian Heimes3c608332008-03-26 22:01:37 +00003396 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397}
3398
3399/* Build a Python string object out of a STRING atom. This takes care of
3400 * compile-time literal catenation, calling parsestr() on each piece, and
3401 * pasting the intermediate results together.
3402 */
3403static PyObject *
3404parsestrplus(struct compiling *c, const node *n)
3405{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003406 PyObject *v;
3407 int i;
3408 REQ(CHILD(n, 0), STRING);
Christian Heimes3c608332008-03-26 22:01:37 +00003409 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003410 /* String literal concatenation */
3411 for (i = 1; i < NCH(n); i++) {
3412 PyObject *s;
Christian Heimes3c608332008-03-26 22:01:37 +00003413 s = parsestr(c, STR(CHILD(n, i)));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003414 if (s == NULL)
3415 goto onError;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003416 if (PyString_Check(v) && PyString_Check(s)) {
3417 PyString_ConcatAndDel(&v, s);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003418 if (v == NULL)
3419 goto onError;
3420 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003421#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003422 else {
3423 PyObject *temp = PyUnicode_Concat(v, s);
3424 Py_DECREF(s);
3425 Py_DECREF(v);
3426 v = temp;
3427 if (v == NULL)
3428 goto onError;
3429 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003431 }
3432 }
3433 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003434
3435 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003436 Py_XDECREF(v);
3437 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438}