blob: b9beef88ef9626d705a8d0ae032b9674f38c6730 [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{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000093 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000094 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{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000104 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000105 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000106 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107
108 assert(PyErr_Occurred());
109 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000110 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111
112 PyErr_Fetch(&type, &value, &tback);
113 errstr = PyTuple_GetItem(value, 0);
114 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000116 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000117 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000118 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000119 Py_DECREF(errstr);
120 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000121 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000122 offset = PyTuple_GetItem(value, 2);
123 if (!offset) {
124 Py_DECREF(errstr);
125 return;
126 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 Py_DECREF(value);
128
129 loc = PyErr_ProgramText(filename, lineno);
130 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_INCREF(Py_None);
132 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000133 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000134 filename_obj = PyUnicode_DecodeFSDefault(filename);
135 if (filename_obj != NULL)
136 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
137 else
138 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000140 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000141 Py_DECREF(errstr);
142 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000143 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000144 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145 Py_DECREF(errstr);
146 Py_DECREF(tmp);
147 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000148 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149 PyErr_Restore(type, value, tback);
150}
151
152/* num_stmts() returns number of contained statements.
153
154 Use this routine to determine how big a sequence is needed for
155 the statements in a parse tree. Its raison d'etre is this bit of
156 grammar:
157
158 stmt: simple_stmt | compound_stmt
159 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
160
161 A simple_stmt can contain multiple small_stmt elements joined
162 by semicolons. If the arg is a simple_stmt, the number of
163 small_stmt elements is returned.
164*/
165
166static int
167num_stmts(const node *n)
168{
169 int i, l;
170 node *ch;
171
172 switch (TYPE(n)) {
173 case single_input:
174 if (TYPE(CHILD(n, 0)) == NEWLINE)
175 return 0;
176 else
177 return num_stmts(CHILD(n, 0));
178 case file_input:
179 l = 0;
180 for (i = 0; i < NCH(n); i++) {
181 ch = CHILD(n, i);
182 if (TYPE(ch) == stmt)
183 l += num_stmts(ch);
184 }
185 return l;
186 case stmt:
187 return num_stmts(CHILD(n, 0));
188 case compound_stmt:
189 return 1;
190 case simple_stmt:
191 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
192 case suite:
193 if (NCH(n) == 1)
194 return num_stmts(CHILD(n, 0));
195 else {
196 l = 0;
197 for (i = 2; i < (NCH(n) - 1); i++)
198 l += num_stmts(CHILD(n, i));
199 return l;
200 }
201 default: {
202 char buf[128];
203
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000204 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205 TYPE(n), NCH(n));
206 Py_FatalError(buf);
207 }
208 }
209 assert(0);
210 return 0;
211}
212
213/* Transform the CST rooted at node * to the appropriate AST
214*/
215
216mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
218 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000219{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000220 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000221 asdl_seq *stmts = NULL;
222 stmt_ty s;
223 node *ch;
224 struct compiling c;
225
226 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000227 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000228 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000229#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000230 ast_error(n, "encoding declaration in Unicode string");
231 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000232#endif
233 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000234 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000235 } else if (TYPE(n) == encoding_decl) {
236 c.c_encoding = STR(n);
237 n = CHILD(n, 0);
238 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000240 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000242 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000243 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244
Jeremy Hyltona8293132006-02-28 17:58:27 +0000245 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246 switch (TYPE(n)) {
247 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000248 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000250 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251 for (i = 0; i < NCH(n) - 1; i++) {
252 ch = CHILD(n, i);
253 if (TYPE(ch) == NEWLINE)
254 continue;
255 REQ(ch, stmt);
256 num = num_stmts(ch);
257 if (num == 1) {
258 s = ast_for_stmt(&c, ch);
259 if (!s)
260 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000261 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 }
263 else {
264 ch = CHILD(ch, 0);
265 REQ(ch, simple_stmt);
266 for (j = 0; j < num; j++) {
267 s = ast_for_stmt(&c, CHILD(ch, j * 2));
268 if (!s)
269 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000270 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271 }
272 }
273 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000274 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 case eval_input: {
276 expr_ty testlist_ast;
277
Nick Coghlan650f0d02007-04-15 12:05:43 +0000278 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000279 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 if (!testlist_ast)
281 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000282 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283 }
284 case single_input:
285 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000286 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000288 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000289 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
290 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000291 if (!asdl_seq_GET(stmts, 0))
292 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000293 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 }
295 else {
296 n = CHILD(n, 0);
297 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000298 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000300 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000302 s = ast_for_stmt(&c, n);
303 if (!s)
304 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305 asdl_seq_SET(stmts, 0, s);
306 }
307 else {
308 /* Only a simple_stmt can contain multiple statements. */
309 REQ(n, simple_stmt);
310 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 if (TYPE(CHILD(n, i)) == NEWLINE)
312 break;
313 s = ast_for_stmt(&c, CHILD(n, i));
314 if (!s)
315 goto error;
316 asdl_seq_SET(stmts, i / 2, s);
317 }
318 }
319
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000320 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321 }
322 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000323 PyErr_Format(PyExc_SystemError,
324 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 goto error;
326 }
327 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328 ast_error_finish(filename);
329 return NULL;
330}
331
332/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
333*/
334
335static operator_ty
336get_operator(const node *n)
337{
338 switch (TYPE(n)) {
339 case VBAR:
340 return BitOr;
341 case CIRCUMFLEX:
342 return BitXor;
343 case AMPER:
344 return BitAnd;
345 case LEFTSHIFT:
346 return LShift;
347 case RIGHTSHIFT:
348 return RShift;
349 case PLUS:
350 return Add;
351 case MINUS:
352 return Sub;
353 case STAR:
354 return Mult;
355 case SLASH:
356 return Div;
357 case DOUBLESLASH:
358 return FloorDiv;
359 case PERCENT:
360 return Mod;
361 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000362 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363 }
364}
365
Guido van Rossume7ba4952007-06-06 23:52:48 +0000366static const char* FORBIDDEN[] = {
367 "None",
368 "True",
369 "False",
370 NULL,
371};
372
373static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000374forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000375{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000376 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000377 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
378 ast_error(n, "assignment to keyword");
379 return 1;
380 }
381 if (full_checks) {
382 const char **p;
383 for (p = FORBIDDEN; *p; p++) {
384 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
385 ast_error(n, "assignment to keyword");
386 return 1;
387 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000388 }
389 }
390 return 0;
391}
392
Jeremy Hyltona8293132006-02-28 17:58:27 +0000393/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000394
395 Only sets context for expr kinds that "can appear in assignment context"
396 (according to ../Parser/Python.asdl). For other expr kinds, it sets
397 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398*/
399
400static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000401set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402{
403 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000404 /* If a particular expression type can't be used for assign / delete,
405 set expr_name to its name and an error message will be generated.
406 */
407 const char* expr_name = NULL;
408
409 /* The ast defines augmented store and load contexts, but the
410 implementation here doesn't actually use them. The code may be
411 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000412 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000413 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000414 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000415 */
416 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417
418 switch (e->kind) {
419 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000420 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000421 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
422 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000424 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000425 e->v.Subscript.ctx = ctx;
426 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000427 case Starred_kind:
428 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000429 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000430 return 0;
431 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000433 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000434 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000435 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000436 }
437 e->v.Name.ctx = ctx;
438 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440 e->v.List.ctx = ctx;
441 s = e->v.List.elts;
442 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000444 if (asdl_seq_LEN(e->v.Tuple.elts)) {
445 e->v.Tuple.ctx = ctx;
446 s = e->v.Tuple.elts;
447 }
448 else {
449 expr_name = "()";
450 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000451 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000452 case Lambda_kind:
453 expr_name = "lambda";
454 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000455 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000456 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000459 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000460 case UnaryOp_kind:
461 expr_name = "operator";
462 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000464 expr_name = "generator expression";
465 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466 case Yield_kind:
467 expr_name = "yield expression";
468 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000469 case ListComp_kind:
470 expr_name = "list comprehension";
471 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000472 case SetComp_kind:
473 expr_name = "set comprehension";
474 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000475 case DictComp_kind:
476 expr_name = "dict comprehension";
477 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000478 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000479 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000480 case Num_kind:
481 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000482 expr_name = "literal";
483 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000484 case Ellipsis_kind:
485 expr_name = "Ellipsis";
486 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000487 case Compare_kind:
488 expr_name = "comparison";
489 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000490 case IfExp_kind:
491 expr_name = "conditional expression";
492 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000493 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 PyErr_Format(PyExc_SystemError,
495 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000496 e->kind, e->lineno);
497 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000499 /* Check for error string set by switch */
500 if (expr_name) {
501 char buf[300];
502 PyOS_snprintf(buf, sizeof(buf),
503 "can't %s %s",
504 ctx == Store ? "assign to" : "delete",
505 expr_name);
506 return ast_error(n, buf);
507 }
508
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000511 */
512 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000513 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514
Thomas Wouters89f507f2006-12-13 04:49:30 +0000515 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000516 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000517 return 0;
518 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519 }
520 return 1;
521}
522
523static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000524ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525{
526 REQ(n, augassign);
527 n = CHILD(n, 0);
528 switch (STR(n)[0]) {
529 case '+':
530 return Add;
531 case '-':
532 return Sub;
533 case '/':
534 if (STR(n)[1] == '/')
535 return FloorDiv;
536 else
537 return Div;
538 case '%':
539 return Mod;
540 case '<':
541 return LShift;
542 case '>':
543 return RShift;
544 case '&':
545 return BitAnd;
546 case '^':
547 return BitXor;
548 case '|':
549 return BitOr;
550 case '*':
551 if (STR(n)[1] == '*')
552 return Pow;
553 else
554 return Mult;
555 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000556 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000557 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558 }
559}
560
561static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000562ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000564 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000565 |'is' 'not'
566 */
567 REQ(n, comp_op);
568 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000569 n = CHILD(n, 0);
570 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 case LESS:
572 return Lt;
573 case GREATER:
574 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000575 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 return Eq;
577 case LESSEQUAL:
578 return LtE;
579 case GREATEREQUAL:
580 return GtE;
581 case NOTEQUAL:
582 return NotEq;
583 case NAME:
584 if (strcmp(STR(n), "in") == 0)
585 return In;
586 if (strcmp(STR(n), "is") == 0)
587 return Is;
588 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000589 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000591 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000592 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593 }
594 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000595 /* handle "not in" and "is not" */
596 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 case NAME:
598 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
599 return NotIn;
600 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
601 return IsNot;
602 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000603 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000605 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000606 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 }
Neal Norwitz79792652005-11-14 04:25:03 +0000608 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000610 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611}
612
613static asdl_seq *
614seq_for_testlist(struct compiling *c, const node *n)
615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +0000617 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
618 */
Armin Rigo31441302005-10-21 12:57:31 +0000619 asdl_seq *seq;
620 expr_ty expression;
621 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000622 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000624 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000625 if (!seq)
626 return NULL;
627
628 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +0000630 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631
Benjamin Peterson4905e802009-09-27 02:43:28 +0000632 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000633 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000634 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000635
636 assert(i / 2 < seq->size);
637 asdl_seq_SET(seq, i / 2, expression);
638 }
639 return seq;
640}
641
Neal Norwitzc1505362006-12-28 06:47:50 +0000642static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000643compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000644{
645 identifier name;
646 expr_ty annotation = NULL;
647 node *ch;
648
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000649 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000650 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000651 name = NEW_IDENTIFIER(ch);
652 if (!name)
653 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000654 if (forbidden_name(name, ch, 0))
655 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000656
657 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
658 annotation = ast_for_expr(c, CHILD(n, 2));
659 if (!annotation)
660 return NULL;
661 }
662
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000663 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000664#if 0
665 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
666 if (!set_context(c, result, Store, n))
667 return NULL;
668 return result;
669#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670}
671
Guido van Rossum4f72a782006-10-27 23:31:49 +0000672/* returns -1 if failed to handle keyword only arguments
673 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000674 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000675 ^^^
676 start pointing here
677 */
678static int
679handle_keywordonly_args(struct compiling *c, const node *n, int start,
680 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
681{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000682 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000683 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000684 expr_ty expression, annotation;
685 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000686 int i = start;
687 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000688
689 if (kwonlyargs == NULL) {
690 ast_error(CHILD(n, start), "named arguments must follow bare *");
691 return -1;
692 }
693 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000694 while (i < NCH(n)) {
695 ch = CHILD(n, i);
696 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000697 case vfpdef:
698 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000699 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000700 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000701 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000702 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000703 asdl_seq_SET(kwdefaults, j, expression);
704 i += 2; /* '=' and test */
705 }
706 else { /* setting NULL if no default value exists */
707 asdl_seq_SET(kwdefaults, j, NULL);
708 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000709 if (NCH(ch) == 3) {
710 /* ch is NAME ':' test */
711 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000712 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000713 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 }
715 else {
716 annotation = NULL;
717 }
718 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000719 argname = NEW_IDENTIFIER(ch);
720 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000721 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000722 if (forbidden_name(argname, ch, 0))
723 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000724 arg = arg(argname, annotation, c->c_arena);
725 if (!arg)
726 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000728 i += 2; /* the name and the comma */
729 break;
730 case DOUBLESTAR:
731 return i;
732 default:
733 ast_error(ch, "unexpected node");
734 goto error;
735 }
736 }
737 return i;
738 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000740}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741
Jeremy Hyltona8293132006-02-28 17:58:27 +0000742/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000743
744static arguments_ty
745ast_for_arguments(struct compiling *c, const node *n)
746{
Neal Norwitzc1505362006-12-28 06:47:50 +0000747 /* This function handles both typedargslist (function definition)
748 and varargslist (lambda definition).
749
750 parameters: '(' [typedargslist] ')'
751 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000753 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000754 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000755 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000758 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000759 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000760 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000762 int i, j, k, nposargs = 0, nkwonlyargs = 0;
763 int nposdefaults = 0, found_default = 0;
764 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 arg_ty arg;
767 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 node *ch;
769
770 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000771 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000772 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
773 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000774 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000776 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
Jeremy Hyltone921e022008-07-17 16:37:17 +0000778 /* First count the number of positional args & defaults. The
779 variable i is the loop index for this for loop and the next.
780 The next loop picks up where the first leaves off.
781 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000783 ch = CHILD(n, i);
784 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000785 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000786 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000787 if (i < NCH(n) && /* skip argument following star */
788 (TYPE(CHILD(n, i)) == tfpdef ||
789 TYPE(CHILD(n, i)) == vfpdef)) {
790 i++;
791 }
792 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000793 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000794 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000795 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000796 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000797 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000799 defaults for keyword only args */
800 for ( ; i < NCH(n); ++i) {
801 ch = CHILD(n, i);
802 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000803 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000805 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
806 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000807 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000808 kwonlyargs = (nkwonlyargs ?
809 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
810 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000811 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000813 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
814 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000815 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000817 since we set NULL as default for keyword only argument w/o default
818 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000819 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
821 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000822 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823
824 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000825 ast_error(n, "more than 255 arguments");
826 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000827 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000828
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000829 /* tfpdef: NAME [':' test]
830 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 */
832 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000833 j = 0; /* index for defaults */
834 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000836 ch = CHILD(n, i);
837 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000838 case tfpdef:
839 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
841 anything other than EQUAL or a comma? */
842 /* XXX Should NCH(n) check be made a separate check? */
843 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000844 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
845 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000846 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000847 assert(posdefaults != NULL);
848 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000849 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000850 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000852 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000854 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000855 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000856 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000857 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000858 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000859 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000860 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861 i += 2; /* the name and the comma */
862 break;
863 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000864 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000866 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000867 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000868 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000869 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000870 if (TYPE(ch) == COMMA) {
871 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000872 i += 2; /* now follows keyword only arguments */
873 res = handle_keywordonly_args(c, n, i,
874 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000875 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000876 i = res; /* res has new position to process */
877 }
878 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000879 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000880 if (!vararg)
881 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000882 if (forbidden_name(vararg, CHILD(ch, 0), 0))
883 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000884 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000885 /* there is an annotation on the vararg */
886 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000887 if (!varargannotation)
888 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000890 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000891 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
892 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000893 int res = 0;
894 res = handle_keywordonly_args(c, n, i,
895 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000896 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000897 i = res; /* res has new position to process */
898 }
899 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000900 break;
901 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000902 ch = CHILD(n, i+1); /* tfpdef */
903 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000904 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000905 if (!kwarg)
906 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000907 if (NCH(ch) > 1) {
908 /* there is an annotation on the kwarg */
909 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000910 if (!kwargannotation)
911 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000912 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000913 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000914 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000915 i += 3;
916 break;
917 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000918 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919 "unexpected node in varargslist: %d @ %d",
920 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000921 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000922 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000924 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
925 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926}
927
928static expr_ty
929ast_for_dotted_name(struct compiling *c, const node *n)
930{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000931 expr_ty e;
932 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000933 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 int i;
935
936 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000937
938 lineno = LINENO(n);
939 col_offset = n->n_col_offset;
940
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 id = NEW_IDENTIFIER(CHILD(n, 0));
942 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000943 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000944 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000946 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947
948 for (i = 2; i < NCH(n); i+=2) {
949 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000950 if (!id)
951 return NULL;
952 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
953 if (!e)
954 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955 }
956
957 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958}
959
960static expr_ty
961ast_for_decorator(struct compiling *c, const node *n)
962{
963 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
964 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000965 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000967 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000968 REQ(CHILD(n, 0), AT);
969 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
972 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000973 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000976 d = name_expr;
977 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978 }
979 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000980 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000981 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000982 if (!d)
983 return NULL;
984 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 }
986 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 d = ast_for_call(c, CHILD(n, 3), name_expr);
988 if (!d)
989 return NULL;
990 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 }
992
993 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994}
995
996static asdl_seq*
997ast_for_decorators(struct compiling *c, const node *n)
998{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000999 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001000 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001004 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005 if (!decorator_seq)
1006 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001009 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001010 if (!d)
1011 return NULL;
1012 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013 }
1014 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015}
1016
1017static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001018ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001020 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001021 identifier name;
1022 arguments_ty args;
1023 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001024 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001025 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001026
1027 REQ(n, funcdef);
1028
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029 name = NEW_IDENTIFIER(CHILD(n, name_i));
1030 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001031 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001032 if (forbidden_name(name, CHILD(n, name_i), 0))
1033 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1035 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001036 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001037 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1038 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1039 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001040 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001041 name_i += 2;
1042 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 body = ast_for_suite(c, CHILD(n, name_i + 3));
1044 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001045 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046
Neal Norwitzc1505362006-12-28 06:47:50 +00001047 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001048 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049}
1050
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001051static stmt_ty
1052ast_for_decorated(struct compiling *c, const node *n)
1053{
1054 /* decorated: decorators (classdef | funcdef) */
1055 stmt_ty thing = NULL;
1056 asdl_seq *decorator_seq = NULL;
1057
1058 REQ(n, decorated);
1059
1060 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1061 if (!decorator_seq)
1062 return NULL;
1063
1064 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001066
1067 if (TYPE(CHILD(n, 1)) == funcdef) {
1068 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1069 } else if (TYPE(CHILD(n, 1)) == classdef) {
1070 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1071 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001072 /* we count the decorators in when talking about the class' or
1073 * function's line number */
1074 if (thing) {
1075 thing->lineno = LINENO(n);
1076 thing->col_offset = n->n_col_offset;
1077 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001078 return thing;
1079}
1080
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081static expr_ty
1082ast_for_lambdef(struct compiling *c, const node *n)
1083{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001084 /* lambdef: 'lambda' [varargslist] ':' test
1085 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 arguments_ty args;
1087 expr_ty expression;
1088
1089 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001090 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1091 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 if (!args)
1093 return NULL;
1094 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001095 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097 }
1098 else {
1099 args = ast_for_arguments(c, CHILD(n, 1));
1100 if (!args)
1101 return NULL;
1102 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001103 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105 }
1106
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001107 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108}
1109
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001110static expr_ty
1111ast_for_ifexpr(struct compiling *c, const node *n)
1112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001114 expr_ty expression, body, orelse;
1115
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001116 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001117 body = ast_for_expr(c, CHILD(n, 0));
1118 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001119 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001120 expression = ast_for_expr(c, CHILD(n, 2));
1121 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001122 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001123 orelse = ast_for_expr(c, CHILD(n, 4));
1124 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001125 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001126 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1127 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001128}
1129
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001131 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132
Nick Coghlan650f0d02007-04-15 12:05:43 +00001133 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134*/
1135
1136static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001137count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001139 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140
Guido van Rossumd8faa362007-04-27 19:54:29 +00001141 count_comp_for:
1142 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001143 REQ(n, comp_for);
1144 if (NCH(n) == 5)
1145 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 else
1147 return n_fors;
1148 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001149 REQ(n, comp_iter);
1150 n = CHILD(n, 0);
1151 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001152 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001153 else if (TYPE(n) == comp_if) {
1154 if (NCH(n) == 3) {
1155 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001156 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001157 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001158 else
1159 return n_fors;
1160 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001161
Guido van Rossumd8faa362007-04-27 19:54:29 +00001162 /* Should never be reached */
1163 PyErr_SetString(PyExc_SystemError,
1164 "logic error in count_comp_fors");
1165 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166}
1167
Nick Coghlan650f0d02007-04-15 12:05:43 +00001168/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169
Nick Coghlan650f0d02007-04-15 12:05:43 +00001170 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171*/
1172
1173static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001174count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001176 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177
Guido van Rossumd8faa362007-04-27 19:54:29 +00001178 while (1) {
1179 REQ(n, comp_iter);
1180 if (TYPE(CHILD(n, 0)) == comp_for)
1181 return n_ifs;
1182 n = CHILD(n, 0);
1183 REQ(n, comp_if);
1184 n_ifs++;
1185 if (NCH(n) == 2)
1186 return n_ifs;
1187 n = CHILD(n, 2);
1188 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189}
1190
Guido van Rossum992d4a32007-07-11 13:09:30 +00001191static asdl_seq *
1192ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001195 asdl_seq *comps;
1196
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001197 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 if (n_fors == -1)
1199 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200
Nick Coghlan650f0d02007-04-15 12:05:43 +00001201 comps = asdl_seq_new(n_fors, c->c_arena);
1202 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001204
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001206 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001208 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001209 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210
Guido van Rossum992d4a32007-07-11 13:09:30 +00001211 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212
Guido van Rossum992d4a32007-07-11 13:09:30 +00001213 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001214 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001215 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001217 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001218 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220
Thomas Wouters89f507f2006-12-13 04:49:30 +00001221 /* Check the # of children rather than the length of t, since
1222 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001223 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001224 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001225 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001227 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1228 c->c_arena),
1229 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001230 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001232
Guido van Rossum992d4a32007-07-11 13:09:30 +00001233 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 int j, n_ifs;
1235 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236
Guido van Rossum992d4a32007-07-11 13:09:30 +00001237 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001238 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001239 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001241
1242 ifs = asdl_seq_new(n_ifs, c->c_arena);
1243 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001247 REQ(n, comp_iter);
1248 n = CHILD(n, 0);
1249 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250
Guido van Rossum992d4a32007-07-11 13:09:30 +00001251 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001252 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001253 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001254 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001255 if (NCH(n) == 3)
1256 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001258 /* on exit, must guarantee that n is a comp_for */
1259 if (TYPE(n) == comp_iter)
1260 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001261 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001263 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001265 return comps;
1266}
1267
1268static expr_ty
1269ast_for_itercomp(struct compiling *c, const node *n, int type)
1270{
1271 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1272 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1273 expr_ty elt;
1274 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275
Guido van Rossum992d4a32007-07-11 13:09:30 +00001276 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277
Guido van Rossum992d4a32007-07-11 13:09:30 +00001278 elt = ast_for_expr(c, CHILD(n, 0));
1279 if (!elt)
1280 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281
Guido van Rossum992d4a32007-07-11 13:09:30 +00001282 comps = ast_for_comprehension(c, CHILD(n, 1));
1283 if (!comps)
1284 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001285
1286 if (type == COMP_GENEXP)
1287 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1288 else if (type == COMP_LISTCOMP)
1289 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1290 else if (type == COMP_SETCOMP)
1291 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1292 else
1293 /* Should never happen */
1294 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001295}
1296
1297static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001298ast_for_dictcomp(struct compiling *c, const node *n)
1299{
1300 expr_ty key, value;
1301 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302
Guido van Rossum992d4a32007-07-11 13:09:30 +00001303 assert(NCH(n) > 3);
1304 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305
Guido van Rossum992d4a32007-07-11 13:09:30 +00001306 key = ast_for_expr(c, CHILD(n, 0));
1307 if (!key)
1308 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001309 value = ast_for_expr(c, CHILD(n, 2));
1310 if (!value)
1311 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312
Guido van Rossum992d4a32007-07-11 13:09:30 +00001313 comps = ast_for_comprehension(c, CHILD(n, 3));
1314 if (!comps)
1315 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316
Guido van Rossum992d4a32007-07-11 13:09:30 +00001317 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1318}
1319
1320static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001321ast_for_genexp(struct compiling *c, const node *n)
1322{
1323 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001324 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001325}
1326
1327static expr_ty
1328ast_for_listcomp(struct compiling *c, const node *n)
1329{
1330 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001331 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001332}
1333
1334static expr_ty
1335ast_for_setcomp(struct compiling *c, const node *n)
1336{
1337 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001338 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001339}
1340
1341
1342static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343ast_for_atom(struct compiling *c, const node *n)
1344{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001345 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1346 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001347 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 */
1349 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001350 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001353 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001354 /* All names start in Load context, but may later be
1355 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001356 PyObject *name = NEW_IDENTIFIER(ch);
1357 if (!name)
1358 return NULL;
1359 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1360 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001362 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001363 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001364 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001365 PyObject *type, *value, *tback, *errstr;
1366 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001367 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001368 if (errstr) {
1369 char *s = "";
1370 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001371 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001372 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1373 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001374 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001375 } else {
1376 ast_error(n, "(unicode error) unknown error");
1377 }
1378 Py_DECREF(type);
1379 Py_DECREF(value);
1380 Py_XDECREF(tback);
1381 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001383 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001384 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001385 if (bytesmode)
1386 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1387 else
1388 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 }
1390 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001391 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001392 if (!pynum)
1393 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001394
Thomas Wouters89f507f2006-12-13 04:49:30 +00001395 PyArena_AddPyObject(c->c_arena, pynum);
1396 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 }
Georg Brandldde00282007-03-18 19:01:53 +00001398 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001399 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001401 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402
Thomas Wouters89f507f2006-12-13 04:49:30 +00001403 if (TYPE(ch) == RPAR)
1404 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 if (TYPE(ch) == yield_expr)
1407 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001410 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001411 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001412
Nick Coghlan650f0d02007-04-15 12:05:43 +00001413 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001415 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416
Thomas Wouters89f507f2006-12-13 04:49:30 +00001417 if (TYPE(ch) == RSQB)
1418 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419
Nick Coghlan650f0d02007-04-15 12:05:43 +00001420 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001421 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1422 asdl_seq *elts = seq_for_testlist(c, ch);
1423 if (!elts)
1424 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001425
Thomas Wouters89f507f2006-12-13 04:49:30 +00001426 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1427 }
1428 else
1429 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001431 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1432 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001433 int i, size;
1434 asdl_seq *keys, *values;
1435
1436 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001437 if (TYPE(ch) == RBRACE) {
1438 /* it's an empty dict */
1439 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1440 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1441 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001442 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001443 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001444 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001445 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001446 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 for (i = 0; i < NCH(ch); i += 2) {
1448 expr_ty expression;
1449 expression = ast_for_expr(c, CHILD(ch, i));
1450 if (!expression)
1451 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001452 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001453 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001454 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1455 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1456 /* it's a set comprehension */
1457 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001458 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1459 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001460 } else {
1461 /* it's a dict */
1462 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1463 keys = asdl_seq_new(size, c->c_arena);
1464 if (!keys)
1465 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466
Guido van Rossum86e58e22006-08-28 15:27:34 +00001467 values = asdl_seq_new(size, c->c_arena);
1468 if (!values)
1469 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470
Guido van Rossum86e58e22006-08-28 15:27:34 +00001471 for (i = 0; i < NCH(ch); i += 4) {
1472 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473
Guido van Rossum86e58e22006-08-28 15:27:34 +00001474 expression = ast_for_expr(c, CHILD(ch, i));
1475 if (!expression)
1476 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001477
Guido van Rossum86e58e22006-08-28 15:27:34 +00001478 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001479
Guido van Rossum86e58e22006-08-28 15:27:34 +00001480 expression = ast_for_expr(c, CHILD(ch, i + 2));
1481 if (!expression)
1482 return NULL;
1483
1484 asdl_seq_SET(values, i / 4, expression);
1485 }
1486 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1487 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001490 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1491 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 }
1493}
1494
1495static slice_ty
1496ast_for_slice(struct compiling *c, const node *n)
1497{
1498 node *ch;
1499 expr_ty lower = NULL, upper = NULL, step = NULL;
1500
1501 REQ(n, subscript);
1502
1503 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001504 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505 sliceop: ':' [test]
1506 */
1507 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508 if (NCH(n) == 1 && TYPE(ch) == test) {
1509 /* 'step' variable hold no significance in terms of being used over
1510 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 if (!step)
1513 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514
Thomas Wouters89f507f2006-12-13 04:49:30 +00001515 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516 }
1517
1518 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001519 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 if (!lower)
1521 return NULL;
1522 }
1523
1524 /* If there's an upper bound it's in the second or third position. */
1525 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001526 if (NCH(n) > 1) {
1527 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528
Thomas Wouters89f507f2006-12-13 04:49:30 +00001529 if (TYPE(n2) == test) {
1530 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531 if (!upper)
1532 return NULL;
1533 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001534 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001536 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537
Thomas Wouters89f507f2006-12-13 04:49:30 +00001538 if (TYPE(n2) == test) {
1539 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001540 if (!upper)
1541 return NULL;
1542 }
1543 }
1544
1545 ch = CHILD(n, NCH(n) - 1);
1546 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001547 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001548 ch = CHILD(ch, 1);
1549 if (TYPE(ch) == test) {
1550 step = ast_for_expr(c, ch);
1551 if (!step)
1552 return NULL;
1553 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001554 }
1555 }
1556
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001557 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558}
1559
1560static expr_ty
1561ast_for_binop(struct compiling *c, const node *n)
1562{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001563 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001565 BinOp(BinOp(A, op, B), op, C).
1566 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001567
Guido van Rossumd8faa362007-04-27 19:54:29 +00001568 int i, nops;
1569 expr_ty expr1, expr2, result;
1570 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571
Guido van Rossumd8faa362007-04-27 19:54:29 +00001572 expr1 = ast_for_expr(c, CHILD(n, 0));
1573 if (!expr1)
1574 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575
Guido van Rossumd8faa362007-04-27 19:54:29 +00001576 expr2 = ast_for_expr(c, CHILD(n, 2));
1577 if (!expr2)
1578 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579
Guido van Rossumd8faa362007-04-27 19:54:29 +00001580 newoperator = get_operator(CHILD(n, 1));
1581 if (!newoperator)
1582 return NULL;
1583
1584 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1585 c->c_arena);
1586 if (!result)
1587 return NULL;
1588
1589 nops = (NCH(n) - 1) / 2;
1590 for (i = 1; i < nops; i++) {
1591 expr_ty tmp_result, tmp;
1592 const node* next_oper = CHILD(n, i * 2 + 1);
1593
1594 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001595 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596 return NULL;
1597
Guido van Rossumd8faa362007-04-27 19:54:29 +00001598 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1599 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600 return NULL;
1601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603 LINENO(next_oper), next_oper->n_col_offset,
1604 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001606 return NULL;
1607 result = tmp_result;
1608 }
1609 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001610}
1611
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612static expr_ty
1613ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001616 subscriptlist: subscript (',' subscript)* [',']
1617 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1618 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001619 REQ(n, trailer);
1620 if (TYPE(CHILD(n, 0)) == LPAR) {
1621 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001622 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1623 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001624 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001625 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001627 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001628 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1629 if (!attr_id)
1630 return NULL;
1631 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001632 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001633 }
1634 else {
1635 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001636 REQ(CHILD(n, 2), RSQB);
1637 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001638 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001639 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1640 if (!slc)
1641 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001642 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1643 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001644 }
1645 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001647 by treating the sequence as a tuple literal if there are
1648 no slice features.
1649 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001650 int j;
1651 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001652 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001653 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001654 asdl_seq *slices, *elts;
1655 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001656 if (!slices)
1657 return NULL;
1658 for (j = 0; j < NCH(n); j += 2) {
1659 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001660 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001661 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001662 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001663 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001664 asdl_seq_SET(slices, j / 2, slc);
1665 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001666 if (!simple) {
1667 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001668 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001669 }
1670 /* extract Index values and put them in a Tuple */
1671 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001672 if (!elts)
1673 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001674 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1675 slc = (slice_ty)asdl_seq_GET(slices, j);
1676 assert(slc->kind == Index_kind && slc->v.Index.value);
1677 asdl_seq_SET(elts, j, slc->v.Index.value);
1678 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001679 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001680 if (!e)
1681 return NULL;
1682 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001683 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001684 }
1685 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001686}
1687
1688static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001689ast_for_factor(struct compiling *c, const node *n)
1690{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001691 expr_ty expression;
1692
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001693 expression = ast_for_expr(c, CHILD(n, 1));
1694 if (!expression)
1695 return NULL;
1696
1697 switch (TYPE(CHILD(n, 0))) {
1698 case PLUS:
1699 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1700 c->c_arena);
1701 case MINUS:
1702 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1703 c->c_arena);
1704 case TILDE:
1705 return UnaryOp(Invert, expression, LINENO(n),
1706 n->n_col_offset, c->c_arena);
1707 }
1708 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1709 TYPE(CHILD(n, 0)));
1710 return NULL;
1711}
1712
1713static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001714ast_for_power(struct compiling *c, const node *n)
1715{
1716 /* power: atom trailer* ('**' factor)*
1717 */
1718 int i;
1719 expr_ty e, tmp;
1720 REQ(n, power);
1721 e = ast_for_atom(c, CHILD(n, 0));
1722 if (!e)
1723 return NULL;
1724 if (NCH(n) == 1)
1725 return e;
1726 for (i = 1; i < NCH(n); i++) {
1727 node *ch = CHILD(n, i);
1728 if (TYPE(ch) != trailer)
1729 break;
1730 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001732 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001733 tmp->lineno = e->lineno;
1734 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001735 e = tmp;
1736 }
1737 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1738 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001739 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001740 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001741 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001742 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001743 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001744 e = tmp;
1745 }
1746 return e;
1747}
1748
Guido van Rossum0368b722007-05-11 16:50:42 +00001749static expr_ty
1750ast_for_starred(struct compiling *c, const node *n)
1751{
1752 expr_ty tmp;
1753 REQ(n, star_expr);
1754
1755 tmp = ast_for_expr(c, CHILD(n, 1));
1756 if (!tmp)
1757 return NULL;
1758
1759 /* The Load context is changed later. */
1760 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1761}
1762
1763
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764/* Do not name a variable 'expr'! Will cause a compile error.
1765*/
1766
1767static expr_ty
1768ast_for_expr(struct compiling *c, const node *n)
1769{
1770 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001771 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001772 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 and_test: not_test ('and' not_test)*
1775 not_test: 'not' not_test | comparison
1776 comparison: expr (comp_op expr)*
1777 expr: xor_expr ('|' xor_expr)*
1778 xor_expr: and_expr ('^' and_expr)*
1779 and_expr: shift_expr ('&' shift_expr)*
1780 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1781 arith_expr: term (('+'|'-') term)*
1782 term: factor (('*'|'/'|'%'|'//') factor)*
1783 factor: ('+'|'-'|'~') factor | power
1784 power: atom trailer* ('**' factor)*
1785 */
1786
1787 asdl_seq *seq;
1788 int i;
1789
1790 loop:
1791 switch (TYPE(n)) {
1792 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001793 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001794 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001795 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001797 else if (NCH(n) > 1)
1798 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001799 /* Fallthrough */
1800 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801 case and_test:
1802 if (NCH(n) == 1) {
1803 n = CHILD(n, 0);
1804 goto loop;
1805 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001806 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 if (!seq)
1808 return NULL;
1809 for (i = 0; i < NCH(n); i += 2) {
1810 expr_ty e = ast_for_expr(c, CHILD(n, i));
1811 if (!e)
1812 return NULL;
1813 asdl_seq_SET(seq, i / 2, e);
1814 }
1815 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001816 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1817 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001818 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001819 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 case not_test:
1821 if (NCH(n) == 1) {
1822 n = CHILD(n, 0);
1823 goto loop;
1824 }
1825 else {
1826 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1827 if (!expression)
1828 return NULL;
1829
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001830 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1831 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 }
1833 case comparison:
1834 if (NCH(n) == 1) {
1835 n = CHILD(n, 0);
1836 goto loop;
1837 }
1838 else {
1839 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001840 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001841 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001842 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 if (!ops)
1844 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001845 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 return NULL;
1848 }
1849 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001850 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001852 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001853 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001855 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856
1857 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001858 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001860 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001862 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 asdl_seq_SET(cmps, i / 2, expression);
1864 }
1865 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001866 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001870 return Compare(expression, ops, cmps, LINENO(n),
1871 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 break;
1874
Guido van Rossum0368b722007-05-11 16:50:42 +00001875 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 /* The next five cases all handle BinOps. The main body of code
1878 is the same in each case, but the switch turned inside out to
1879 reuse the code for each type of operator.
1880 */
1881 case expr:
1882 case xor_expr:
1883 case and_expr:
1884 case shift_expr:
1885 case arith_expr:
1886 case term:
1887 if (NCH(n) == 1) {
1888 n = CHILD(n, 0);
1889 goto loop;
1890 }
1891 return ast_for_binop(c, n);
1892 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 expr_ty exp = NULL;
1894 if (NCH(n) == 2) {
1895 exp = ast_for_testlist(c, CHILD(n, 1));
1896 if (!exp)
1897 return NULL;
1898 }
1899 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1900 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001901 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 if (NCH(n) == 1) {
1903 n = CHILD(n, 0);
1904 goto loop;
1905 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001906 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001907 case power:
1908 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001910 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911 return NULL;
1912 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001913 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 return NULL;
1915}
1916
1917static expr_ty
1918ast_for_call(struct compiling *c, const node *n, expr_ty func)
1919{
1920 /*
1921 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1922 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924 */
1925
1926 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001927 asdl_seq *args;
1928 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 expr_ty vararg = NULL, kwarg = NULL;
1930
1931 REQ(n, arglist);
1932
1933 nargs = 0;
1934 nkeywords = 0;
1935 ngens = 0;
1936 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001937 node *ch = CHILD(n, i);
1938 if (TYPE(ch) == argument) {
1939 if (NCH(ch) == 1)
1940 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001941 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001944 nkeywords++;
1945 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 }
1947 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001948 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 "if not sole argument");
1950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 }
1952
1953 if (nargs + nkeywords + ngens > 255) {
1954 ast_error(n, "more than 255 arguments");
1955 return NULL;
1956 }
1957
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001958 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960 return NULL;
1961 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 nargs = 0;
1965 nkeywords = 0;
1966 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001967 node *ch = CHILD(n, i);
1968 if (TYPE(ch) == argument) {
1969 expr_ty e;
1970 if (NCH(ch) == 1) {
1971 if (nkeywords) {
1972 ast_error(CHILD(ch, 0),
1973 "non-keyword arg after keyword arg");
1974 return NULL;
1975 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001976 if (vararg) {
1977 ast_error(CHILD(ch, 0),
1978 "only named arguments may follow *expression");
1979 return NULL;
1980 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001981 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001983 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001984 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001986 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001989 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001990 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 else {
1993 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001994 identifier key, tmp;
1995 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002000 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 /* f(lambda x: x[0] = 3) ends up getting parsed with
2002 * LHS test = lambda x: x[0], and RHS test = 3.
2003 * SF bug 132313 points out that complaining about a keyword
2004 * then is very confusing.
2005 */
2006 if (e->kind == Lambda_kind) {
2007 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002008 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 } else if (e->kind != Name_kind) {
2010 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002011 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002012 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 return NULL;
2014 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002016 for (k = 0; k < nkeywords; k++) {
2017 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2018 if (!PyUnicode_Compare(tmp, key)) {
2019 ast_error(CHILD(ch, 0), "keyword argument repeated");
2020 return NULL;
2021 }
2022 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002023 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002025 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002028 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002029 asdl_seq_SET(keywords, nkeywords++, kw);
2030 }
2031 }
2032 else if (TYPE(ch) == STAR) {
2033 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002034 if (!vararg)
2035 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002036 i++;
2037 }
2038 else if (TYPE(ch) == DOUBLESTAR) {
2039 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002040 if (!kwarg)
2041 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 i++;
2043 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 }
2045
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002046 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047}
2048
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002050ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002052 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002053 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002055 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002056 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002057 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002058 }
2059 else {
2060 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002061 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002062 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002064 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 else {
2066 asdl_seq *tmp = seq_for_testlist(c, n);
2067 if (!tmp)
2068 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002069 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002071}
2072
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073static stmt_ty
2074ast_for_expr_stmt(struct compiling *c, const node *n)
2075{
2076 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002079 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 test: ... here starts the operator precendence dance
2083 */
2084
2085 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 if (!e)
2088 return NULL;
2089
Thomas Wouters89f507f2006-12-13 04:49:30 +00002090 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 }
2092 else if (TYPE(CHILD(n, 1)) == augassign) {
2093 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002094 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002095 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096
Thomas Wouters89f507f2006-12-13 04:49:30 +00002097 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 if (!expr1)
2099 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002100 if(!set_context(c, expr1, Store, ch))
2101 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002102 /* set_context checks that most expressions are not the left side.
2103 Augmented assignments can only have a name, a subscript, or an
2104 attribute on the left, though, so we have to explicitly check for
2105 those. */
2106 switch (expr1->kind) {
2107 case Name_kind:
2108 case Attribute_kind:
2109 case Subscript_kind:
2110 break;
2111 default:
2112 ast_error(ch, "illegal expression for augmented assignment");
2113 return NULL;
2114 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115
Thomas Wouters89f507f2006-12-13 04:49:30 +00002116 ch = CHILD(n, 2);
2117 if (TYPE(ch) == testlist)
2118 expr2 = ast_for_testlist(c, ch);
2119 else
2120 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002121 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122 return NULL;
2123
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002124 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002125 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 return NULL;
2127
Thomas Wouters89f507f2006-12-13 04:49:30 +00002128 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 }
2130 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002131 int i;
2132 asdl_seq *targets;
2133 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 expr_ty expression;
2135
Thomas Wouters89f507f2006-12-13 04:49:30 +00002136 /* a normal assignment */
2137 REQ(CHILD(n, 1), EQUAL);
2138 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2139 if (!targets)
2140 return NULL;
2141 for (i = 0; i < NCH(n) - 2; i += 2) {
2142 expr_ty e;
2143 node *ch = CHILD(n, i);
2144 if (TYPE(ch) == yield_expr) {
2145 ast_error(ch, "assignment to yield expression not possible");
2146 return NULL;
2147 }
2148 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002152 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002153 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155
Thomas Wouters89f507f2006-12-13 04:49:30 +00002156 asdl_seq_SET(targets, i / 2, e);
2157 }
2158 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002159 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002160 expression = ast_for_testlist(c, value);
2161 else
2162 expression = ast_for_expr(c, value);
2163 if (!expression)
2164 return NULL;
2165 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167}
2168
Benjamin Peterson78565b22009-06-28 19:19:51 +00002169
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002171ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172{
2173 asdl_seq *seq;
2174 int i;
2175 expr_ty e;
2176
2177 REQ(n, exprlist);
2178
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002179 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002181 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002183 e = ast_for_expr(c, CHILD(n, i));
2184 if (!e)
2185 return NULL;
2186 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002187 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 }
2190 return seq;
2191}
2192
2193static stmt_ty
2194ast_for_del_stmt(struct compiling *c, const node *n)
2195{
2196 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 /* del_stmt: 'del' exprlist */
2199 REQ(n, del_stmt);
2200
2201 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2202 if (!expr_list)
2203 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002204 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205}
2206
2207static stmt_ty
2208ast_for_flow_stmt(struct compiling *c, const node *n)
2209{
2210 /*
2211 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2212 | yield_stmt
2213 break_stmt: 'break'
2214 continue_stmt: 'continue'
2215 return_stmt: 'return' [testlist]
2216 yield_stmt: yield_expr
2217 yield_expr: 'yield' testlist
2218 raise_stmt: 'raise' [test [',' test [',' test]]]
2219 */
2220 node *ch;
2221
2222 REQ(n, flow_stmt);
2223 ch = CHILD(n, 0);
2224 switch (TYPE(ch)) {
2225 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002226 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002228 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002230 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2231 if (!exp)
2232 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002233 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 }
2235 case return_stmt:
2236 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002237 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002239 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240 if (!expression)
2241 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002242 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 }
2244 case raise_stmt:
2245 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002246 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2247 else if (NCH(ch) >= 2) {
2248 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2250 if (!expression)
2251 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002252 if (NCH(ch) == 4) {
2253 cause = ast_for_expr(c, CHILD(ch, 3));
2254 if (!cause)
2255 return NULL;
2256 }
2257 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 }
2259 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002260 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261 "unexpected flow_stmt: %d", TYPE(ch));
2262 return NULL;
2263 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002264
2265 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2266 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267}
2268
2269static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002270alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271{
2272 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002273 import_as_name: NAME ['as' NAME]
2274 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 dotted_name: NAME ('.' NAME)*
2276 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002277 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002278
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 loop:
2280 switch (TYPE(n)) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002281 case import_as_name: {
2282 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002283 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002284 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002285 if (!name)
2286 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002287 if (NCH(n) == 3) {
2288 node *str_node = CHILD(n, 2);
2289 str = NEW_IDENTIFIER(str_node);
2290 if (!str)
2291 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002292 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002293 return NULL;
2294 }
2295 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002296 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002297 return NULL;
2298 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002299 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002300 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 case dotted_as_name:
2302 if (NCH(n) == 1) {
2303 n = CHILD(n, 0);
2304 goto loop;
2305 }
2306 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002307 node *asname_node = CHILD(n, 2);
2308 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002309 if (!a)
2310 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002312 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002313 if (!a->asname)
2314 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002315 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002316 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 return a;
2318 }
2319 break;
2320 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002321 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002322 node *name_node = CHILD(n, 0);
2323 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002324 if (!name)
2325 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002326 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002327 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002328 return alias(name, NULL, c->c_arena);
2329 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 else {
2331 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002332 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002333 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336
2337 len = 0;
2338 for (i = 0; i < NCH(n); i += 2)
2339 /* length of string plus one for the dot */
2340 len += strlen(STR(CHILD(n, i))) + 1;
2341 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002342 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 if (!str)
2344 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002345 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 if (!s)
2347 return NULL;
2348 for (i = 0; i < NCH(n); i += 2) {
2349 char *sch = STR(CHILD(n, i));
2350 strcpy(s, STR(CHILD(n, i)));
2351 s += strlen(sch);
2352 *s++ = '.';
2353 }
2354 --s;
2355 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2357 PyBytes_GET_SIZE(str),
2358 NULL);
2359 Py_DECREF(str);
2360 if (!uni)
2361 return NULL;
2362 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002363 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002364 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002365 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 }
2367 break;
2368 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002369 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002370 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002371 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002373 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 "unexpected import name: %d", TYPE(n));
2375 return NULL;
2376 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002377
2378 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 return NULL;
2380}
2381
2382static stmt_ty
2383ast_for_import_stmt(struct compiling *c, const node *n)
2384{
2385 /*
2386 import_stmt: import_name | import_from
2387 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002388 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2389 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002391 int lineno;
2392 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 int i;
2394 asdl_seq *aliases;
2395
2396 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002397 lineno = LINENO(n);
2398 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002400 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002402 REQ(n, dotted_as_names);
2403 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2404 if (!aliases)
2405 return NULL;
2406 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002407 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002408 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002410 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002414 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002416 int idx, ndots = 0;
2417 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002418 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002420 /* Count the number of dots (for relative imports) and check for the
2421 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 for (idx = 1; idx < NCH(n); idx++) {
2423 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002424 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2425 if (!mod)
2426 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 idx++;
2428 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002429 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002431 ndots += 3;
2432 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002433 } else if (TYPE(CHILD(n, idx)) != DOT) {
2434 break;
2435 }
2436 ndots++;
2437 }
2438 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002439 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002440 case STAR:
2441 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 n = CHILD(n, idx);
2443 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002444 break;
2445 case LPAR:
2446 /* from ... import (x, y, z) */
2447 n = CHILD(n, idx + 1);
2448 n_children = NCH(n);
2449 break;
2450 case import_as_names:
2451 /* from ... import x, y, z */
2452 n = CHILD(n, idx);
2453 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002454 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 ast_error(n, "trailing comma not allowed without"
2456 " surrounding parentheses");
2457 return NULL;
2458 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002459 break;
2460 default:
2461 ast_error(n, "Unexpected node-type in from-import");
2462 return NULL;
2463 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2466 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468
2469 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002470 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002471 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002472 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002474 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002476 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002478 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002479 if (!import_alias)
2480 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002482 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002484 if (mod != NULL)
2485 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002486 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002487 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
Neal Norwitz79792652005-11-14 04:25:03 +00002489 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 "unknown import statement: starts with command '%s'",
2491 STR(CHILD(n, 0)));
2492 return NULL;
2493}
2494
2495static stmt_ty
2496ast_for_global_stmt(struct compiling *c, const node *n)
2497{
2498 /* global_stmt: 'global' NAME (',' NAME)* */
2499 identifier name;
2500 asdl_seq *s;
2501 int i;
2502
2503 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002504 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 name = NEW_IDENTIFIER(CHILD(n, i));
2509 if (!name)
2510 return NULL;
2511 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002513 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514}
2515
2516static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002517ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2518{
2519 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2520 identifier name;
2521 asdl_seq *s;
2522 int i;
2523
2524 REQ(n, nonlocal_stmt);
2525 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2526 if (!s)
2527 return NULL;
2528 for (i = 1; i < NCH(n); i += 2) {
2529 name = NEW_IDENTIFIER(CHILD(n, i));
2530 if (!name)
2531 return NULL;
2532 asdl_seq_SET(s, i / 2, name);
2533 }
2534 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2535}
2536
2537static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538ast_for_assert_stmt(struct compiling *c, const node *n)
2539{
2540 /* assert_stmt: 'assert' test [',' test] */
2541 REQ(n, assert_stmt);
2542 if (NCH(n) == 2) {
2543 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2544 if (!expression)
2545 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002546 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 }
2548 else if (NCH(n) == 4) {
2549 expr_ty expr1, expr2;
2550
2551 expr1 = ast_for_expr(c, CHILD(n, 1));
2552 if (!expr1)
2553 return NULL;
2554 expr2 = ast_for_expr(c, CHILD(n, 3));
2555 if (!expr2)
2556 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557
Thomas Wouters89f507f2006-12-13 04:49:30 +00002558 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 }
Neal Norwitz79792652005-11-14 04:25:03 +00002560 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 "improper number of parts to 'assert' statement: %d",
2562 NCH(n));
2563 return NULL;
2564}
2565
2566static asdl_seq *
2567ast_for_suite(struct compiling *c, const node *n)
2568{
2569 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002570 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 stmt_ty s;
2572 int i, total, num, end, pos = 0;
2573 node *ch;
2574
2575 REQ(n, suite);
2576
2577 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002578 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002582 n = CHILD(n, 0);
2583 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 */
2586 end = NCH(n) - 1;
2587 if (TYPE(CHILD(n, end - 1)) == SEMI)
2588 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 for (i = 0; i < end; i += 2) {
2591 ch = CHILD(n, i);
2592 s = ast_for_stmt(c, ch);
2593 if (!s)
2594 return NULL;
2595 asdl_seq_SET(seq, pos++, s);
2596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597 }
2598 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002599 for (i = 2; i < (NCH(n) - 1); i++) {
2600 ch = CHILD(n, i);
2601 REQ(ch, stmt);
2602 num = num_stmts(ch);
2603 if (num == 1) {
2604 /* small_stmt or compound_stmt with only one child */
2605 s = ast_for_stmt(c, ch);
2606 if (!s)
2607 return NULL;
2608 asdl_seq_SET(seq, pos++, s);
2609 }
2610 else {
2611 int j;
2612 ch = CHILD(ch, 0);
2613 REQ(ch, simple_stmt);
2614 for (j = 0; j < NCH(ch); j += 2) {
2615 /* statement terminates with a semi-colon ';' */
2616 if (NCH(CHILD(ch, j)) == 0) {
2617 assert((j + 1) == NCH(ch));
2618 break;
2619 }
2620 s = ast_for_stmt(c, CHILD(ch, j));
2621 if (!s)
2622 return NULL;
2623 asdl_seq_SET(seq, pos++, s);
2624 }
2625 }
2626 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 }
2628 assert(pos == seq->size);
2629 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630}
2631
2632static stmt_ty
2633ast_for_if_stmt(struct compiling *c, const node *n)
2634{
2635 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2636 ['else' ':' suite]
2637 */
2638 char *s;
2639
2640 REQ(n, if_stmt);
2641
2642 if (NCH(n) == 4) {
2643 expr_ty expression;
2644 asdl_seq *suite_seq;
2645
2646 expression = ast_for_expr(c, CHILD(n, 1));
2647 if (!expression)
2648 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002650 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652
Guido van Rossumd8faa362007-04-27 19:54:29 +00002653 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2654 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002656
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 s = STR(CHILD(n, 4));
2658 /* s[2], the third character in the string, will be
2659 's' for el_s_e, or
2660 'i' for el_i_f
2661 */
2662 if (s[2] == 's') {
2663 expr_ty expression;
2664 asdl_seq *seq1, *seq2;
2665
2666 expression = ast_for_expr(c, CHILD(n, 1));
2667 if (!expression)
2668 return NULL;
2669 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002670 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 return NULL;
2672 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002673 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 return NULL;
2675
Guido van Rossumd8faa362007-04-27 19:54:29 +00002676 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2677 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 }
2679 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002681 expr_ty expression;
2682 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 asdl_seq *orelse = NULL;
2684 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 /* must reference the child n_elif+1 since 'else' token is third,
2686 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2688 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2689 has_else = 1;
2690 n_elif -= 3;
2691 }
2692 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693
Thomas Wouters89f507f2006-12-13 04:49:30 +00002694 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002695 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696
Thomas Wouters89f507f2006-12-13 04:49:30 +00002697 orelse = asdl_seq_new(1, c->c_arena);
2698 if (!orelse)
2699 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002701 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002703 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2704 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002706 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2707 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 asdl_seq_SET(orelse, 0,
2711 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002712 LINENO(CHILD(n, NCH(n) - 6)),
2713 CHILD(n, NCH(n) - 6)->n_col_offset,
2714 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 /* the just-created orelse handled the last elif */
2716 n_elif--;
2717 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 for (i = 0; i < n_elif; i++) {
2720 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002721 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2722 if (!newobj)
2723 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002725 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002728 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730
Thomas Wouters89f507f2006-12-13 04:49:30 +00002731 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002733 LINENO(CHILD(n, off)),
2734 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 orelse = newobj;
2736 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002737 expression = ast_for_expr(c, CHILD(n, 1));
2738 if (!expression)
2739 return NULL;
2740 suite_seq = ast_for_suite(c, CHILD(n, 3));
2741 if (!suite_seq)
2742 return NULL;
2743 return If(expression, suite_seq, orelse,
2744 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002746
2747 PyErr_Format(PyExc_SystemError,
2748 "unexpected token in 'if' statement: %s", s);
2749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750}
2751
2752static stmt_ty
2753ast_for_while_stmt(struct compiling *c, const node *n)
2754{
2755 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2756 REQ(n, while_stmt);
2757
2758 if (NCH(n) == 4) {
2759 expr_ty expression;
2760 asdl_seq *suite_seq;
2761
2762 expression = ast_for_expr(c, CHILD(n, 1));
2763 if (!expression)
2764 return NULL;
2765 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002766 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002768 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 }
2770 else if (NCH(n) == 7) {
2771 expr_ty expression;
2772 asdl_seq *seq1, *seq2;
2773
2774 expression = ast_for_expr(c, CHILD(n, 1));
2775 if (!expression)
2776 return NULL;
2777 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002778 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 return NULL;
2780 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002781 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 return NULL;
2783
Thomas Wouters89f507f2006-12-13 04:49:30 +00002784 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786
2787 PyErr_Format(PyExc_SystemError,
2788 "wrong number of tokens for 'while' statement: %d",
2789 NCH(n));
2790 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791}
2792
2793static stmt_ty
2794ast_for_for_stmt(struct compiling *c, const node *n)
2795{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002796 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002798 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002799 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2801 REQ(n, for_stmt);
2802
2803 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002804 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 if (!seq)
2806 return NULL;
2807 }
2808
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002809 node_target = CHILD(n, 1);
2810 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002811 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002813 /* Check the # of children rather than the length of _target, since
2814 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002815 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002816 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002817 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002819 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002821 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002822 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 return NULL;
2824 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002825 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 return NULL;
2827
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002828 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2829 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830}
2831
2832static excepthandler_ty
2833ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2834{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002835 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 REQ(exc, except_clause);
2837 REQ(body, suite);
2838
2839 if (NCH(exc) == 1) {
2840 asdl_seq *suite_seq = ast_for_suite(c, body);
2841 if (!suite_seq)
2842 return NULL;
2843
Neal Norwitzad74aa82008-03-31 05:14:30 +00002844 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002845 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 }
2847 else if (NCH(exc) == 2) {
2848 expr_ty expression;
2849 asdl_seq *suite_seq;
2850
2851 expression = ast_for_expr(c, CHILD(exc, 1));
2852 if (!expression)
2853 return NULL;
2854 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002855 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 return NULL;
2857
Neal Norwitzad74aa82008-03-31 05:14:30 +00002858 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002859 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 }
2861 else if (NCH(exc) == 4) {
2862 asdl_seq *suite_seq;
2863 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002864 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002865 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002867 if (forbidden_name(e, CHILD(exc, 3), 0))
2868 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002870 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 return NULL;
2872 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002873 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 return NULL;
2875
Neal Norwitzad74aa82008-03-31 05:14:30 +00002876 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002877 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002879
2880 PyErr_Format(PyExc_SystemError,
2881 "wrong number of children for 'except' clause: %d",
2882 NCH(exc));
2883 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884}
2885
2886static stmt_ty
2887ast_for_try_stmt(struct compiling *c, const node *n)
2888{
Neal Norwitzf599f422005-12-17 21:33:47 +00002889 const int nch = NCH(n);
2890 int n_except = (nch - 3)/3;
2891 asdl_seq *body, *orelse = NULL, *finally = NULL;
2892
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 REQ(n, try_stmt);
2894
Neal Norwitzf599f422005-12-17 21:33:47 +00002895 body = ast_for_suite(c, CHILD(n, 2));
2896 if (body == NULL)
2897 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898
Neal Norwitzf599f422005-12-17 21:33:47 +00002899 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2900 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2901 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2902 /* we can assume it's an "else",
2903 because nch >= 9 for try-else-finally and
2904 it would otherwise have a type of except_clause */
2905 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2906 if (orelse == NULL)
2907 return NULL;
2908 n_except--;
2909 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910
Neal Norwitzf599f422005-12-17 21:33:47 +00002911 finally = ast_for_suite(c, CHILD(n, nch - 1));
2912 if (finally == NULL)
2913 return NULL;
2914 n_except--;
2915 }
2916 else {
2917 /* we can assume it's an "else",
2918 otherwise it would have a type of except_clause */
2919 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2920 if (orelse == NULL)
2921 return NULL;
2922 n_except--;
2923 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002925 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002926 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 return NULL;
2928 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929
Neal Norwitzf599f422005-12-17 21:33:47 +00002930 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002931 int i;
2932 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002933 /* process except statements to create a try ... except */
2934 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2935 if (handlers == NULL)
2936 return NULL;
2937
2938 for (i = 0; i < n_except; i++) {
2939 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2940 CHILD(n, 5 + i * 3));
2941 if (!e)
2942 return NULL;
2943 asdl_seq_SET(handlers, i, e);
2944 }
2945
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002947 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002948 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002949 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002950
2951 /* if a 'finally' is present too, we nest the TryExcept within a
2952 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002953 body = asdl_seq_new(1, c->c_arena);
2954 if (body == NULL)
2955 return NULL;
2956 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002957 }
2958
2959 /* must be a try ... finally (except clauses are in body, if any exist) */
2960 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002961 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962}
2963
Georg Brandl0c315622009-05-25 21:10:36 +00002964/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002965static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002966ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002967{
2968 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002969
Georg Brandl0c315622009-05-25 21:10:36 +00002970 REQ(n, with_item);
2971 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002972 if (!context_expr)
2973 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002974 if (NCH(n) == 3) {
2975 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002976
2977 if (!optional_vars) {
2978 return NULL;
2979 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002980 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002981 return NULL;
2982 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002983 }
2984
Georg Brandl0c315622009-05-25 21:10:36 +00002985 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002986 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002987}
2988
Georg Brandl0c315622009-05-25 21:10:36 +00002989/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2990static stmt_ty
2991ast_for_with_stmt(struct compiling *c, const node *n)
2992{
2993 int i;
2994 stmt_ty ret;
2995 asdl_seq *inner;
2996
2997 REQ(n, with_stmt);
2998
2999 /* process the with items inside-out */
3000 i = NCH(n) - 1;
3001 /* the suite of the innermost with item is the suite of the with stmt */
3002 inner = ast_for_suite(c, CHILD(n, i));
3003 if (!inner)
3004 return NULL;
3005
3006 for (;;) {
3007 i -= 2;
3008 ret = ast_for_with_item(c, CHILD(n, i), inner);
3009 if (!ret)
3010 return NULL;
3011 /* was this the last item? */
3012 if (i == 1)
3013 break;
3014 /* if not, wrap the result so far in a new sequence */
3015 inner = asdl_seq_new(1, c->c_arena);
3016 if (!inner)
3017 return NULL;
3018 asdl_seq_SET(inner, 0, ret);
3019 }
3020
3021 return ret;
3022}
3023
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003025ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003027 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003028 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003029 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003030 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003031
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 REQ(n, classdef);
3033
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003034 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 s = ast_for_suite(c, CHILD(n, 3));
3036 if (!s)
3037 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003038 classname = NEW_IDENTIFIER(CHILD(n, 1));
3039 if (!classname)
3040 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003041 if (forbidden_name(classname, CHILD(n, 3), 0))
3042 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003043 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3044 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003046
3047 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003048 s = ast_for_suite(c, CHILD(n,5));
3049 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003050 return NULL;
3051 classname = NEW_IDENTIFIER(CHILD(n, 1));
3052 if (!classname)
3053 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003054 if (forbidden_name(classname, CHILD(n, 3), 0))
3055 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003056 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3057 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 }
3059
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003060 /* class NAME '(' arglist ')' ':' suite */
3061 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003062 {
3063 PyObject *dummy_name;
3064 expr_ty dummy;
3065 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3066 if (!dummy_name)
3067 return NULL;
3068 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3069 call = ast_for_call(c, CHILD(n, 3), dummy);
3070 if (!call)
3071 return NULL;
3072 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003074 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003076 classname = NEW_IDENTIFIER(CHILD(n, 1));
3077 if (!classname)
3078 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003079 if (forbidden_name(classname, CHILD(n, 1), 0))
3080 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003081
Benjamin Peterson30760062008-11-25 04:02:28 +00003082 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003083 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003084 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085}
3086
3087static stmt_ty
3088ast_for_stmt(struct compiling *c, const node *n)
3089{
3090 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003091 assert(NCH(n) == 1);
3092 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093 }
3094 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003095 assert(num_stmts(n) == 1);
3096 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 }
3098 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003099 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003100 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3101 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003102 */
3103 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 case expr_stmt:
3105 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 case del_stmt:
3107 return ast_for_del_stmt(c, n);
3108 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003109 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 case flow_stmt:
3111 return ast_for_flow_stmt(c, n);
3112 case import_stmt:
3113 return ast_for_import_stmt(c, n);
3114 case global_stmt:
3115 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003116 case nonlocal_stmt:
3117 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118 case assert_stmt:
3119 return ast_for_assert_stmt(c, n);
3120 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003121 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3123 TYPE(n), NCH(n));
3124 return NULL;
3125 }
3126 }
3127 else {
3128 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003129 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003130 */
3131 node *ch = CHILD(n, 0);
3132 REQ(n, compound_stmt);
3133 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 case if_stmt:
3135 return ast_for_if_stmt(c, ch);
3136 case while_stmt:
3137 return ast_for_while_stmt(c, ch);
3138 case for_stmt:
3139 return ast_for_for_stmt(c, ch);
3140 case try_stmt:
3141 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003142 case with_stmt:
3143 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003145 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003147 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 case decorated:
3149 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003151 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3153 TYPE(n), NCH(n));
3154 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003155 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 }
3157}
3158
3159static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003160parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 const char *end;
3163 long x;
3164 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003165 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003168 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 errno = 0;
3170 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 if (s[0] == '0') {
3173 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3174 if (x < 0 && errno == 0) {
3175 return PyLong_FromString((char *)s,
3176 (char **)0,
3177 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003178 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003179 }
3180 else
3181 x = PyOS_strtol((char *)s, (char **)&end, 0);
3182 if (*end == '\0') {
3183 if (errno != 0)
3184 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003185 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 }
3187 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003188 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003189 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003190 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3191 if (compl.imag == -1.0 && PyErr_Occurred())
3192 return NULL;
3193 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 }
3195 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003197 dx = PyOS_string_to_double(s, NULL, NULL);
3198 if (dx == -1.0 && PyErr_Occurred())
3199 return NULL;
3200 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202}
3203
3204static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003205decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 PyObject *u, *v;
3208 char *s, *t;
3209 t = s = (char *)*sPtr;
3210 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3211 while (s < end && (*s & 0x80)) s++;
3212 *sPtr = s;
3213 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3214 if (u == NULL)
3215 return NULL;
3216 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3217 Py_DECREF(u);
3218 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219}
3220
3221static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003222decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003224 PyObject *v, *u;
3225 char *buf;
3226 char *p;
3227 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003228
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 if (encoding == NULL) {
3230 buf = (char *)s;
3231 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003233 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003234 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003235 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003236 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3237 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3238 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239 if (u == NULL)
3240 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003241 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 end = s + len;
3243 while (s < end) {
3244 if (*s == '\\') {
3245 *p++ = *s++;
3246 if (*s & 0x80) {
3247 strcpy(p, "u005c");
3248 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003249 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003250 }
3251 if (*s & 0x80) { /* XXX inefficient */
3252 PyObject *w;
3253 char *r;
3254 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003255 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003256 if (w == NULL) {
3257 Py_DECREF(u);
3258 return NULL;
3259 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003260 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003261 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003262 assert(rn % 4 == 0);
3263 for (i = 0; i < rn; i += 4) {
3264 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003266 r[i + 1] & 0xFF,
3267 r[i + 2] & 0xFF,
3268 r[i + 3] & 0xFF);
3269 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003270 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003271 /* Should be impossible to overflow */
3272 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003273 Py_DECREF(w);
3274 } else {
3275 *p++ = *s++;
3276 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003277 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003278 len = p - buf;
3279 s = buf;
3280 }
3281 if (rawmode)
3282 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3283 else
3284 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3285 Py_XDECREF(u);
3286 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287}
3288
3289/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003290 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 * parsestr parses it, and returns the decoded Python string object.
3292 */
3293static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003294parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003296 size_t len;
3297 const char *s = STR(n);
3298 int quote = Py_CHARMASK(*s);
3299 int rawmode = 0;
3300 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003301 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003302 if (quote == 'b' || quote == 'B') {
3303 quote = *++s;
3304 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003306 if (quote == 'r' || quote == 'R') {
3307 quote = *++s;
3308 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003309 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003310 }
3311 if (quote != '\'' && quote != '\"') {
3312 PyErr_BadInternalCall();
3313 return NULL;
3314 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003315 s++;
3316 len = strlen(s);
3317 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003319 "string to parse is too long");
3320 return NULL;
3321 }
3322 if (s[--len] != quote) {
3323 PyErr_BadInternalCall();
3324 return NULL;
3325 }
3326 if (len >= 4 && s[0] == quote && s[1] == quote) {
3327 s += 2;
3328 len -= 2;
3329 if (s[--len] != quote || s[--len] != quote) {
3330 PyErr_BadInternalCall();
3331 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003332 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003333 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003334 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003335 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003336 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 if (*bytesmode) {
3338 /* Disallow non-ascii characters (but not escapes) */
3339 const char *c;
3340 for (c = s; *c; c++) {
3341 if (Py_CHARMASK(*c) >= 0x80) {
3342 ast_error(n, "bytes can only contain ASCII "
3343 "literal characters.");
3344 return NULL;
3345 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003346 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003347 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003348 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003349 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003350 if (rawmode || strchr(s, '\\') == NULL) {
3351 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003352 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003353 if (u == NULL || !*bytesmode)
3354 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003355 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003356 Py_DECREF(u);
3357 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003358 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003359 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003360 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003361 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003363 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003364 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003365 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003366 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003367 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368}
3369
Guido van Rossum29fd7122007-11-12 01:13:56 +00003370/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371 * compile-time literal catenation, calling parsestr() on each piece, and
3372 * pasting the intermediate results together.
3373 */
3374static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003375parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003377 PyObject *v;
3378 int i;
3379 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003380 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003381 if (v != NULL) {
3382 /* String literal concatenation */
3383 for (i = 1; i < NCH(n); i++) {
3384 PyObject *s;
3385 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003386 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003387 if (s == NULL)
3388 goto onError;
3389 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003390 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003391 goto onError;
3392 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003393 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3394 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003395 if (v == NULL)
3396 goto onError;
3397 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003398 else {
3399 PyObject *temp = PyUnicode_Concat(v, s);
3400 Py_DECREF(s);
3401 Py_DECREF(v);
3402 v = temp;
3403 if (v == NULL)
3404 goto onError;
3405 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003406 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003407 }
3408 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409
Guido van Rossumd8faa362007-04-27 19:54:29 +00003410 onError:
3411 Py_XDECREF(v);
3412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413}