blob: 6faf5b21a6ebba9c964ff631ca15da761f07533e [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"
10#include "ast.h"
11#include "token.h"
12#include "parsetok.h"
13#include "graminit.h"
14
15#include <assert.h>
16
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000017/* Data structure used internally */
18struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000019 char *c_encoding; /* source encoding */
20 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000021 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000031static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
Christian Heimes81ee3ef2008-05-04 22:42:01 +000036static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000037static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000038static PyObject *parsestrplus(struct compiling *, const node *n,
39 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000042#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#endif
44
Nick Coghlan650f0d02007-04-15 12:05:43 +000045#define COMP_GENEXP 0
46#define COMP_LISTCOMP 1
47#define COMP_SETCOMP 2
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000050new_identifier(const char* n, PyArena *arena)
51{
Martin v. Löwis5b222132007-06-10 09:51:05 +000052 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000053 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000054 if (!id)
55 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000056 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000057 /* Check whether there are non-ASCII characters in the
58 identifier; if so, normalize to NFKC. */
59 for (; *u; u++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 if (*u >= 128) {
61 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
62 PyObject *id2;
63 if (!m)
64 return NULL;
65 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
66 Py_DECREF(m);
67 if (!id2)
68 return NULL;
69 Py_DECREF(id);
70 id = id2;
71 break;
72 }
Martin v. Löwis47383402007-08-15 07:32:56 +000073 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000074 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000075 PyArena_AddPyObject(arena, id);
76 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077}
78
Neal Norwitzadb69fc2005-12-17 20:54:49 +000079#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000080
81/* This routine provides an invalid object for the syntax error.
82 The outermost routine must unpack this error and create the
83 proper object. We do this so that we don't have to pass
84 the filename to everything function.
85
86 XXX Maybe we should just pass the filename...
87*/
88
89static int
90ast_error(const node *n, const char *errstr)
91{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000092 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000094 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 PyErr_SetObject(PyExc_SyntaxError, u);
96 Py_DECREF(u);
97 return 0;
98}
99
100static void
101ast_error_finish(const char *filename)
102{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000103 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000104 PyObject *filename_obj;
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 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000121 offset = PyTuple_GetItem(value, 2);
122 if (!offset) {
123 Py_DECREF(errstr);
124 return;
125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 Py_DECREF(value);
127
128 loc = PyErr_ProgramText(filename, lineno);
129 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000130 Py_INCREF(Py_None);
131 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000133 if (filename != NULL)
134 filename_obj = PyUnicode_DecodeFSDefault(filename);
135 else {
136 Py_INCREF(Py_None);
137 filename_obj = Py_None;
138 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000139 if (filename_obj != NULL)
140 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
141 else
142 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000143 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000144 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000145 Py_DECREF(errstr);
146 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000147 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000148 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149 Py_DECREF(errstr);
150 Py_DECREF(tmp);
151 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000152 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000153 PyErr_Restore(type, value, tback);
154}
155
156/* num_stmts() returns number of contained statements.
157
158 Use this routine to determine how big a sequence is needed for
159 the statements in a parse tree. Its raison d'etre is this bit of
160 grammar:
161
162 stmt: simple_stmt | compound_stmt
163 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
164
165 A simple_stmt can contain multiple small_stmt elements joined
166 by semicolons. If the arg is a simple_stmt, the number of
167 small_stmt elements is returned.
168*/
169
170static int
171num_stmts(const node *n)
172{
173 int i, l;
174 node *ch;
175
176 switch (TYPE(n)) {
177 case single_input:
178 if (TYPE(CHILD(n, 0)) == NEWLINE)
179 return 0;
180 else
181 return num_stmts(CHILD(n, 0));
182 case file_input:
183 l = 0;
184 for (i = 0; i < NCH(n); i++) {
185 ch = CHILD(n, i);
186 if (TYPE(ch) == stmt)
187 l += num_stmts(ch);
188 }
189 return l;
190 case stmt:
191 return num_stmts(CHILD(n, 0));
192 case compound_stmt:
193 return 1;
194 case simple_stmt:
195 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
196 case suite:
197 if (NCH(n) == 1)
198 return num_stmts(CHILD(n, 0));
199 else {
200 l = 0;
201 for (i = 2; i < (NCH(n) - 1); i++)
202 l += num_stmts(CHILD(n, i));
203 return l;
204 }
205 default: {
206 char buf[128];
207
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000208 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209 TYPE(n), NCH(n));
210 Py_FatalError(buf);
211 }
212 }
213 assert(0);
214 return 0;
215}
216
217/* Transform the CST rooted at node * to the appropriate AST
218*/
219
220mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000221PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
222 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000224 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 asdl_seq *stmts = NULL;
226 stmt_ty s;
227 node *ch;
228 struct compiling c;
229
230 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000231 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000232 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000233#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000234 ast_error(n, "encoding declaration in Unicode string");
235 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000236#endif
237 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000238 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 } else if (TYPE(n) == encoding_decl) {
240 c.c_encoding = STR(n);
241 n = CHILD(n, 0);
242 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000244 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000246 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000247 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248
Jeremy Hyltona8293132006-02-28 17:58:27 +0000249 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000250 switch (TYPE(n)) {
251 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255 for (i = 0; i < NCH(n) - 1; i++) {
256 ch = CHILD(n, i);
257 if (TYPE(ch) == NEWLINE)
258 continue;
259 REQ(ch, stmt);
260 num = num_stmts(ch);
261 if (num == 1) {
262 s = ast_for_stmt(&c, ch);
263 if (!s)
264 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000265 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000266 }
267 else {
268 ch = CHILD(ch, 0);
269 REQ(ch, simple_stmt);
270 for (j = 0; j < num; j++) {
271 s = ast_for_stmt(&c, CHILD(ch, j * 2));
272 if (!s)
273 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000274 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 }
276 }
277 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000278 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 case eval_input: {
280 expr_ty testlist_ast;
281
Nick Coghlan650f0d02007-04-15 12:05:43 +0000282 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000283 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 if (!testlist_ast)
285 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000286 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 }
288 case single_input:
289 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000290 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000293 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
294 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000295 if (!asdl_seq_GET(stmts, 0))
296 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000297 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 }
299 else {
300 n = CHILD(n, 0);
301 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000302 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000303 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000304 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000306 s = ast_for_stmt(&c, n);
307 if (!s)
308 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000309 asdl_seq_SET(stmts, 0, s);
310 }
311 else {
312 /* Only a simple_stmt can contain multiple statements. */
313 REQ(n, simple_stmt);
314 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 if (TYPE(CHILD(n, i)) == NEWLINE)
316 break;
317 s = ast_for_stmt(&c, CHILD(n, i));
318 if (!s)
319 goto error;
320 asdl_seq_SET(stmts, i / 2, s);
321 }
322 }
323
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000324 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 }
326 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000327 PyErr_Format(PyExc_SystemError,
328 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000329 goto error;
330 }
331 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000332 ast_error_finish(filename);
333 return NULL;
334}
335
336/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
337*/
338
339static operator_ty
340get_operator(const node *n)
341{
342 switch (TYPE(n)) {
343 case VBAR:
344 return BitOr;
345 case CIRCUMFLEX:
346 return BitXor;
347 case AMPER:
348 return BitAnd;
349 case LEFTSHIFT:
350 return LShift;
351 case RIGHTSHIFT:
352 return RShift;
353 case PLUS:
354 return Add;
355 case MINUS:
356 return Sub;
357 case STAR:
358 return Mult;
359 case SLASH:
360 return Div;
361 case DOUBLESLASH:
362 return FloorDiv;
363 case PERCENT:
364 return Mod;
365 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000366 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367 }
368}
369
Guido van Rossume7ba4952007-06-06 23:52:48 +0000370static const char* FORBIDDEN[] = {
371 "None",
372 "True",
373 "False",
374 NULL,
375};
376
377static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000378forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000379{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000380 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000381 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
382 ast_error(n, "assignment to keyword");
383 return 1;
384 }
385 if (full_checks) {
386 const char **p;
387 for (p = FORBIDDEN; *p; p++) {
388 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
389 ast_error(n, "assignment to keyword");
390 return 1;
391 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000392 }
393 }
394 return 0;
395}
396
Jeremy Hyltona8293132006-02-28 17:58:27 +0000397/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
399 Only sets context for expr kinds that "can appear in assignment context"
400 (according to ../Parser/Python.asdl). For other expr kinds, it sets
401 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402*/
403
404static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000405set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000406{
407 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 /* If a particular expression type can't be used for assign / delete,
409 set expr_name to its name and an error message will be generated.
410 */
411 const char* expr_name = NULL;
412
413 /* The ast defines augmented store and load contexts, but the
414 implementation here doesn't actually use them. The code may be
415 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000417 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000418 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000419 */
420 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000421
422 switch (e->kind) {
423 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000424 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000425 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
426 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 e->v.Subscript.ctx = ctx;
430 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000431 case Starred_kind:
432 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000433 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000434 return 0;
435 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000437 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000438 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000439 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440 }
441 e->v.Name.ctx = ctx;
442 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000444 e->v.List.ctx = ctx;
445 s = e->v.List.elts;
446 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000447 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000448 if (asdl_seq_LEN(e->v.Tuple.elts)) {
449 e->v.Tuple.ctx = ctx;
450 s = e->v.Tuple.elts;
451 }
452 else {
453 expr_name = "()";
454 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000455 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000456 case Lambda_kind:
457 expr_name = "lambda";
458 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000459 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000460 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000462 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000464 case UnaryOp_kind:
465 expr_name = "operator";
466 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 expr_name = "generator expression";
469 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470 case Yield_kind:
471 expr_name = "yield expression";
472 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 case ListComp_kind:
474 expr_name = "list comprehension";
475 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000476 case SetComp_kind:
477 expr_name = "set comprehension";
478 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000479 case DictComp_kind:
480 expr_name = "dict comprehension";
481 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000482 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000483 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000484 case Num_kind:
485 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500486 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000487 expr_name = "literal";
488 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000489 case Ellipsis_kind:
490 expr_name = "Ellipsis";
491 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000492 case Compare_kind:
493 expr_name = "comparison";
494 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000495 case IfExp_kind:
496 expr_name = "conditional expression";
497 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000498 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 PyErr_Format(PyExc_SystemError,
500 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000501 e->kind, e->lineno);
502 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000503 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000504 /* Check for error string set by switch */
505 if (expr_name) {
506 char buf[300];
507 PyOS_snprintf(buf, sizeof(buf),
508 "can't %s %s",
509 ctx == Store ? "assign to" : "delete",
510 expr_name);
511 return ast_error(n, buf);
512 }
513
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000516 */
517 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000518 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000521 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000522 return 0;
523 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524 }
525 return 1;
526}
527
528static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000529ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000530{
531 REQ(n, augassign);
532 n = CHILD(n, 0);
533 switch (STR(n)[0]) {
534 case '+':
535 return Add;
536 case '-':
537 return Sub;
538 case '/':
539 if (STR(n)[1] == '/')
540 return FloorDiv;
541 else
542 return Div;
543 case '%':
544 return Mod;
545 case '<':
546 return LShift;
547 case '>':
548 return RShift;
549 case '&':
550 return BitAnd;
551 case '^':
552 return BitXor;
553 case '|':
554 return BitOr;
555 case '*':
556 if (STR(n)[1] == '*')
557 return Pow;
558 else
559 return Mult;
560 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000561 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000562 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563 }
564}
565
566static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000567ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000569 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 |'is' 'not'
571 */
572 REQ(n, comp_op);
573 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000574 n = CHILD(n, 0);
575 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 case LESS:
577 return Lt;
578 case GREATER:
579 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000580 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 return Eq;
582 case LESSEQUAL:
583 return LtE;
584 case GREATEREQUAL:
585 return GtE;
586 case NOTEQUAL:
587 return NotEq;
588 case NAME:
589 if (strcmp(STR(n), "in") == 0)
590 return In;
591 if (strcmp(STR(n), "is") == 0)
592 return Is;
593 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000594 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000596 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598 }
599 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000600 /* handle "not in" and "is not" */
601 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602 case NAME:
603 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
604 return NotIn;
605 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
606 return IsNot;
607 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000608 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000610 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000611 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612 }
Neal Norwitz79792652005-11-14 04:25:03 +0000613 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000615 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616}
617
618static asdl_seq *
619seq_for_testlist(struct compiling *c, const node *n)
620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +0000622 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
623 */
Armin Rigo31441302005-10-21 12:57:31 +0000624 asdl_seq *seq;
625 expr_ty expression;
626 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000627 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000629 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000630 if (!seq)
631 return NULL;
632
633 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +0000635 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636
Benjamin Peterson4905e802009-09-27 02:43:28 +0000637 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000638 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000640
641 assert(i / 2 < seq->size);
642 asdl_seq_SET(seq, i / 2, expression);
643 }
644 return seq;
645}
646
Neal Norwitzc1505362006-12-28 06:47:50 +0000647static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -0700648ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000649{
650 identifier name;
651 expr_ty annotation = NULL;
652 node *ch;
653
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000654 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000655 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000656 name = NEW_IDENTIFIER(ch);
657 if (!name)
658 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000659 if (forbidden_name(name, ch, 0))
660 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000661
662 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
663 annotation = ast_for_expr(c, CHILD(n, 2));
664 if (!annotation)
665 return NULL;
666 }
667
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000668 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669}
670
Guido van Rossum4f72a782006-10-27 23:31:49 +0000671/* returns -1 if failed to handle keyword only arguments
672 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000673 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 ^^^
675 start pointing here
676 */
677static int
678handle_keywordonly_args(struct compiling *c, const node *n, int start,
679 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
680{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000681 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000682 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000683 expr_ty expression, annotation;
684 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000685 int i = start;
686 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000687
688 if (kwonlyargs == NULL) {
689 ast_error(CHILD(n, start), "named arguments must follow bare *");
690 return -1;
691 }
692 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000693 while (i < NCH(n)) {
694 ch = CHILD(n, i);
695 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000696 case vfpdef:
697 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000698 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000699 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000700 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000701 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000702 asdl_seq_SET(kwdefaults, j, expression);
703 i += 2; /* '=' and test */
704 }
705 else { /* setting NULL if no default value exists */
706 asdl_seq_SET(kwdefaults, j, NULL);
707 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000708 if (NCH(ch) == 3) {
709 /* ch is NAME ':' test */
710 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000711 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000712 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000713 }
714 else {
715 annotation = NULL;
716 }
717 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000718 argname = NEW_IDENTIFIER(ch);
719 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000720 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000721 if (forbidden_name(argname, ch, 0))
722 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000723 arg = arg(argname, annotation, c->c_arena);
724 if (!arg)
725 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000726 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000727 i += 2; /* the name and the comma */
728 break;
729 case DOUBLESTAR:
730 return i;
731 default:
732 ast_error(ch, "unexpected node");
733 goto error;
734 }
735 }
736 return i;
737 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000739}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740
Jeremy Hyltona8293132006-02-28 17:58:27 +0000741/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742
743static arguments_ty
744ast_for_arguments(struct compiling *c, const node *n)
745{
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 /* This function handles both typedargslist (function definition)
747 and varargslist (lambda definition).
748
749 parameters: '(' [typedargslist] ')'
750 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000752 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000753 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000754 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000755 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000757 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000758 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000759 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 int i, j, k, nposargs = 0, nkwonlyargs = 0;
762 int nposdefaults = 0, found_default = 0;
763 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000765 arg_ty arg;
766 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 node *ch;
768
769 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000770 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000771 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
772 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000773 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000775 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776
Jeremy Hyltone921e022008-07-17 16:37:17 +0000777 /* First count the number of positional args & defaults. The
778 variable i is the loop index for this for loop and the next.
779 The next loop picks up where the first leaves off.
780 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000782 ch = CHILD(n, i);
783 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000784 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000785 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000786 if (i < NCH(n) && /* skip argument following star */
787 (TYPE(CHILD(n, i)) == tfpdef ||
788 TYPE(CHILD(n, i)) == vfpdef)) {
789 i++;
790 }
791 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000793 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000794 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 defaults for keyword only args */
799 for ( ; i < NCH(n); ++i) {
800 ch = CHILD(n, i);
801 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000802 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
805 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000806 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 kwonlyargs = (nkwonlyargs ?
808 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
809 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000810 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000812 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
813 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000814 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000816 since we set NULL as default for keyword only argument w/o default
817 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000818 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000819 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
820 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000821 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000822
823 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000824 ast_error(n, "more than 255 arguments");
825 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000828 /* tfpdef: NAME [':' test]
829 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 */
831 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000832 j = 0; /* index for defaults */
833 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000835 ch = CHILD(n, i);
836 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000837 case tfpdef:
838 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000839 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
840 anything other than EQUAL or a comma? */
841 /* XXX Should NCH(n) check be made a separate check? */
842 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000843 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
844 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000845 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000846 assert(posdefaults != NULL);
847 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000849 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000850 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000851 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000853 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000854 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000855 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -0700856 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000857 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000858 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000859 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 i += 2; /* the name and the comma */
861 break;
862 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000863 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000865 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000866 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000867 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000868 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000869 if (TYPE(ch) == COMMA) {
870 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000871 i += 2; /* now follows keyword only arguments */
872 res = handle_keywordonly_args(c, n, i,
873 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000874 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000875 i = res; /* res has new position to process */
876 }
877 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000878 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000879 if (!vararg)
880 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000881 if (forbidden_name(vararg, CHILD(ch, 0), 0))
882 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000883 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000884 /* there is an annotation on the vararg */
885 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000886 if (!varargannotation)
887 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000888 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000889 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000890 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
891 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000892 int res = 0;
893 res = handle_keywordonly_args(c, n, i,
894 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000895 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000896 i = res; /* res has new position to process */
897 }
898 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 break;
900 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000901 ch = CHILD(n, i+1); /* tfpdef */
902 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000903 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000904 if (!kwarg)
905 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000906 if (NCH(ch) > 1) {
907 /* there is an annotation on the kwarg */
908 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000909 if (!kwargannotation)
910 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000911 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000912 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000913 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 i += 3;
915 break;
916 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000917 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918 "unexpected node in varargslist: %d @ %d",
919 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000920 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000921 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000923 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
924 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925}
926
927static expr_ty
928ast_for_dotted_name(struct compiling *c, const node *n)
929{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000930 expr_ty e;
931 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000932 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 int i;
934
935 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000936
937 lineno = LINENO(n);
938 col_offset = n->n_col_offset;
939
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 id = NEW_IDENTIFIER(CHILD(n, 0));
941 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000942 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000943 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946
947 for (i = 2; i < NCH(n); i+=2) {
948 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 if (!id)
950 return NULL;
951 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
952 if (!e)
953 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 }
955
956 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957}
958
959static expr_ty
960ast_for_decorator(struct compiling *c, const node *n)
961{
962 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
963 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000964 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000967 REQ(CHILD(n, 0), AT);
968 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
971 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000972 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000975 d = name_expr;
976 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 }
978 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000980 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000981 if (!d)
982 return NULL;
983 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 }
985 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000986 d = ast_for_call(c, CHILD(n, 3), name_expr);
987 if (!d)
988 return NULL;
989 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990 }
991
992 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993}
994
995static asdl_seq*
996ast_for_decorators(struct compiling *c, const node *n)
997{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000998 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000999 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001003 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 if (!decorator_seq)
1005 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001008 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001009 if (!d)
1010 return NULL;
1011 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 }
1013 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014}
1015
1016static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001017ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001019 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001020 identifier name;
1021 arguments_ty args;
1022 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001023 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001024 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025
1026 REQ(n, funcdef);
1027
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001028 name = NEW_IDENTIFIER(CHILD(n, name_i));
1029 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001030 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001031 if (forbidden_name(name, CHILD(n, name_i), 0))
1032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1034 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001035 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001036 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1037 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1038 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001039 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001040 name_i += 2;
1041 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042 body = ast_for_suite(c, CHILD(n, name_i + 3));
1043 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001044 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045
Neal Norwitzc1505362006-12-28 06:47:50 +00001046 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001047 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048}
1049
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001050static stmt_ty
1051ast_for_decorated(struct compiling *c, const node *n)
1052{
1053 /* decorated: decorators (classdef | funcdef) */
1054 stmt_ty thing = NULL;
1055 asdl_seq *decorator_seq = NULL;
1056
1057 REQ(n, decorated);
1058
1059 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1060 if (!decorator_seq)
1061 return NULL;
1062
1063 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001065
1066 if (TYPE(CHILD(n, 1)) == funcdef) {
1067 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1068 } else if (TYPE(CHILD(n, 1)) == classdef) {
1069 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1070 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001071 /* we count the decorators in when talking about the class' or
1072 * function's line number */
1073 if (thing) {
1074 thing->lineno = LINENO(n);
1075 thing->col_offset = n->n_col_offset;
1076 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001077 return thing;
1078}
1079
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080static expr_ty
1081ast_for_lambdef(struct compiling *c, const node *n)
1082{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001083 /* lambdef: 'lambda' [varargslist] ':' test
1084 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085 arguments_ty args;
1086 expr_ty expression;
1087
1088 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001089 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1090 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 if (!args)
1092 return NULL;
1093 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001094 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096 }
1097 else {
1098 args = ast_for_arguments(c, CHILD(n, 1));
1099 if (!args)
1100 return NULL;
1101 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001102 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104 }
1105
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001106 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107}
1108
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001109static expr_ty
1110ast_for_ifexpr(struct compiling *c, const node *n)
1111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001113 expr_ty expression, body, orelse;
1114
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001115 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001116 body = ast_for_expr(c, CHILD(n, 0));
1117 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001118 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001119 expression = ast_for_expr(c, CHILD(n, 2));
1120 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001121 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001122 orelse = ast_for_expr(c, CHILD(n, 4));
1123 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001125 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1126 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001127}
1128
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001130 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131
Nick Coghlan650f0d02007-04-15 12:05:43 +00001132 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133*/
1134
1135static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001136count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001138 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139
Guido van Rossumd8faa362007-04-27 19:54:29 +00001140 count_comp_for:
1141 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001142 REQ(n, comp_for);
1143 if (NCH(n) == 5)
1144 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001145 else
1146 return n_fors;
1147 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001148 REQ(n, comp_iter);
1149 n = CHILD(n, 0);
1150 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001151 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001152 else if (TYPE(n) == comp_if) {
1153 if (NCH(n) == 3) {
1154 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001155 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001156 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001157 else
1158 return n_fors;
1159 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001160
Guido van Rossumd8faa362007-04-27 19:54:29 +00001161 /* Should never be reached */
1162 PyErr_SetString(PyExc_SystemError,
1163 "logic error in count_comp_fors");
1164 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165}
1166
Nick Coghlan650f0d02007-04-15 12:05:43 +00001167/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168
Nick Coghlan650f0d02007-04-15 12:05:43 +00001169 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170*/
1171
1172static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001173count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001175 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176
Guido van Rossumd8faa362007-04-27 19:54:29 +00001177 while (1) {
1178 REQ(n, comp_iter);
1179 if (TYPE(CHILD(n, 0)) == comp_for)
1180 return n_ifs;
1181 n = CHILD(n, 0);
1182 REQ(n, comp_if);
1183 n_ifs++;
1184 if (NCH(n) == 2)
1185 return n_ifs;
1186 n = CHILD(n, 2);
1187 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001188}
1189
Guido van Rossum992d4a32007-07-11 13:09:30 +00001190static asdl_seq *
1191ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 asdl_seq *comps;
1195
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001196 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 if (n_fors == -1)
1198 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001199
Nick Coghlan650f0d02007-04-15 12:05:43 +00001200 comps = asdl_seq_new(n_fors, c->c_arena);
1201 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001203
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001205 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001207 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001208 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209
Guido van Rossum992d4a32007-07-11 13:09:30 +00001210 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211
Guido van Rossum992d4a32007-07-11 13:09:30 +00001212 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001213 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001214 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001216 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001219
Thomas Wouters89f507f2006-12-13 04:49:30 +00001220 /* Check the # of children rather than the length of t, since
1221 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001222 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001223 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001224 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001226 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1227 c->c_arena),
1228 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001229 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001231
Guido van Rossum992d4a32007-07-11 13:09:30 +00001232 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 int j, n_ifs;
1234 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235
Guido van Rossum992d4a32007-07-11 13:09:30 +00001236 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001237 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001238 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001240
1241 ifs = asdl_seq_new(n_ifs, c->c_arena);
1242 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001244
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001246 REQ(n, comp_iter);
1247 n = CHILD(n, 0);
1248 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249
Guido van Rossum992d4a32007-07-11 13:09:30 +00001250 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001251 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001252 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001253 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001254 if (NCH(n) == 3)
1255 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001257 /* on exit, must guarantee that n is a comp_for */
1258 if (TYPE(n) == comp_iter)
1259 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001260 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001262 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001264 return comps;
1265}
1266
1267static expr_ty
1268ast_for_itercomp(struct compiling *c, const node *n, int type)
1269{
1270 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1271 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1272 expr_ty elt;
1273 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274
Guido van Rossum992d4a32007-07-11 13:09:30 +00001275 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276
Guido van Rossum992d4a32007-07-11 13:09:30 +00001277 elt = ast_for_expr(c, CHILD(n, 0));
1278 if (!elt)
1279 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280
Guido van Rossum992d4a32007-07-11 13:09:30 +00001281 comps = ast_for_comprehension(c, CHILD(n, 1));
1282 if (!comps)
1283 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001284
1285 if (type == COMP_GENEXP)
1286 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1287 else if (type == COMP_LISTCOMP)
1288 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1289 else if (type == COMP_SETCOMP)
1290 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1291 else
1292 /* Should never happen */
1293 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001294}
1295
1296static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001297ast_for_dictcomp(struct compiling *c, const node *n)
1298{
1299 expr_ty key, value;
1300 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301
Guido van Rossum992d4a32007-07-11 13:09:30 +00001302 assert(NCH(n) > 3);
1303 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304
Guido van Rossum992d4a32007-07-11 13:09:30 +00001305 key = ast_for_expr(c, CHILD(n, 0));
1306 if (!key)
1307 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001308 value = ast_for_expr(c, CHILD(n, 2));
1309 if (!value)
1310 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311
Guido van Rossum992d4a32007-07-11 13:09:30 +00001312 comps = ast_for_comprehension(c, CHILD(n, 3));
1313 if (!comps)
1314 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315
Guido van Rossum992d4a32007-07-11 13:09:30 +00001316 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1317}
1318
1319static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001320ast_for_genexp(struct compiling *c, const node *n)
1321{
1322 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001323 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001324}
1325
1326static expr_ty
1327ast_for_listcomp(struct compiling *c, const node *n)
1328{
1329 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001330 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001331}
1332
1333static expr_ty
1334ast_for_setcomp(struct compiling *c, const node *n)
1335{
1336 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001337 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001338}
1339
1340
1341static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342ast_for_atom(struct compiling *c, const node *n)
1343{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001344 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1345 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001346 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 */
1348 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001349 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001352 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001353 /* All names start in Load context, but may later be
1354 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001355 PyObject *name = NEW_IDENTIFIER(ch);
1356 if (!name)
1357 return NULL;
1358 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1359 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001361 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001362 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001363 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001364 PyObject *type, *value, *tback, *errstr;
1365 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001366 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001367 if (errstr) {
1368 char *s = "";
1369 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001370 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001371 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1372 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001373 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001374 } else {
1375 ast_error(n, "(unicode error) unknown error");
1376 }
1377 Py_DECREF(type);
1378 Py_DECREF(value);
1379 Py_XDECREF(tback);
1380 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001381 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001382 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001383 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001384 if (bytesmode)
1385 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1386 else
1387 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388 }
1389 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001390 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001391 if (!pynum)
1392 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001393
Thomas Wouters89f507f2006-12-13 04:49:30 +00001394 PyArena_AddPyObject(c->c_arena, pynum);
1395 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 }
Georg Brandldde00282007-03-18 19:01:53 +00001397 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001398 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001400 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401
Thomas Wouters89f507f2006-12-13 04:49:30 +00001402 if (TYPE(ch) == RPAR)
1403 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404
Thomas Wouters89f507f2006-12-13 04:49:30 +00001405 if (TYPE(ch) == yield_expr)
1406 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001409 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001411
Nick Coghlan650f0d02007-04-15 12:05:43 +00001412 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001414 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 if (TYPE(ch) == RSQB)
1417 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418
Nick Coghlan650f0d02007-04-15 12:05:43 +00001419 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001420 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1421 asdl_seq *elts = seq_for_testlist(c, ch);
1422 if (!elts)
1423 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001424
Thomas Wouters89f507f2006-12-13 04:49:30 +00001425 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1426 }
1427 else
1428 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001430 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1431 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001432 int i, size;
1433 asdl_seq *keys, *values;
1434
1435 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001436 if (TYPE(ch) == RBRACE) {
1437 /* it's an empty dict */
1438 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1439 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1440 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001441 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001442 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001443 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001444 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001445 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001446 for (i = 0; i < NCH(ch); i += 2) {
1447 expr_ty expression;
1448 expression = ast_for_expr(c, CHILD(ch, i));
1449 if (!expression)
1450 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001451 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001452 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001453 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1454 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1455 /* it's a set comprehension */
1456 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001457 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1458 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001459 } else {
1460 /* it's a dict */
1461 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1462 keys = asdl_seq_new(size, c->c_arena);
1463 if (!keys)
1464 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465
Guido van Rossum86e58e22006-08-28 15:27:34 +00001466 values = asdl_seq_new(size, c->c_arena);
1467 if (!values)
1468 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469
Guido van Rossum86e58e22006-08-28 15:27:34 +00001470 for (i = 0; i < NCH(ch); i += 4) {
1471 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472
Guido van Rossum86e58e22006-08-28 15:27:34 +00001473 expression = ast_for_expr(c, CHILD(ch, i));
1474 if (!expression)
1475 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001476
Guido van Rossum86e58e22006-08-28 15:27:34 +00001477 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001478
Guido van Rossum86e58e22006-08-28 15:27:34 +00001479 expression = ast_for_expr(c, CHILD(ch, i + 2));
1480 if (!expression)
1481 return NULL;
1482
1483 asdl_seq_SET(values, i / 4, expression);
1484 }
1485 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1486 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001489 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1490 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 }
1492}
1493
1494static slice_ty
1495ast_for_slice(struct compiling *c, const node *n)
1496{
1497 node *ch;
1498 expr_ty lower = NULL, upper = NULL, step = NULL;
1499
1500 REQ(n, subscript);
1501
1502 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001503 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 sliceop: ':' [test]
1505 */
1506 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 if (NCH(n) == 1 && TYPE(ch) == test) {
1508 /* 'step' variable hold no significance in terms of being used over
1509 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 if (!step)
1512 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513
Thomas Wouters89f507f2006-12-13 04:49:30 +00001514 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 }
1516
1517 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001518 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519 if (!lower)
1520 return NULL;
1521 }
1522
1523 /* If there's an upper bound it's in the second or third position. */
1524 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525 if (NCH(n) > 1) {
1526 node *n2 = CHILD(n, 1);
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 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001535 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536
Thomas Wouters89f507f2006-12-13 04:49:30 +00001537 if (TYPE(n2) == test) {
1538 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539 if (!upper)
1540 return NULL;
1541 }
1542 }
1543
1544 ch = CHILD(n, NCH(n) - 1);
1545 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001546 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001547 ch = CHILD(ch, 1);
1548 if (TYPE(ch) == test) {
1549 step = ast_for_expr(c, ch);
1550 if (!step)
1551 return NULL;
1552 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553 }
1554 }
1555
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001556 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557}
1558
1559static expr_ty
1560ast_for_binop(struct compiling *c, const node *n)
1561{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001564 BinOp(BinOp(A, op, B), op, C).
1565 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 int i, nops;
1568 expr_ty expr1, expr2, result;
1569 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570
Guido van Rossumd8faa362007-04-27 19:54:29 +00001571 expr1 = ast_for_expr(c, CHILD(n, 0));
1572 if (!expr1)
1573 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575 expr2 = ast_for_expr(c, CHILD(n, 2));
1576 if (!expr2)
1577 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579 newoperator = get_operator(CHILD(n, 1));
1580 if (!newoperator)
1581 return NULL;
1582
1583 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1584 c->c_arena);
1585 if (!result)
1586 return NULL;
1587
1588 nops = (NCH(n) - 1) / 2;
1589 for (i = 1; i < nops; i++) {
1590 expr_ty tmp_result, tmp;
1591 const node* next_oper = CHILD(n, i * 2 + 1);
1592
1593 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001594 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595 return NULL;
1596
Guido van Rossumd8faa362007-04-27 19:54:29 +00001597 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1598 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599 return NULL;
1600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001602 LINENO(next_oper), next_oper->n_col_offset,
1603 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 return NULL;
1606 result = tmp_result;
1607 }
1608 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609}
1610
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611static expr_ty
1612ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001615 subscriptlist: subscript (',' subscript)* [',']
1616 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1617 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001618 REQ(n, trailer);
1619 if (TYPE(CHILD(n, 0)) == LPAR) {
1620 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001621 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1622 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001623 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001624 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001626 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001627 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1628 if (!attr_id)
1629 return NULL;
1630 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001631 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001632 }
1633 else {
1634 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001635 REQ(CHILD(n, 2), RSQB);
1636 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001637 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001638 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1639 if (!slc)
1640 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001641 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1642 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001643 }
1644 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001646 by treating the sequence as a tuple literal if there are
1647 no slice features.
1648 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001649 int j;
1650 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001651 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001652 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001653 asdl_seq *slices, *elts;
1654 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001655 if (!slices)
1656 return NULL;
1657 for (j = 0; j < NCH(n); j += 2) {
1658 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001659 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001661 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001662 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001663 asdl_seq_SET(slices, j / 2, slc);
1664 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001665 if (!simple) {
1666 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001667 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001668 }
1669 /* extract Index values and put them in a Tuple */
1670 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001671 if (!elts)
1672 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001673 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1674 slc = (slice_ty)asdl_seq_GET(slices, j);
1675 assert(slc->kind == Index_kind && slc->v.Index.value);
1676 asdl_seq_SET(elts, j, slc->v.Index.value);
1677 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001678 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001679 if (!e)
1680 return NULL;
1681 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001682 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001683 }
1684 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001685}
1686
1687static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001688ast_for_factor(struct compiling *c, const node *n)
1689{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001690 expr_ty expression;
1691
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001692 expression = ast_for_expr(c, CHILD(n, 1));
1693 if (!expression)
1694 return NULL;
1695
1696 switch (TYPE(CHILD(n, 0))) {
1697 case PLUS:
1698 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1699 c->c_arena);
1700 case MINUS:
1701 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1702 c->c_arena);
1703 case TILDE:
1704 return UnaryOp(Invert, expression, LINENO(n),
1705 n->n_col_offset, c->c_arena);
1706 }
1707 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1708 TYPE(CHILD(n, 0)));
1709 return NULL;
1710}
1711
1712static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001713ast_for_power(struct compiling *c, const node *n)
1714{
1715 /* power: atom trailer* ('**' factor)*
1716 */
1717 int i;
1718 expr_ty e, tmp;
1719 REQ(n, power);
1720 e = ast_for_atom(c, CHILD(n, 0));
1721 if (!e)
1722 return NULL;
1723 if (NCH(n) == 1)
1724 return e;
1725 for (i = 1; i < NCH(n); i++) {
1726 node *ch = CHILD(n, i);
1727 if (TYPE(ch) != trailer)
1728 break;
1729 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001730 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001731 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001732 tmp->lineno = e->lineno;
1733 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001734 e = tmp;
1735 }
1736 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1737 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001738 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001739 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001740 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001741 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001742 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001743 e = tmp;
1744 }
1745 return e;
1746}
1747
Guido van Rossum0368b722007-05-11 16:50:42 +00001748static expr_ty
1749ast_for_starred(struct compiling *c, const node *n)
1750{
1751 expr_ty tmp;
1752 REQ(n, star_expr);
1753
1754 tmp = ast_for_expr(c, CHILD(n, 1));
1755 if (!tmp)
1756 return NULL;
1757
1758 /* The Load context is changed later. */
1759 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1760}
1761
1762
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763/* Do not name a variable 'expr'! Will cause a compile error.
1764*/
1765
1766static expr_ty
1767ast_for_expr(struct compiling *c, const node *n)
1768{
1769 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001770 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001771 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 and_test: not_test ('and' not_test)*
1774 not_test: 'not' not_test | comparison
1775 comparison: expr (comp_op expr)*
1776 expr: xor_expr ('|' xor_expr)*
1777 xor_expr: and_expr ('^' and_expr)*
1778 and_expr: shift_expr ('&' shift_expr)*
1779 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1780 arith_expr: term (('+'|'-') term)*
1781 term: factor (('*'|'/'|'%'|'//') factor)*
1782 factor: ('+'|'-'|'~') factor | power
1783 power: atom trailer* ('**' factor)*
1784 */
1785
1786 asdl_seq *seq;
1787 int i;
1788
1789 loop:
1790 switch (TYPE(n)) {
1791 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001792 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001793 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001794 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001796 else if (NCH(n) > 1)
1797 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001798 /* Fallthrough */
1799 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 case and_test:
1801 if (NCH(n) == 1) {
1802 n = CHILD(n, 0);
1803 goto loop;
1804 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001805 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 if (!seq)
1807 return NULL;
1808 for (i = 0; i < NCH(n); i += 2) {
1809 expr_ty e = ast_for_expr(c, CHILD(n, i));
1810 if (!e)
1811 return NULL;
1812 asdl_seq_SET(seq, i / 2, e);
1813 }
1814 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1816 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001817 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001818 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 case not_test:
1820 if (NCH(n) == 1) {
1821 n = CHILD(n, 0);
1822 goto loop;
1823 }
1824 else {
1825 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1826 if (!expression)
1827 return NULL;
1828
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1830 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 }
1832 case comparison:
1833 if (NCH(n) == 1) {
1834 n = CHILD(n, 0);
1835 goto loop;
1836 }
1837 else {
1838 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001839 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001840 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001841 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 if (!ops)
1843 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001844 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 return NULL;
1847 }
1848 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001851 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001852 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001854 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855
1856 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001857 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001859 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001861 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 asdl_seq_SET(cmps, i / 2, expression);
1863 }
1864 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001865 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 return Compare(expression, ops, cmps, LINENO(n),
1870 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 }
1872 break;
1873
Guido van Rossum0368b722007-05-11 16:50:42 +00001874 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 /* The next five cases all handle BinOps. The main body of code
1877 is the same in each case, but the switch turned inside out to
1878 reuse the code for each type of operator.
1879 */
1880 case expr:
1881 case xor_expr:
1882 case and_expr:
1883 case shift_expr:
1884 case arith_expr:
1885 case term:
1886 if (NCH(n) == 1) {
1887 n = CHILD(n, 0);
1888 goto loop;
1889 }
1890 return ast_for_binop(c, n);
1891 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001892 expr_ty exp = NULL;
1893 if (NCH(n) == 2) {
1894 exp = ast_for_testlist(c, CHILD(n, 1));
1895 if (!exp)
1896 return NULL;
1897 }
1898 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1899 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001900 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 if (NCH(n) == 1) {
1902 n = CHILD(n, 0);
1903 goto loop;
1904 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001906 case power:
1907 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001909 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001910 return NULL;
1911 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001912 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 return NULL;
1914}
1915
1916static expr_ty
1917ast_for_call(struct compiling *c, const node *n, expr_ty func)
1918{
1919 /*
1920 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1921 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001922 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923 */
1924
1925 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001926 asdl_seq *args;
1927 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928 expr_ty vararg = NULL, kwarg = NULL;
1929
1930 REQ(n, arglist);
1931
1932 nargs = 0;
1933 nkeywords = 0;
1934 ngens = 0;
1935 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001936 node *ch = CHILD(n, i);
1937 if (TYPE(ch) == argument) {
1938 if (NCH(ch) == 1)
1939 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001940 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001941 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001943 nkeywords++;
1944 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 }
1946 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001947 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001948 "if not sole argument");
1949 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001950 }
1951
1952 if (nargs + nkeywords + ngens > 255) {
1953 ast_error(n, "more than 255 arguments");
1954 return NULL;
1955 }
1956
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001957 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001959 return NULL;
1960 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001962 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 nargs = 0;
1964 nkeywords = 0;
1965 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001966 node *ch = CHILD(n, i);
1967 if (TYPE(ch) == argument) {
1968 expr_ty e;
1969 if (NCH(ch) == 1) {
1970 if (nkeywords) {
1971 ast_error(CHILD(ch, 0),
1972 "non-keyword arg after keyword arg");
1973 return NULL;
1974 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001975 if (vararg) {
1976 ast_error(CHILD(ch, 0),
1977 "only named arguments may follow *expression");
1978 return NULL;
1979 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001980 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001982 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001985 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 else {
1992 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001993 identifier key, tmp;
1994 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001999 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 /* f(lambda x: x[0] = 3) ends up getting parsed with
2001 * LHS test = lambda x: x[0], and RHS test = 3.
2002 * SF bug 132313 points out that complaining about a keyword
2003 * then is very confusing.
2004 */
2005 if (e->kind == Lambda_kind) {
2006 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002007 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 } else if (e->kind != Name_kind) {
2009 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002010 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002011 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 return NULL;
2013 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002015 for (k = 0; k < nkeywords; k++) {
2016 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2017 if (!PyUnicode_Compare(tmp, key)) {
2018 ast_error(CHILD(ch, 0), "keyword argument repeated");
2019 return NULL;
2020 }
2021 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002024 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002025 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002027 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 asdl_seq_SET(keywords, nkeywords++, kw);
2029 }
2030 }
2031 else if (TYPE(ch) == STAR) {
2032 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002033 if (!vararg)
2034 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002035 i++;
2036 }
2037 else if (TYPE(ch) == DOUBLESTAR) {
2038 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002039 if (!kwarg)
2040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 i++;
2042 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 }
2044
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002045 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046}
2047
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002049ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002051 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002052 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002054 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002055 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002056 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002057 }
2058 else {
2059 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002060 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002061 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002063 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064 else {
2065 asdl_seq *tmp = seq_for_testlist(c, n);
2066 if (!tmp)
2067 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002068 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002070}
2071
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072static stmt_ty
2073ast_for_expr_stmt(struct compiling *c, const node *n)
2074{
2075 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002078 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 test: ... here starts the operator precendence dance
2082 */
2083
2084 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 if (!e)
2087 return NULL;
2088
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 }
2091 else if (TYPE(CHILD(n, 1)) == augassign) {
2092 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002093 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002094 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095
Thomas Wouters89f507f2006-12-13 04:49:30 +00002096 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 if (!expr1)
2098 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002099 if(!set_context(c, expr1, Store, ch))
2100 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002101 /* set_context checks that most expressions are not the left side.
2102 Augmented assignments can only have a name, a subscript, or an
2103 attribute on the left, though, so we have to explicitly check for
2104 those. */
2105 switch (expr1->kind) {
2106 case Name_kind:
2107 case Attribute_kind:
2108 case Subscript_kind:
2109 break;
2110 default:
2111 ast_error(ch, "illegal expression for augmented assignment");
2112 return NULL;
2113 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114
Thomas Wouters89f507f2006-12-13 04:49:30 +00002115 ch = CHILD(n, 2);
2116 if (TYPE(ch) == testlist)
2117 expr2 = ast_for_testlist(c, ch);
2118 else
2119 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002120 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121 return NULL;
2122
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002123 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002124 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 return NULL;
2126
Thomas Wouters89f507f2006-12-13 04:49:30 +00002127 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128 }
2129 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002130 int i;
2131 asdl_seq *targets;
2132 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 expr_ty expression;
2134
Thomas Wouters89f507f2006-12-13 04:49:30 +00002135 /* a normal assignment */
2136 REQ(CHILD(n, 1), EQUAL);
2137 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2138 if (!targets)
2139 return NULL;
2140 for (i = 0; i < NCH(n) - 2; i += 2) {
2141 expr_ty e;
2142 node *ch = CHILD(n, i);
2143 if (TYPE(ch) == yield_expr) {
2144 ast_error(ch, "assignment to yield expression not possible");
2145 return NULL;
2146 }
2147 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002149 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002151 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002152 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002153 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154
Thomas Wouters89f507f2006-12-13 04:49:30 +00002155 asdl_seq_SET(targets, i / 2, e);
2156 }
2157 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002158 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002159 expression = ast_for_testlist(c, value);
2160 else
2161 expression = ast_for_expr(c, value);
2162 if (!expression)
2163 return NULL;
2164 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166}
2167
Benjamin Peterson78565b22009-06-28 19:19:51 +00002168
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002170ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171{
2172 asdl_seq *seq;
2173 int i;
2174 expr_ty e;
2175
2176 REQ(n, exprlist);
2177
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002178 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002180 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002182 e = ast_for_expr(c, CHILD(n, i));
2183 if (!e)
2184 return NULL;
2185 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002186 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002187 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 }
2189 return seq;
2190}
2191
2192static stmt_ty
2193ast_for_del_stmt(struct compiling *c, const node *n)
2194{
2195 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197 /* del_stmt: 'del' exprlist */
2198 REQ(n, del_stmt);
2199
2200 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2201 if (!expr_list)
2202 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002203 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204}
2205
2206static stmt_ty
2207ast_for_flow_stmt(struct compiling *c, const node *n)
2208{
2209 /*
2210 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2211 | yield_stmt
2212 break_stmt: 'break'
2213 continue_stmt: 'continue'
2214 return_stmt: 'return' [testlist]
2215 yield_stmt: yield_expr
2216 yield_expr: 'yield' testlist
2217 raise_stmt: 'raise' [test [',' test [',' test]]]
2218 */
2219 node *ch;
2220
2221 REQ(n, flow_stmt);
2222 ch = CHILD(n, 0);
2223 switch (TYPE(ch)) {
2224 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002225 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002227 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002229 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2230 if (!exp)
2231 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002232 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 }
2234 case return_stmt:
2235 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002236 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002238 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 if (!expression)
2240 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002241 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 }
2243 case raise_stmt:
2244 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002245 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2246 else if (NCH(ch) >= 2) {
2247 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2249 if (!expression)
2250 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002251 if (NCH(ch) == 4) {
2252 cause = ast_for_expr(c, CHILD(ch, 3));
2253 if (!cause)
2254 return NULL;
2255 }
2256 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 }
2258 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002259 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 "unexpected flow_stmt: %d", TYPE(ch));
2261 return NULL;
2262 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002263
2264 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2265 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266}
2267
2268static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002269alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270{
2271 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002272 import_as_name: NAME ['as' NAME]
2273 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 dotted_name: NAME ('.' NAME)*
2275 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002276 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002277
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 loop:
2279 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002280 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002281 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002282 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002283 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002284 if (!name)
2285 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002286 if (NCH(n) == 3) {
2287 node *str_node = CHILD(n, 2);
2288 str = NEW_IDENTIFIER(str_node);
2289 if (!str)
2290 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002291 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002292 return NULL;
2293 }
2294 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002295 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002296 return NULL;
2297 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002298 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002299 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300 case dotted_as_name:
2301 if (NCH(n) == 1) {
2302 n = CHILD(n, 0);
2303 goto loop;
2304 }
2305 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002306 node *asname_node = CHILD(n, 2);
2307 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002308 if (!a)
2309 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002311 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002312 if (!a->asname)
2313 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002314 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 return a;
2317 }
2318 break;
2319 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002320 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002321 node *name_node = CHILD(n, 0);
2322 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002323 if (!name)
2324 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002325 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002326 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002327 return alias(name, NULL, c->c_arena);
2328 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 else {
2330 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002331 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002332 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335
2336 len = 0;
2337 for (i = 0; i < NCH(n); i += 2)
2338 /* length of string plus one for the dot */
2339 len += strlen(STR(CHILD(n, i))) + 1;
2340 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002341 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 if (!str)
2343 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002344 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 if (!s)
2346 return NULL;
2347 for (i = 0; i < NCH(n); i += 2) {
2348 char *sch = STR(CHILD(n, i));
2349 strcpy(s, STR(CHILD(n, i)));
2350 s += strlen(sch);
2351 *s++ = '.';
2352 }
2353 --s;
2354 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2356 PyBytes_GET_SIZE(str),
2357 NULL);
2358 Py_DECREF(str);
2359 if (!uni)
2360 return NULL;
2361 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002362 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002363 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002364 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365 }
2366 break;
2367 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002368 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002369 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002370 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002372 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 "unexpected import name: %d", TYPE(n));
2374 return NULL;
2375 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002376
2377 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002378 return NULL;
2379}
2380
2381static stmt_ty
2382ast_for_import_stmt(struct compiling *c, const node *n)
2383{
2384 /*
2385 import_stmt: import_name | import_from
2386 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002387 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2388 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002390 int lineno;
2391 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 int i;
2393 asdl_seq *aliases;
2394
2395 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002396 lineno = LINENO(n);
2397 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002399 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002401 REQ(n, dotted_as_names);
2402 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2403 if (!aliases)
2404 return NULL;
2405 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002406 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002407 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002409 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002413 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 int idx, ndots = 0;
2416 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002417 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002419 /* Count the number of dots (for relative imports) and check for the
2420 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 for (idx = 1; idx < NCH(n); idx++) {
2422 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002423 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2424 if (!mod)
2425 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 idx++;
2427 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002428 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002430 ndots += 3;
2431 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 } else if (TYPE(CHILD(n, idx)) != DOT) {
2433 break;
2434 }
2435 ndots++;
2436 }
2437 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002438 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002439 case STAR:
2440 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 n = CHILD(n, idx);
2442 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002443 break;
2444 case LPAR:
2445 /* from ... import (x, y, z) */
2446 n = CHILD(n, idx + 1);
2447 n_children = NCH(n);
2448 break;
2449 case import_as_names:
2450 /* from ... import x, y, z */
2451 n = CHILD(n, idx);
2452 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002453 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 ast_error(n, "trailing comma not allowed without"
2455 " surrounding parentheses");
2456 return NULL;
2457 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002458 break;
2459 default:
2460 ast_error(n, "Unexpected node-type in from-import");
2461 return NULL;
2462 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2465 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467
2468 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002469 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002470 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002471 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002475 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002477 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002478 if (!import_alias)
2479 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002481 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002483 if (mod != NULL)
2484 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002485 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002486 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 }
Neal Norwitz79792652005-11-14 04:25:03 +00002488 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 "unknown import statement: starts with command '%s'",
2490 STR(CHILD(n, 0)));
2491 return NULL;
2492}
2493
2494static stmt_ty
2495ast_for_global_stmt(struct compiling *c, const node *n)
2496{
2497 /* global_stmt: 'global' NAME (',' NAME)* */
2498 identifier name;
2499 asdl_seq *s;
2500 int i;
2501
2502 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002503 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 name = NEW_IDENTIFIER(CHILD(n, i));
2508 if (!name)
2509 return NULL;
2510 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002512 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513}
2514
2515static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002516ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2517{
2518 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2519 identifier name;
2520 asdl_seq *s;
2521 int i;
2522
2523 REQ(n, nonlocal_stmt);
2524 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2525 if (!s)
2526 return NULL;
2527 for (i = 1; i < NCH(n); i += 2) {
2528 name = NEW_IDENTIFIER(CHILD(n, i));
2529 if (!name)
2530 return NULL;
2531 asdl_seq_SET(s, i / 2, name);
2532 }
2533 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2534}
2535
2536static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537ast_for_assert_stmt(struct compiling *c, const node *n)
2538{
2539 /* assert_stmt: 'assert' test [',' test] */
2540 REQ(n, assert_stmt);
2541 if (NCH(n) == 2) {
2542 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2543 if (!expression)
2544 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 }
2547 else if (NCH(n) == 4) {
2548 expr_ty expr1, expr2;
2549
2550 expr1 = ast_for_expr(c, CHILD(n, 1));
2551 if (!expr1)
2552 return NULL;
2553 expr2 = ast_for_expr(c, CHILD(n, 3));
2554 if (!expr2)
2555 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556
Thomas Wouters89f507f2006-12-13 04:49:30 +00002557 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 }
Neal Norwitz79792652005-11-14 04:25:03 +00002559 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 "improper number of parts to 'assert' statement: %d",
2561 NCH(n));
2562 return NULL;
2563}
2564
2565static asdl_seq *
2566ast_for_suite(struct compiling *c, const node *n)
2567{
2568 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002569 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 stmt_ty s;
2571 int i, total, num, end, pos = 0;
2572 node *ch;
2573
2574 REQ(n, suite);
2575
2576 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002577 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 n = CHILD(n, 0);
2582 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002584 */
2585 end = NCH(n) - 1;
2586 if (TYPE(CHILD(n, end - 1)) == SEMI)
2587 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 for (i = 0; i < end; i += 2) {
2590 ch = CHILD(n, i);
2591 s = ast_for_stmt(c, ch);
2592 if (!s)
2593 return NULL;
2594 asdl_seq_SET(seq, pos++, s);
2595 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 }
2597 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 for (i = 2; i < (NCH(n) - 1); i++) {
2599 ch = CHILD(n, i);
2600 REQ(ch, stmt);
2601 num = num_stmts(ch);
2602 if (num == 1) {
2603 /* small_stmt or compound_stmt with only one child */
2604 s = ast_for_stmt(c, ch);
2605 if (!s)
2606 return NULL;
2607 asdl_seq_SET(seq, pos++, s);
2608 }
2609 else {
2610 int j;
2611 ch = CHILD(ch, 0);
2612 REQ(ch, simple_stmt);
2613 for (j = 0; j < NCH(ch); j += 2) {
2614 /* statement terminates with a semi-colon ';' */
2615 if (NCH(CHILD(ch, j)) == 0) {
2616 assert((j + 1) == NCH(ch));
2617 break;
2618 }
2619 s = ast_for_stmt(c, CHILD(ch, j));
2620 if (!s)
2621 return NULL;
2622 asdl_seq_SET(seq, pos++, s);
2623 }
2624 }
2625 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 }
2627 assert(pos == seq->size);
2628 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629}
2630
2631static stmt_ty
2632ast_for_if_stmt(struct compiling *c, const node *n)
2633{
2634 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2635 ['else' ':' suite]
2636 */
2637 char *s;
2638
2639 REQ(n, if_stmt);
2640
2641 if (NCH(n) == 4) {
2642 expr_ty expression;
2643 asdl_seq *suite_seq;
2644
2645 expression = ast_for_expr(c, CHILD(n, 1));
2646 if (!expression)
2647 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002649 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651
Guido van Rossumd8faa362007-04-27 19:54:29 +00002652 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2653 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002655
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 s = STR(CHILD(n, 4));
2657 /* s[2], the third character in the string, will be
2658 's' for el_s_e, or
2659 'i' for el_i_f
2660 */
2661 if (s[2] == 's') {
2662 expr_ty expression;
2663 asdl_seq *seq1, *seq2;
2664
2665 expression = ast_for_expr(c, CHILD(n, 1));
2666 if (!expression)
2667 return NULL;
2668 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002669 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 return NULL;
2671 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002672 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 return NULL;
2674
Guido van Rossumd8faa362007-04-27 19:54:29 +00002675 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2676 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 }
2678 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002679 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002680 expr_ty expression;
2681 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 asdl_seq *orelse = NULL;
2683 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 /* must reference the child n_elif+1 since 'else' token is third,
2685 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2687 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2688 has_else = 1;
2689 n_elif -= 3;
2690 }
2691 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Thomas Wouters89f507f2006-12-13 04:49:30 +00002693 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002694 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695
Thomas Wouters89f507f2006-12-13 04:49:30 +00002696 orelse = asdl_seq_new(1, c->c_arena);
2697 if (!orelse)
2698 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002700 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002702 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2703 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002705 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2706 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 asdl_seq_SET(orelse, 0,
2710 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002711 LINENO(CHILD(n, NCH(n) - 6)),
2712 CHILD(n, NCH(n) - 6)->n_col_offset,
2713 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002714 /* the just-created orelse handled the last elif */
2715 n_elif--;
2716 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717
Thomas Wouters89f507f2006-12-13 04:49:30 +00002718 for (i = 0; i < n_elif; i++) {
2719 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2721 if (!newobj)
2722 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002724 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002727 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729
Thomas Wouters89f507f2006-12-13 04:49:30 +00002730 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002732 LINENO(CHILD(n, off)),
2733 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002734 orelse = newobj;
2735 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002736 expression = ast_for_expr(c, CHILD(n, 1));
2737 if (!expression)
2738 return NULL;
2739 suite_seq = ast_for_suite(c, CHILD(n, 3));
2740 if (!suite_seq)
2741 return NULL;
2742 return If(expression, suite_seq, orelse,
2743 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002745
2746 PyErr_Format(PyExc_SystemError,
2747 "unexpected token in 'if' statement: %s", s);
2748 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749}
2750
2751static stmt_ty
2752ast_for_while_stmt(struct compiling *c, const node *n)
2753{
2754 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2755 REQ(n, while_stmt);
2756
2757 if (NCH(n) == 4) {
2758 expr_ty expression;
2759 asdl_seq *suite_seq;
2760
2761 expression = ast_for_expr(c, CHILD(n, 1));
2762 if (!expression)
2763 return NULL;
2764 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002765 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002767 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 }
2769 else if (NCH(n) == 7) {
2770 expr_ty expression;
2771 asdl_seq *seq1, *seq2;
2772
2773 expression = ast_for_expr(c, CHILD(n, 1));
2774 if (!expression)
2775 return NULL;
2776 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002777 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778 return NULL;
2779 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002780 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 return NULL;
2782
Thomas Wouters89f507f2006-12-13 04:49:30 +00002783 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785
2786 PyErr_Format(PyExc_SystemError,
2787 "wrong number of tokens for 'while' statement: %d",
2788 NCH(n));
2789 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790}
2791
2792static stmt_ty
2793ast_for_for_stmt(struct compiling *c, const node *n)
2794{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002795 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002797 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002798 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2800 REQ(n, for_stmt);
2801
2802 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002803 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 if (!seq)
2805 return NULL;
2806 }
2807
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002808 node_target = CHILD(n, 1);
2809 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002810 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002812 /* Check the # of children rather than the length of _target, since
2813 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002814 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002815 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002816 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002818 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002820 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002821 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 return NULL;
2823 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002824 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 return NULL;
2826
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002827 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2828 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829}
2830
2831static excepthandler_ty
2832ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2833{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002834 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835 REQ(exc, except_clause);
2836 REQ(body, suite);
2837
2838 if (NCH(exc) == 1) {
2839 asdl_seq *suite_seq = ast_for_suite(c, body);
2840 if (!suite_seq)
2841 return NULL;
2842
Neal Norwitzad74aa82008-03-31 05:14:30 +00002843 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002844 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 }
2846 else if (NCH(exc) == 2) {
2847 expr_ty expression;
2848 asdl_seq *suite_seq;
2849
2850 expression = ast_for_expr(c, CHILD(exc, 1));
2851 if (!expression)
2852 return NULL;
2853 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002854 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 return NULL;
2856
Neal Norwitzad74aa82008-03-31 05:14:30 +00002857 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002858 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 }
2860 else if (NCH(exc) == 4) {
2861 asdl_seq *suite_seq;
2862 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002863 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002864 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002866 if (forbidden_name(e, CHILD(exc, 3), 0))
2867 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002869 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870 return NULL;
2871 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002872 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 return NULL;
2874
Neal Norwitzad74aa82008-03-31 05:14:30 +00002875 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002876 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002878
2879 PyErr_Format(PyExc_SystemError,
2880 "wrong number of children for 'except' clause: %d",
2881 NCH(exc));
2882 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883}
2884
2885static stmt_ty
2886ast_for_try_stmt(struct compiling *c, const node *n)
2887{
Neal Norwitzf599f422005-12-17 21:33:47 +00002888 const int nch = NCH(n);
2889 int n_except = (nch - 3)/3;
2890 asdl_seq *body, *orelse = NULL, *finally = NULL;
2891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 REQ(n, try_stmt);
2893
Neal Norwitzf599f422005-12-17 21:33:47 +00002894 body = ast_for_suite(c, CHILD(n, 2));
2895 if (body == NULL)
2896 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897
Neal Norwitzf599f422005-12-17 21:33:47 +00002898 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2899 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2900 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2901 /* we can assume it's an "else",
2902 because nch >= 9 for try-else-finally and
2903 it would otherwise have a type of except_clause */
2904 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2905 if (orelse == NULL)
2906 return NULL;
2907 n_except--;
2908 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909
Neal Norwitzf599f422005-12-17 21:33:47 +00002910 finally = ast_for_suite(c, CHILD(n, nch - 1));
2911 if (finally == NULL)
2912 return NULL;
2913 n_except--;
2914 }
2915 else {
2916 /* we can assume it's an "else",
2917 otherwise it would have a type of except_clause */
2918 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2919 if (orelse == NULL)
2920 return NULL;
2921 n_except--;
2922 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002924 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002925 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 return NULL;
2927 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928
Neal Norwitzf599f422005-12-17 21:33:47 +00002929 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002930 int i;
2931 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002932 /* process except statements to create a try ... except */
2933 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2934 if (handlers == NULL)
2935 return NULL;
2936
2937 for (i = 0; i < n_except; i++) {
2938 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2939 CHILD(n, 5 + i * 3));
2940 if (!e)
2941 return NULL;
2942 asdl_seq_SET(handlers, i, e);
2943 }
2944
Thomas Wouters89f507f2006-12-13 04:49:30 +00002945 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002946 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002947 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002949
2950 /* if a 'finally' is present too, we nest the TryExcept within a
2951 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002952 body = asdl_seq_new(1, c->c_arena);
2953 if (body == NULL)
2954 return NULL;
2955 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002956 }
2957
2958 /* must be a try ... finally (except clauses are in body, if any exist) */
2959 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002960 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961}
2962
Georg Brandl0c315622009-05-25 21:10:36 +00002963/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002964static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002965ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002966{
2967 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002968
Georg Brandl0c315622009-05-25 21:10:36 +00002969 REQ(n, with_item);
2970 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002971 if (!context_expr)
2972 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002973 if (NCH(n) == 3) {
2974 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002975
2976 if (!optional_vars) {
2977 return NULL;
2978 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002979 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002980 return NULL;
2981 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002982 }
2983
Georg Brandl0c315622009-05-25 21:10:36 +00002984 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002985 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002986}
2987
Georg Brandl0c315622009-05-25 21:10:36 +00002988/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2989static stmt_ty
2990ast_for_with_stmt(struct compiling *c, const node *n)
2991{
2992 int i;
2993 stmt_ty ret;
2994 asdl_seq *inner;
2995
2996 REQ(n, with_stmt);
2997
2998 /* process the with items inside-out */
2999 i = NCH(n) - 1;
3000 /* the suite of the innermost with item is the suite of the with stmt */
3001 inner = ast_for_suite(c, CHILD(n, i));
3002 if (!inner)
3003 return NULL;
3004
3005 for (;;) {
3006 i -= 2;
3007 ret = ast_for_with_item(c, CHILD(n, i), inner);
3008 if (!ret)
3009 return NULL;
3010 /* was this the last item? */
3011 if (i == 1)
3012 break;
3013 /* if not, wrap the result so far in a new sequence */
3014 inner = asdl_seq_new(1, c->c_arena);
3015 if (!inner)
3016 return NULL;
3017 asdl_seq_SET(inner, 0, ret);
3018 }
3019
3020 return ret;
3021}
3022
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003024ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003026 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003027 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003028 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003029 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003030
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 REQ(n, classdef);
3032
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003033 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 s = ast_for_suite(c, CHILD(n, 3));
3035 if (!s)
3036 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003037 classname = NEW_IDENTIFIER(CHILD(n, 1));
3038 if (!classname)
3039 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003040 if (forbidden_name(classname, CHILD(n, 3), 0))
3041 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003042 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3043 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003045
3046 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003047 s = ast_for_suite(c, CHILD(n,5));
3048 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003049 return NULL;
3050 classname = NEW_IDENTIFIER(CHILD(n, 1));
3051 if (!classname)
3052 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003053 if (forbidden_name(classname, CHILD(n, 3), 0))
3054 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003055 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3056 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 }
3058
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003059 /* class NAME '(' arglist ')' ':' suite */
3060 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003061 {
3062 PyObject *dummy_name;
3063 expr_ty dummy;
3064 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3065 if (!dummy_name)
3066 return NULL;
3067 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3068 call = ast_for_call(c, CHILD(n, 3), dummy);
3069 if (!call)
3070 return NULL;
3071 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003073 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003075 classname = NEW_IDENTIFIER(CHILD(n, 1));
3076 if (!classname)
3077 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003078 if (forbidden_name(classname, CHILD(n, 1), 0))
3079 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003080
Benjamin Peterson30760062008-11-25 04:02:28 +00003081 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003082 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003083 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084}
3085
3086static stmt_ty
3087ast_for_stmt(struct compiling *c, const node *n)
3088{
3089 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003090 assert(NCH(n) == 1);
3091 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 }
3093 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003094 assert(num_stmts(n) == 1);
3095 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 }
3097 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003098 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003099 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3100 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003101 */
3102 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003103 case expr_stmt:
3104 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 case del_stmt:
3106 return ast_for_del_stmt(c, n);
3107 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003108 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 case flow_stmt:
3110 return ast_for_flow_stmt(c, n);
3111 case import_stmt:
3112 return ast_for_import_stmt(c, n);
3113 case global_stmt:
3114 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003115 case nonlocal_stmt:
3116 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 case assert_stmt:
3118 return ast_for_assert_stmt(c, n);
3119 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003120 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3122 TYPE(n), NCH(n));
3123 return NULL;
3124 }
3125 }
3126 else {
3127 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003128 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003129 */
3130 node *ch = CHILD(n, 0);
3131 REQ(n, compound_stmt);
3132 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133 case if_stmt:
3134 return ast_for_if_stmt(c, ch);
3135 case while_stmt:
3136 return ast_for_while_stmt(c, ch);
3137 case for_stmt:
3138 return ast_for_for_stmt(c, ch);
3139 case try_stmt:
3140 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003141 case with_stmt:
3142 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003143 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003144 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003146 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 case decorated:
3148 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003150 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3152 TYPE(n), NCH(n));
3153 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003154 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155 }
3156}
3157
3158static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003159parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 const char *end;
3162 long x;
3163 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003164 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003167 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003168 errno = 0;
3169 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 if (s[0] == '0') {
3172 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3173 if (x < 0 && errno == 0) {
3174 return PyLong_FromString((char *)s,
3175 (char **)0,
3176 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003177 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 }
3179 else
3180 x = PyOS_strtol((char *)s, (char **)&end, 0);
3181 if (*end == '\0') {
3182 if (errno != 0)
3183 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003184 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 }
3186 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003188 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003189 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3190 if (compl.imag == -1.0 && PyErr_Occurred())
3191 return NULL;
3192 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 }
3194 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003195 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003196 dx = PyOS_string_to_double(s, NULL, NULL);
3197 if (dx == -1.0 && PyErr_Occurred())
3198 return NULL;
3199 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003200 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201}
3202
3203static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003204decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003206 PyObject *u, *v;
3207 char *s, *t;
3208 t = s = (char *)*sPtr;
3209 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3210 while (s < end && (*s & 0x80)) s++;
3211 *sPtr = s;
3212 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3213 if (u == NULL)
3214 return NULL;
3215 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3216 Py_DECREF(u);
3217 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218}
3219
3220static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003221decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 PyObject *v, *u;
3224 char *buf;
3225 char *p;
3226 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003227
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228 if (encoding == NULL) {
3229 buf = (char *)s;
3230 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003231 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003232 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003233 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003234 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003235 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3236 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3237 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 if (u == NULL)
3239 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003240 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003241 end = s + len;
3242 while (s < end) {
3243 if (*s == '\\') {
3244 *p++ = *s++;
3245 if (*s & 0x80) {
3246 strcpy(p, "u005c");
3247 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003248 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003249 }
3250 if (*s & 0x80) { /* XXX inefficient */
3251 PyObject *w;
3252 char *r;
3253 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003254 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003255 if (w == NULL) {
3256 Py_DECREF(u);
3257 return NULL;
3258 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003259 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003260 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003261 assert(rn % 4 == 0);
3262 for (i = 0; i < rn; i += 4) {
3263 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003264 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003265 r[i + 1] & 0xFF,
3266 r[i + 2] & 0xFF,
3267 r[i + 3] & 0xFF);
3268 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003270 /* Should be impossible to overflow */
3271 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003272 Py_DECREF(w);
3273 } else {
3274 *p++ = *s++;
3275 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003276 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003277 len = p - buf;
3278 s = buf;
3279 }
3280 if (rawmode)
3281 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3282 else
3283 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3284 Py_XDECREF(u);
3285 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286}
3287
3288/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003289 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 * parsestr parses it, and returns the decoded Python string object.
3291 */
3292static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003293parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003295 size_t len;
3296 const char *s = STR(n);
3297 int quote = Py_CHARMASK(*s);
3298 int rawmode = 0;
3299 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003300 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003301 if (quote == 'b' || quote == 'B') {
3302 quote = *++s;
3303 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003305 if (quote == 'r' || quote == 'R') {
3306 quote = *++s;
3307 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003308 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003309 }
3310 if (quote != '\'' && quote != '\"') {
3311 PyErr_BadInternalCall();
3312 return NULL;
3313 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003314 s++;
3315 len = strlen(s);
3316 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003318 "string to parse is too long");
3319 return NULL;
3320 }
3321 if (s[--len] != quote) {
3322 PyErr_BadInternalCall();
3323 return NULL;
3324 }
3325 if (len >= 4 && s[0] == quote && s[1] == quote) {
3326 s += 2;
3327 len -= 2;
3328 if (s[--len] != quote || s[--len] != quote) {
3329 PyErr_BadInternalCall();
3330 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003331 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003332 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003333 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003334 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003335 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003336 if (*bytesmode) {
3337 /* Disallow non-ascii characters (but not escapes) */
3338 const char *c;
3339 for (c = s; *c; c++) {
3340 if (Py_CHARMASK(*c) >= 0x80) {
3341 ast_error(n, "bytes can only contain ASCII "
3342 "literal characters.");
3343 return NULL;
3344 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003345 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003346 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003347 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003348 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003349 if (rawmode || strchr(s, '\\') == NULL) {
3350 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003351 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003352 if (u == NULL || !*bytesmode)
3353 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003354 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003355 Py_DECREF(u);
3356 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003357 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003358 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003359 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003360 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003362 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003363 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003364 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003365 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003366 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367}
3368
Guido van Rossum29fd7122007-11-12 01:13:56 +00003369/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 * compile-time literal catenation, calling parsestr() on each piece, and
3371 * pasting the intermediate results together.
3372 */
3373static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003374parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003376 PyObject *v;
3377 int i;
3378 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003379 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003380 if (v != NULL) {
3381 /* String literal concatenation */
3382 for (i = 1; i < NCH(n); i++) {
3383 PyObject *s;
3384 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003385 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003386 if (s == NULL)
3387 goto onError;
3388 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003389 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003390 goto onError;
3391 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003392 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3393 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003394 if (v == NULL)
3395 goto onError;
3396 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003397 else {
3398 PyObject *temp = PyUnicode_Concat(v, s);
3399 Py_DECREF(s);
3400 Py_DECREF(v);
3401 v = temp;
3402 if (v == NULL)
3403 goto onError;
3404 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003405 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003406 }
3407 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408
Guido van Rossumd8faa362007-04-27 19:54:29 +00003409 onError:
3410 Py_XDECREF(v);
3411 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003412}