blob: 9f6b7eaa8a28c2a0105076099c902e7665d163b1 [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 */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 if (*u >= 128) {
62 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
63 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
Martin v. Löwis47383402007-08-15 07:32:56 +000074 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 Py_DECREF(value);
122
123 loc = PyErr_ProgramText(filename, lineno);
124 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000125 Py_INCREF(Py_None);
126 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000128 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_DECREF(errstr);
132 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000133 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 Py_DECREF(errstr);
136 Py_DECREF(tmp);
137 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyErr_Restore(type, value, tback);
140}
141
142/* num_stmts() returns number of contained statements.
143
144 Use this routine to determine how big a sequence is needed for
145 the statements in a parse tree. Its raison d'etre is this bit of
146 grammar:
147
148 stmt: simple_stmt | compound_stmt
149 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
150
151 A simple_stmt can contain multiple small_stmt elements joined
152 by semicolons. If the arg is a simple_stmt, the number of
153 small_stmt elements is returned.
154*/
155
156static int
157num_stmts(const node *n)
158{
159 int i, l;
160 node *ch;
161
162 switch (TYPE(n)) {
163 case single_input:
164 if (TYPE(CHILD(n, 0)) == NEWLINE)
165 return 0;
166 else
167 return num_stmts(CHILD(n, 0));
168 case file_input:
169 l = 0;
170 for (i = 0; i < NCH(n); i++) {
171 ch = CHILD(n, i);
172 if (TYPE(ch) == stmt)
173 l += num_stmts(ch);
174 }
175 return l;
176 case stmt:
177 return num_stmts(CHILD(n, 0));
178 case compound_stmt:
179 return 1;
180 case simple_stmt:
181 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
182 case suite:
183 if (NCH(n) == 1)
184 return num_stmts(CHILD(n, 0));
185 else {
186 l = 0;
187 for (i = 2; i < (NCH(n) - 1); i++)
188 l += num_stmts(CHILD(n, i));
189 return l;
190 }
191 default: {
192 char buf[128];
193
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000194 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195 TYPE(n), NCH(n));
196 Py_FatalError(buf);
197 }
198 }
199 assert(0);
200 return 0;
201}
202
203/* Transform the CST rooted at node * to the appropriate AST
204*/
205
206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 asdl_seq *stmts = NULL;
212 stmt_ty s;
213 node *ch;
214 struct compiling c;
215
216 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000218 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000219#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220 ast_error(n, "encoding declaration in Unicode string");
221 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000222#endif
223 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 } else if (TYPE(n) == encoding_decl) {
226 c.c_encoding = STR(n);
227 n = CHILD(n, 0);
228 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000230 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000232 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000233 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 switch (TYPE(n)) {
237 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 for (i = 0; i < NCH(n) - 1; i++) {
242 ch = CHILD(n, i);
243 if (TYPE(ch) == NEWLINE)
244 continue;
245 REQ(ch, stmt);
246 num = num_stmts(ch);
247 if (num == 1) {
248 s = ast_for_stmt(&c, ch);
249 if (!s)
250 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000251 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 ch = CHILD(ch, 0);
255 REQ(ch, simple_stmt);
256 for (j = 0; j < num; j++) {
257 s = ast_for_stmt(&c, CHILD(ch, j * 2));
258 if (!s)
259 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000260 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 }
262 }
263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000264 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 case eval_input: {
266 expr_ty testlist_ast;
267
Nick Coghlan650f0d02007-04-15 12:05:43 +0000268 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000269 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!testlist_ast)
271 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000272 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 }
274 case single_input:
275 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000276 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000279 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
280 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000281 if (!asdl_seq_GET(stmts, 0))
282 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 }
285 else {
286 n = CHILD(n, 0);
287 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 s = ast_for_stmt(&c, n);
293 if (!s)
294 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 asdl_seq_SET(stmts, 0, s);
296 }
297 else {
298 /* Only a simple_stmt can contain multiple statements. */
299 REQ(n, simple_stmt);
300 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (TYPE(CHILD(n, i)) == NEWLINE)
302 break;
303 s = ast_for_stmt(&c, CHILD(n, i));
304 if (!s)
305 goto error;
306 asdl_seq_SET(stmts, i / 2, s);
307 }
308 }
309
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000313 PyErr_Format(PyExc_SystemError,
314 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 goto error;
316 }
317 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 ast_error_finish(filename);
319 return NULL;
320}
321
322/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
323*/
324
325static operator_ty
326get_operator(const node *n)
327{
328 switch (TYPE(n)) {
329 case VBAR:
330 return BitOr;
331 case CIRCUMFLEX:
332 return BitXor;
333 case AMPER:
334 return BitAnd;
335 case LEFTSHIFT:
336 return LShift;
337 case RIGHTSHIFT:
338 return RShift;
339 case PLUS:
340 return Add;
341 case MINUS:
342 return Sub;
343 case STAR:
344 return Mult;
345 case SLASH:
346 return Div;
347 case DOUBLESLASH:
348 return FloorDiv;
349 case PERCENT:
350 return Mod;
351 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 }
354}
355
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356static const char* FORBIDDEN[] = {
357 "None",
358 "True",
359 "False",
360 NULL,
361};
362
363static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000364forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000366 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000367 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
368 ast_error(n, "assignment to keyword");
369 return 1;
370 }
371 if (full_checks) {
372 const char **p;
373 for (p = FORBIDDEN; *p; p++) {
374 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
375 ast_error(n, "assignment to keyword");
376 return 1;
377 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000378 }
379 }
380 return 0;
381}
382
Jeremy Hyltona8293132006-02-28 17:58:27 +0000383/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000384
385 Only sets context for expr kinds that "can appear in assignment context"
386 (according to ../Parser/Python.asdl). For other expr kinds, it sets
387 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000388*/
389
390static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000391set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392{
393 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 /* If a particular expression type can't be used for assign / delete,
395 set expr_name to its name and an error message will be generated.
396 */
397 const char* expr_name = NULL;
398
399 /* The ast defines augmented store and load contexts, but the
400 implementation here doesn't actually use them. The code may be
401 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000402 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000404 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000405 */
406 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407
408 switch (e->kind) {
409 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000411 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
412 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 e->v.Subscript.ctx = ctx;
416 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000417 case Starred_kind:
418 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000419 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000420 return 0;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000423 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000424 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000425 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 }
427 e->v.Name.ctx = ctx;
428 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430 e->v.List.ctx = ctx;
431 s = e->v.List.elts;
432 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000434 if (asdl_seq_LEN(e->v.Tuple.elts)) {
435 e->v.Tuple.ctx = ctx;
436 s = e->v.Tuple.elts;
437 }
438 else {
439 expr_name = "()";
440 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 case Lambda_kind:
443 expr_name = "lambda";
444 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 case UnaryOp_kind:
451 expr_name = "operator";
452 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 expr_name = "generator expression";
455 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456 case Yield_kind:
457 expr_name = "yield expression";
458 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 case ListComp_kind:
460 expr_name = "list comprehension";
461 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000462 case SetComp_kind:
463 expr_name = "set comprehension";
464 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000465 case DictComp_kind:
466 expr_name = "dict comprehension";
467 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000469 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 case Num_kind:
471 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000472 expr_name = "literal";
473 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000474 case Ellipsis_kind:
475 expr_name = "Ellipsis";
476 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000477 case Compare_kind:
478 expr_name = "comparison";
479 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000480 case IfExp_kind:
481 expr_name = "conditional expression";
482 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000483 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 PyErr_Format(PyExc_SystemError,
485 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000486 e->kind, e->lineno);
487 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000489 /* Check for error string set by switch */
490 if (expr_name) {
491 char buf[300];
492 PyOS_snprintf(buf, sizeof(buf),
493 "can't %s %s",
494 ctx == Store ? "assign to" : "delete",
495 expr_name);
496 return ast_error(n, buf);
497 }
498
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501 */
502 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000503 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504
Thomas Wouters89f507f2006-12-13 04:49:30 +0000505 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000506 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000507 return 0;
508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 return 1;
511}
512
513static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000514ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515{
516 REQ(n, augassign);
517 n = CHILD(n, 0);
518 switch (STR(n)[0]) {
519 case '+':
520 return Add;
521 case '-':
522 return Sub;
523 case '/':
524 if (STR(n)[1] == '/')
525 return FloorDiv;
526 else
527 return Div;
528 case '%':
529 return Mod;
530 case '<':
531 return LShift;
532 case '>':
533 return RShift;
534 case '&':
535 return BitAnd;
536 case '^':
537 return BitXor;
538 case '|':
539 return BitOr;
540 case '*':
541 if (STR(n)[1] == '*')
542 return Pow;
543 else
544 return Mult;
545 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000546 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 }
549}
550
551static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000552ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000554 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 |'is' 'not'
556 */
557 REQ(n, comp_op);
558 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000559 n = CHILD(n, 0);
560 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561 case LESS:
562 return Lt;
563 case GREATER:
564 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000565 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 return Eq;
567 case LESSEQUAL:
568 return LtE;
569 case GREATEREQUAL:
570 return GtE;
571 case NOTEQUAL:
572 return NotEq;
573 case NAME:
574 if (strcmp(STR(n), "in") == 0)
575 return In;
576 if (strcmp(STR(n), "is") == 0)
577 return Is;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
584 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 /* handle "not in" and "is not" */
586 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 case NAME:
588 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
589 return NotIn;
590 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
591 return IsNot;
592 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000593 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 }
Neal Norwitz79792652005-11-14 04:25:03 +0000598 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000600 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601}
602
603static asdl_seq *
604seq_for_testlist(struct compiling *c, const node *n)
605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +0000607 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
608 */
Armin Rigo31441302005-10-21 12:57:31 +0000609 asdl_seq *seq;
610 expr_ty expression;
611 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000612 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000614 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615 if (!seq)
616 return NULL;
617
618 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +0000620 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621
Benjamin Peterson4905e802009-09-27 02:43:28 +0000622 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000623 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000625
626 assert(i / 2 < seq->size);
627 asdl_seq_SET(seq, i / 2, expression);
628 }
629 return seq;
630}
631
Neal Norwitzc1505362006-12-28 06:47:50 +0000632static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000633compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000634{
635 identifier name;
636 expr_ty annotation = NULL;
637 node *ch;
638
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000639 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000640 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000641 name = NEW_IDENTIFIER(ch);
642 if (!name)
643 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000644 if (forbidden_name(name, ch, 0))
645 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000646
647 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
648 annotation = ast_for_expr(c, CHILD(n, 2));
649 if (!annotation)
650 return NULL;
651 }
652
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000653 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000654#if 0
655 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
656 if (!set_context(c, result, Store, n))
657 return NULL;
658 return result;
659#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660}
661
Guido van Rossum4f72a782006-10-27 23:31:49 +0000662/* returns -1 if failed to handle keyword only arguments
663 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000664 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000665 ^^^
666 start pointing here
667 */
668static int
669handle_keywordonly_args(struct compiling *c, const node *n, int start,
670 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
671{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000672 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000673 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000674 expr_ty expression, annotation;
675 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000676 int i = start;
677 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000678
679 if (kwonlyargs == NULL) {
680 ast_error(CHILD(n, start), "named arguments must follow bare *");
681 return -1;
682 }
683 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000684 while (i < NCH(n)) {
685 ch = CHILD(n, i);
686 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000687 case vfpdef:
688 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000690 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000691 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000692 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000693 asdl_seq_SET(kwdefaults, j, expression);
694 i += 2; /* '=' and test */
695 }
696 else { /* setting NULL if no default value exists */
697 asdl_seq_SET(kwdefaults, j, NULL);
698 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000699 if (NCH(ch) == 3) {
700 /* ch is NAME ':' test */
701 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000702 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000703 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 }
705 else {
706 annotation = NULL;
707 }
708 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000709 argname = NEW_IDENTIFIER(ch);
710 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000711 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000712 if (forbidden_name(argname, ch, 0))
713 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000714 arg = arg(argname, annotation, c->c_arena);
715 if (!arg)
716 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000717 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000718 i += 2; /* the name and the comma */
719 break;
720 case DOUBLESTAR:
721 return i;
722 default:
723 ast_error(ch, "unexpected node");
724 goto error;
725 }
726 }
727 return i;
728 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000730}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731
Jeremy Hyltona8293132006-02-28 17:58:27 +0000732/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733
734static arguments_ty
735ast_for_arguments(struct compiling *c, const node *n)
736{
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 /* This function handles both typedargslist (function definition)
738 and varargslist (lambda definition).
739
740 parameters: '(' [typedargslist] ')'
741 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000743 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000744 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000745 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000748 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000750 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000752 int i, j, k, nposargs = 0, nkwonlyargs = 0;
753 int nposdefaults = 0, found_default = 0;
754 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 arg_ty arg;
757 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 node *ch;
759
760 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000762 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
763 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000764 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767
Jeremy Hyltone921e022008-07-17 16:37:17 +0000768 /* First count the number of positional args & defaults. The
769 variable i is the loop index for this for loop and the next.
770 The next loop picks up where the first leaves off.
771 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000773 ch = CHILD(n, i);
774 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000775 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000776 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000777 if (i < NCH(n) && /* skip argument following star */
778 (TYPE(CHILD(n, i)) == tfpdef ||
779 TYPE(CHILD(n, i)) == vfpdef)) {
780 i++;
781 }
782 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000783 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000784 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000785 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000786 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000789 defaults for keyword only args */
790 for ( ; i < NCH(n); ++i) {
791 ch = CHILD(n, i);
792 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000793 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
796 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000797 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 kwonlyargs = (nkwonlyargs ?
799 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
800 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000801 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
804 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000805 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 since we set NULL as default for keyword only argument w/o default
808 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
811 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000812 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000813
814 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000815 ast_error(n, "more than 255 arguments");
816 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000817 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000819 /* tfpdef: NAME [':' test]
820 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821 */
822 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000823 j = 0; /* index for defaults */
824 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000826 ch = CHILD(n, i);
827 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000828 case tfpdef:
829 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
831 anything other than EQUAL or a comma? */
832 /* XXX Should NCH(n) check be made a separate check? */
833 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000834 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
835 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000836 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 assert(posdefaults != NULL);
838 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000839 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000842 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000844 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000845 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000846 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000847 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000848 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000849 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000850 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851 i += 2; /* the name and the comma */
852 break;
853 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000854 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000856 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000857 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000858 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000859 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000860 if (TYPE(ch) == COMMA) {
861 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000862 i += 2; /* now follows keyword only arguments */
863 res = handle_keywordonly_args(c, n, i,
864 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000865 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000866 i = res; /* res has new position to process */
867 }
868 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000869 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000870 if (!vararg)
871 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000872 if (forbidden_name(vararg, CHILD(ch, 0), 0))
873 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000874 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000875 /* there is an annotation on the vararg */
876 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000877 if (!varargannotation)
878 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000879 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000880 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000881 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
882 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000883 int res = 0;
884 res = handle_keywordonly_args(c, n, i,
885 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000886 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000887 i = res; /* res has new position to process */
888 }
889 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890 break;
891 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000892 ch = CHILD(n, i+1); /* tfpdef */
893 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000894 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000895 if (!kwarg)
896 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000897 if (NCH(ch) > 1) {
898 /* there is an annotation on the kwarg */
899 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000900 if (!kwargannotation)
901 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000902 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000903 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000904 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 i += 3;
906 break;
907 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000908 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909 "unexpected node in varargslist: %d @ %d",
910 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000911 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000912 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000914 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
915 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916}
917
918static expr_ty
919ast_for_dotted_name(struct compiling *c, const node *n)
920{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000921 expr_ty e;
922 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000923 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 int i;
925
926 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000927
928 lineno = LINENO(n);
929 col_offset = n->n_col_offset;
930
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931 id = NEW_IDENTIFIER(CHILD(n, 0));
932 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000933 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000934 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000936 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937
938 for (i = 2; i < NCH(n); i+=2) {
939 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000940 if (!id)
941 return NULL;
942 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
943 if (!e)
944 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 }
946
947 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948}
949
950static expr_ty
951ast_for_decorator(struct compiling *c, const node *n)
952{
953 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
954 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000955 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000958 REQ(CHILD(n, 0), AT);
959 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
962 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000963 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000966 d = name_expr;
967 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 }
969 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000970 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000971 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000972 if (!d)
973 return NULL;
974 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 }
976 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000977 d = ast_for_call(c, CHILD(n, 3), name_expr);
978 if (!d)
979 return NULL;
980 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 }
982
983 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984}
985
986static asdl_seq*
987ast_for_decorators(struct compiling *c, const node *n)
988{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000989 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000990 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000994 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 if (!decorator_seq)
996 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000999 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001000 if (!d)
1001 return NULL;
1002 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 }
1004 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005}
1006
1007static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001008ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001010 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001011 identifier name;
1012 arguments_ty args;
1013 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001014 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001015 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016
1017 REQ(n, funcdef);
1018
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019 name = NEW_IDENTIFIER(CHILD(n, name_i));
1020 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001021 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001022 if (forbidden_name(name, CHILD(n, name_i), 0))
1023 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1025 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001026 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001027 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1028 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1029 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001030 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001031 name_i += 2;
1032 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033 body = ast_for_suite(c, CHILD(n, name_i + 3));
1034 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001035 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036
Neal Norwitzc1505362006-12-28 06:47:50 +00001037 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001038 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039}
1040
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001041static stmt_ty
1042ast_for_decorated(struct compiling *c, const node *n)
1043{
1044 /* decorated: decorators (classdef | funcdef) */
1045 stmt_ty thing = NULL;
1046 asdl_seq *decorator_seq = NULL;
1047
1048 REQ(n, decorated);
1049
1050 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1051 if (!decorator_seq)
1052 return NULL;
1053
1054 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001056
1057 if (TYPE(CHILD(n, 1)) == funcdef) {
1058 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1059 } else if (TYPE(CHILD(n, 1)) == classdef) {
1060 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1061 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001062 /* we count the decorators in when talking about the class' or
1063 * function's line number */
1064 if (thing) {
1065 thing->lineno = LINENO(n);
1066 thing->col_offset = n->n_col_offset;
1067 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001068 return thing;
1069}
1070
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071static expr_ty
1072ast_for_lambdef(struct compiling *c, const node *n)
1073{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001074 /* lambdef: 'lambda' [varargslist] ':' test
1075 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076 arguments_ty args;
1077 expr_ty expression;
1078
1079 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001080 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1081 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 if (!args)
1083 return NULL;
1084 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001085 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 }
1088 else {
1089 args = ast_for_arguments(c, CHILD(n, 1));
1090 if (!args)
1091 return NULL;
1092 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001093 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 }
1096
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001097 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098}
1099
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001100static expr_ty
1101ast_for_ifexpr(struct compiling *c, const node *n)
1102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001104 expr_ty expression, body, orelse;
1105
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001106 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001107 body = ast_for_expr(c, CHILD(n, 0));
1108 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001109 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001110 expression = ast_for_expr(c, CHILD(n, 2));
1111 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001112 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001113 orelse = ast_for_expr(c, CHILD(n, 4));
1114 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001115 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001116 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1117 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001118}
1119
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001121 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122
Nick Coghlan650f0d02007-04-15 12:05:43 +00001123 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124*/
1125
1126static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001127count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130
Guido van Rossumd8faa362007-04-27 19:54:29 +00001131 count_comp_for:
1132 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001133 REQ(n, comp_for);
1134 if (NCH(n) == 5)
1135 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001136 else
1137 return n_fors;
1138 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001139 REQ(n, comp_iter);
1140 n = CHILD(n, 0);
1141 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001142 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001143 else if (TYPE(n) == comp_if) {
1144 if (NCH(n) == 3) {
1145 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001147 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001148 else
1149 return n_fors;
1150 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001151
Guido van Rossumd8faa362007-04-27 19:54:29 +00001152 /* Should never be reached */
1153 PyErr_SetString(PyExc_SystemError,
1154 "logic error in count_comp_fors");
1155 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156}
1157
Nick Coghlan650f0d02007-04-15 12:05:43 +00001158/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159
Nick Coghlan650f0d02007-04-15 12:05:43 +00001160 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161*/
1162
1163static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001164count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001166 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167
Guido van Rossumd8faa362007-04-27 19:54:29 +00001168 while (1) {
1169 REQ(n, comp_iter);
1170 if (TYPE(CHILD(n, 0)) == comp_for)
1171 return n_ifs;
1172 n = CHILD(n, 0);
1173 REQ(n, comp_if);
1174 n_ifs++;
1175 if (NCH(n) == 2)
1176 return n_ifs;
1177 n = CHILD(n, 2);
1178 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179}
1180
Guido van Rossum992d4a32007-07-11 13:09:30 +00001181static asdl_seq *
1182ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001185 asdl_seq *comps;
1186
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001187 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001188 if (n_fors == -1)
1189 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190
Nick Coghlan650f0d02007-04-15 12:05:43 +00001191 comps = asdl_seq_new(n_fors, c->c_arena);
1192 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001196 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001198 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001199 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200
Guido van Rossum992d4a32007-07-11 13:09:30 +00001201 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202
Guido van Rossum992d4a32007-07-11 13:09:30 +00001203 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001204 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001207 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001208 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210
Thomas Wouters89f507f2006-12-13 04:49:30 +00001211 /* Check the # of children rather than the length of t, since
1212 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001213 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001214 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001215 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001217 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1218 c->c_arena),
1219 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001220 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001222
Guido van Rossum992d4a32007-07-11 13:09:30 +00001223 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 int j, n_ifs;
1225 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226
Guido van Rossum992d4a32007-07-11 13:09:30 +00001227 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001228 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001229 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001231
1232 ifs = asdl_seq_new(n_ifs, c->c_arena);
1233 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001235
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001237 REQ(n, comp_iter);
1238 n = CHILD(n, 0);
1239 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240
Guido van Rossum992d4a32007-07-11 13:09:30 +00001241 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001242 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001243 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001244 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001245 if (NCH(n) == 3)
1246 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001248 /* on exit, must guarantee that n is a comp_for */
1249 if (TYPE(n) == comp_iter)
1250 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001251 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001253 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001255 return comps;
1256}
1257
1258static expr_ty
1259ast_for_itercomp(struct compiling *c, const node *n, int type)
1260{
1261 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1262 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1263 expr_ty elt;
1264 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265
Guido van Rossum992d4a32007-07-11 13:09:30 +00001266 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267
Guido van Rossum992d4a32007-07-11 13:09:30 +00001268 elt = ast_for_expr(c, CHILD(n, 0));
1269 if (!elt)
1270 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271
Guido van Rossum992d4a32007-07-11 13:09:30 +00001272 comps = ast_for_comprehension(c, CHILD(n, 1));
1273 if (!comps)
1274 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001275
1276 if (type == COMP_GENEXP)
1277 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1278 else if (type == COMP_LISTCOMP)
1279 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1280 else if (type == COMP_SETCOMP)
1281 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1282 else
1283 /* Should never happen */
1284 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285}
1286
1287static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001288ast_for_dictcomp(struct compiling *c, const node *n)
1289{
1290 expr_ty key, value;
1291 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292
Guido van Rossum992d4a32007-07-11 13:09:30 +00001293 assert(NCH(n) > 3);
1294 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295
Guido van Rossum992d4a32007-07-11 13:09:30 +00001296 key = ast_for_expr(c, CHILD(n, 0));
1297 if (!key)
1298 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001299 value = ast_for_expr(c, CHILD(n, 2));
1300 if (!value)
1301 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302
Guido van Rossum992d4a32007-07-11 13:09:30 +00001303 comps = ast_for_comprehension(c, CHILD(n, 3));
1304 if (!comps)
1305 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306
Guido van Rossum992d4a32007-07-11 13:09:30 +00001307 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1308}
1309
1310static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001311ast_for_genexp(struct compiling *c, const node *n)
1312{
1313 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001314 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001315}
1316
1317static expr_ty
1318ast_for_listcomp(struct compiling *c, const node *n)
1319{
1320 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001321 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001322}
1323
1324static expr_ty
1325ast_for_setcomp(struct compiling *c, const node *n)
1326{
1327 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001328 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001329}
1330
1331
1332static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333ast_for_atom(struct compiling *c, const node *n)
1334{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001335 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1336 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001337 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338 */
1339 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001340 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001343 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001344 /* All names start in Load context, but may later be
1345 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001346 PyObject *name = NEW_IDENTIFIER(ch);
1347 if (!name)
1348 return NULL;
1349 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1350 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001352 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001353 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001354 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001355 PyObject *type, *value, *tback, *errstr;
1356 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001357 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001358 if (errstr) {
1359 char *s = "";
1360 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001361 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001362 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1363 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001364 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001365 } else {
1366 ast_error(n, "(unicode error) unknown error");
1367 }
1368 Py_DECREF(type);
1369 Py_DECREF(value);
1370 Py_XDECREF(tback);
1371 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001372 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001373 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001374 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001375 if (bytesmode)
1376 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1377 else
1378 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 }
1380 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001381 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 if (!pynum)
1383 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001384
Thomas Wouters89f507f2006-12-13 04:49:30 +00001385 PyArena_AddPyObject(c->c_arena, pynum);
1386 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 }
Georg Brandldde00282007-03-18 19:01:53 +00001388 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001389 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001390 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001391 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392
Thomas Wouters89f507f2006-12-13 04:49:30 +00001393 if (TYPE(ch) == RPAR)
1394 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 if (TYPE(ch) == yield_expr)
1397 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001400 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001401 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001402
Nick Coghlan650f0d02007-04-15 12:05:43 +00001403 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001405 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406
Thomas Wouters89f507f2006-12-13 04:49:30 +00001407 if (TYPE(ch) == RSQB)
1408 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409
Nick Coghlan650f0d02007-04-15 12:05:43 +00001410 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001411 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1412 asdl_seq *elts = seq_for_testlist(c, ch);
1413 if (!elts)
1414 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001415
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1417 }
1418 else
1419 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001421 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1422 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001423 int i, size;
1424 asdl_seq *keys, *values;
1425
1426 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001427 if (TYPE(ch) == RBRACE) {
1428 /* it's an empty dict */
1429 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1430 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1431 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001432 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001433 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001434 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001435 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001436 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001437 for (i = 0; i < NCH(ch); i += 2) {
1438 expr_ty expression;
1439 expression = ast_for_expr(c, CHILD(ch, i));
1440 if (!expression)
1441 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001442 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001443 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001444 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1445 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1446 /* it's a set comprehension */
1447 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001448 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1449 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001450 } else {
1451 /* it's a dict */
1452 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1453 keys = asdl_seq_new(size, c->c_arena);
1454 if (!keys)
1455 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456
Guido van Rossum86e58e22006-08-28 15:27:34 +00001457 values = asdl_seq_new(size, c->c_arena);
1458 if (!values)
1459 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460
Guido van Rossum86e58e22006-08-28 15:27:34 +00001461 for (i = 0; i < NCH(ch); i += 4) {
1462 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463
Guido van Rossum86e58e22006-08-28 15:27:34 +00001464 expression = ast_for_expr(c, CHILD(ch, i));
1465 if (!expression)
1466 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001467
Guido van Rossum86e58e22006-08-28 15:27:34 +00001468 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001469
Guido van Rossum86e58e22006-08-28 15:27:34 +00001470 expression = ast_for_expr(c, CHILD(ch, i + 2));
1471 if (!expression)
1472 return NULL;
1473
1474 asdl_seq_SET(values, i / 4, expression);
1475 }
1476 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001480 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1481 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 }
1483}
1484
1485static slice_ty
1486ast_for_slice(struct compiling *c, const node *n)
1487{
1488 node *ch;
1489 expr_ty lower = NULL, upper = NULL, step = NULL;
1490
1491 REQ(n, subscript);
1492
1493 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001494 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 sliceop: ':' [test]
1496 */
1497 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 if (NCH(n) == 1 && TYPE(ch) == test) {
1499 /* 'step' variable hold no significance in terms of being used over
1500 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502 if (!step)
1503 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 }
1507
1508 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001509 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 if (!lower)
1511 return NULL;
1512 }
1513
1514 /* If there's an upper bound it's in the second or third position. */
1515 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001516 if (NCH(n) > 1) {
1517 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518
Thomas Wouters89f507f2006-12-13 04:49:30 +00001519 if (TYPE(n2) == test) {
1520 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 if (!upper)
1522 return NULL;
1523 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001524 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001526 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527
Thomas Wouters89f507f2006-12-13 04:49:30 +00001528 if (TYPE(n2) == test) {
1529 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530 if (!upper)
1531 return NULL;
1532 }
1533 }
1534
1535 ch = CHILD(n, NCH(n) - 1);
1536 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001537 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001538 ch = CHILD(ch, 1);
1539 if (TYPE(ch) == test) {
1540 step = ast_for_expr(c, ch);
1541 if (!step)
1542 return NULL;
1543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544 }
1545 }
1546
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001547 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548}
1549
1550static expr_ty
1551ast_for_binop(struct compiling *c, const node *n)
1552{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001553 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001555 BinOp(BinOp(A, op, B), op, C).
1556 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557
Guido van Rossumd8faa362007-04-27 19:54:29 +00001558 int i, nops;
1559 expr_ty expr1, expr2, result;
1560 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562 expr1 = ast_for_expr(c, CHILD(n, 0));
1563 if (!expr1)
1564 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565
Guido van Rossumd8faa362007-04-27 19:54:29 +00001566 expr2 = ast_for_expr(c, CHILD(n, 2));
1567 if (!expr2)
1568 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569
Guido van Rossumd8faa362007-04-27 19:54:29 +00001570 newoperator = get_operator(CHILD(n, 1));
1571 if (!newoperator)
1572 return NULL;
1573
1574 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1575 c->c_arena);
1576 if (!result)
1577 return NULL;
1578
1579 nops = (NCH(n) - 1) / 2;
1580 for (i = 1; i < nops; i++) {
1581 expr_ty tmp_result, tmp;
1582 const node* next_oper = CHILD(n, i * 2 + 1);
1583
1584 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001585 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586 return NULL;
1587
Guido van Rossumd8faa362007-04-27 19:54:29 +00001588 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1589 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590 return NULL;
1591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593 LINENO(next_oper), next_oper->n_col_offset,
1594 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001596 return NULL;
1597 result = tmp_result;
1598 }
1599 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600}
1601
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001602static expr_ty
1603ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001606 subscriptlist: subscript (',' subscript)* [',']
1607 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1608 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 REQ(n, trailer);
1610 if (TYPE(CHILD(n, 0)) == LPAR) {
1611 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001612 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1613 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001614 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001615 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001616 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001617 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001618 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1619 if (!attr_id)
1620 return NULL;
1621 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001622 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001623 }
1624 else {
1625 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 REQ(CHILD(n, 2), RSQB);
1627 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001629 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1630 if (!slc)
1631 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001632 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1633 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001634 }
1635 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001637 by treating the sequence as a tuple literal if there are
1638 no slice features.
1639 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001640 int j;
1641 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001643 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001644 asdl_seq *slices, *elts;
1645 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 if (!slices)
1647 return NULL;
1648 for (j = 0; j < NCH(n); j += 2) {
1649 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001650 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001651 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001652 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001653 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 asdl_seq_SET(slices, j / 2, slc);
1655 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 if (!simple) {
1657 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001658 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001659 }
1660 /* extract Index values and put them in a Tuple */
1661 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001662 if (!elts)
1663 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001664 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1665 slc = (slice_ty)asdl_seq_GET(slices, j);
1666 assert(slc->kind == Index_kind && slc->v.Index.value);
1667 asdl_seq_SET(elts, j, slc->v.Index.value);
1668 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001669 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001670 if (!e)
1671 return NULL;
1672 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001673 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001674 }
1675 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001676}
1677
1678static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001679ast_for_factor(struct compiling *c, const node *n)
1680{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001681 expr_ty expression;
1682
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001683 expression = ast_for_expr(c, CHILD(n, 1));
1684 if (!expression)
1685 return NULL;
1686
1687 switch (TYPE(CHILD(n, 0))) {
1688 case PLUS:
1689 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1690 c->c_arena);
1691 case MINUS:
1692 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1693 c->c_arena);
1694 case TILDE:
1695 return UnaryOp(Invert, expression, LINENO(n),
1696 n->n_col_offset, c->c_arena);
1697 }
1698 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1699 TYPE(CHILD(n, 0)));
1700 return NULL;
1701}
1702
1703static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001704ast_for_power(struct compiling *c, const node *n)
1705{
1706 /* power: atom trailer* ('**' factor)*
1707 */
1708 int i;
1709 expr_ty e, tmp;
1710 REQ(n, power);
1711 e = ast_for_atom(c, CHILD(n, 0));
1712 if (!e)
1713 return NULL;
1714 if (NCH(n) == 1)
1715 return e;
1716 for (i = 1; i < NCH(n); i++) {
1717 node *ch = CHILD(n, i);
1718 if (TYPE(ch) != trailer)
1719 break;
1720 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001721 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001722 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001723 tmp->lineno = e->lineno;
1724 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001725 e = tmp;
1726 }
1727 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1728 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001729 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001730 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001731 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001732 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001733 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001734 e = tmp;
1735 }
1736 return e;
1737}
1738
Guido van Rossum0368b722007-05-11 16:50:42 +00001739static expr_ty
1740ast_for_starred(struct compiling *c, const node *n)
1741{
1742 expr_ty tmp;
1743 REQ(n, star_expr);
1744
1745 tmp = ast_for_expr(c, CHILD(n, 1));
1746 if (!tmp)
1747 return NULL;
1748
1749 /* The Load context is changed later. */
1750 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1751}
1752
1753
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754/* Do not name a variable 'expr'! Will cause a compile error.
1755*/
1756
1757static expr_ty
1758ast_for_expr(struct compiling *c, const node *n)
1759{
1760 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001761 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001762 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764 and_test: not_test ('and' not_test)*
1765 not_test: 'not' not_test | comparison
1766 comparison: expr (comp_op expr)*
1767 expr: xor_expr ('|' xor_expr)*
1768 xor_expr: and_expr ('^' and_expr)*
1769 and_expr: shift_expr ('&' shift_expr)*
1770 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1771 arith_expr: term (('+'|'-') term)*
1772 term: factor (('*'|'/'|'%'|'//') factor)*
1773 factor: ('+'|'-'|'~') factor | power
1774 power: atom trailer* ('**' factor)*
1775 */
1776
1777 asdl_seq *seq;
1778 int i;
1779
1780 loop:
1781 switch (TYPE(n)) {
1782 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001783 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001784 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001785 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001787 else if (NCH(n) > 1)
1788 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001789 /* Fallthrough */
1790 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 case and_test:
1792 if (NCH(n) == 1) {
1793 n = CHILD(n, 0);
1794 goto loop;
1795 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001796 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797 if (!seq)
1798 return NULL;
1799 for (i = 0; i < NCH(n); i += 2) {
1800 expr_ty e = ast_for_expr(c, CHILD(n, i));
1801 if (!e)
1802 return NULL;
1803 asdl_seq_SET(seq, i / 2, e);
1804 }
1805 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001806 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1807 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001808 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001809 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 case not_test:
1811 if (NCH(n) == 1) {
1812 n = CHILD(n, 0);
1813 goto loop;
1814 }
1815 else {
1816 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1817 if (!expression)
1818 return NULL;
1819
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001820 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1821 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 }
1823 case comparison:
1824 if (NCH(n) == 1) {
1825 n = CHILD(n, 0);
1826 goto loop;
1827 }
1828 else {
1829 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001830 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001831 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001832 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 if (!ops)
1834 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001835 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 return NULL;
1838 }
1839 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001840 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001842 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001845 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846
1847 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001848 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001850 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001852 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 asdl_seq_SET(cmps, i / 2, expression);
1854 }
1855 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001856 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001860 return Compare(expression, ops, cmps, LINENO(n),
1861 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 }
1863 break;
1864
Guido van Rossum0368b722007-05-11 16:50:42 +00001865 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 /* The next five cases all handle BinOps. The main body of code
1868 is the same in each case, but the switch turned inside out to
1869 reuse the code for each type of operator.
1870 */
1871 case expr:
1872 case xor_expr:
1873 case and_expr:
1874 case shift_expr:
1875 case arith_expr:
1876 case term:
1877 if (NCH(n) == 1) {
1878 n = CHILD(n, 0);
1879 goto loop;
1880 }
1881 return ast_for_binop(c, n);
1882 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 expr_ty exp = NULL;
1884 if (NCH(n) == 2) {
1885 exp = ast_for_testlist(c, CHILD(n, 1));
1886 if (!exp)
1887 return NULL;
1888 }
1889 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1890 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001891 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 if (NCH(n) == 1) {
1893 n = CHILD(n, 0);
1894 goto loop;
1895 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001897 case power:
1898 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001900 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 return NULL;
1902 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001903 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 return NULL;
1905}
1906
1907static expr_ty
1908ast_for_call(struct compiling *c, const node *n, expr_ty func)
1909{
1910 /*
1911 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1912 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001913 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 */
1915
1916 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001917 asdl_seq *args;
1918 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 expr_ty vararg = NULL, kwarg = NULL;
1920
1921 REQ(n, arglist);
1922
1923 nargs = 0;
1924 nkeywords = 0;
1925 ngens = 0;
1926 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001927 node *ch = CHILD(n, i);
1928 if (TYPE(ch) == argument) {
1929 if (NCH(ch) == 1)
1930 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001932 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001934 nkeywords++;
1935 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 }
1937 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001938 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001939 "if not sole argument");
1940 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 }
1942
1943 if (nargs + nkeywords + ngens > 255) {
1944 ast_error(n, "more than 255 arguments");
1945 return NULL;
1946 }
1947
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001948 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001950 return NULL;
1951 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001953 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 nargs = 0;
1955 nkeywords = 0;
1956 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001957 node *ch = CHILD(n, i);
1958 if (TYPE(ch) == argument) {
1959 expr_ty e;
1960 if (NCH(ch) == 1) {
1961 if (nkeywords) {
1962 ast_error(CHILD(ch, 0),
1963 "non-keyword arg after keyword arg");
1964 return NULL;
1965 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001966 if (vararg) {
1967 ast_error(CHILD(ch, 0),
1968 "only named arguments may follow *expression");
1969 return NULL;
1970 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001971 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001973 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001976 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001977 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001979 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001980 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001982 else {
1983 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001984 identifier key, tmp;
1985 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001988 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 /* f(lambda x: x[0] = 3) ends up getting parsed with
1992 * LHS test = lambda x: x[0], and RHS test = 3.
1993 * SF bug 132313 points out that complaining about a keyword
1994 * then is very confusing.
1995 */
1996 if (e->kind == Lambda_kind) {
1997 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 } else if (e->kind != Name_kind) {
2000 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002001 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002002 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 return NULL;
2004 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002006 for (k = 0; k < nkeywords; k++) {
2007 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2008 if (!PyUnicode_Compare(tmp, key)) {
2009 ast_error(CHILD(ch, 0), "keyword argument repeated");
2010 return NULL;
2011 }
2012 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002015 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002018 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 asdl_seq_SET(keywords, nkeywords++, kw);
2020 }
2021 }
2022 else if (TYPE(ch) == STAR) {
2023 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002024 if (!vararg)
2025 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 i++;
2027 }
2028 else if (TYPE(ch) == DOUBLESTAR) {
2029 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002030 if (!kwarg)
2031 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002032 i++;
2033 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 }
2035
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002036 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037}
2038
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002040ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002042 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002043 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002045 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002046 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002047 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002048 }
2049 else {
2050 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002051 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002052 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002054 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055 else {
2056 asdl_seq *tmp = seq_for_testlist(c, n);
2057 if (!tmp)
2058 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002059 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002061}
2062
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063static stmt_ty
2064ast_for_expr_stmt(struct compiling *c, const node *n)
2065{
2066 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002069 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002071 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 test: ... here starts the operator precendence dance
2073 */
2074
2075 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002076 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 if (!e)
2078 return NULL;
2079
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 }
2082 else if (TYPE(CHILD(n, 1)) == augassign) {
2083 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002084 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086
Thomas Wouters89f507f2006-12-13 04:49:30 +00002087 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 if (!expr1)
2089 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002090 if(!set_context(c, expr1, Store, ch))
2091 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002092 /* set_context checks that most expressions are not the left side.
2093 Augmented assignments can only have a name, a subscript, or an
2094 attribute on the left, though, so we have to explicitly check for
2095 those. */
2096 switch (expr1->kind) {
2097 case Name_kind:
2098 case Attribute_kind:
2099 case Subscript_kind:
2100 break;
2101 default:
2102 ast_error(ch, "illegal expression for augmented assignment");
2103 return NULL;
2104 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002105
Thomas Wouters89f507f2006-12-13 04:49:30 +00002106 ch = CHILD(n, 2);
2107 if (TYPE(ch) == testlist)
2108 expr2 = ast_for_testlist(c, ch);
2109 else
2110 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002111 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112 return NULL;
2113
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002114 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002115 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 return NULL;
2117
Thomas Wouters89f507f2006-12-13 04:49:30 +00002118 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119 }
2120 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002121 int i;
2122 asdl_seq *targets;
2123 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124 expr_ty expression;
2125
Thomas Wouters89f507f2006-12-13 04:49:30 +00002126 /* a normal assignment */
2127 REQ(CHILD(n, 1), EQUAL);
2128 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2129 if (!targets)
2130 return NULL;
2131 for (i = 0; i < NCH(n) - 2; i += 2) {
2132 expr_ty e;
2133 node *ch = CHILD(n, i);
2134 if (TYPE(ch) == yield_expr) {
2135 ast_error(ch, "assignment to yield expression not possible");
2136 return NULL;
2137 }
2138 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002140 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002142 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002143 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002144 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145
Thomas Wouters89f507f2006-12-13 04:49:30 +00002146 asdl_seq_SET(targets, i / 2, e);
2147 }
2148 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002149 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 expression = ast_for_testlist(c, value);
2151 else
2152 expression = ast_for_expr(c, value);
2153 if (!expression)
2154 return NULL;
2155 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157}
2158
Benjamin Peterson78565b22009-06-28 19:19:51 +00002159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002161ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162{
2163 asdl_seq *seq;
2164 int i;
2165 expr_ty e;
2166
2167 REQ(n, exprlist);
2168
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002169 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002173 e = ast_for_expr(c, CHILD(n, i));
2174 if (!e)
2175 return NULL;
2176 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002177 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002178 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179 }
2180 return seq;
2181}
2182
2183static stmt_ty
2184ast_for_del_stmt(struct compiling *c, const node *n)
2185{
2186 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 /* del_stmt: 'del' exprlist */
2189 REQ(n, del_stmt);
2190
2191 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2192 if (!expr_list)
2193 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002194 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002195}
2196
2197static stmt_ty
2198ast_for_flow_stmt(struct compiling *c, const node *n)
2199{
2200 /*
2201 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2202 | yield_stmt
2203 break_stmt: 'break'
2204 continue_stmt: 'continue'
2205 return_stmt: 'return' [testlist]
2206 yield_stmt: yield_expr
2207 yield_expr: 'yield' testlist
2208 raise_stmt: 'raise' [test [',' test [',' test]]]
2209 */
2210 node *ch;
2211
2212 REQ(n, flow_stmt);
2213 ch = CHILD(n, 0);
2214 switch (TYPE(ch)) {
2215 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002216 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002217 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002218 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002220 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2221 if (!exp)
2222 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002223 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 }
2225 case return_stmt:
2226 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002227 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002229 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230 if (!expression)
2231 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002232 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 }
2234 case raise_stmt:
2235 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002236 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2237 else if (NCH(ch) >= 2) {
2238 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2240 if (!expression)
2241 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002242 if (NCH(ch) == 4) {
2243 cause = ast_for_expr(c, CHILD(ch, 3));
2244 if (!cause)
2245 return NULL;
2246 }
2247 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 }
2249 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002250 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 "unexpected flow_stmt: %d", TYPE(ch));
2252 return NULL;
2253 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002254
2255 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2256 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257}
2258
2259static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002260alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261{
2262 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002263 import_as_name: NAME ['as' NAME]
2264 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 dotted_name: NAME ('.' NAME)*
2266 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002267 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002268
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269 loop:
2270 switch (TYPE(n)) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002271 case import_as_name: {
2272 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002273 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002274 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002275 if (!name)
2276 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002277 if (NCH(n) == 3) {
2278 node *str_node = CHILD(n, 2);
2279 str = NEW_IDENTIFIER(str_node);
2280 if (!str)
2281 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002282 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002283 return NULL;
2284 }
2285 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002286 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002287 return NULL;
2288 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002289 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 case dotted_as_name:
2292 if (NCH(n) == 1) {
2293 n = CHILD(n, 0);
2294 goto loop;
2295 }
2296 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002297 node *asname_node = CHILD(n, 2);
2298 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002299 if (!a)
2300 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002302 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002303 if (!a->asname)
2304 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002305 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002306 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 return a;
2308 }
2309 break;
2310 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002311 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002312 node *name_node = CHILD(n, 0);
2313 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002314 if (!name)
2315 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002316 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002317 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002318 return alias(name, NULL, c->c_arena);
2319 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 else {
2321 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002322 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002323 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326
2327 len = 0;
2328 for (i = 0; i < NCH(n); i += 2)
2329 /* length of string plus one for the dot */
2330 len += strlen(STR(CHILD(n, i))) + 1;
2331 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002332 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 if (!str)
2334 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002335 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 if (!s)
2337 return NULL;
2338 for (i = 0; i < NCH(n); i += 2) {
2339 char *sch = STR(CHILD(n, i));
2340 strcpy(s, STR(CHILD(n, i)));
2341 s += strlen(sch);
2342 *s++ = '.';
2343 }
2344 --s;
2345 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2347 PyBytes_GET_SIZE(str),
2348 NULL);
2349 Py_DECREF(str);
2350 if (!uni)
2351 return NULL;
2352 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002353 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002355 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 }
2357 break;
2358 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002359 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002360 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002361 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002363 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 "unexpected import name: %d", TYPE(n));
2365 return NULL;
2366 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002367
2368 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 return NULL;
2370}
2371
2372static stmt_ty
2373ast_for_import_stmt(struct compiling *c, const node *n)
2374{
2375 /*
2376 import_stmt: import_name | import_from
2377 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002378 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2379 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002381 int lineno;
2382 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 int i;
2384 asdl_seq *aliases;
2385
2386 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002387 lineno = LINENO(n);
2388 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002390 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002392 REQ(n, dotted_as_names);
2393 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2394 if (!aliases)
2395 return NULL;
2396 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002397 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002398 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002400 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002402 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002404 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002406 int idx, ndots = 0;
2407 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002408 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002410 /* Count the number of dots (for relative imports) and check for the
2411 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 for (idx = 1; idx < NCH(n); idx++) {
2413 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002414 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2415 if (!mod)
2416 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 idx++;
2418 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002419 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002421 ndots += 3;
2422 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 } else if (TYPE(CHILD(n, idx)) != DOT) {
2424 break;
2425 }
2426 ndots++;
2427 }
2428 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002429 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002430 case STAR:
2431 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 n = CHILD(n, idx);
2433 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 break;
2435 case LPAR:
2436 /* from ... import (x, y, z) */
2437 n = CHILD(n, idx + 1);
2438 n_children = NCH(n);
2439 break;
2440 case import_as_names:
2441 /* from ... import x, y, z */
2442 n = CHILD(n, idx);
2443 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002444 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 ast_error(n, "trailing comma not allowed without"
2446 " surrounding parentheses");
2447 return NULL;
2448 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 break;
2450 default:
2451 ast_error(n, "Unexpected node-type in from-import");
2452 return NULL;
2453 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454
Thomas Wouters89f507f2006-12-13 04:49:30 +00002455 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2456 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458
2459 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002460 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002461 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002462 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002466 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002468 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002469 if (!import_alias)
2470 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002474 if (mod != NULL)
2475 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002476 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002477 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 }
Neal Norwitz79792652005-11-14 04:25:03 +00002479 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 "unknown import statement: starts with command '%s'",
2481 STR(CHILD(n, 0)));
2482 return NULL;
2483}
2484
2485static stmt_ty
2486ast_for_global_stmt(struct compiling *c, const node *n)
2487{
2488 /* global_stmt: 'global' NAME (',' NAME)* */
2489 identifier name;
2490 asdl_seq *s;
2491 int i;
2492
2493 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002494 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 name = NEW_IDENTIFIER(CHILD(n, i));
2499 if (!name)
2500 return NULL;
2501 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002503 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504}
2505
2506static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002507ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2508{
2509 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2510 identifier name;
2511 asdl_seq *s;
2512 int i;
2513
2514 REQ(n, nonlocal_stmt);
2515 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2516 if (!s)
2517 return NULL;
2518 for (i = 1; i < NCH(n); i += 2) {
2519 name = NEW_IDENTIFIER(CHILD(n, i));
2520 if (!name)
2521 return NULL;
2522 asdl_seq_SET(s, i / 2, name);
2523 }
2524 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2525}
2526
2527static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528ast_for_assert_stmt(struct compiling *c, const node *n)
2529{
2530 /* assert_stmt: 'assert' test [',' test] */
2531 REQ(n, assert_stmt);
2532 if (NCH(n) == 2) {
2533 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2534 if (!expression)
2535 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002536 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 }
2538 else if (NCH(n) == 4) {
2539 expr_ty expr1, expr2;
2540
2541 expr1 = ast_for_expr(c, CHILD(n, 1));
2542 if (!expr1)
2543 return NULL;
2544 expr2 = ast_for_expr(c, CHILD(n, 3));
2545 if (!expr2)
2546 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547
Thomas Wouters89f507f2006-12-13 04:49:30 +00002548 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 }
Neal Norwitz79792652005-11-14 04:25:03 +00002550 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 "improper number of parts to 'assert' statement: %d",
2552 NCH(n));
2553 return NULL;
2554}
2555
2556static asdl_seq *
2557ast_for_suite(struct compiling *c, const node *n)
2558{
2559 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002560 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 stmt_ty s;
2562 int i, total, num, end, pos = 0;
2563 node *ch;
2564
2565 REQ(n, suite);
2566
2567 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002568 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002572 n = CHILD(n, 0);
2573 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002575 */
2576 end = NCH(n) - 1;
2577 if (TYPE(CHILD(n, end - 1)) == SEMI)
2578 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 for (i = 0; i < end; i += 2) {
2581 ch = CHILD(n, i);
2582 s = ast_for_stmt(c, ch);
2583 if (!s)
2584 return NULL;
2585 asdl_seq_SET(seq, pos++, s);
2586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 }
2588 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 for (i = 2; i < (NCH(n) - 1); i++) {
2590 ch = CHILD(n, i);
2591 REQ(ch, stmt);
2592 num = num_stmts(ch);
2593 if (num == 1) {
2594 /* small_stmt or compound_stmt with only one child */
2595 s = ast_for_stmt(c, ch);
2596 if (!s)
2597 return NULL;
2598 asdl_seq_SET(seq, pos++, s);
2599 }
2600 else {
2601 int j;
2602 ch = CHILD(ch, 0);
2603 REQ(ch, simple_stmt);
2604 for (j = 0; j < NCH(ch); j += 2) {
2605 /* statement terminates with a semi-colon ';' */
2606 if (NCH(CHILD(ch, j)) == 0) {
2607 assert((j + 1) == NCH(ch));
2608 break;
2609 }
2610 s = ast_for_stmt(c, CHILD(ch, j));
2611 if (!s)
2612 return NULL;
2613 asdl_seq_SET(seq, pos++, s);
2614 }
2615 }
2616 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 }
2618 assert(pos == seq->size);
2619 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620}
2621
2622static stmt_ty
2623ast_for_if_stmt(struct compiling *c, const node *n)
2624{
2625 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2626 ['else' ':' suite]
2627 */
2628 char *s;
2629
2630 REQ(n, if_stmt);
2631
2632 if (NCH(n) == 4) {
2633 expr_ty expression;
2634 asdl_seq *suite_seq;
2635
2636 expression = ast_for_expr(c, CHILD(n, 1));
2637 if (!expression)
2638 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002640 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642
Guido van Rossumd8faa362007-04-27 19:54:29 +00002643 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2644 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002646
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 s = STR(CHILD(n, 4));
2648 /* s[2], the third character in the string, will be
2649 's' for el_s_e, or
2650 'i' for el_i_f
2651 */
2652 if (s[2] == 's') {
2653 expr_ty expression;
2654 asdl_seq *seq1, *seq2;
2655
2656 expression = ast_for_expr(c, CHILD(n, 1));
2657 if (!expression)
2658 return NULL;
2659 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002660 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 return NULL;
2662 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002663 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 return NULL;
2665
Guido van Rossumd8faa362007-04-27 19:54:29 +00002666 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2667 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 }
2669 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671 expr_ty expression;
2672 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002673 asdl_seq *orelse = NULL;
2674 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 /* must reference the child n_elif+1 since 'else' token is third,
2676 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002677 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2678 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2679 has_else = 1;
2680 n_elif -= 3;
2681 }
2682 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002685 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 orelse = asdl_seq_new(1, c->c_arena);
2688 if (!orelse)
2689 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002691 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002693 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2694 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002696 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2697 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 asdl_seq_SET(orelse, 0,
2701 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002702 LINENO(CHILD(n, NCH(n) - 6)),
2703 CHILD(n, NCH(n) - 6)->n_col_offset,
2704 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002705 /* the just-created orelse handled the last elif */
2706 n_elif--;
2707 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 for (i = 0; i < n_elif; i++) {
2710 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002711 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2712 if (!newobj)
2713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002715 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002718 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720
Thomas Wouters89f507f2006-12-13 04:49:30 +00002721 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002723 LINENO(CHILD(n, off)),
2724 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 orelse = newobj;
2726 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002727 expression = ast_for_expr(c, CHILD(n, 1));
2728 if (!expression)
2729 return NULL;
2730 suite_seq = ast_for_suite(c, CHILD(n, 3));
2731 if (!suite_seq)
2732 return NULL;
2733 return If(expression, suite_seq, orelse,
2734 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002736
2737 PyErr_Format(PyExc_SystemError,
2738 "unexpected token in 'if' statement: %s", s);
2739 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740}
2741
2742static stmt_ty
2743ast_for_while_stmt(struct compiling *c, const node *n)
2744{
2745 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2746 REQ(n, while_stmt);
2747
2748 if (NCH(n) == 4) {
2749 expr_ty expression;
2750 asdl_seq *suite_seq;
2751
2752 expression = ast_for_expr(c, CHILD(n, 1));
2753 if (!expression)
2754 return NULL;
2755 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002756 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002758 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 }
2760 else if (NCH(n) == 7) {
2761 expr_ty expression;
2762 asdl_seq *seq1, *seq2;
2763
2764 expression = ast_for_expr(c, CHILD(n, 1));
2765 if (!expression)
2766 return NULL;
2767 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002768 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 return NULL;
2770 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002771 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 return NULL;
2773
Thomas Wouters89f507f2006-12-13 04:49:30 +00002774 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776
2777 PyErr_Format(PyExc_SystemError,
2778 "wrong number of tokens for 'while' statement: %d",
2779 NCH(n));
2780 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781}
2782
2783static stmt_ty
2784ast_for_for_stmt(struct compiling *c, const node *n)
2785{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002788 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002789 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2791 REQ(n, for_stmt);
2792
2793 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002794 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 if (!seq)
2796 return NULL;
2797 }
2798
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002799 node_target = CHILD(n, 1);
2800 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002801 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002803 /* Check the # of children rather than the length of _target, since
2804 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002805 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002806 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002807 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002809 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002811 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002812 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 return NULL;
2814 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002815 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 return NULL;
2817
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002818 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2819 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820}
2821
2822static excepthandler_ty
2823ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2824{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002825 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 REQ(exc, except_clause);
2827 REQ(body, suite);
2828
2829 if (NCH(exc) == 1) {
2830 asdl_seq *suite_seq = ast_for_suite(c, body);
2831 if (!suite_seq)
2832 return NULL;
2833
Neal Norwitzad74aa82008-03-31 05:14:30 +00002834 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002835 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 }
2837 else if (NCH(exc) == 2) {
2838 expr_ty expression;
2839 asdl_seq *suite_seq;
2840
2841 expression = ast_for_expr(c, CHILD(exc, 1));
2842 if (!expression)
2843 return NULL;
2844 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002845 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 return NULL;
2847
Neal Norwitzad74aa82008-03-31 05:14:30 +00002848 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002849 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 }
2851 else if (NCH(exc) == 4) {
2852 asdl_seq *suite_seq;
2853 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002854 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002855 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002857 if (forbidden_name(e, CHILD(exc, 3), 0))
2858 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
2862 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002863 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 return NULL;
2865
Neal Norwitzad74aa82008-03-31 05:14:30 +00002866 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002867 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002869
2870 PyErr_Format(PyExc_SystemError,
2871 "wrong number of children for 'except' clause: %d",
2872 NCH(exc));
2873 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874}
2875
2876static stmt_ty
2877ast_for_try_stmt(struct compiling *c, const node *n)
2878{
Neal Norwitzf599f422005-12-17 21:33:47 +00002879 const int nch = NCH(n);
2880 int n_except = (nch - 3)/3;
2881 asdl_seq *body, *orelse = NULL, *finally = NULL;
2882
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 REQ(n, try_stmt);
2884
Neal Norwitzf599f422005-12-17 21:33:47 +00002885 body = ast_for_suite(c, CHILD(n, 2));
2886 if (body == NULL)
2887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888
Neal Norwitzf599f422005-12-17 21:33:47 +00002889 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2890 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2891 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2892 /* we can assume it's an "else",
2893 because nch >= 9 for try-else-finally and
2894 it would otherwise have a type of except_clause */
2895 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2896 if (orelse == NULL)
2897 return NULL;
2898 n_except--;
2899 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900
Neal Norwitzf599f422005-12-17 21:33:47 +00002901 finally = ast_for_suite(c, CHILD(n, nch - 1));
2902 if (finally == NULL)
2903 return NULL;
2904 n_except--;
2905 }
2906 else {
2907 /* we can assume it's an "else",
2908 otherwise it would have a type of except_clause */
2909 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2910 if (orelse == NULL)
2911 return NULL;
2912 n_except--;
2913 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002915 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002916 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917 return NULL;
2918 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 int i;
2922 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002923 /* process except statements to create a try ... except */
2924 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2925 if (handlers == NULL)
2926 return NULL;
2927
2928 for (i = 0; i < n_except; i++) {
2929 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2930 CHILD(n, 5 + i * 3));
2931 if (!e)
2932 return NULL;
2933 asdl_seq_SET(handlers, i, e);
2934 }
2935
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002937 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002938 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002939 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002940
2941 /* if a 'finally' is present too, we nest the TryExcept within a
2942 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 body = asdl_seq_new(1, c->c_arena);
2944 if (body == NULL)
2945 return NULL;
2946 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002947 }
2948
2949 /* must be a try ... finally (except clauses are in body, if any exist) */
2950 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002951 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952}
2953
Georg Brandl0c315622009-05-25 21:10:36 +00002954/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002955static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002956ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002957{
2958 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002959
Georg Brandl0c315622009-05-25 21:10:36 +00002960 REQ(n, with_item);
2961 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002962 if (!context_expr)
2963 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002964 if (NCH(n) == 3) {
2965 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002966
2967 if (!optional_vars) {
2968 return NULL;
2969 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002970 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002971 return NULL;
2972 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973 }
2974
Georg Brandl0c315622009-05-25 21:10:36 +00002975 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002976 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002977}
2978
Georg Brandl0c315622009-05-25 21:10:36 +00002979/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2980static stmt_ty
2981ast_for_with_stmt(struct compiling *c, const node *n)
2982{
2983 int i;
2984 stmt_ty ret;
2985 asdl_seq *inner;
2986
2987 REQ(n, with_stmt);
2988
2989 /* process the with items inside-out */
2990 i = NCH(n) - 1;
2991 /* the suite of the innermost with item is the suite of the with stmt */
2992 inner = ast_for_suite(c, CHILD(n, i));
2993 if (!inner)
2994 return NULL;
2995
2996 for (;;) {
2997 i -= 2;
2998 ret = ast_for_with_item(c, CHILD(n, i), inner);
2999 if (!ret)
3000 return NULL;
3001 /* was this the last item? */
3002 if (i == 1)
3003 break;
3004 /* if not, wrap the result so far in a new sequence */
3005 inner = asdl_seq_new(1, c->c_arena);
3006 if (!inner)
3007 return NULL;
3008 asdl_seq_SET(inner, 0, ret);
3009 }
3010
3011 return ret;
3012}
3013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003015ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003017 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003018 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003019 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003020 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 REQ(n, classdef);
3023
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003024 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 s = ast_for_suite(c, CHILD(n, 3));
3026 if (!s)
3027 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003028 classname = NEW_IDENTIFIER(CHILD(n, 1));
3029 if (!classname)
3030 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003031 if (forbidden_name(classname, CHILD(n, 3), 0))
3032 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003033 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3034 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003036
3037 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003038 s = ast_for_suite(c, CHILD(n,5));
3039 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003040 return NULL;
3041 classname = NEW_IDENTIFIER(CHILD(n, 1));
3042 if (!classname)
3043 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003044 if (forbidden_name(classname, CHILD(n, 3), 0))
3045 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003046 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3047 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 }
3049
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003050 /* class NAME '(' arglist ')' ':' suite */
3051 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003052 {
3053 PyObject *dummy_name;
3054 expr_ty dummy;
3055 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3056 if (!dummy_name)
3057 return NULL;
3058 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3059 call = ast_for_call(c, CHILD(n, 3), dummy);
3060 if (!call)
3061 return NULL;
3062 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003064 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003066 classname = NEW_IDENTIFIER(CHILD(n, 1));
3067 if (!classname)
3068 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003069 if (forbidden_name(classname, CHILD(n, 1), 0))
3070 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003071
Benjamin Peterson30760062008-11-25 04:02:28 +00003072 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003073 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003074 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075}
3076
3077static stmt_ty
3078ast_for_stmt(struct compiling *c, const node *n)
3079{
3080 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 assert(NCH(n) == 1);
3082 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 }
3084 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003085 assert(num_stmts(n) == 1);
3086 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 }
3088 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003089 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003090 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3091 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003092 */
3093 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094 case expr_stmt:
3095 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 case del_stmt:
3097 return ast_for_del_stmt(c, n);
3098 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003099 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 case flow_stmt:
3101 return ast_for_flow_stmt(c, n);
3102 case import_stmt:
3103 return ast_for_import_stmt(c, n);
3104 case global_stmt:
3105 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003106 case nonlocal_stmt:
3107 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 case assert_stmt:
3109 return ast_for_assert_stmt(c, n);
3110 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003111 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3113 TYPE(n), NCH(n));
3114 return NULL;
3115 }
3116 }
3117 else {
3118 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003119 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003120 */
3121 node *ch = CHILD(n, 0);
3122 REQ(n, compound_stmt);
3123 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 case if_stmt:
3125 return ast_for_if_stmt(c, ch);
3126 case while_stmt:
3127 return ast_for_while_stmt(c, ch);
3128 case for_stmt:
3129 return ast_for_for_stmt(c, ch);
3130 case try_stmt:
3131 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003132 case with_stmt:
3133 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003135 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003137 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 case decorated:
3139 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003141 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3143 TYPE(n), NCH(n));
3144 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003145 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146 }
3147}
3148
3149static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003150parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003152 const char *end;
3153 long x;
3154 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003155 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003156 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003158 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 errno = 0;
3160 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 if (s[0] == '0') {
3163 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3164 if (x < 0 && errno == 0) {
3165 return PyLong_FromString((char *)s,
3166 (char **)0,
3167 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003168 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 }
3170 else
3171 x = PyOS_strtol((char *)s, (char **)&end, 0);
3172 if (*end == '\0') {
3173 if (errno != 0)
3174 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003175 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 }
3177 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003179 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003180 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3181 if (compl.imag == -1.0 && PyErr_Occurred())
3182 return NULL;
3183 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003184 }
3185 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003187 dx = PyOS_string_to_double(s, NULL, NULL);
3188 if (dx == -1.0 && PyErr_Occurred())
3189 return NULL;
3190 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003191 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192}
3193
3194static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003195decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003197 PyObject *u, *v;
3198 char *s, *t;
3199 t = s = (char *)*sPtr;
3200 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3201 while (s < end && (*s & 0x80)) s++;
3202 *sPtr = s;
3203 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3204 if (u == NULL)
3205 return NULL;
3206 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3207 Py_DECREF(u);
3208 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209}
3210
3211static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003212decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003214 PyObject *v, *u;
3215 char *buf;
3216 char *p;
3217 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003218
Guido van Rossumd8faa362007-04-27 19:54:29 +00003219 if (encoding == NULL) {
3220 buf = (char *)s;
3221 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003222 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003223 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003224 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003225 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003226 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3227 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3228 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 if (u == NULL)
3230 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003231 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 end = s + len;
3233 while (s < end) {
3234 if (*s == '\\') {
3235 *p++ = *s++;
3236 if (*s & 0x80) {
3237 strcpy(p, "u005c");
3238 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003239 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003240 }
3241 if (*s & 0x80) { /* XXX inefficient */
3242 PyObject *w;
3243 char *r;
3244 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003245 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 if (w == NULL) {
3247 Py_DECREF(u);
3248 return NULL;
3249 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003250 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003251 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003252 assert(rn % 4 == 0);
3253 for (i = 0; i < rn; i += 4) {
3254 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003255 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003256 r[i + 1] & 0xFF,
3257 r[i + 2] & 0xFF,
3258 r[i + 3] & 0xFF);
3259 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003260 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003261 /* Should be impossible to overflow */
3262 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 Py_DECREF(w);
3264 } else {
3265 *p++ = *s++;
3266 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003267 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003268 len = p - buf;
3269 s = buf;
3270 }
3271 if (rawmode)
3272 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3273 else
3274 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3275 Py_XDECREF(u);
3276 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277}
3278
3279/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003280 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 * parsestr parses it, and returns the decoded Python string object.
3282 */
3283static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003284parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003285{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003286 size_t len;
3287 const char *s = STR(n);
3288 int quote = Py_CHARMASK(*s);
3289 int rawmode = 0;
3290 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003291 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003292 if (quote == 'b' || quote == 'B') {
3293 quote = *++s;
3294 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003296 if (quote == 'r' || quote == 'R') {
3297 quote = *++s;
3298 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003299 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003300 }
3301 if (quote != '\'' && quote != '\"') {
3302 PyErr_BadInternalCall();
3303 return NULL;
3304 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003305 s++;
3306 len = strlen(s);
3307 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003309 "string to parse is too long");
3310 return NULL;
3311 }
3312 if (s[--len] != quote) {
3313 PyErr_BadInternalCall();
3314 return NULL;
3315 }
3316 if (len >= 4 && s[0] == quote && s[1] == quote) {
3317 s += 2;
3318 len -= 2;
3319 if (s[--len] != quote || s[--len] != quote) {
3320 PyErr_BadInternalCall();
3321 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003322 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003323 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003324 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003325 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003326 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003327 if (*bytesmode) {
3328 /* Disallow non-ascii characters (but not escapes) */
3329 const char *c;
3330 for (c = s; *c; c++) {
3331 if (Py_CHARMASK(*c) >= 0x80) {
3332 ast_error(n, "bytes can only contain ASCII "
3333 "literal characters.");
3334 return NULL;
3335 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003336 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003338 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003339 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003340 if (rawmode || strchr(s, '\\') == NULL) {
3341 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003342 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003343 if (u == NULL || !*bytesmode)
3344 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003345 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003346 Py_DECREF(u);
3347 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003348 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003349 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003350 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003351 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003353 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003354 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003355 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003356 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003357 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358}
3359
Guido van Rossum29fd7122007-11-12 01:13:56 +00003360/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 * compile-time literal catenation, calling parsestr() on each piece, and
3362 * pasting the intermediate results together.
3363 */
3364static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003365parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003367 PyObject *v;
3368 int i;
3369 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003370 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003371 if (v != NULL) {
3372 /* String literal concatenation */
3373 for (i = 1; i < NCH(n); i++) {
3374 PyObject *s;
3375 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003376 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003377 if (s == NULL)
3378 goto onError;
3379 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003380 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003381 goto onError;
3382 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003383 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3384 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003385 if (v == NULL)
3386 goto onError;
3387 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003388 else {
3389 PyObject *temp = PyUnicode_Concat(v, s);
3390 Py_DECREF(s);
3391 Py_DECREF(v);
3392 v = temp;
3393 if (v == NULL)
3394 goto onError;
3395 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003396 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003397 }
3398 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399
Guido van Rossumd8faa362007-04-27 19:54:29 +00003400 onError:
3401 Py_XDECREF(v);
3402 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403}