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