blob: 38643f6a3bd0d2f6831c8ea8649e6cb6233a11bd [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 if (*u >= 128) {
62 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
63 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
Martin v. Löwis47383402007-08-15 07:32:56 +000074 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000093 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000094 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000104 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
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 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000133 tmp = Py_BuildValue("(zlOO)", filename, lineno, offset, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000134 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000135 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000136 Py_DECREF(errstr);
137 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000138 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000139 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140 Py_DECREF(errstr);
141 Py_DECREF(tmp);
142 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000143 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000144 PyErr_Restore(type, value, tback);
145}
146
147/* num_stmts() returns number of contained statements.
148
149 Use this routine to determine how big a sequence is needed for
150 the statements in a parse tree. Its raison d'etre is this bit of
151 grammar:
152
153 stmt: simple_stmt | compound_stmt
154 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
155
156 A simple_stmt can contain multiple small_stmt elements joined
157 by semicolons. If the arg is a simple_stmt, the number of
158 small_stmt elements is returned.
159*/
160
161static int
162num_stmts(const node *n)
163{
164 int i, l;
165 node *ch;
166
167 switch (TYPE(n)) {
168 case single_input:
169 if (TYPE(CHILD(n, 0)) == NEWLINE)
170 return 0;
171 else
172 return num_stmts(CHILD(n, 0));
173 case file_input:
174 l = 0;
175 for (i = 0; i < NCH(n); i++) {
176 ch = CHILD(n, i);
177 if (TYPE(ch) == stmt)
178 l += num_stmts(ch);
179 }
180 return l;
181 case stmt:
182 return num_stmts(CHILD(n, 0));
183 case compound_stmt:
184 return 1;
185 case simple_stmt:
186 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
187 case suite:
188 if (NCH(n) == 1)
189 return num_stmts(CHILD(n, 0));
190 else {
191 l = 0;
192 for (i = 2; i < (NCH(n) - 1); i++)
193 l += num_stmts(CHILD(n, i));
194 return l;
195 }
196 default: {
197 char buf[128];
198
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000199 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200 TYPE(n), NCH(n));
201 Py_FatalError(buf);
202 }
203 }
204 assert(0);
205 return 0;
206}
207
208/* Transform the CST rooted at node * to the appropriate AST
209*/
210
211mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000212PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
213 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000214{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000215 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216 asdl_seq *stmts = NULL;
217 stmt_ty s;
218 node *ch;
219 struct compiling c;
220
221 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000222 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000223 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000224#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000225 ast_error(n, "encoding declaration in Unicode string");
226 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000227#endif
228 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000229 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230 } else if (TYPE(n) == encoding_decl) {
231 c.c_encoding = STR(n);
232 n = CHILD(n, 0);
233 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000235 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000237 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000238 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239
Jeremy Hyltona8293132006-02-28 17:58:27 +0000240 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 switch (TYPE(n)) {
242 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000243 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000245 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246 for (i = 0; i < NCH(n) - 1; i++) {
247 ch = CHILD(n, i);
248 if (TYPE(ch) == NEWLINE)
249 continue;
250 REQ(ch, stmt);
251 num = num_stmts(ch);
252 if (num == 1) {
253 s = ast_for_stmt(&c, ch);
254 if (!s)
255 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000256 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000257 }
258 else {
259 ch = CHILD(ch, 0);
260 REQ(ch, simple_stmt);
261 for (j = 0; j < num; j++) {
262 s = ast_for_stmt(&c, CHILD(ch, j * 2));
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 }
268 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000269 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 case eval_input: {
271 expr_ty testlist_ast;
272
Nick Coghlan650f0d02007-04-15 12:05:43 +0000273 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000274 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 if (!testlist_ast)
276 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000277 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000278 }
279 case single_input:
280 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000281 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000282 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000283 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000284 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
285 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000286 if (!asdl_seq_GET(stmts, 0))
287 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 }
290 else {
291 n = CHILD(n, 0);
292 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000293 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000295 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000296 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000297 s = ast_for_stmt(&c, n);
298 if (!s)
299 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000300 asdl_seq_SET(stmts, 0, s);
301 }
302 else {
303 /* Only a simple_stmt can contain multiple statements. */
304 REQ(n, simple_stmt);
305 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000306 if (TYPE(CHILD(n, i)) == NEWLINE)
307 break;
308 s = ast_for_stmt(&c, CHILD(n, i));
309 if (!s)
310 goto error;
311 asdl_seq_SET(stmts, i / 2, s);
312 }
313 }
314
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000315 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000316 }
317 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000318 PyErr_Format(PyExc_SystemError,
319 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320 goto error;
321 }
322 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323 ast_error_finish(filename);
324 return NULL;
325}
326
327/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
328*/
329
330static operator_ty
331get_operator(const node *n)
332{
333 switch (TYPE(n)) {
334 case VBAR:
335 return BitOr;
336 case CIRCUMFLEX:
337 return BitXor;
338 case AMPER:
339 return BitAnd;
340 case LEFTSHIFT:
341 return LShift;
342 case RIGHTSHIFT:
343 return RShift;
344 case PLUS:
345 return Add;
346 case MINUS:
347 return Sub;
348 case STAR:
349 return Mult;
350 case SLASH:
351 return Div;
352 case DOUBLESLASH:
353 return FloorDiv;
354 case PERCENT:
355 return Mod;
356 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000357 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000358 }
359}
360
Guido van Rossume7ba4952007-06-06 23:52:48 +0000361static const char* FORBIDDEN[] = {
362 "None",
363 "True",
364 "False",
365 NULL,
366};
367
368static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000369forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000370{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000371 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000372 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
373 ast_error(n, "assignment to keyword");
374 return 1;
375 }
376 if (full_checks) {
377 const char **p;
378 for (p = FORBIDDEN; *p; p++) {
379 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
380 ast_error(n, "assignment to keyword");
381 return 1;
382 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000383 }
384 }
385 return 0;
386}
387
Jeremy Hyltona8293132006-02-28 17:58:27 +0000388/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389
390 Only sets context for expr kinds that "can appear in assignment context"
391 (according to ../Parser/Python.asdl). For other expr kinds, it sets
392 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393*/
394
395static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000396set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397{
398 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 /* If a particular expression type can't be used for assign / delete,
400 set expr_name to its name and an error message will be generated.
401 */
402 const char* expr_name = NULL;
403
404 /* The ast defines augmented store and load contexts, but the
405 implementation here doesn't actually use them. The code may be
406 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000409 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 */
411 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412
413 switch (e->kind) {
414 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000416 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
417 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000419 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000420 e->v.Subscript.ctx = ctx;
421 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000422 case Starred_kind:
423 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000424 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000425 return 0;
426 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000428 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000429 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000430 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000431 }
432 e->v.Name.ctx = ctx;
433 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000435 e->v.List.ctx = ctx;
436 s = e->v.List.elts;
437 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000438 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000439 if (asdl_seq_LEN(e->v.Tuple.elts)) {
440 e->v.Tuple.ctx = ctx;
441 s = e->v.Tuple.elts;
442 }
443 else {
444 expr_name = "()";
445 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000446 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000447 case Lambda_kind:
448 expr_name = "lambda";
449 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000450 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000451 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000452 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000453 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000454 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000455 case UnaryOp_kind:
456 expr_name = "operator";
457 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000458 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 expr_name = "generator expression";
460 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000461 case Yield_kind:
462 expr_name = "yield expression";
463 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000464 case ListComp_kind:
465 expr_name = "list comprehension";
466 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000467 case SetComp_kind:
468 expr_name = "set comprehension";
469 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000470 case DictComp_kind:
471 expr_name = "dict comprehension";
472 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000474 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 case Num_kind:
476 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000477 expr_name = "literal";
478 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000479 case Ellipsis_kind:
480 expr_name = "Ellipsis";
481 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000482 case Compare_kind:
483 expr_name = "comparison";
484 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000485 case IfExp_kind:
486 expr_name = "conditional expression";
487 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000488 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 PyErr_Format(PyExc_SystemError,
490 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000491 e->kind, e->lineno);
492 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000494 /* Check for error string set by switch */
495 if (expr_name) {
496 char buf[300];
497 PyOS_snprintf(buf, sizeof(buf),
498 "can't %s %s",
499 ctx == Store ? "assign to" : "delete",
500 expr_name);
501 return ast_error(n, buf);
502 }
503
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506 */
507 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000508 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509
Thomas Wouters89f507f2006-12-13 04:49:30 +0000510 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000511 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000512 return 0;
513 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514 }
515 return 1;
516}
517
518static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000519ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520{
521 REQ(n, augassign);
522 n = CHILD(n, 0);
523 switch (STR(n)[0]) {
524 case '+':
525 return Add;
526 case '-':
527 return Sub;
528 case '/':
529 if (STR(n)[1] == '/')
530 return FloorDiv;
531 else
532 return Div;
533 case '%':
534 return Mod;
535 case '<':
536 return LShift;
537 case '>':
538 return RShift;
539 case '&':
540 return BitAnd;
541 case '^':
542 return BitXor;
543 case '|':
544 return BitOr;
545 case '*':
546 if (STR(n)[1] == '*')
547 return Pow;
548 else
549 return Mult;
550 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000551 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000552 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553 }
554}
555
556static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000557ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000559 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560 |'is' 'not'
561 */
562 REQ(n, comp_op);
563 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000564 n = CHILD(n, 0);
565 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 case LESS:
567 return Lt;
568 case GREATER:
569 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000570 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 return Eq;
572 case LESSEQUAL:
573 return LtE;
574 case GREATEREQUAL:
575 return GtE;
576 case NOTEQUAL:
577 return NotEq;
578 case NAME:
579 if (strcmp(STR(n), "in") == 0)
580 return In;
581 if (strcmp(STR(n), "is") == 0)
582 return Is;
583 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000584 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000587 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588 }
589 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000590 /* handle "not in" and "is not" */
591 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592 case NAME:
593 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
594 return NotIn;
595 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
596 return IsNot;
597 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000598 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000600 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602 }
Neal Norwitz79792652005-11-14 04:25:03 +0000603 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000605 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606}
607
608static asdl_seq *
609seq_for_testlist(struct compiling *c, const node *n)
610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +0000612 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
613 */
Armin Rigo31441302005-10-21 12:57:31 +0000614 asdl_seq *seq;
615 expr_ty expression;
616 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000617 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000619 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 if (!seq)
621 return NULL;
622
623 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +0000625 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000626
Benjamin Peterson4905e802009-09-27 02:43:28 +0000627 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000628 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000630
631 assert(i / 2 < seq->size);
632 asdl_seq_SET(seq, i / 2, expression);
633 }
634 return seq;
635}
636
Neal Norwitzc1505362006-12-28 06:47:50 +0000637static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000638compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000639{
640 identifier name;
641 expr_ty annotation = NULL;
642 node *ch;
643
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000644 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000645 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000646 name = NEW_IDENTIFIER(ch);
647 if (!name)
648 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000649 if (forbidden_name(name, ch, 0))
650 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000651
652 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
653 annotation = ast_for_expr(c, CHILD(n, 2));
654 if (!annotation)
655 return NULL;
656 }
657
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000658 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000659#if 0
660 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
661 if (!set_context(c, result, Store, n))
662 return NULL;
663 return result;
664#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665}
666
Guido van Rossum4f72a782006-10-27 23:31:49 +0000667/* returns -1 if failed to handle keyword only arguments
668 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000669 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000670 ^^^
671 start pointing here
672 */
673static int
674handle_keywordonly_args(struct compiling *c, const node *n, int start,
675 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
676{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000677 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000678 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000679 expr_ty expression, annotation;
680 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000681 int i = start;
682 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000683
684 if (kwonlyargs == NULL) {
685 ast_error(CHILD(n, start), "named arguments must follow bare *");
686 return -1;
687 }
688 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 while (i < NCH(n)) {
690 ch = CHILD(n, i);
691 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000692 case vfpdef:
693 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000694 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000695 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000696 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000697 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000698 asdl_seq_SET(kwdefaults, j, expression);
699 i += 2; /* '=' and test */
700 }
701 else { /* setting NULL if no default value exists */
702 asdl_seq_SET(kwdefaults, j, NULL);
703 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 if (NCH(ch) == 3) {
705 /* ch is NAME ':' test */
706 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000707 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000708 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000709 }
710 else {
711 annotation = NULL;
712 }
713 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000714 argname = NEW_IDENTIFIER(ch);
715 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000716 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000717 if (forbidden_name(argname, ch, 0))
718 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000719 arg = arg(argname, annotation, c->c_arena);
720 if (!arg)
721 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000722 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000723 i += 2; /* the name and the comma */
724 break;
725 case DOUBLESTAR:
726 return i;
727 default:
728 ast_error(ch, "unexpected node");
729 goto error;
730 }
731 }
732 return i;
733 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736
Jeremy Hyltona8293132006-02-28 17:58:27 +0000737/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738
739static arguments_ty
740ast_for_arguments(struct compiling *c, const node *n)
741{
Neal Norwitzc1505362006-12-28 06:47:50 +0000742 /* This function handles both typedargslist (function definition)
743 and varargslist (lambda definition).
744
745 parameters: '(' [typedargslist] ')'
746 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000748 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000750 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000751 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000753 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000754 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000755 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000757 int i, j, k, nposargs = 0, nkwonlyargs = 0;
758 int nposdefaults = 0, found_default = 0;
759 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000761 arg_ty arg;
762 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000763 node *ch;
764
765 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000767 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
768 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000771 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772
Jeremy Hyltone921e022008-07-17 16:37:17 +0000773 /* First count the number of positional args & defaults. The
774 variable i is the loop index for this for loop and the next.
775 The next loop picks up where the first leaves off.
776 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 ch = CHILD(n, i);
779 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000780 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000781 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000782 if (i < NCH(n) && /* skip argument following star */
783 (TYPE(CHILD(n, i)) == tfpdef ||
784 TYPE(CHILD(n, i)) == vfpdef)) {
785 i++;
786 }
787 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000789 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000790 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 defaults for keyword only args */
795 for ( ; i < NCH(n); ++i) {
796 ch = CHILD(n, i);
797 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000798 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000799 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000800 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
801 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000802 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 kwonlyargs = (nkwonlyargs ?
804 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
805 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000806 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000808 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
809 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000810 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000812 since we set NULL as default for keyword only argument w/o default
813 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000814 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000815 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
816 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000817 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000818
819 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000820 ast_error(n, "more than 255 arguments");
821 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000824 /* tfpdef: NAME [':' test]
825 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000826 */
827 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000828 j = 0; /* index for defaults */
829 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000831 ch = CHILD(n, i);
832 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000833 case tfpdef:
834 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
836 anything other than EQUAL or a comma? */
837 /* XXX Should NCH(n) check be made a separate check? */
838 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000839 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
840 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000841 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000842 assert(posdefaults != NULL);
843 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000845 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000847 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000849 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000850 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000851 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000852 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000853 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000854 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000855 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 i += 2; /* the name and the comma */
857 break;
858 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000861 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000862 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000863 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000864 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000865 if (TYPE(ch) == COMMA) {
866 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000867 i += 2; /* now follows keyword only arguments */
868 res = handle_keywordonly_args(c, n, i,
869 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000870 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000871 i = res; /* res has new position to process */
872 }
873 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000874 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000875 if (!vararg)
876 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000877 if (forbidden_name(vararg, CHILD(ch, 0), 0))
878 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000879 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000880 /* there is an annotation on the vararg */
881 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000882 if (!varargannotation)
883 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000884 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000885 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000886 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
887 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000888 int res = 0;
889 res = handle_keywordonly_args(c, n, i,
890 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000891 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000892 i = res; /* res has new position to process */
893 }
894 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895 break;
896 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000897 ch = CHILD(n, i+1); /* tfpdef */
898 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000899 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000900 if (!kwarg)
901 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000902 if (NCH(ch) > 1) {
903 /* there is an annotation on the kwarg */
904 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000905 if (!kwargannotation)
906 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000907 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000908 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000909 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 i += 3;
911 break;
912 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000913 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 "unexpected node in varargslist: %d @ %d",
915 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000916 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000917 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000919 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
920 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921}
922
923static expr_ty
924ast_for_dotted_name(struct compiling *c, const node *n)
925{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000926 expr_ty e;
927 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000928 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929 int i;
930
931 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000932
933 lineno = LINENO(n);
934 col_offset = n->n_col_offset;
935
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 id = NEW_IDENTIFIER(CHILD(n, 0));
937 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000938 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000939 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000941 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942
943 for (i = 2; i < NCH(n); i+=2) {
944 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 if (!id)
946 return NULL;
947 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
948 if (!e)
949 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 }
951
952 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953}
954
955static expr_ty
956ast_for_decorator(struct compiling *c, const node *n)
957{
958 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
959 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000960 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000963 REQ(CHILD(n, 0), AT);
964 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
967 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000968 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000971 d = name_expr;
972 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 }
974 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000975 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000976 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000977 if (!d)
978 return NULL;
979 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 }
981 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000982 d = ast_for_call(c, CHILD(n, 3), name_expr);
983 if (!d)
984 return NULL;
985 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000986 }
987
988 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989}
990
991static asdl_seq*
992ast_for_decorators(struct compiling *c, const node *n)
993{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000994 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000995 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000999 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 if (!decorator_seq)
1001 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001004 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001005 if (!d)
1006 return NULL;
1007 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 }
1009 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010}
1011
1012static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001013ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001015 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001016 identifier name;
1017 arguments_ty args;
1018 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001019 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001020 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021
1022 REQ(n, funcdef);
1023
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024 name = NEW_IDENTIFIER(CHILD(n, name_i));
1025 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001026 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001027 if (forbidden_name(name, CHILD(n, name_i), 0))
1028 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1030 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001031 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001032 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1033 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1034 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001035 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001036 name_i += 2;
1037 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 body = ast_for_suite(c, CHILD(n, name_i + 3));
1039 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001040 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041
Neal Norwitzc1505362006-12-28 06:47:50 +00001042 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001043 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044}
1045
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001046static stmt_ty
1047ast_for_decorated(struct compiling *c, const node *n)
1048{
1049 /* decorated: decorators (classdef | funcdef) */
1050 stmt_ty thing = NULL;
1051 asdl_seq *decorator_seq = NULL;
1052
1053 REQ(n, decorated);
1054
1055 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1056 if (!decorator_seq)
1057 return NULL;
1058
1059 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001061
1062 if (TYPE(CHILD(n, 1)) == funcdef) {
1063 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1064 } else if (TYPE(CHILD(n, 1)) == classdef) {
1065 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1066 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001067 /* we count the decorators in when talking about the class' or
1068 * function's line number */
1069 if (thing) {
1070 thing->lineno = LINENO(n);
1071 thing->col_offset = n->n_col_offset;
1072 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001073 return thing;
1074}
1075
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076static expr_ty
1077ast_for_lambdef(struct compiling *c, const node *n)
1078{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001079 /* lambdef: 'lambda' [varargslist] ':' test
1080 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 arguments_ty args;
1082 expr_ty expression;
1083
1084 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001085 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1086 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 if (!args)
1088 return NULL;
1089 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001090 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 }
1093 else {
1094 args = ast_for_arguments(c, CHILD(n, 1));
1095 if (!args)
1096 return NULL;
1097 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001098 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100 }
1101
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001102 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103}
1104
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001105static expr_ty
1106ast_for_ifexpr(struct compiling *c, const node *n)
1107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001109 expr_ty expression, body, orelse;
1110
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001111 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001112 body = ast_for_expr(c, CHILD(n, 0));
1113 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001114 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001115 expression = ast_for_expr(c, CHILD(n, 2));
1116 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001117 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001118 orelse = ast_for_expr(c, CHILD(n, 4));
1119 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001120 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001121 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1122 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001123}
1124
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001126 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127
Nick Coghlan650f0d02007-04-15 12:05:43 +00001128 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129*/
1130
1131static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001132count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001134 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135
Guido van Rossumd8faa362007-04-27 19:54:29 +00001136 count_comp_for:
1137 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001138 REQ(n, comp_for);
1139 if (NCH(n) == 5)
1140 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001141 else
1142 return n_fors;
1143 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001144 REQ(n, comp_iter);
1145 n = CHILD(n, 0);
1146 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001147 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001148 else if (TYPE(n) == comp_if) {
1149 if (NCH(n) == 3) {
1150 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001151 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001152 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001153 else
1154 return n_fors;
1155 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001156
Guido van Rossumd8faa362007-04-27 19:54:29 +00001157 /* Should never be reached */
1158 PyErr_SetString(PyExc_SystemError,
1159 "logic error in count_comp_fors");
1160 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161}
1162
Nick Coghlan650f0d02007-04-15 12:05:43 +00001163/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164
Nick Coghlan650f0d02007-04-15 12:05:43 +00001165 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166*/
1167
1168static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001169count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001171 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172
Guido van Rossumd8faa362007-04-27 19:54:29 +00001173 while (1) {
1174 REQ(n, comp_iter);
1175 if (TYPE(CHILD(n, 0)) == comp_for)
1176 return n_ifs;
1177 n = CHILD(n, 0);
1178 REQ(n, comp_if);
1179 n_ifs++;
1180 if (NCH(n) == 2)
1181 return n_ifs;
1182 n = CHILD(n, 2);
1183 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184}
1185
Guido van Rossum992d4a32007-07-11 13:09:30 +00001186static asdl_seq *
1187ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001188{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001190 asdl_seq *comps;
1191
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001192 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 if (n_fors == -1)
1194 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001195
Nick Coghlan650f0d02007-04-15 12:05:43 +00001196 comps = asdl_seq_new(n_fors, c->c_arena);
1197 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001199
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001201 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001203 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001204 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205
Guido van Rossum992d4a32007-07-11 13:09:30 +00001206 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207
Guido van Rossum992d4a32007-07-11 13:09:30 +00001208 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001209 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001212 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001213 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001215
Thomas Wouters89f507f2006-12-13 04:49:30 +00001216 /* Check the # of children rather than the length of t, since
1217 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001218 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001219 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001220 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001222 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1223 c->c_arena),
1224 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001225 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001227
Guido van Rossum992d4a32007-07-11 13:09:30 +00001228 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 int j, n_ifs;
1230 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231
Guido van Rossum992d4a32007-07-11 13:09:30 +00001232 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001233 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001234 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001236
1237 ifs = asdl_seq_new(n_ifs, c->c_arena);
1238 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001240
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001242 REQ(n, comp_iter);
1243 n = CHILD(n, 0);
1244 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245
Guido van Rossum992d4a32007-07-11 13:09:30 +00001246 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001247 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001248 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001249 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001250 if (NCH(n) == 3)
1251 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001253 /* on exit, must guarantee that n is a comp_for */
1254 if (TYPE(n) == comp_iter)
1255 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001256 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001258 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001260 return comps;
1261}
1262
1263static expr_ty
1264ast_for_itercomp(struct compiling *c, const node *n, int type)
1265{
1266 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1267 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1268 expr_ty elt;
1269 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270
Guido van Rossum992d4a32007-07-11 13:09:30 +00001271 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272
Guido van Rossum992d4a32007-07-11 13:09:30 +00001273 elt = ast_for_expr(c, CHILD(n, 0));
1274 if (!elt)
1275 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276
Guido van Rossum992d4a32007-07-11 13:09:30 +00001277 comps = ast_for_comprehension(c, CHILD(n, 1));
1278 if (!comps)
1279 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001280
1281 if (type == COMP_GENEXP)
1282 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1283 else if (type == COMP_LISTCOMP)
1284 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1285 else if (type == COMP_SETCOMP)
1286 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1287 else
1288 /* Should never happen */
1289 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290}
1291
1292static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001293ast_for_dictcomp(struct compiling *c, const node *n)
1294{
1295 expr_ty key, value;
1296 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297
Guido van Rossum992d4a32007-07-11 13:09:30 +00001298 assert(NCH(n) > 3);
1299 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300
Guido van Rossum992d4a32007-07-11 13:09:30 +00001301 key = ast_for_expr(c, CHILD(n, 0));
1302 if (!key)
1303 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001304 value = ast_for_expr(c, CHILD(n, 2));
1305 if (!value)
1306 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307
Guido van Rossum992d4a32007-07-11 13:09:30 +00001308 comps = ast_for_comprehension(c, CHILD(n, 3));
1309 if (!comps)
1310 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311
Guido van Rossum992d4a32007-07-11 13:09:30 +00001312 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1313}
1314
1315static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001316ast_for_genexp(struct compiling *c, const node *n)
1317{
1318 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001319 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001320}
1321
1322static expr_ty
1323ast_for_listcomp(struct compiling *c, const node *n)
1324{
1325 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001326 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001327}
1328
1329static expr_ty
1330ast_for_setcomp(struct compiling *c, const node *n)
1331{
1332 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001333 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001334}
1335
1336
1337static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338ast_for_atom(struct compiling *c, const node *n)
1339{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001340 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1341 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001342 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 */
1344 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001345 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001348 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001349 /* All names start in Load context, but may later be
1350 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001351 PyObject *name = NEW_IDENTIFIER(ch);
1352 if (!name)
1353 return NULL;
1354 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1355 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001357 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001358 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001359 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001360 PyObject *type, *value, *tback, *errstr;
1361 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001362 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001363 if (errstr) {
1364 char *s = "";
1365 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001366 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001367 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1368 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001369 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001370 } else {
1371 ast_error(n, "(unicode error) unknown error");
1372 }
1373 Py_DECREF(type);
1374 Py_DECREF(value);
1375 Py_XDECREF(tback);
1376 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001377 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001378 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001379 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001380 if (bytesmode)
1381 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1382 else
1383 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384 }
1385 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001386 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 if (!pynum)
1388 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001389
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 PyArena_AddPyObject(c->c_arena, pynum);
1391 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392 }
Georg Brandldde00282007-03-18 19:01:53 +00001393 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001394 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397
Thomas Wouters89f507f2006-12-13 04:49:30 +00001398 if (TYPE(ch) == RPAR)
1399 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400
Thomas Wouters89f507f2006-12-13 04:49:30 +00001401 if (TYPE(ch) == yield_expr)
1402 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001405 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001407
Nick Coghlan650f0d02007-04-15 12:05:43 +00001408 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411
Thomas Wouters89f507f2006-12-13 04:49:30 +00001412 if (TYPE(ch) == RSQB)
1413 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414
Nick Coghlan650f0d02007-04-15 12:05:43 +00001415 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1417 asdl_seq *elts = seq_for_testlist(c, ch);
1418 if (!elts)
1419 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001420
Thomas Wouters89f507f2006-12-13 04:49:30 +00001421 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1422 }
1423 else
1424 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001426 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1427 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001428 int i, size;
1429 asdl_seq *keys, *values;
1430
1431 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001432 if (TYPE(ch) == RBRACE) {
1433 /* it's an empty dict */
1434 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1435 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1436 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001437 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001438 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001439 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001440 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001441 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001442 for (i = 0; i < NCH(ch); i += 2) {
1443 expr_ty expression;
1444 expression = ast_for_expr(c, CHILD(ch, i));
1445 if (!expression)
1446 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001447 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001448 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001449 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1450 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1451 /* it's a set comprehension */
1452 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001453 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1454 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001455 } else {
1456 /* it's a dict */
1457 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1458 keys = asdl_seq_new(size, c->c_arena);
1459 if (!keys)
1460 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461
Guido van Rossum86e58e22006-08-28 15:27:34 +00001462 values = asdl_seq_new(size, c->c_arena);
1463 if (!values)
1464 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465
Guido van Rossum86e58e22006-08-28 15:27:34 +00001466 for (i = 0; i < NCH(ch); i += 4) {
1467 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468
Guido van Rossum86e58e22006-08-28 15:27:34 +00001469 expression = ast_for_expr(c, CHILD(ch, i));
1470 if (!expression)
1471 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001472
Guido van Rossum86e58e22006-08-28 15:27:34 +00001473 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001474
Guido van Rossum86e58e22006-08-28 15:27:34 +00001475 expression = ast_for_expr(c, CHILD(ch, i + 2));
1476 if (!expression)
1477 return NULL;
1478
1479 asdl_seq_SET(values, i / 4, expression);
1480 }
1481 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1482 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001485 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 }
1488}
1489
1490static slice_ty
1491ast_for_slice(struct compiling *c, const node *n)
1492{
1493 node *ch;
1494 expr_ty lower = NULL, upper = NULL, step = NULL;
1495
1496 REQ(n, subscript);
1497
1498 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001499 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 sliceop: ':' [test]
1501 */
1502 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503 if (NCH(n) == 1 && TYPE(ch) == test) {
1504 /* 'step' variable hold no significance in terms of being used over
1505 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 if (!step)
1508 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509
Thomas Wouters89f507f2006-12-13 04:49:30 +00001510 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 }
1512
1513 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001514 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 if (!lower)
1516 return NULL;
1517 }
1518
1519 /* If there's an upper bound it's in the second or third position. */
1520 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001521 if (NCH(n) > 1) {
1522 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523
Thomas Wouters89f507f2006-12-13 04:49:30 +00001524 if (TYPE(n2) == test) {
1525 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526 if (!upper)
1527 return NULL;
1528 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001529 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001531 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533 if (TYPE(n2) == test) {
1534 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535 if (!upper)
1536 return NULL;
1537 }
1538 }
1539
1540 ch = CHILD(n, NCH(n) - 1);
1541 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001542 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001543 ch = CHILD(ch, 1);
1544 if (TYPE(ch) == test) {
1545 step = ast_for_expr(c, ch);
1546 if (!step)
1547 return NULL;
1548 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549 }
1550 }
1551
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001552 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553}
1554
1555static expr_ty
1556ast_for_binop(struct compiling *c, const node *n)
1557{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001558 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001560 BinOp(BinOp(A, op, B), op, C).
1561 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562
Guido van Rossumd8faa362007-04-27 19:54:29 +00001563 int i, nops;
1564 expr_ty expr1, expr2, result;
1565 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 expr1 = ast_for_expr(c, CHILD(n, 0));
1568 if (!expr1)
1569 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570
Guido van Rossumd8faa362007-04-27 19:54:29 +00001571 expr2 = ast_for_expr(c, CHILD(n, 2));
1572 if (!expr2)
1573 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575 newoperator = get_operator(CHILD(n, 1));
1576 if (!newoperator)
1577 return NULL;
1578
1579 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1580 c->c_arena);
1581 if (!result)
1582 return NULL;
1583
1584 nops = (NCH(n) - 1) / 2;
1585 for (i = 1; i < nops; i++) {
1586 expr_ty tmp_result, tmp;
1587 const node* next_oper = CHILD(n, i * 2 + 1);
1588
1589 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001590 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001591 return NULL;
1592
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1594 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595 return NULL;
1596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001598 LINENO(next_oper), next_oper->n_col_offset,
1599 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601 return NULL;
1602 result = tmp_result;
1603 }
1604 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605}
1606
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001607static expr_ty
1608ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001611 subscriptlist: subscript (',' subscript)* [',']
1612 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1613 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001614 REQ(n, trailer);
1615 if (TYPE(CHILD(n, 0)) == LPAR) {
1616 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001617 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1618 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001619 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001620 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001621 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001622 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001623 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1624 if (!attr_id)
1625 return NULL;
1626 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001627 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001628 }
1629 else {
1630 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001631 REQ(CHILD(n, 2), RSQB);
1632 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001633 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001634 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1635 if (!slc)
1636 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001637 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1638 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001639 }
1640 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 by treating the sequence as a tuple literal if there are
1643 no slice features.
1644 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001645 int j;
1646 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001647 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001648 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001649 asdl_seq *slices, *elts;
1650 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001651 if (!slices)
1652 return NULL;
1653 for (j = 0; j < NCH(n); j += 2) {
1654 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001655 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001656 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001657 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001658 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001659 asdl_seq_SET(slices, j / 2, slc);
1660 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001661 if (!simple) {
1662 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001663 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001664 }
1665 /* extract Index values and put them in a Tuple */
1666 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001667 if (!elts)
1668 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001669 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1670 slc = (slice_ty)asdl_seq_GET(slices, j);
1671 assert(slc->kind == Index_kind && slc->v.Index.value);
1672 asdl_seq_SET(elts, j, slc->v.Index.value);
1673 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001674 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001675 if (!e)
1676 return NULL;
1677 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001678 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001679 }
1680 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001681}
1682
1683static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001684ast_for_factor(struct compiling *c, const node *n)
1685{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001686 expr_ty expression;
1687
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001688 expression = ast_for_expr(c, CHILD(n, 1));
1689 if (!expression)
1690 return NULL;
1691
1692 switch (TYPE(CHILD(n, 0))) {
1693 case PLUS:
1694 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1695 c->c_arena);
1696 case MINUS:
1697 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1698 c->c_arena);
1699 case TILDE:
1700 return UnaryOp(Invert, expression, LINENO(n),
1701 n->n_col_offset, c->c_arena);
1702 }
1703 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1704 TYPE(CHILD(n, 0)));
1705 return NULL;
1706}
1707
1708static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001709ast_for_power(struct compiling *c, const node *n)
1710{
1711 /* power: atom trailer* ('**' factor)*
1712 */
1713 int i;
1714 expr_ty e, tmp;
1715 REQ(n, power);
1716 e = ast_for_atom(c, CHILD(n, 0));
1717 if (!e)
1718 return NULL;
1719 if (NCH(n) == 1)
1720 return e;
1721 for (i = 1; i < NCH(n); i++) {
1722 node *ch = CHILD(n, i);
1723 if (TYPE(ch) != trailer)
1724 break;
1725 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001726 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001727 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001728 tmp->lineno = e->lineno;
1729 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001730 e = tmp;
1731 }
1732 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1733 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001734 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001735 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001736 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001737 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001738 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001739 e = tmp;
1740 }
1741 return e;
1742}
1743
Guido van Rossum0368b722007-05-11 16:50:42 +00001744static expr_ty
1745ast_for_starred(struct compiling *c, const node *n)
1746{
1747 expr_ty tmp;
1748 REQ(n, star_expr);
1749
1750 tmp = ast_for_expr(c, CHILD(n, 1));
1751 if (!tmp)
1752 return NULL;
1753
1754 /* The Load context is changed later. */
1755 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1756}
1757
1758
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759/* Do not name a variable 'expr'! Will cause a compile error.
1760*/
1761
1762static expr_ty
1763ast_for_expr(struct compiling *c, const node *n)
1764{
1765 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001766 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001767 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 and_test: not_test ('and' not_test)*
1770 not_test: 'not' not_test | comparison
1771 comparison: expr (comp_op expr)*
1772 expr: xor_expr ('|' xor_expr)*
1773 xor_expr: and_expr ('^' and_expr)*
1774 and_expr: shift_expr ('&' shift_expr)*
1775 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1776 arith_expr: term (('+'|'-') term)*
1777 term: factor (('*'|'/'|'%'|'//') factor)*
1778 factor: ('+'|'-'|'~') factor | power
1779 power: atom trailer* ('**' factor)*
1780 */
1781
1782 asdl_seq *seq;
1783 int i;
1784
1785 loop:
1786 switch (TYPE(n)) {
1787 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001788 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001789 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001790 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001792 else if (NCH(n) > 1)
1793 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001794 /* Fallthrough */
1795 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796 case and_test:
1797 if (NCH(n) == 1) {
1798 n = CHILD(n, 0);
1799 goto loop;
1800 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001801 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802 if (!seq)
1803 return NULL;
1804 for (i = 0; i < NCH(n); i += 2) {
1805 expr_ty e = ast_for_expr(c, CHILD(n, i));
1806 if (!e)
1807 return NULL;
1808 asdl_seq_SET(seq, i / 2, e);
1809 }
1810 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001811 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1812 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001813 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001814 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001815 case not_test:
1816 if (NCH(n) == 1) {
1817 n = CHILD(n, 0);
1818 goto loop;
1819 }
1820 else {
1821 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1822 if (!expression)
1823 return NULL;
1824
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001825 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1826 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 }
1828 case comparison:
1829 if (NCH(n) == 1) {
1830 n = CHILD(n, 0);
1831 goto loop;
1832 }
1833 else {
1834 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001835 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001836 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001837 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838 if (!ops)
1839 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001840 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 return NULL;
1843 }
1844 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001847 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001848 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001850 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851
1852 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001853 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001855 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001857 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 asdl_seq_SET(cmps, i / 2, expression);
1859 }
1860 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001861 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001865 return Compare(expression, ops, cmps, LINENO(n),
1866 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 }
1868 break;
1869
Guido van Rossum0368b722007-05-11 16:50:42 +00001870 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 /* The next five cases all handle BinOps. The main body of code
1873 is the same in each case, but the switch turned inside out to
1874 reuse the code for each type of operator.
1875 */
1876 case expr:
1877 case xor_expr:
1878 case and_expr:
1879 case shift_expr:
1880 case arith_expr:
1881 case term:
1882 if (NCH(n) == 1) {
1883 n = CHILD(n, 0);
1884 goto loop;
1885 }
1886 return ast_for_binop(c, n);
1887 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001888 expr_ty exp = NULL;
1889 if (NCH(n) == 2) {
1890 exp = ast_for_testlist(c, CHILD(n, 1));
1891 if (!exp)
1892 return NULL;
1893 }
1894 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1895 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001896 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897 if (NCH(n) == 1) {
1898 n = CHILD(n, 0);
1899 goto loop;
1900 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001902 case power:
1903 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001905 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 return NULL;
1907 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001908 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 return NULL;
1910}
1911
1912static expr_ty
1913ast_for_call(struct compiling *c, const node *n, expr_ty func)
1914{
1915 /*
1916 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1917 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001918 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 */
1920
1921 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001922 asdl_seq *args;
1923 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924 expr_ty vararg = NULL, kwarg = NULL;
1925
1926 REQ(n, arglist);
1927
1928 nargs = 0;
1929 nkeywords = 0;
1930 ngens = 0;
1931 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001932 node *ch = CHILD(n, i);
1933 if (TYPE(ch) == argument) {
1934 if (NCH(ch) == 1)
1935 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001937 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001939 nkeywords++;
1940 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 }
1942 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001943 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001944 "if not sole argument");
1945 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 }
1947
1948 if (nargs + nkeywords + ngens > 255) {
1949 ast_error(n, "more than 255 arguments");
1950 return NULL;
1951 }
1952
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001953 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001955 return NULL;
1956 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001958 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 nargs = 0;
1960 nkeywords = 0;
1961 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001962 node *ch = CHILD(n, i);
1963 if (TYPE(ch) == argument) {
1964 expr_ty e;
1965 if (NCH(ch) == 1) {
1966 if (nkeywords) {
1967 ast_error(CHILD(ch, 0),
1968 "non-keyword arg after keyword arg");
1969 return NULL;
1970 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001971 if (vararg) {
1972 ast_error(CHILD(ch, 0),
1973 "only named arguments may follow *expression");
1974 return NULL;
1975 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001979 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001981 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001982 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001984 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 else {
1988 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001989 identifier key, tmp;
1990 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001993 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001995 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 /* f(lambda x: x[0] = 3) ends up getting parsed with
1997 * LHS test = lambda x: x[0], and RHS test = 3.
1998 * SF bug 132313 points out that complaining about a keyword
1999 * then is very confusing.
2000 */
2001 if (e->kind == Lambda_kind) {
2002 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 } else if (e->kind != Name_kind) {
2005 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002006 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002007 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 return NULL;
2009 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002010 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002011 for (k = 0; k < nkeywords; k++) {
2012 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2013 if (!PyUnicode_Compare(tmp, key)) {
2014 ast_error(CHILD(ch, 0), "keyword argument repeated");
2015 return NULL;
2016 }
2017 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002020 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002023 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 asdl_seq_SET(keywords, nkeywords++, kw);
2025 }
2026 }
2027 else if (TYPE(ch) == STAR) {
2028 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002029 if (!vararg)
2030 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 i++;
2032 }
2033 else if (TYPE(ch) == DOUBLESTAR) {
2034 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002035 if (!kwarg)
2036 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002037 i++;
2038 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 }
2040
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002041 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042}
2043
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002045ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002047 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002048 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002050 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002051 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002052 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002053 }
2054 else {
2055 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002056 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002057 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002059 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 else {
2061 asdl_seq *tmp = seq_for_testlist(c, n);
2062 if (!tmp)
2063 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002064 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002066}
2067
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068static stmt_ty
2069ast_for_expr_stmt(struct compiling *c, const node *n)
2070{
2071 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002074 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002076 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 test: ... here starts the operator precendence dance
2078 */
2079
2080 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 if (!e)
2083 return NULL;
2084
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 }
2087 else if (TYPE(CHILD(n, 1)) == augassign) {
2088 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002089 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002090 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091
Thomas Wouters89f507f2006-12-13 04:49:30 +00002092 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 if (!expr1)
2094 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002095 if(!set_context(c, expr1, Store, ch))
2096 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002097 /* set_context checks that most expressions are not the left side.
2098 Augmented assignments can only have a name, a subscript, or an
2099 attribute on the left, though, so we have to explicitly check for
2100 those. */
2101 switch (expr1->kind) {
2102 case Name_kind:
2103 case Attribute_kind:
2104 case Subscript_kind:
2105 break;
2106 default:
2107 ast_error(ch, "illegal expression for augmented assignment");
2108 return NULL;
2109 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110
Thomas Wouters89f507f2006-12-13 04:49:30 +00002111 ch = CHILD(n, 2);
2112 if (TYPE(ch) == testlist)
2113 expr2 = ast_for_testlist(c, ch);
2114 else
2115 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002116 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117 return NULL;
2118
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002119 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002120 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121 return NULL;
2122
Thomas Wouters89f507f2006-12-13 04:49:30 +00002123 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124 }
2125 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002126 int i;
2127 asdl_seq *targets;
2128 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 expr_ty expression;
2130
Thomas Wouters89f507f2006-12-13 04:49:30 +00002131 /* a normal assignment */
2132 REQ(CHILD(n, 1), EQUAL);
2133 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2134 if (!targets)
2135 return NULL;
2136 for (i = 0; i < NCH(n) - 2; i += 2) {
2137 expr_ty e;
2138 node *ch = CHILD(n, i);
2139 if (TYPE(ch) == yield_expr) {
2140 ast_error(ch, "assignment to yield expression not possible");
2141 return NULL;
2142 }
2143 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002145 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002147 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002148 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002149 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150
Thomas Wouters89f507f2006-12-13 04:49:30 +00002151 asdl_seq_SET(targets, i / 2, e);
2152 }
2153 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002154 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002155 expression = ast_for_testlist(c, value);
2156 else
2157 expression = ast_for_expr(c, value);
2158 if (!expression)
2159 return NULL;
2160 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162}
2163
Benjamin Peterson78565b22009-06-28 19:19:51 +00002164
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002166ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167{
2168 asdl_seq *seq;
2169 int i;
2170 expr_ty e;
2171
2172 REQ(n, exprlist);
2173
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002174 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002175 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002176 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002178 e = ast_for_expr(c, CHILD(n, i));
2179 if (!e)
2180 return NULL;
2181 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002182 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002183 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184 }
2185 return seq;
2186}
2187
2188static stmt_ty
2189ast_for_del_stmt(struct compiling *c, const node *n)
2190{
2191 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 /* del_stmt: 'del' exprlist */
2194 REQ(n, del_stmt);
2195
2196 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2197 if (!expr_list)
2198 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002199 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200}
2201
2202static stmt_ty
2203ast_for_flow_stmt(struct compiling *c, const node *n)
2204{
2205 /*
2206 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2207 | yield_stmt
2208 break_stmt: 'break'
2209 continue_stmt: 'continue'
2210 return_stmt: 'return' [testlist]
2211 yield_stmt: yield_expr
2212 yield_expr: 'yield' testlist
2213 raise_stmt: 'raise' [test [',' test [',' test]]]
2214 */
2215 node *ch;
2216
2217 REQ(n, flow_stmt);
2218 ch = CHILD(n, 0);
2219 switch (TYPE(ch)) {
2220 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002221 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002223 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002225 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2226 if (!exp)
2227 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002228 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 }
2230 case return_stmt:
2231 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002232 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002234 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 if (!expression)
2236 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002237 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 }
2239 case raise_stmt:
2240 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002241 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2242 else if (NCH(ch) >= 2) {
2243 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2245 if (!expression)
2246 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002247 if (NCH(ch) == 4) {
2248 cause = ast_for_expr(c, CHILD(ch, 3));
2249 if (!cause)
2250 return NULL;
2251 }
2252 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 }
2254 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002255 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 "unexpected flow_stmt: %d", TYPE(ch));
2257 return NULL;
2258 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002259
2260 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2261 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262}
2263
2264static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002265alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266{
2267 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002268 import_as_name: NAME ['as' NAME]
2269 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 dotted_name: NAME ('.' NAME)*
2271 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002272 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002273
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 loop:
2275 switch (TYPE(n)) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002276 case import_as_name: {
2277 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002278 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002279 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002280 if (!name)
2281 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002282 if (NCH(n) == 3) {
2283 node *str_node = CHILD(n, 2);
2284 str = NEW_IDENTIFIER(str_node);
2285 if (!str)
2286 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002287 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002288 return NULL;
2289 }
2290 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002291 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002292 return NULL;
2293 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002294 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002295 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 case dotted_as_name:
2297 if (NCH(n) == 1) {
2298 n = CHILD(n, 0);
2299 goto loop;
2300 }
2301 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002302 node *asname_node = CHILD(n, 2);
2303 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002304 if (!a)
2305 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002307 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002308 if (!a->asname)
2309 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002310 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002311 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 return a;
2313 }
2314 break;
2315 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002316 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002317 node *name_node = CHILD(n, 0);
2318 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002319 if (!name)
2320 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002321 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002322 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002323 return alias(name, NULL, c->c_arena);
2324 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 else {
2326 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002327 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002328 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331
2332 len = 0;
2333 for (i = 0; i < NCH(n); i += 2)
2334 /* length of string plus one for the dot */
2335 len += strlen(STR(CHILD(n, i))) + 1;
2336 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002337 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 if (!str)
2339 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002340 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 if (!s)
2342 return NULL;
2343 for (i = 0; i < NCH(n); i += 2) {
2344 char *sch = STR(CHILD(n, i));
2345 strcpy(s, STR(CHILD(n, i)));
2346 s += strlen(sch);
2347 *s++ = '.';
2348 }
2349 --s;
2350 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2352 PyBytes_GET_SIZE(str),
2353 NULL);
2354 Py_DECREF(str);
2355 if (!uni)
2356 return NULL;
2357 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002358 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002359 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002360 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002361 }
2362 break;
2363 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002364 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002365 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002366 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002368 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 "unexpected import name: %d", TYPE(n));
2370 return NULL;
2371 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002372
2373 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 return NULL;
2375}
2376
2377static stmt_ty
2378ast_for_import_stmt(struct compiling *c, const node *n)
2379{
2380 /*
2381 import_stmt: import_name | import_from
2382 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002383 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2384 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002386 int lineno;
2387 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 int i;
2389 asdl_seq *aliases;
2390
2391 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002392 lineno = LINENO(n);
2393 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002395 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002397 REQ(n, dotted_as_names);
2398 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2399 if (!aliases)
2400 return NULL;
2401 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002402 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002403 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002405 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002407 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002409 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411 int idx, ndots = 0;
2412 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002413 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002415 /* Count the number of dots (for relative imports) and check for the
2416 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 for (idx = 1; idx < NCH(n); idx++) {
2418 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002419 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2420 if (!mod)
2421 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 idx++;
2423 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002424 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002426 ndots += 3;
2427 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002428 } else if (TYPE(CHILD(n, idx)) != DOT) {
2429 break;
2430 }
2431 ndots++;
2432 }
2433 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002434 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002435 case STAR:
2436 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 n = CHILD(n, idx);
2438 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 break;
2440 case LPAR:
2441 /* from ... import (x, y, z) */
2442 n = CHILD(n, idx + 1);
2443 n_children = NCH(n);
2444 break;
2445 case import_as_names:
2446 /* from ... import x, y, z */
2447 n = CHILD(n, idx);
2448 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002449 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 ast_error(n, "trailing comma not allowed without"
2451 " surrounding parentheses");
2452 return NULL;
2453 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002454 break;
2455 default:
2456 ast_error(n, "Unexpected node-type in from-import");
2457 return NULL;
2458 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459
Thomas Wouters89f507f2006-12-13 04:49:30 +00002460 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2461 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463
2464 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002465 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002466 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002467 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002471 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002473 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002474 if (!import_alias)
2475 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002479 if (mod != NULL)
2480 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002481 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002482 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 }
Neal Norwitz79792652005-11-14 04:25:03 +00002484 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485 "unknown import statement: starts with command '%s'",
2486 STR(CHILD(n, 0)));
2487 return NULL;
2488}
2489
2490static stmt_ty
2491ast_for_global_stmt(struct compiling *c, const node *n)
2492{
2493 /* global_stmt: 'global' NAME (',' NAME)* */
2494 identifier name;
2495 asdl_seq *s;
2496 int i;
2497
2498 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002499 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002501 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002503 name = NEW_IDENTIFIER(CHILD(n, i));
2504 if (!name)
2505 return NULL;
2506 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002508 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509}
2510
2511static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002512ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2513{
2514 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2515 identifier name;
2516 asdl_seq *s;
2517 int i;
2518
2519 REQ(n, nonlocal_stmt);
2520 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2521 if (!s)
2522 return NULL;
2523 for (i = 1; i < NCH(n); i += 2) {
2524 name = NEW_IDENTIFIER(CHILD(n, i));
2525 if (!name)
2526 return NULL;
2527 asdl_seq_SET(s, i / 2, name);
2528 }
2529 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2530}
2531
2532static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533ast_for_assert_stmt(struct compiling *c, const node *n)
2534{
2535 /* assert_stmt: 'assert' test [',' test] */
2536 REQ(n, assert_stmt);
2537 if (NCH(n) == 2) {
2538 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2539 if (!expression)
2540 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002541 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 }
2543 else if (NCH(n) == 4) {
2544 expr_ty expr1, expr2;
2545
2546 expr1 = ast_for_expr(c, CHILD(n, 1));
2547 if (!expr1)
2548 return NULL;
2549 expr2 = ast_for_expr(c, CHILD(n, 3));
2550 if (!expr2)
2551 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552
Thomas Wouters89f507f2006-12-13 04:49:30 +00002553 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 }
Neal Norwitz79792652005-11-14 04:25:03 +00002555 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 "improper number of parts to 'assert' statement: %d",
2557 NCH(n));
2558 return NULL;
2559}
2560
2561static asdl_seq *
2562ast_for_suite(struct compiling *c, const node *n)
2563{
2564 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002565 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 stmt_ty s;
2567 int i, total, num, end, pos = 0;
2568 node *ch;
2569
2570 REQ(n, suite);
2571
2572 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002573 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002575 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002577 n = CHILD(n, 0);
2578 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 */
2581 end = NCH(n) - 1;
2582 if (TYPE(CHILD(n, end - 1)) == SEMI)
2583 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 for (i = 0; i < end; i += 2) {
2586 ch = CHILD(n, i);
2587 s = ast_for_stmt(c, ch);
2588 if (!s)
2589 return NULL;
2590 asdl_seq_SET(seq, pos++, s);
2591 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 }
2593 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 for (i = 2; i < (NCH(n) - 1); i++) {
2595 ch = CHILD(n, i);
2596 REQ(ch, stmt);
2597 num = num_stmts(ch);
2598 if (num == 1) {
2599 /* small_stmt or compound_stmt with only one child */
2600 s = ast_for_stmt(c, ch);
2601 if (!s)
2602 return NULL;
2603 asdl_seq_SET(seq, pos++, s);
2604 }
2605 else {
2606 int j;
2607 ch = CHILD(ch, 0);
2608 REQ(ch, simple_stmt);
2609 for (j = 0; j < NCH(ch); j += 2) {
2610 /* statement terminates with a semi-colon ';' */
2611 if (NCH(CHILD(ch, j)) == 0) {
2612 assert((j + 1) == NCH(ch));
2613 break;
2614 }
2615 s = ast_for_stmt(c, CHILD(ch, j));
2616 if (!s)
2617 return NULL;
2618 asdl_seq_SET(seq, pos++, s);
2619 }
2620 }
2621 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 }
2623 assert(pos == seq->size);
2624 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625}
2626
2627static stmt_ty
2628ast_for_if_stmt(struct compiling *c, const node *n)
2629{
2630 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2631 ['else' ':' suite]
2632 */
2633 char *s;
2634
2635 REQ(n, if_stmt);
2636
2637 if (NCH(n) == 4) {
2638 expr_ty expression;
2639 asdl_seq *suite_seq;
2640
2641 expression = ast_for_expr(c, CHILD(n, 1));
2642 if (!expression)
2643 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002645 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647
Guido van Rossumd8faa362007-04-27 19:54:29 +00002648 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2649 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002651
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 s = STR(CHILD(n, 4));
2653 /* s[2], the third character in the string, will be
2654 's' for el_s_e, or
2655 'i' for el_i_f
2656 */
2657 if (s[2] == 's') {
2658 expr_ty expression;
2659 asdl_seq *seq1, *seq2;
2660
2661 expression = ast_for_expr(c, CHILD(n, 1));
2662 if (!expression)
2663 return NULL;
2664 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002665 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 return NULL;
2667 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002668 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 return NULL;
2670
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2672 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 }
2674 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002675 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002676 expr_ty expression;
2677 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 asdl_seq *orelse = NULL;
2679 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 /* must reference the child n_elif+1 since 'else' token is third,
2681 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2683 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2684 has_else = 1;
2685 n_elif -= 3;
2686 }
2687 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688
Thomas Wouters89f507f2006-12-13 04:49:30 +00002689 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002690 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691
Thomas Wouters89f507f2006-12-13 04:49:30 +00002692 orelse = asdl_seq_new(1, c->c_arena);
2693 if (!orelse)
2694 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002696 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002698 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2699 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002701 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2702 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 asdl_seq_SET(orelse, 0,
2706 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002707 LINENO(CHILD(n, NCH(n) - 6)),
2708 CHILD(n, NCH(n) - 6)->n_col_offset,
2709 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002710 /* the just-created orelse handled the last elif */
2711 n_elif--;
2712 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713
Thomas Wouters89f507f2006-12-13 04:49:30 +00002714 for (i = 0; i < n_elif; i++) {
2715 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002716 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2717 if (!newobj)
2718 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002720 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002723 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002728 LINENO(CHILD(n, off)),
2729 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002730 orelse = newobj;
2731 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002732 expression = ast_for_expr(c, CHILD(n, 1));
2733 if (!expression)
2734 return NULL;
2735 suite_seq = ast_for_suite(c, CHILD(n, 3));
2736 if (!suite_seq)
2737 return NULL;
2738 return If(expression, suite_seq, orelse,
2739 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002741
2742 PyErr_Format(PyExc_SystemError,
2743 "unexpected token in 'if' statement: %s", s);
2744 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745}
2746
2747static stmt_ty
2748ast_for_while_stmt(struct compiling *c, const node *n)
2749{
2750 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2751 REQ(n, while_stmt);
2752
2753 if (NCH(n) == 4) {
2754 expr_ty expression;
2755 asdl_seq *suite_seq;
2756
2757 expression = ast_for_expr(c, CHILD(n, 1));
2758 if (!expression)
2759 return NULL;
2760 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002761 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002763 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 }
2765 else if (NCH(n) == 7) {
2766 expr_ty expression;
2767 asdl_seq *seq1, *seq2;
2768
2769 expression = ast_for_expr(c, CHILD(n, 1));
2770 if (!expression)
2771 return NULL;
2772 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002773 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return NULL;
2775 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 return NULL;
2778
Thomas Wouters89f507f2006-12-13 04:49:30 +00002779 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002781
2782 PyErr_Format(PyExc_SystemError,
2783 "wrong number of tokens for 'while' statement: %d",
2784 NCH(n));
2785 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786}
2787
2788static stmt_ty
2789ast_for_for_stmt(struct compiling *c, const node *n)
2790{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002791 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002793 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002794 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2796 REQ(n, for_stmt);
2797
2798 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002799 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 if (!seq)
2801 return NULL;
2802 }
2803
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002804 node_target = CHILD(n, 1);
2805 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002806 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002808 /* Check the # of children rather than the length of _target, since
2809 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002810 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002811 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002812 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002814 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002816 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002817 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 return NULL;
2819 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002820 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 return NULL;
2822
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002823 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2824 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825}
2826
2827static excepthandler_ty
2828ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2829{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002830 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 REQ(exc, except_clause);
2832 REQ(body, suite);
2833
2834 if (NCH(exc) == 1) {
2835 asdl_seq *suite_seq = ast_for_suite(c, body);
2836 if (!suite_seq)
2837 return NULL;
2838
Neal Norwitzad74aa82008-03-31 05:14:30 +00002839 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002840 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 }
2842 else if (NCH(exc) == 2) {
2843 expr_ty expression;
2844 asdl_seq *suite_seq;
2845
2846 expression = ast_for_expr(c, CHILD(exc, 1));
2847 if (!expression)
2848 return NULL;
2849 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002850 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 return NULL;
2852
Neal Norwitzad74aa82008-03-31 05:14:30 +00002853 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002854 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 }
2856 else if (NCH(exc) == 4) {
2857 asdl_seq *suite_seq;
2858 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002859 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002860 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002862 if (forbidden_name(e, CHILD(exc, 3), 0))
2863 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002865 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 return NULL;
2867 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002868 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 return NULL;
2870
Neal Norwitzad74aa82008-03-31 05:14:30 +00002871 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002872 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002874
2875 PyErr_Format(PyExc_SystemError,
2876 "wrong number of children for 'except' clause: %d",
2877 NCH(exc));
2878 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879}
2880
2881static stmt_ty
2882ast_for_try_stmt(struct compiling *c, const node *n)
2883{
Neal Norwitzf599f422005-12-17 21:33:47 +00002884 const int nch = NCH(n);
2885 int n_except = (nch - 3)/3;
2886 asdl_seq *body, *orelse = NULL, *finally = NULL;
2887
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 REQ(n, try_stmt);
2889
Neal Norwitzf599f422005-12-17 21:33:47 +00002890 body = ast_for_suite(c, CHILD(n, 2));
2891 if (body == NULL)
2892 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893
Neal Norwitzf599f422005-12-17 21:33:47 +00002894 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2895 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2896 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2897 /* we can assume it's an "else",
2898 because nch >= 9 for try-else-finally and
2899 it would otherwise have a type of except_clause */
2900 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2901 if (orelse == NULL)
2902 return NULL;
2903 n_except--;
2904 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905
Neal Norwitzf599f422005-12-17 21:33:47 +00002906 finally = ast_for_suite(c, CHILD(n, nch - 1));
2907 if (finally == NULL)
2908 return NULL;
2909 n_except--;
2910 }
2911 else {
2912 /* we can assume it's an "else",
2913 otherwise it would have a type of except_clause */
2914 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2915 if (orelse == NULL)
2916 return NULL;
2917 n_except--;
2918 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002921 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 return NULL;
2923 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924
Neal Norwitzf599f422005-12-17 21:33:47 +00002925 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 int i;
2927 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002928 /* process except statements to create a try ... except */
2929 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2930 if (handlers == NULL)
2931 return NULL;
2932
2933 for (i = 0; i < n_except; i++) {
2934 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2935 CHILD(n, 5 + i * 3));
2936 if (!e)
2937 return NULL;
2938 asdl_seq_SET(handlers, i, e);
2939 }
2940
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002942 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002943 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002945
2946 /* if a 'finally' is present too, we nest the TryExcept within a
2947 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 body = asdl_seq_new(1, c->c_arena);
2949 if (body == NULL)
2950 return NULL;
2951 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002952 }
2953
2954 /* must be a try ... finally (except clauses are in body, if any exist) */
2955 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002956 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957}
2958
Georg Brandl0c315622009-05-25 21:10:36 +00002959/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002960static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002961ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002962{
2963 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002964
Georg Brandl0c315622009-05-25 21:10:36 +00002965 REQ(n, with_item);
2966 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002967 if (!context_expr)
2968 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002969 if (NCH(n) == 3) {
2970 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002971
2972 if (!optional_vars) {
2973 return NULL;
2974 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002975 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002976 return NULL;
2977 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002978 }
2979
Georg Brandl0c315622009-05-25 21:10:36 +00002980 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002981 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002982}
2983
Georg Brandl0c315622009-05-25 21:10:36 +00002984/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2985static stmt_ty
2986ast_for_with_stmt(struct compiling *c, const node *n)
2987{
2988 int i;
2989 stmt_ty ret;
2990 asdl_seq *inner;
2991
2992 REQ(n, with_stmt);
2993
2994 /* process the with items inside-out */
2995 i = NCH(n) - 1;
2996 /* the suite of the innermost with item is the suite of the with stmt */
2997 inner = ast_for_suite(c, CHILD(n, i));
2998 if (!inner)
2999 return NULL;
3000
3001 for (;;) {
3002 i -= 2;
3003 ret = ast_for_with_item(c, CHILD(n, i), inner);
3004 if (!ret)
3005 return NULL;
3006 /* was this the last item? */
3007 if (i == 1)
3008 break;
3009 /* if not, wrap the result so far in a new sequence */
3010 inner = asdl_seq_new(1, c->c_arena);
3011 if (!inner)
3012 return NULL;
3013 asdl_seq_SET(inner, 0, ret);
3014 }
3015
3016 return ret;
3017}
3018
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003020ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003022 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003023 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003024 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003025 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 REQ(n, classdef);
3028
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003029 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 s = ast_for_suite(c, CHILD(n, 3));
3031 if (!s)
3032 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003033 classname = NEW_IDENTIFIER(CHILD(n, 1));
3034 if (!classname)
3035 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003036 if (forbidden_name(classname, CHILD(n, 3), 0))
3037 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003038 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3039 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003041
3042 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003043 s = ast_for_suite(c, CHILD(n,5));
3044 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003045 return NULL;
3046 classname = NEW_IDENTIFIER(CHILD(n, 1));
3047 if (!classname)
3048 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003049 if (forbidden_name(classname, CHILD(n, 3), 0))
3050 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003051 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3052 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 }
3054
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003055 /* class NAME '(' arglist ')' ':' suite */
3056 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003057 {
3058 PyObject *dummy_name;
3059 expr_ty dummy;
3060 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3061 if (!dummy_name)
3062 return NULL;
3063 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3064 call = ast_for_call(c, CHILD(n, 3), dummy);
3065 if (!call)
3066 return NULL;
3067 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003069 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003071 classname = NEW_IDENTIFIER(CHILD(n, 1));
3072 if (!classname)
3073 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003074 if (forbidden_name(classname, CHILD(n, 1), 0))
3075 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003076
Benjamin Peterson30760062008-11-25 04:02:28 +00003077 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003078 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003079 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080}
3081
3082static stmt_ty
3083ast_for_stmt(struct compiling *c, const node *n)
3084{
3085 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 assert(NCH(n) == 1);
3087 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 }
3089 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003090 assert(num_stmts(n) == 1);
3091 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 }
3093 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003094 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003095 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3096 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003097 */
3098 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099 case expr_stmt:
3100 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 case del_stmt:
3102 return ast_for_del_stmt(c, n);
3103 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003104 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 case flow_stmt:
3106 return ast_for_flow_stmt(c, n);
3107 case import_stmt:
3108 return ast_for_import_stmt(c, n);
3109 case global_stmt:
3110 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003111 case nonlocal_stmt:
3112 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 case assert_stmt:
3114 return ast_for_assert_stmt(c, n);
3115 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003116 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3118 TYPE(n), NCH(n));
3119 return NULL;
3120 }
3121 }
3122 else {
3123 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003124 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003125 */
3126 node *ch = CHILD(n, 0);
3127 REQ(n, compound_stmt);
3128 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129 case if_stmt:
3130 return ast_for_if_stmt(c, ch);
3131 case while_stmt:
3132 return ast_for_while_stmt(c, ch);
3133 case for_stmt:
3134 return ast_for_for_stmt(c, ch);
3135 case try_stmt:
3136 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003137 case with_stmt:
3138 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003140 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003142 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 case decorated:
3144 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003146 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3148 TYPE(n), NCH(n));
3149 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003150 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151 }
3152}
3153
3154static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003155parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003157 const char *end;
3158 long x;
3159 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003160 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003162
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003163 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003164 errno = 0;
3165 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003167 if (s[0] == '0') {
3168 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3169 if (x < 0 && errno == 0) {
3170 return PyLong_FromString((char *)s,
3171 (char **)0,
3172 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003173 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 }
3175 else
3176 x = PyOS_strtol((char *)s, (char **)&end, 0);
3177 if (*end == '\0') {
3178 if (errno != 0)
3179 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003180 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003181 }
3182 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003183 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003184 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003185 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3186 if (compl.imag == -1.0 && PyErr_Occurred())
3187 return NULL;
3188 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003189 }
3190 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003191 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003192 dx = PyOS_string_to_double(s, NULL, NULL);
3193 if (dx == -1.0 && PyErr_Occurred())
3194 return NULL;
3195 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197}
3198
3199static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003200decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 PyObject *u, *v;
3203 char *s, *t;
3204 t = s = (char *)*sPtr;
3205 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3206 while (s < end && (*s & 0x80)) s++;
3207 *sPtr = s;
3208 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3209 if (u == NULL)
3210 return NULL;
3211 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3212 Py_DECREF(u);
3213 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214}
3215
3216static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003217decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003219 PyObject *v, *u;
3220 char *buf;
3221 char *p;
3222 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003223
Guido van Rossumd8faa362007-04-27 19:54:29 +00003224 if (encoding == NULL) {
3225 buf = (char *)s;
3226 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003227 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003228 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003229 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003230 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003231 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3232 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3233 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 if (u == NULL)
3235 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003236 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 end = s + len;
3238 while (s < end) {
3239 if (*s == '\\') {
3240 *p++ = *s++;
3241 if (*s & 0x80) {
3242 strcpy(p, "u005c");
3243 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003244 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003245 }
3246 if (*s & 0x80) { /* XXX inefficient */
3247 PyObject *w;
3248 char *r;
3249 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003250 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003251 if (w == NULL) {
3252 Py_DECREF(u);
3253 return NULL;
3254 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003255 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003256 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003257 assert(rn % 4 == 0);
3258 for (i = 0; i < rn; i += 4) {
3259 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003260 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003261 r[i + 1] & 0xFF,
3262 r[i + 2] & 0xFF,
3263 r[i + 3] & 0xFF);
3264 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003266 /* Should be impossible to overflow */
3267 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003268 Py_DECREF(w);
3269 } else {
3270 *p++ = *s++;
3271 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003272 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003273 len = p - buf;
3274 s = buf;
3275 }
3276 if (rawmode)
3277 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3278 else
3279 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3280 Py_XDECREF(u);
3281 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282}
3283
3284/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003285 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 * parsestr parses it, and returns the decoded Python string object.
3287 */
3288static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003289parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003291 size_t len;
3292 const char *s = STR(n);
3293 int quote = Py_CHARMASK(*s);
3294 int rawmode = 0;
3295 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003296 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003297 if (quote == 'b' || quote == 'B') {
3298 quote = *++s;
3299 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003301 if (quote == 'r' || quote == 'R') {
3302 quote = *++s;
3303 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003304 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003305 }
3306 if (quote != '\'' && quote != '\"') {
3307 PyErr_BadInternalCall();
3308 return NULL;
3309 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003310 s++;
3311 len = strlen(s);
3312 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003314 "string to parse is too long");
3315 return NULL;
3316 }
3317 if (s[--len] != quote) {
3318 PyErr_BadInternalCall();
3319 return NULL;
3320 }
3321 if (len >= 4 && s[0] == quote && s[1] == quote) {
3322 s += 2;
3323 len -= 2;
3324 if (s[--len] != quote || s[--len] != quote) {
3325 PyErr_BadInternalCall();
3326 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003327 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003328 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003329 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003330 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003331 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003332 if (*bytesmode) {
3333 /* Disallow non-ascii characters (but not escapes) */
3334 const char *c;
3335 for (c = s; *c; c++) {
3336 if (Py_CHARMASK(*c) >= 0x80) {
3337 ast_error(n, "bytes can only contain ASCII "
3338 "literal characters.");
3339 return NULL;
3340 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003341 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003342 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003343 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003344 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003345 if (rawmode || strchr(s, '\\') == NULL) {
3346 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003347 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003348 if (u == NULL || !*bytesmode)
3349 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003350 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003351 Py_DECREF(u);
3352 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003353 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003354 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003355 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003356 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003358 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003359 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003360 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003361 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003362 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363}
3364
Guido van Rossum29fd7122007-11-12 01:13:56 +00003365/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 * compile-time literal catenation, calling parsestr() on each piece, and
3367 * pasting the intermediate results together.
3368 */
3369static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003370parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003372 PyObject *v;
3373 int i;
3374 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003375 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003376 if (v != NULL) {
3377 /* String literal concatenation */
3378 for (i = 1; i < NCH(n); i++) {
3379 PyObject *s;
3380 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003381 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003382 if (s == NULL)
3383 goto onError;
3384 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003385 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003386 goto onError;
3387 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003388 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3389 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003390 if (v == NULL)
3391 goto onError;
3392 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003393 else {
3394 PyObject *temp = PyUnicode_Concat(v, s);
3395 Py_DECREF(s);
3396 Py_DECREF(v);
3397 v = temp;
3398 if (v == NULL)
3399 goto onError;
3400 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003401 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003402 }
3403 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404
Guido van Rossumd8faa362007-04-27 19:54:29 +00003405 onError:
3406 Py_XDECREF(v);
3407 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408}