blob: 0d4d9ee9ea8c14bacf7ad5437a85881279897026 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
10#include "ast.h"
11#include "token.h"
12#include "parsetok.h"
13#include "graminit.h"
14
15#include <assert.h>
16
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000017/* Data structure used internally */
18struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000019 char *c_encoding; /* source encoding */
20 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000021 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000031static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
Christian Heimes81ee3ef2008-05-04 22:42:01 +000036static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000037static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000038static PyObject *parsestrplus(struct compiling *, const node *n,
39 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000042#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#endif
44
Nick Coghlan650f0d02007-04-15 12:05:43 +000045#define COMP_GENEXP 0
46#define COMP_LISTCOMP 1
47#define COMP_SETCOMP 2
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000050new_identifier(const char* n, PyArena *arena)
51{
Martin v. Löwis5b222132007-06-10 09:51:05 +000052 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000053 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000054 if (!id)
55 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000056 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000057 /* Check whether there are non-ASCII characters in the
58 identifier; if so, normalize to NFKC. */
59 for (; *u; u++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 if (*u >= 128) {
61 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
62 PyObject *id2;
63 if (!m)
64 return NULL;
65 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
66 Py_DECREF(m);
67 if (!id2)
68 return NULL;
69 Py_DECREF(id);
70 id = id2;
71 break;
72 }
Martin v. Löwis47383402007-08-15 07:32:56 +000073 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000074 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000075 PyArena_AddPyObject(arena, id);
76 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077}
78
Neal Norwitzadb69fc2005-12-17 20:54:49 +000079#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000080
81/* This routine provides an invalid object for the syntax error.
82 The outermost routine must unpack this error and create the
83 proper object. We do this so that we don't have to pass
84 the filename to everything function.
85
86 XXX Maybe we should just pass the filename...
87*/
88
89static int
90ast_error(const node *n, const char *errstr)
91{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000092 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000094 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 PyErr_SetObject(PyExc_SyntaxError, u);
96 Py_DECREF(u);
97 return 0;
98}
99
100static void
101ast_error_finish(const char *filename)
102{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000103 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000104 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000121 offset = PyTuple_GetItem(value, 2);
122 if (!offset) {
123 Py_DECREF(errstr);
124 return;
125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 Py_DECREF(value);
127
128 loc = PyErr_ProgramText(filename, lineno);
129 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000130 Py_INCREF(Py_None);
131 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000133 if (filename != NULL)
134 filename_obj = PyUnicode_DecodeFSDefault(filename);
135 else {
136 Py_INCREF(Py_None);
137 filename_obj = Py_None;
138 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000139 if (filename_obj != NULL)
140 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
141 else
142 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000143 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000144 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000145 Py_DECREF(errstr);
146 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000147 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000148 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149 Py_DECREF(errstr);
150 Py_DECREF(tmp);
151 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000152 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000153 PyErr_Restore(type, value, tback);
154}
155
156/* num_stmts() returns number of contained statements.
157
158 Use this routine to determine how big a sequence is needed for
159 the statements in a parse tree. Its raison d'etre is this bit of
160 grammar:
161
162 stmt: simple_stmt | compound_stmt
163 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
164
165 A simple_stmt can contain multiple small_stmt elements joined
166 by semicolons. If the arg is a simple_stmt, the number of
167 small_stmt elements is returned.
168*/
169
170static int
171num_stmts(const node *n)
172{
173 int i, l;
174 node *ch;
175
176 switch (TYPE(n)) {
177 case single_input:
178 if (TYPE(CHILD(n, 0)) == NEWLINE)
179 return 0;
180 else
181 return num_stmts(CHILD(n, 0));
182 case file_input:
183 l = 0;
184 for (i = 0; i < NCH(n); i++) {
185 ch = CHILD(n, i);
186 if (TYPE(ch) == stmt)
187 l += num_stmts(ch);
188 }
189 return l;
190 case stmt:
191 return num_stmts(CHILD(n, 0));
192 case compound_stmt:
193 return 1;
194 case simple_stmt:
195 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
196 case suite:
197 if (NCH(n) == 1)
198 return num_stmts(CHILD(n, 0));
199 else {
200 l = 0;
201 for (i = 2; i < (NCH(n) - 1); i++)
202 l += num_stmts(CHILD(n, i));
203 return l;
204 }
205 default: {
206 char buf[128];
207
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000208 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209 TYPE(n), NCH(n));
210 Py_FatalError(buf);
211 }
212 }
213 assert(0);
214 return 0;
215}
216
217/* Transform the CST rooted at node * to the appropriate AST
218*/
219
220mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000221PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
222 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000224 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 asdl_seq *stmts = NULL;
226 stmt_ty s;
227 node *ch;
228 struct compiling c;
229
230 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000231 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000232 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000233#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000234 ast_error(n, "encoding declaration in Unicode string");
235 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000236#endif
237 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000238 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 } else if (TYPE(n) == encoding_decl) {
240 c.c_encoding = STR(n);
241 n = CHILD(n, 0);
242 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000244 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000246 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000247 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248
Jeremy Hyltona8293132006-02-28 17:58:27 +0000249 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000250 switch (TYPE(n)) {
251 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255 for (i = 0; i < NCH(n) - 1; i++) {
256 ch = CHILD(n, i);
257 if (TYPE(ch) == NEWLINE)
258 continue;
259 REQ(ch, stmt);
260 num = num_stmts(ch);
261 if (num == 1) {
262 s = ast_for_stmt(&c, ch);
263 if (!s)
264 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000265 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000266 }
267 else {
268 ch = CHILD(ch, 0);
269 REQ(ch, simple_stmt);
270 for (j = 0; j < num; j++) {
271 s = ast_for_stmt(&c, CHILD(ch, j * 2));
272 if (!s)
273 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000274 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 }
276 }
277 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000278 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 case eval_input: {
280 expr_ty testlist_ast;
281
Nick Coghlan650f0d02007-04-15 12:05:43 +0000282 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000283 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 if (!testlist_ast)
285 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000286 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 }
288 case single_input:
289 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000290 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000293 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
294 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000295 if (!asdl_seq_GET(stmts, 0))
296 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000297 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 }
299 else {
300 n = CHILD(n, 0);
301 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000302 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000303 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000304 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000306 s = ast_for_stmt(&c, n);
307 if (!s)
308 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000309 asdl_seq_SET(stmts, 0, s);
310 }
311 else {
312 /* Only a simple_stmt can contain multiple statements. */
313 REQ(n, simple_stmt);
314 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 if (TYPE(CHILD(n, i)) == NEWLINE)
316 break;
317 s = ast_for_stmt(&c, CHILD(n, i));
318 if (!s)
319 goto error;
320 asdl_seq_SET(stmts, i / 2, s);
321 }
322 }
323
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000324 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 }
326 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000327 PyErr_Format(PyExc_SystemError,
328 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000329 goto error;
330 }
331 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000332 ast_error_finish(filename);
333 return NULL;
334}
335
336/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
337*/
338
339static operator_ty
340get_operator(const node *n)
341{
342 switch (TYPE(n)) {
343 case VBAR:
344 return BitOr;
345 case CIRCUMFLEX:
346 return BitXor;
347 case AMPER:
348 return BitAnd;
349 case LEFTSHIFT:
350 return LShift;
351 case RIGHTSHIFT:
352 return RShift;
353 case PLUS:
354 return Add;
355 case MINUS:
356 return Sub;
357 case STAR:
358 return Mult;
359 case SLASH:
360 return Div;
361 case DOUBLESLASH:
362 return FloorDiv;
363 case PERCENT:
364 return Mod;
365 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000366 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367 }
368}
369
Guido van Rossume7ba4952007-06-06 23:52:48 +0000370static const char* FORBIDDEN[] = {
371 "None",
372 "True",
373 "False",
374 NULL,
375};
376
377static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000378forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000379{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000380 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000381 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
382 ast_error(n, "assignment to keyword");
383 return 1;
384 }
385 if (full_checks) {
386 const char **p;
387 for (p = FORBIDDEN; *p; p++) {
388 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
389 ast_error(n, "assignment to keyword");
390 return 1;
391 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000392 }
393 }
394 return 0;
395}
396
Jeremy Hyltona8293132006-02-28 17:58:27 +0000397/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
399 Only sets context for expr kinds that "can appear in assignment context"
400 (according to ../Parser/Python.asdl). For other expr kinds, it sets
401 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402*/
403
404static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000405set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000406{
407 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 /* If a particular expression type can't be used for assign / delete,
409 set expr_name to its name and an error message will be generated.
410 */
411 const char* expr_name = NULL;
412
413 /* The ast defines augmented store and load contexts, but the
414 implementation here doesn't actually use them. The code may be
415 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000417 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000418 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000419 */
420 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000421
422 switch (e->kind) {
423 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000424 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000425 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
426 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 e->v.Subscript.ctx = ctx;
430 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000431 case Starred_kind:
432 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000433 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000434 return 0;
435 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000437 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000438 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000439 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440 }
441 e->v.Name.ctx = ctx;
442 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000444 e->v.List.ctx = ctx;
445 s = e->v.List.elts;
446 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000447 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000448 if (asdl_seq_LEN(e->v.Tuple.elts)) {
449 e->v.Tuple.ctx = ctx;
450 s = e->v.Tuple.elts;
451 }
452 else {
453 expr_name = "()";
454 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000455 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000456 case Lambda_kind:
457 expr_name = "lambda";
458 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000459 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000460 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000462 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000464 case UnaryOp_kind:
465 expr_name = "operator";
466 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 expr_name = "generator expression";
469 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470 case Yield_kind:
471 expr_name = "yield expression";
472 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 case ListComp_kind:
474 expr_name = "list comprehension";
475 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000476 case SetComp_kind:
477 expr_name = "set comprehension";
478 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000479 case DictComp_kind:
480 expr_name = "dict comprehension";
481 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000482 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000483 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000484 case Num_kind:
485 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500486 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000487 expr_name = "literal";
488 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000489 case Ellipsis_kind:
490 expr_name = "Ellipsis";
491 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000492 case Compare_kind:
493 expr_name = "comparison";
494 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000495 case IfExp_kind:
496 expr_name = "conditional expression";
497 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000498 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 PyErr_Format(PyExc_SystemError,
500 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000501 e->kind, e->lineno);
502 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000503 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000504 /* Check for error string set by switch */
505 if (expr_name) {
506 char buf[300];
507 PyOS_snprintf(buf, sizeof(buf),
508 "can't %s %s",
509 ctx == Store ? "assign to" : "delete",
510 expr_name);
511 return ast_error(n, buf);
512 }
513
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000516 */
517 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000518 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000521 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000522 return 0;
523 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524 }
525 return 1;
526}
527
528static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000529ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000530{
531 REQ(n, augassign);
532 n = CHILD(n, 0);
533 switch (STR(n)[0]) {
534 case '+':
535 return Add;
536 case '-':
537 return Sub;
538 case '/':
539 if (STR(n)[1] == '/')
540 return FloorDiv;
541 else
542 return Div;
543 case '%':
544 return Mod;
545 case '<':
546 return LShift;
547 case '>':
548 return RShift;
549 case '&':
550 return BitAnd;
551 case '^':
552 return BitXor;
553 case '|':
554 return BitOr;
555 case '*':
556 if (STR(n)[1] == '*')
557 return Pow;
558 else
559 return Mult;
560 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000561 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000562 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563 }
564}
565
566static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000567ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000569 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 |'is' 'not'
571 */
572 REQ(n, comp_op);
573 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000574 n = CHILD(n, 0);
575 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 case LESS:
577 return Lt;
578 case GREATER:
579 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000580 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 return Eq;
582 case LESSEQUAL:
583 return LtE;
584 case GREATEREQUAL:
585 return GtE;
586 case NOTEQUAL:
587 return NotEq;
588 case NAME:
589 if (strcmp(STR(n), "in") == 0)
590 return In;
591 if (strcmp(STR(n), "is") == 0)
592 return Is;
593 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000594 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000596 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598 }
599 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000600 /* handle "not in" and "is not" */
601 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602 case NAME:
603 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
604 return NotIn;
605 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
606 return IsNot;
607 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000608 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000610 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000611 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612 }
Neal Norwitz79792652005-11-14 04:25:03 +0000613 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000615 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616}
617
618static asdl_seq *
619seq_for_testlist(struct compiling *c, const node *n)
620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +0000622 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
623 */
Armin Rigo31441302005-10-21 12:57:31 +0000624 asdl_seq *seq;
625 expr_ty expression;
626 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000627 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000629 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000630 if (!seq)
631 return NULL;
632
633 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +0000635 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636
Benjamin Peterson4905e802009-09-27 02:43:28 +0000637 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000638 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000640
641 assert(i / 2 < seq->size);
642 asdl_seq_SET(seq, i / 2, expression);
643 }
644 return seq;
645}
646
Neal Norwitzc1505362006-12-28 06:47:50 +0000647static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000648compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000649{
650 identifier name;
651 expr_ty annotation = NULL;
652 node *ch;
653
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000654 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000655 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000656 name = NEW_IDENTIFIER(ch);
657 if (!name)
658 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000659 if (forbidden_name(name, ch, 0))
660 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000661
662 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
663 annotation = ast_for_expr(c, CHILD(n, 2));
664 if (!annotation)
665 return NULL;
666 }
667
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000668 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000669#if 0
670 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
671 if (!set_context(c, result, Store, n))
672 return NULL;
673 return result;
674#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000675}
676
Guido van Rossum4f72a782006-10-27 23:31:49 +0000677/* returns -1 if failed to handle keyword only arguments
678 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000679 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000680 ^^^
681 start pointing here
682 */
683static int
684handle_keywordonly_args(struct compiling *c, const node *n, int start,
685 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
686{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000687 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000688 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000689 expr_ty expression, annotation;
690 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000691 int i = start;
692 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000693
694 if (kwonlyargs == NULL) {
695 ast_error(CHILD(n, start), "named arguments must follow bare *");
696 return -1;
697 }
698 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000699 while (i < NCH(n)) {
700 ch = CHILD(n, i);
701 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000702 case vfpdef:
703 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000704 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000705 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000706 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000707 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000708 asdl_seq_SET(kwdefaults, j, expression);
709 i += 2; /* '=' and test */
710 }
711 else { /* setting NULL if no default value exists */
712 asdl_seq_SET(kwdefaults, j, NULL);
713 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 if (NCH(ch) == 3) {
715 /* ch is NAME ':' test */
716 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000717 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000718 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000719 }
720 else {
721 annotation = NULL;
722 }
723 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000724 argname = NEW_IDENTIFIER(ch);
725 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000726 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000727 if (forbidden_name(argname, ch, 0))
728 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000729 arg = arg(argname, annotation, c->c_arena);
730 if (!arg)
731 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000732 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000733 i += 2; /* the name and the comma */
734 break;
735 case DOUBLESTAR:
736 return i;
737 default:
738 ast_error(ch, "unexpected node");
739 goto error;
740 }
741 }
742 return i;
743 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000745}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746
Jeremy Hyltona8293132006-02-28 17:58:27 +0000747/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748
749static arguments_ty
750ast_for_arguments(struct compiling *c, const node *n)
751{
Neal Norwitzc1505362006-12-28 06:47:50 +0000752 /* This function handles both typedargslist (function definition)
753 and varargslist (lambda definition).
754
755 parameters: '(' [typedargslist] ')'
756 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000758 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000759 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000760 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000761 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000763 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000764 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000765 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 int i, j, k, nposargs = 0, nkwonlyargs = 0;
768 int nposdefaults = 0, found_default = 0;
769 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000771 arg_ty arg;
772 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 node *ch;
774
775 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000777 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
778 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000779 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000781 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782
Jeremy Hyltone921e022008-07-17 16:37:17 +0000783 /* First count the number of positional args & defaults. The
784 variable i is the loop index for this for loop and the next.
785 The next loop picks up where the first leaves off.
786 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 ch = CHILD(n, i);
789 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000790 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000791 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000792 if (i < NCH(n) && /* skip argument following star */
793 (TYPE(CHILD(n, i)) == tfpdef ||
794 TYPE(CHILD(n, i)) == vfpdef)) {
795 i++;
796 }
797 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000799 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000800 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 defaults for keyword only args */
805 for ( ; i < NCH(n); ++i) {
806 ch = CHILD(n, i);
807 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000808 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000809 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
811 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000812 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000813 kwonlyargs = (nkwonlyargs ?
814 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
815 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000816 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000818 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
819 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000820 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000822 since we set NULL as default for keyword only argument w/o default
823 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000824 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000825 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
826 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000827 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000828
829 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000830 ast_error(n, "more than 255 arguments");
831 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000832 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000834 /* tfpdef: NAME [':' test]
835 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 */
837 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000838 j = 0; /* index for defaults */
839 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000841 ch = CHILD(n, i);
842 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000843 case tfpdef:
844 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
846 anything other than EQUAL or a comma? */
847 /* XXX Should NCH(n) check be made a separate check? */
848 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000849 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
850 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000851 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000852 assert(posdefaults != NULL);
853 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000855 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000857 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000860 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000861 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000862 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000863 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000864 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000865 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 i += 2; /* the name and the comma */
867 break;
868 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000869 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000871 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000872 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000873 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000874 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000875 if (TYPE(ch) == COMMA) {
876 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000877 i += 2; /* now follows keyword only arguments */
878 res = handle_keywordonly_args(c, n, i,
879 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000880 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000881 i = res; /* res has new position to process */
882 }
883 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000884 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000885 if (!vararg)
886 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000887 if (forbidden_name(vararg, CHILD(ch, 0), 0))
888 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000890 /* there is an annotation on the vararg */
891 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000892 if (!varargannotation)
893 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000894 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000895 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000896 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
897 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000898 int res = 0;
899 res = handle_keywordonly_args(c, n, i,
900 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000901 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000902 i = res; /* res has new position to process */
903 }
904 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 break;
906 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000907 ch = CHILD(n, i+1); /* tfpdef */
908 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000909 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000910 if (!kwarg)
911 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000912 if (NCH(ch) > 1) {
913 /* there is an annotation on the kwarg */
914 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000915 if (!kwargannotation)
916 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000917 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000918 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000919 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 i += 3;
921 break;
922 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000923 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 "unexpected node in varargslist: %d @ %d",
925 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000926 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000927 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000929 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
930 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931}
932
933static expr_ty
934ast_for_dotted_name(struct compiling *c, const node *n)
935{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000936 expr_ty e;
937 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000938 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 int i;
940
941 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000942
943 lineno = LINENO(n);
944 col_offset = n->n_col_offset;
945
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 id = NEW_IDENTIFIER(CHILD(n, 0));
947 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000948 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000949 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952
953 for (i = 2; i < NCH(n); i+=2) {
954 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000955 if (!id)
956 return NULL;
957 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
958 if (!e)
959 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960 }
961
962 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static expr_ty
966ast_for_decorator(struct compiling *c, const node *n)
967{
968 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
969 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000970 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000973 REQ(CHILD(n, 0), AT);
974 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
977 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000978 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000981 d = name_expr;
982 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983 }
984 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000985 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000986 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 if (!d)
988 return NULL;
989 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990 }
991 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000992 d = ast_for_call(c, CHILD(n, 3), name_expr);
993 if (!d)
994 return NULL;
995 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 }
997
998 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999}
1000
1001static asdl_seq*
1002ast_for_decorators(struct compiling *c, const node *n)
1003{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001004 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001005 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001006 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001009 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 if (!decorator_seq)
1011 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001014 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001015 if (!d)
1016 return NULL;
1017 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018 }
1019 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020}
1021
1022static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001023ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001025 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001026 identifier name;
1027 arguments_ty args;
1028 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001029 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001030 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031
1032 REQ(n, funcdef);
1033
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 name = NEW_IDENTIFIER(CHILD(n, name_i));
1035 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001036 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001037 if (forbidden_name(name, CHILD(n, name_i), 0))
1038 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1040 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001041 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001042 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1043 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1044 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001045 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001046 name_i += 2;
1047 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048 body = ast_for_suite(c, CHILD(n, name_i + 3));
1049 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001050 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051
Neal Norwitzc1505362006-12-28 06:47:50 +00001052 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001053 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054}
1055
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001056static stmt_ty
1057ast_for_decorated(struct compiling *c, const node *n)
1058{
1059 /* decorated: decorators (classdef | funcdef) */
1060 stmt_ty thing = NULL;
1061 asdl_seq *decorator_seq = NULL;
1062
1063 REQ(n, decorated);
1064
1065 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1066 if (!decorator_seq)
1067 return NULL;
1068
1069 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001071
1072 if (TYPE(CHILD(n, 1)) == funcdef) {
1073 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1074 } else if (TYPE(CHILD(n, 1)) == classdef) {
1075 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1076 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001077 /* we count the decorators in when talking about the class' or
1078 * function's line number */
1079 if (thing) {
1080 thing->lineno = LINENO(n);
1081 thing->col_offset = n->n_col_offset;
1082 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001083 return thing;
1084}
1085
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086static expr_ty
1087ast_for_lambdef(struct compiling *c, const node *n)
1088{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001089 /* lambdef: 'lambda' [varargslist] ':' test
1090 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 arguments_ty args;
1092 expr_ty expression;
1093
1094 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001095 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1096 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097 if (!args)
1098 return NULL;
1099 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001100 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102 }
1103 else {
1104 args = ast_for_arguments(c, CHILD(n, 1));
1105 if (!args)
1106 return NULL;
1107 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001108 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110 }
1111
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001112 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113}
1114
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001115static expr_ty
1116ast_for_ifexpr(struct compiling *c, const node *n)
1117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001119 expr_ty expression, body, orelse;
1120
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001121 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001122 body = ast_for_expr(c, CHILD(n, 0));
1123 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001125 expression = ast_for_expr(c, CHILD(n, 2));
1126 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001127 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001128 orelse = ast_for_expr(c, CHILD(n, 4));
1129 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001130 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001131 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1132 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001133}
1134
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001136 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137
Nick Coghlan650f0d02007-04-15 12:05:43 +00001138 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139*/
1140
1141static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001142count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001144 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 count_comp_for:
1147 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001148 REQ(n, comp_for);
1149 if (NCH(n) == 5)
1150 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001151 else
1152 return n_fors;
1153 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001154 REQ(n, comp_iter);
1155 n = CHILD(n, 0);
1156 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001157 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001158 else if (TYPE(n) == comp_if) {
1159 if (NCH(n) == 3) {
1160 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001161 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001162 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001163 else
1164 return n_fors;
1165 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001166
Guido van Rossumd8faa362007-04-27 19:54:29 +00001167 /* Should never be reached */
1168 PyErr_SetString(PyExc_SystemError,
1169 "logic error in count_comp_fors");
1170 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171}
1172
Nick Coghlan650f0d02007-04-15 12:05:43 +00001173/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174
Nick Coghlan650f0d02007-04-15 12:05:43 +00001175 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176*/
1177
1178static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001179count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001181 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182
Guido van Rossumd8faa362007-04-27 19:54:29 +00001183 while (1) {
1184 REQ(n, comp_iter);
1185 if (TYPE(CHILD(n, 0)) == comp_for)
1186 return n_ifs;
1187 n = CHILD(n, 0);
1188 REQ(n, comp_if);
1189 n_ifs++;
1190 if (NCH(n) == 2)
1191 return n_ifs;
1192 n = CHILD(n, 2);
1193 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194}
1195
Guido van Rossum992d4a32007-07-11 13:09:30 +00001196static asdl_seq *
1197ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001200 asdl_seq *comps;
1201
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001202 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 if (n_fors == -1)
1204 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205
Nick Coghlan650f0d02007-04-15 12:05:43 +00001206 comps = asdl_seq_new(n_fors, c->c_arena);
1207 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001209
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001211 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001213 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001214 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215
Guido van Rossum992d4a32007-07-11 13:09:30 +00001216 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217
Guido van Rossum992d4a32007-07-11 13:09:30 +00001218 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001219 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001222 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001223 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001225
Thomas Wouters89f507f2006-12-13 04:49:30 +00001226 /* Check the # of children rather than the length of t, since
1227 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001228 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001229 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001230 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001232 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1233 c->c_arena),
1234 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001235 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001237
Guido van Rossum992d4a32007-07-11 13:09:30 +00001238 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239 int j, n_ifs;
1240 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241
Guido van Rossum992d4a32007-07-11 13:09:30 +00001242 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001243 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001244 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001246
1247 ifs = asdl_seq_new(n_ifs, c->c_arena);
1248 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001250
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001252 REQ(n, comp_iter);
1253 n = CHILD(n, 0);
1254 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255
Guido van Rossum992d4a32007-07-11 13:09:30 +00001256 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001257 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001258 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001259 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001260 if (NCH(n) == 3)
1261 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001263 /* on exit, must guarantee that n is a comp_for */
1264 if (TYPE(n) == comp_iter)
1265 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001266 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001268 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001270 return comps;
1271}
1272
1273static expr_ty
1274ast_for_itercomp(struct compiling *c, const node *n, int type)
1275{
1276 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1277 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1278 expr_ty elt;
1279 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280
Guido van Rossum992d4a32007-07-11 13:09:30 +00001281 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282
Guido van Rossum992d4a32007-07-11 13:09:30 +00001283 elt = ast_for_expr(c, CHILD(n, 0));
1284 if (!elt)
1285 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286
Guido van Rossum992d4a32007-07-11 13:09:30 +00001287 comps = ast_for_comprehension(c, CHILD(n, 1));
1288 if (!comps)
1289 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001290
1291 if (type == COMP_GENEXP)
1292 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1293 else if (type == COMP_LISTCOMP)
1294 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1295 else if (type == COMP_SETCOMP)
1296 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1297 else
1298 /* Should never happen */
1299 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300}
1301
1302static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001303ast_for_dictcomp(struct compiling *c, const node *n)
1304{
1305 expr_ty key, value;
1306 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307
Guido van Rossum992d4a32007-07-11 13:09:30 +00001308 assert(NCH(n) > 3);
1309 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310
Guido van Rossum992d4a32007-07-11 13:09:30 +00001311 key = ast_for_expr(c, CHILD(n, 0));
1312 if (!key)
1313 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001314 value = ast_for_expr(c, CHILD(n, 2));
1315 if (!value)
1316 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317
Guido van Rossum992d4a32007-07-11 13:09:30 +00001318 comps = ast_for_comprehension(c, CHILD(n, 3));
1319 if (!comps)
1320 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321
Guido van Rossum992d4a32007-07-11 13:09:30 +00001322 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1323}
1324
1325static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001326ast_for_genexp(struct compiling *c, const node *n)
1327{
1328 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001329 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001330}
1331
1332static expr_ty
1333ast_for_listcomp(struct compiling *c, const node *n)
1334{
1335 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001336 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001337}
1338
1339static expr_ty
1340ast_for_setcomp(struct compiling *c, const node *n)
1341{
1342 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001343 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001344}
1345
1346
1347static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348ast_for_atom(struct compiling *c, const node *n)
1349{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001350 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1351 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001352 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001353 */
1354 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001355 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001358 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001359 /* All names start in Load context, but may later be
1360 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001361 PyObject *name = NEW_IDENTIFIER(ch);
1362 if (!name)
1363 return NULL;
1364 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1365 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001367 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001368 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001369 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001370 PyObject *type, *value, *tback, *errstr;
1371 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001372 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001373 if (errstr) {
1374 char *s = "";
1375 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001376 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001377 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1378 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001379 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001380 } else {
1381 ast_error(n, "(unicode error) unknown error");
1382 }
1383 Py_DECREF(type);
1384 Py_DECREF(value);
1385 Py_XDECREF(tback);
1386 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001388 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001389 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001390 if (bytesmode)
1391 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1392 else
1393 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 }
1395 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001396 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001397 if (!pynum)
1398 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001399
Thomas Wouters89f507f2006-12-13 04:49:30 +00001400 PyArena_AddPyObject(c->c_arena, pynum);
1401 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 }
Georg Brandldde00282007-03-18 19:01:53 +00001403 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001404 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001405 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407
Thomas Wouters89f507f2006-12-13 04:49:30 +00001408 if (TYPE(ch) == RPAR)
1409 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410
Thomas Wouters89f507f2006-12-13 04:49:30 +00001411 if (TYPE(ch) == yield_expr)
1412 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001415 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001417
Nick Coghlan650f0d02007-04-15 12:05:43 +00001418 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001420 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 if (TYPE(ch) == RSQB)
1423 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424
Nick Coghlan650f0d02007-04-15 12:05:43 +00001425 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001426 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1427 asdl_seq *elts = seq_for_testlist(c, ch);
1428 if (!elts)
1429 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001430
Thomas Wouters89f507f2006-12-13 04:49:30 +00001431 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1432 }
1433 else
1434 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001436 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1437 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001438 int i, size;
1439 asdl_seq *keys, *values;
1440
1441 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001442 if (TYPE(ch) == RBRACE) {
1443 /* it's an empty dict */
1444 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1445 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1446 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001447 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001448 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001449 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001450 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001451 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001452 for (i = 0; i < NCH(ch); i += 2) {
1453 expr_ty expression;
1454 expression = ast_for_expr(c, CHILD(ch, i));
1455 if (!expression)
1456 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001457 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001458 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001459 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1460 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1461 /* it's a set comprehension */
1462 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001463 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1464 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001465 } else {
1466 /* it's a dict */
1467 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1468 keys = asdl_seq_new(size, c->c_arena);
1469 if (!keys)
1470 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471
Guido van Rossum86e58e22006-08-28 15:27:34 +00001472 values = asdl_seq_new(size, c->c_arena);
1473 if (!values)
1474 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475
Guido van Rossum86e58e22006-08-28 15:27:34 +00001476 for (i = 0; i < NCH(ch); i += 4) {
1477 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478
Guido van Rossum86e58e22006-08-28 15:27:34 +00001479 expression = ast_for_expr(c, CHILD(ch, i));
1480 if (!expression)
1481 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001482
Guido van Rossum86e58e22006-08-28 15:27:34 +00001483 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001484
Guido van Rossum86e58e22006-08-28 15:27:34 +00001485 expression = ast_for_expr(c, CHILD(ch, i + 2));
1486 if (!expression)
1487 return NULL;
1488
1489 asdl_seq_SET(values, i / 4, expression);
1490 }
1491 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1492 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1496 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 }
1498}
1499
1500static slice_ty
1501ast_for_slice(struct compiling *c, const node *n)
1502{
1503 node *ch;
1504 expr_ty lower = NULL, upper = NULL, step = NULL;
1505
1506 REQ(n, subscript);
1507
1508 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001509 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 sliceop: ':' [test]
1511 */
1512 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 if (NCH(n) == 1 && TYPE(ch) == test) {
1514 /* 'step' variable hold no significance in terms of being used over
1515 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517 if (!step)
1518 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519
Thomas Wouters89f507f2006-12-13 04:49:30 +00001520 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 }
1522
1523 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001524 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525 if (!lower)
1526 return NULL;
1527 }
1528
1529 /* If there's an upper bound it's in the second or third position. */
1530 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001531 if (NCH(n) > 1) {
1532 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533
Thomas Wouters89f507f2006-12-13 04:49:30 +00001534 if (TYPE(n2) == test) {
1535 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536 if (!upper)
1537 return NULL;
1538 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001539 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001540 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001541 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542
Thomas Wouters89f507f2006-12-13 04:49:30 +00001543 if (TYPE(n2) == test) {
1544 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545 if (!upper)
1546 return NULL;
1547 }
1548 }
1549
1550 ch = CHILD(n, NCH(n) - 1);
1551 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001552 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001553 ch = CHILD(ch, 1);
1554 if (TYPE(ch) == test) {
1555 step = ast_for_expr(c, ch);
1556 if (!step)
1557 return NULL;
1558 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559 }
1560 }
1561
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001562 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001563}
1564
1565static expr_ty
1566ast_for_binop(struct compiling *c, const node *n)
1567{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001568 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001570 BinOp(BinOp(A, op, B), op, C).
1571 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572
Guido van Rossumd8faa362007-04-27 19:54:29 +00001573 int i, nops;
1574 expr_ty expr1, expr2, result;
1575 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576
Guido van Rossumd8faa362007-04-27 19:54:29 +00001577 expr1 = ast_for_expr(c, CHILD(n, 0));
1578 if (!expr1)
1579 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580
Guido van Rossumd8faa362007-04-27 19:54:29 +00001581 expr2 = ast_for_expr(c, CHILD(n, 2));
1582 if (!expr2)
1583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585 newoperator = get_operator(CHILD(n, 1));
1586 if (!newoperator)
1587 return NULL;
1588
1589 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1590 c->c_arena);
1591 if (!result)
1592 return NULL;
1593
1594 nops = (NCH(n) - 1) / 2;
1595 for (i = 1; i < nops; i++) {
1596 expr_ty tmp_result, tmp;
1597 const node* next_oper = CHILD(n, i * 2 + 1);
1598
1599 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001600 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001601 return NULL;
1602
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1604 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605 return NULL;
1606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001608 LINENO(next_oper), next_oper->n_col_offset,
1609 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611 return NULL;
1612 result = tmp_result;
1613 }
1614 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615}
1616
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001617static expr_ty
1618ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001621 subscriptlist: subscript (',' subscript)* [',']
1622 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1623 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001624 REQ(n, trailer);
1625 if (TYPE(CHILD(n, 0)) == LPAR) {
1626 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001627 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1628 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001629 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001630 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001631 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001632 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001633 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1634 if (!attr_id)
1635 return NULL;
1636 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001637 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001638 }
1639 else {
1640 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001641 REQ(CHILD(n, 2), RSQB);
1642 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001643 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001644 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1645 if (!slc)
1646 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001647 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1648 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001649 }
1650 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001652 by treating the sequence as a tuple literal if there are
1653 no slice features.
1654 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001655 int j;
1656 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001657 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001658 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001659 asdl_seq *slices, *elts;
1660 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001661 if (!slices)
1662 return NULL;
1663 for (j = 0; j < NCH(n); j += 2) {
1664 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001665 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001666 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001667 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001668 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001669 asdl_seq_SET(slices, j / 2, slc);
1670 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001671 if (!simple) {
1672 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001673 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001674 }
1675 /* extract Index values and put them in a Tuple */
1676 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001677 if (!elts)
1678 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001679 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1680 slc = (slice_ty)asdl_seq_GET(slices, j);
1681 assert(slc->kind == Index_kind && slc->v.Index.value);
1682 asdl_seq_SET(elts, j, slc->v.Index.value);
1683 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001684 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001685 if (!e)
1686 return NULL;
1687 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001688 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001689 }
1690 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001691}
1692
1693static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001694ast_for_factor(struct compiling *c, const node *n)
1695{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001696 expr_ty expression;
1697
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001698 expression = ast_for_expr(c, CHILD(n, 1));
1699 if (!expression)
1700 return NULL;
1701
1702 switch (TYPE(CHILD(n, 0))) {
1703 case PLUS:
1704 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1705 c->c_arena);
1706 case MINUS:
1707 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1708 c->c_arena);
1709 case TILDE:
1710 return UnaryOp(Invert, expression, LINENO(n),
1711 n->n_col_offset, c->c_arena);
1712 }
1713 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1714 TYPE(CHILD(n, 0)));
1715 return NULL;
1716}
1717
1718static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001719ast_for_power(struct compiling *c, const node *n)
1720{
1721 /* power: atom trailer* ('**' factor)*
1722 */
1723 int i;
1724 expr_ty e, tmp;
1725 REQ(n, power);
1726 e = ast_for_atom(c, CHILD(n, 0));
1727 if (!e)
1728 return NULL;
1729 if (NCH(n) == 1)
1730 return e;
1731 for (i = 1; i < NCH(n); i++) {
1732 node *ch = CHILD(n, i);
1733 if (TYPE(ch) != trailer)
1734 break;
1735 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001736 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001737 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001738 tmp->lineno = e->lineno;
1739 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001740 e = tmp;
1741 }
1742 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1743 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001744 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001745 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001746 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001747 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001748 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001749 e = tmp;
1750 }
1751 return e;
1752}
1753
Guido van Rossum0368b722007-05-11 16:50:42 +00001754static expr_ty
1755ast_for_starred(struct compiling *c, const node *n)
1756{
1757 expr_ty tmp;
1758 REQ(n, star_expr);
1759
1760 tmp = ast_for_expr(c, CHILD(n, 1));
1761 if (!tmp)
1762 return NULL;
1763
1764 /* The Load context is changed later. */
1765 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1766}
1767
1768
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769/* Do not name a variable 'expr'! Will cause a compile error.
1770*/
1771
1772static expr_ty
1773ast_for_expr(struct compiling *c, const node *n)
1774{
1775 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001776 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001777 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779 and_test: not_test ('and' not_test)*
1780 not_test: 'not' not_test | comparison
1781 comparison: expr (comp_op expr)*
1782 expr: xor_expr ('|' xor_expr)*
1783 xor_expr: and_expr ('^' and_expr)*
1784 and_expr: shift_expr ('&' shift_expr)*
1785 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1786 arith_expr: term (('+'|'-') term)*
1787 term: factor (('*'|'/'|'%'|'//') factor)*
1788 factor: ('+'|'-'|'~') factor | power
1789 power: atom trailer* ('**' factor)*
1790 */
1791
1792 asdl_seq *seq;
1793 int i;
1794
1795 loop:
1796 switch (TYPE(n)) {
1797 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001798 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001799 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001802 else if (NCH(n) > 1)
1803 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001804 /* Fallthrough */
1805 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 case and_test:
1807 if (NCH(n) == 1) {
1808 n = CHILD(n, 0);
1809 goto loop;
1810 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001811 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 if (!seq)
1813 return NULL;
1814 for (i = 0; i < NCH(n); i += 2) {
1815 expr_ty e = ast_for_expr(c, CHILD(n, i));
1816 if (!e)
1817 return NULL;
1818 asdl_seq_SET(seq, i / 2, e);
1819 }
1820 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001821 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1822 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001823 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001824 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 case not_test:
1826 if (NCH(n) == 1) {
1827 n = CHILD(n, 0);
1828 goto loop;
1829 }
1830 else {
1831 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1832 if (!expression)
1833 return NULL;
1834
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001835 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1836 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 }
1838 case comparison:
1839 if (NCH(n) == 1) {
1840 n = CHILD(n, 0);
1841 goto loop;
1842 }
1843 else {
1844 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001846 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001847 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 if (!ops)
1849 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001850 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001852 return NULL;
1853 }
1854 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001857 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001858 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001860 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861
1862 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001863 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001865 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001867 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 asdl_seq_SET(cmps, i / 2, expression);
1869 }
1870 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001871 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001873 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001875 return Compare(expression, ops, cmps, LINENO(n),
1876 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 }
1878 break;
1879
Guido van Rossum0368b722007-05-11 16:50:42 +00001880 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 /* The next five cases all handle BinOps. The main body of code
1883 is the same in each case, but the switch turned inside out to
1884 reuse the code for each type of operator.
1885 */
1886 case expr:
1887 case xor_expr:
1888 case and_expr:
1889 case shift_expr:
1890 case arith_expr:
1891 case term:
1892 if (NCH(n) == 1) {
1893 n = CHILD(n, 0);
1894 goto loop;
1895 }
1896 return ast_for_binop(c, n);
1897 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 expr_ty exp = NULL;
1899 if (NCH(n) == 2) {
1900 exp = ast_for_testlist(c, CHILD(n, 1));
1901 if (!exp)
1902 return NULL;
1903 }
1904 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1905 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001906 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 if (NCH(n) == 1) {
1908 n = CHILD(n, 0);
1909 goto loop;
1910 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001912 case power:
1913 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001915 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 return NULL;
1917 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001918 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 return NULL;
1920}
1921
1922static expr_ty
1923ast_for_call(struct compiling *c, const node *n, expr_ty func)
1924{
1925 /*
1926 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1927 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 */
1930
1931 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001932 asdl_seq *args;
1933 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934 expr_ty vararg = NULL, kwarg = NULL;
1935
1936 REQ(n, arglist);
1937
1938 nargs = 0;
1939 nkeywords = 0;
1940 ngens = 0;
1941 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 node *ch = CHILD(n, i);
1943 if (TYPE(ch) == argument) {
1944 if (NCH(ch) == 1)
1945 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001946 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001947 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 nkeywords++;
1950 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 }
1952 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001953 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001954 "if not sole argument");
1955 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 }
1957
1958 if (nargs + nkeywords + ngens > 255) {
1959 ast_error(n, "more than 255 arguments");
1960 return NULL;
1961 }
1962
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001965 return NULL;
1966 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001968 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 nargs = 0;
1970 nkeywords = 0;
1971 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001972 node *ch = CHILD(n, i);
1973 if (TYPE(ch) == argument) {
1974 expr_ty e;
1975 if (NCH(ch) == 1) {
1976 if (nkeywords) {
1977 ast_error(CHILD(ch, 0),
1978 "non-keyword arg after keyword arg");
1979 return NULL;
1980 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001981 if (vararg) {
1982 ast_error(CHILD(ch, 0),
1983 "only named arguments may follow *expression");
1984 return NULL;
1985 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001991 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001994 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 else {
1998 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001999 identifier key, tmp;
2000 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 /* f(lambda x: x[0] = 3) ends up getting parsed with
2007 * LHS test = lambda x: x[0], and RHS test = 3.
2008 * SF bug 132313 points out that complaining about a keyword
2009 * then is very confusing.
2010 */
2011 if (e->kind == Lambda_kind) {
2012 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002013 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 } else if (e->kind != Name_kind) {
2015 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002016 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002017 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 return NULL;
2019 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002021 for (k = 0; k < nkeywords; k++) {
2022 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2023 if (!PyUnicode_Compare(tmp, key)) {
2024 ast_error(CHILD(ch, 0), "keyword argument repeated");
2025 return NULL;
2026 }
2027 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002030 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002033 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 asdl_seq_SET(keywords, nkeywords++, kw);
2035 }
2036 }
2037 else if (TYPE(ch) == STAR) {
2038 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002039 if (!vararg)
2040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 i++;
2042 }
2043 else if (TYPE(ch) == DOUBLESTAR) {
2044 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002045 if (!kwarg)
2046 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 i++;
2048 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 }
2050
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002051 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052}
2053
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002055ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002057 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002058 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002060 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002061 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002062 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002063 }
2064 else {
2065 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002066 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002067 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002069 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 else {
2071 asdl_seq *tmp = seq_for_testlist(c, n);
2072 if (!tmp)
2073 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002074 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002076}
2077
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078static stmt_ty
2079ast_for_expr_stmt(struct compiling *c, const node *n)
2080{
2081 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002084 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 test: ... here starts the operator precendence dance
2088 */
2089
2090 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 if (!e)
2093 return NULL;
2094
Thomas Wouters89f507f2006-12-13 04:49:30 +00002095 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096 }
2097 else if (TYPE(CHILD(n, 1)) == augassign) {
2098 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002099 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002100 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101
Thomas Wouters89f507f2006-12-13 04:49:30 +00002102 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103 if (!expr1)
2104 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002105 if(!set_context(c, expr1, Store, ch))
2106 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002107 /* set_context checks that most expressions are not the left side.
2108 Augmented assignments can only have a name, a subscript, or an
2109 attribute on the left, though, so we have to explicitly check for
2110 those. */
2111 switch (expr1->kind) {
2112 case Name_kind:
2113 case Attribute_kind:
2114 case Subscript_kind:
2115 break;
2116 default:
2117 ast_error(ch, "illegal expression for augmented assignment");
2118 return NULL;
2119 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120
Thomas Wouters89f507f2006-12-13 04:49:30 +00002121 ch = CHILD(n, 2);
2122 if (TYPE(ch) == testlist)
2123 expr2 = ast_for_testlist(c, ch);
2124 else
2125 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002126 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127 return NULL;
2128
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002129 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002130 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 return NULL;
2132
Thomas Wouters89f507f2006-12-13 04:49:30 +00002133 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 }
2135 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002136 int i;
2137 asdl_seq *targets;
2138 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 expr_ty expression;
2140
Thomas Wouters89f507f2006-12-13 04:49:30 +00002141 /* a normal assignment */
2142 REQ(CHILD(n, 1), EQUAL);
2143 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2144 if (!targets)
2145 return NULL;
2146 for (i = 0; i < NCH(n) - 2; i += 2) {
2147 expr_ty e;
2148 node *ch = CHILD(n, i);
2149 if (TYPE(ch) == yield_expr) {
2150 ast_error(ch, "assignment to yield expression not possible");
2151 return NULL;
2152 }
2153 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002155 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002157 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002158 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002159 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160
Thomas Wouters89f507f2006-12-13 04:49:30 +00002161 asdl_seq_SET(targets, i / 2, e);
2162 }
2163 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002164 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002165 expression = ast_for_testlist(c, value);
2166 else
2167 expression = ast_for_expr(c, value);
2168 if (!expression)
2169 return NULL;
2170 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172}
2173
Benjamin Peterson78565b22009-06-28 19:19:51 +00002174
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002175static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002176ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177{
2178 asdl_seq *seq;
2179 int i;
2180 expr_ty e;
2181
2182 REQ(n, exprlist);
2183
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002184 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002186 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 e = ast_for_expr(c, CHILD(n, i));
2189 if (!e)
2190 return NULL;
2191 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002192 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002193 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 }
2195 return seq;
2196}
2197
2198static stmt_ty
2199ast_for_del_stmt(struct compiling *c, const node *n)
2200{
2201 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 /* del_stmt: 'del' exprlist */
2204 REQ(n, del_stmt);
2205
2206 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2207 if (!expr_list)
2208 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002209 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002210}
2211
2212static stmt_ty
2213ast_for_flow_stmt(struct compiling *c, const node *n)
2214{
2215 /*
2216 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2217 | yield_stmt
2218 break_stmt: 'break'
2219 continue_stmt: 'continue'
2220 return_stmt: 'return' [testlist]
2221 yield_stmt: yield_expr
2222 yield_expr: 'yield' testlist
2223 raise_stmt: 'raise' [test [',' test [',' test]]]
2224 */
2225 node *ch;
2226
2227 REQ(n, flow_stmt);
2228 ch = CHILD(n, 0);
2229 switch (TYPE(ch)) {
2230 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002231 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002233 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002235 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2236 if (!exp)
2237 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002238 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 }
2240 case return_stmt:
2241 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002242 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002244 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 if (!expression)
2246 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002247 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 }
2249 case raise_stmt:
2250 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002251 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2252 else if (NCH(ch) >= 2) {
2253 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2255 if (!expression)
2256 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002257 if (NCH(ch) == 4) {
2258 cause = ast_for_expr(c, CHILD(ch, 3));
2259 if (!cause)
2260 return NULL;
2261 }
2262 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 }
2264 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002265 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266 "unexpected flow_stmt: %d", TYPE(ch));
2267 return NULL;
2268 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002269
2270 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272}
2273
2274static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002275alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276{
2277 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002278 import_as_name: NAME ['as' NAME]
2279 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 dotted_name: NAME ('.' NAME)*
2281 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002282 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002283
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 loop:
2285 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002286 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002287 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002288 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002289 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002290 if (!name)
2291 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002292 if (NCH(n) == 3) {
2293 node *str_node = CHILD(n, 2);
2294 str = NEW_IDENTIFIER(str_node);
2295 if (!str)
2296 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002297 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002298 return NULL;
2299 }
2300 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002301 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002302 return NULL;
2303 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002304 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002305 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 case dotted_as_name:
2307 if (NCH(n) == 1) {
2308 n = CHILD(n, 0);
2309 goto loop;
2310 }
2311 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002312 node *asname_node = CHILD(n, 2);
2313 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002314 if (!a)
2315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002317 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002318 if (!a->asname)
2319 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002320 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002321 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 return a;
2323 }
2324 break;
2325 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002326 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002327 node *name_node = CHILD(n, 0);
2328 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002329 if (!name)
2330 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002331 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002332 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002333 return alias(name, NULL, c->c_arena);
2334 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 else {
2336 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002337 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002338 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341
2342 len = 0;
2343 for (i = 0; i < NCH(n); i += 2)
2344 /* length of string plus one for the dot */
2345 len += strlen(STR(CHILD(n, i))) + 1;
2346 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002347 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 if (!str)
2349 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002350 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351 if (!s)
2352 return NULL;
2353 for (i = 0; i < NCH(n); i += 2) {
2354 char *sch = STR(CHILD(n, i));
2355 strcpy(s, STR(CHILD(n, i)));
2356 s += strlen(sch);
2357 *s++ = '.';
2358 }
2359 --s;
2360 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2362 PyBytes_GET_SIZE(str),
2363 NULL);
2364 Py_DECREF(str);
2365 if (!uni)
2366 return NULL;
2367 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002368 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002369 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002370 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 }
2372 break;
2373 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002374 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002375 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002376 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002378 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 "unexpected import name: %d", TYPE(n));
2380 return NULL;
2381 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002382
2383 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 return NULL;
2385}
2386
2387static stmt_ty
2388ast_for_import_stmt(struct compiling *c, const node *n)
2389{
2390 /*
2391 import_stmt: import_name | import_from
2392 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002393 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2394 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002396 int lineno;
2397 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 int i;
2399 asdl_seq *aliases;
2400
2401 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002402 lineno = LINENO(n);
2403 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002405 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002407 REQ(n, dotted_as_names);
2408 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2409 if (!aliases)
2410 return NULL;
2411 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002412 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002413 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002419 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 int idx, ndots = 0;
2422 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002423 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002425 /* Count the number of dots (for relative imports) and check for the
2426 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 for (idx = 1; idx < NCH(n); idx++) {
2428 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002429 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2430 if (!mod)
2431 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 idx++;
2433 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002434 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002436 ndots += 3;
2437 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002438 } else if (TYPE(CHILD(n, idx)) != DOT) {
2439 break;
2440 }
2441 ndots++;
2442 }
2443 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002444 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002445 case STAR:
2446 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002447 n = CHILD(n, idx);
2448 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 break;
2450 case LPAR:
2451 /* from ... import (x, y, z) */
2452 n = CHILD(n, idx + 1);
2453 n_children = NCH(n);
2454 break;
2455 case import_as_names:
2456 /* from ... import x, y, z */
2457 n = CHILD(n, idx);
2458 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002459 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 ast_error(n, "trailing comma not allowed without"
2461 " surrounding parentheses");
2462 return NULL;
2463 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 break;
2465 default:
2466 ast_error(n, "Unexpected node-type in from-import");
2467 return NULL;
2468 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2471 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473
2474 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002475 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002476 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002477 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002481 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002483 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002484 if (!import_alias)
2485 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002486 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002487 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002489 if (mod != NULL)
2490 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002491 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002492 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493 }
Neal Norwitz79792652005-11-14 04:25:03 +00002494 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 "unknown import statement: starts with command '%s'",
2496 STR(CHILD(n, 0)));
2497 return NULL;
2498}
2499
2500static stmt_ty
2501ast_for_global_stmt(struct compiling *c, const node *n)
2502{
2503 /* global_stmt: 'global' NAME (',' NAME)* */
2504 identifier name;
2505 asdl_seq *s;
2506 int i;
2507
2508 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002509 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 name = NEW_IDENTIFIER(CHILD(n, i));
2514 if (!name)
2515 return NULL;
2516 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002518 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519}
2520
2521static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002522ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2523{
2524 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2525 identifier name;
2526 asdl_seq *s;
2527 int i;
2528
2529 REQ(n, nonlocal_stmt);
2530 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2531 if (!s)
2532 return NULL;
2533 for (i = 1; i < NCH(n); i += 2) {
2534 name = NEW_IDENTIFIER(CHILD(n, i));
2535 if (!name)
2536 return NULL;
2537 asdl_seq_SET(s, i / 2, name);
2538 }
2539 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2540}
2541
2542static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543ast_for_assert_stmt(struct compiling *c, const node *n)
2544{
2545 /* assert_stmt: 'assert' test [',' test] */
2546 REQ(n, assert_stmt);
2547 if (NCH(n) == 2) {
2548 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2549 if (!expression)
2550 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002551 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 }
2553 else if (NCH(n) == 4) {
2554 expr_ty expr1, expr2;
2555
2556 expr1 = ast_for_expr(c, CHILD(n, 1));
2557 if (!expr1)
2558 return NULL;
2559 expr2 = ast_for_expr(c, CHILD(n, 3));
2560 if (!expr2)
2561 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562
Thomas Wouters89f507f2006-12-13 04:49:30 +00002563 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 }
Neal Norwitz79792652005-11-14 04:25:03 +00002565 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 "improper number of parts to 'assert' statement: %d",
2567 NCH(n));
2568 return NULL;
2569}
2570
2571static asdl_seq *
2572ast_for_suite(struct compiling *c, const node *n)
2573{
2574 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002575 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 stmt_ty s;
2577 int i, total, num, end, pos = 0;
2578 node *ch;
2579
2580 REQ(n, suite);
2581
2582 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002583 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002587 n = CHILD(n, 0);
2588 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 */
2591 end = NCH(n) - 1;
2592 if (TYPE(CHILD(n, end - 1)) == SEMI)
2593 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 for (i = 0; i < end; i += 2) {
2596 ch = CHILD(n, i);
2597 s = ast_for_stmt(c, ch);
2598 if (!s)
2599 return NULL;
2600 asdl_seq_SET(seq, pos++, s);
2601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 }
2603 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002604 for (i = 2; i < (NCH(n) - 1); i++) {
2605 ch = CHILD(n, i);
2606 REQ(ch, stmt);
2607 num = num_stmts(ch);
2608 if (num == 1) {
2609 /* small_stmt or compound_stmt with only one child */
2610 s = ast_for_stmt(c, ch);
2611 if (!s)
2612 return NULL;
2613 asdl_seq_SET(seq, pos++, s);
2614 }
2615 else {
2616 int j;
2617 ch = CHILD(ch, 0);
2618 REQ(ch, simple_stmt);
2619 for (j = 0; j < NCH(ch); j += 2) {
2620 /* statement terminates with a semi-colon ';' */
2621 if (NCH(CHILD(ch, j)) == 0) {
2622 assert((j + 1) == NCH(ch));
2623 break;
2624 }
2625 s = ast_for_stmt(c, CHILD(ch, j));
2626 if (!s)
2627 return NULL;
2628 asdl_seq_SET(seq, pos++, s);
2629 }
2630 }
2631 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 }
2633 assert(pos == seq->size);
2634 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635}
2636
2637static stmt_ty
2638ast_for_if_stmt(struct compiling *c, const node *n)
2639{
2640 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2641 ['else' ':' suite]
2642 */
2643 char *s;
2644
2645 REQ(n, if_stmt);
2646
2647 if (NCH(n) == 4) {
2648 expr_ty expression;
2649 asdl_seq *suite_seq;
2650
2651 expression = ast_for_expr(c, CHILD(n, 1));
2652 if (!expression)
2653 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002655 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657
Guido van Rossumd8faa362007-04-27 19:54:29 +00002658 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2659 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002661
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 s = STR(CHILD(n, 4));
2663 /* s[2], the third character in the string, will be
2664 's' for el_s_e, or
2665 'i' for el_i_f
2666 */
2667 if (s[2] == 's') {
2668 expr_ty expression;
2669 asdl_seq *seq1, *seq2;
2670
2671 expression = ast_for_expr(c, CHILD(n, 1));
2672 if (!expression)
2673 return NULL;
2674 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002675 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 return NULL;
2677 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002678 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 return NULL;
2680
Guido van Rossumd8faa362007-04-27 19:54:29 +00002681 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2682 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 }
2684 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002686 expr_ty expression;
2687 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 asdl_seq *orelse = NULL;
2689 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 /* must reference the child n_elif+1 since 'else' token is third,
2691 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002692 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2693 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2694 has_else = 1;
2695 n_elif -= 3;
2696 }
2697 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698
Thomas Wouters89f507f2006-12-13 04:49:30 +00002699 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002700 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701
Thomas Wouters89f507f2006-12-13 04:49:30 +00002702 orelse = asdl_seq_new(1, c->c_arena);
2703 if (!orelse)
2704 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002706 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002708 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2709 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002711 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2712 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 asdl_seq_SET(orelse, 0,
2716 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002717 LINENO(CHILD(n, NCH(n) - 6)),
2718 CHILD(n, NCH(n) - 6)->n_col_offset,
2719 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 /* the just-created orelse handled the last elif */
2721 n_elif--;
2722 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723
Thomas Wouters89f507f2006-12-13 04:49:30 +00002724 for (i = 0; i < n_elif; i++) {
2725 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2727 if (!newobj)
2728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002730 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002733 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735
Thomas Wouters89f507f2006-12-13 04:49:30 +00002736 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002738 LINENO(CHILD(n, off)),
2739 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002740 orelse = newobj;
2741 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002742 expression = ast_for_expr(c, CHILD(n, 1));
2743 if (!expression)
2744 return NULL;
2745 suite_seq = ast_for_suite(c, CHILD(n, 3));
2746 if (!suite_seq)
2747 return NULL;
2748 return If(expression, suite_seq, orelse,
2749 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002751
2752 PyErr_Format(PyExc_SystemError,
2753 "unexpected token in 'if' statement: %s", s);
2754 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755}
2756
2757static stmt_ty
2758ast_for_while_stmt(struct compiling *c, const node *n)
2759{
2760 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2761 REQ(n, while_stmt);
2762
2763 if (NCH(n) == 4) {
2764 expr_ty expression;
2765 asdl_seq *suite_seq;
2766
2767 expression = ast_for_expr(c, CHILD(n, 1));
2768 if (!expression)
2769 return NULL;
2770 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002771 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002773 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 }
2775 else if (NCH(n) == 7) {
2776 expr_ty expression;
2777 asdl_seq *seq1, *seq2;
2778
2779 expression = ast_for_expr(c, CHILD(n, 1));
2780 if (!expression)
2781 return NULL;
2782 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002783 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 return NULL;
2785 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 return NULL;
2788
Thomas Wouters89f507f2006-12-13 04:49:30 +00002789 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002791
2792 PyErr_Format(PyExc_SystemError,
2793 "wrong number of tokens for 'while' statement: %d",
2794 NCH(n));
2795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796}
2797
2798static stmt_ty
2799ast_for_for_stmt(struct compiling *c, const node *n)
2800{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002801 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002803 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002804 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2806 REQ(n, for_stmt);
2807
2808 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002809 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 if (!seq)
2811 return NULL;
2812 }
2813
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002814 node_target = CHILD(n, 1);
2815 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002816 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002818 /* Check the # of children rather than the length of _target, since
2819 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002820 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002821 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002822 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002824 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002826 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002827 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 return NULL;
2829 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002830 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 return NULL;
2832
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002833 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2834 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835}
2836
2837static excepthandler_ty
2838ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2839{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002840 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 REQ(exc, except_clause);
2842 REQ(body, suite);
2843
2844 if (NCH(exc) == 1) {
2845 asdl_seq *suite_seq = ast_for_suite(c, body);
2846 if (!suite_seq)
2847 return NULL;
2848
Neal Norwitzad74aa82008-03-31 05:14:30 +00002849 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002850 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 }
2852 else if (NCH(exc) == 2) {
2853 expr_ty expression;
2854 asdl_seq *suite_seq;
2855
2856 expression = ast_for_expr(c, CHILD(exc, 1));
2857 if (!expression)
2858 return NULL;
2859 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
2862
Neal Norwitzad74aa82008-03-31 05:14:30 +00002863 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002864 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 }
2866 else if (NCH(exc) == 4) {
2867 asdl_seq *suite_seq;
2868 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002869 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002870 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002872 if (forbidden_name(e, CHILD(exc, 3), 0))
2873 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002875 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 return NULL;
2877 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002878 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 return NULL;
2880
Neal Norwitzad74aa82008-03-31 05:14:30 +00002881 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002882 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002884
2885 PyErr_Format(PyExc_SystemError,
2886 "wrong number of children for 'except' clause: %d",
2887 NCH(exc));
2888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889}
2890
2891static stmt_ty
2892ast_for_try_stmt(struct compiling *c, const node *n)
2893{
Neal Norwitzf599f422005-12-17 21:33:47 +00002894 const int nch = NCH(n);
2895 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002896 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002897
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 REQ(n, try_stmt);
2899
Neal Norwitzf599f422005-12-17 21:33:47 +00002900 body = ast_for_suite(c, CHILD(n, 2));
2901 if (body == NULL)
2902 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903
Neal Norwitzf599f422005-12-17 21:33:47 +00002904 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2905 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2906 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2907 /* we can assume it's an "else",
2908 because nch >= 9 for try-else-finally and
2909 it would otherwise have a type of except_clause */
2910 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2911 if (orelse == NULL)
2912 return NULL;
2913 n_except--;
2914 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915
Neal Norwitzf599f422005-12-17 21:33:47 +00002916 finally = ast_for_suite(c, CHILD(n, nch - 1));
2917 if (finally == NULL)
2918 return NULL;
2919 n_except--;
2920 }
2921 else {
2922 /* we can assume it's an "else",
2923 otherwise it would have a type of except_clause */
2924 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2925 if (orelse == NULL)
2926 return NULL;
2927 n_except--;
2928 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002930 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002931 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932 return NULL;
2933 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934
Neal Norwitzf599f422005-12-17 21:33:47 +00002935 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00002937 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002938 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002939 if (handlers == NULL)
2940 return NULL;
2941
2942 for (i = 0; i < n_except; i++) {
2943 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2944 CHILD(n, 5 + i * 3));
2945 if (!e)
2946 return NULL;
2947 asdl_seq_SET(handlers, i, e);
2948 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002949 }
2950
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002951 assert(finally != NULL || asdl_seq_LEN(handlers));
2952 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953}
2954
Georg Brandl0c315622009-05-25 21:10:36 +00002955/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002956static withitem_ty
2957ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002958{
2959 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002960
Georg Brandl0c315622009-05-25 21:10:36 +00002961 REQ(n, with_item);
2962 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002963 if (!context_expr)
2964 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002965 if (NCH(n) == 3) {
2966 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002967
2968 if (!optional_vars) {
2969 return NULL;
2970 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002971 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002972 return NULL;
2973 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002974 }
2975
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002976 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002977}
2978
Georg Brandl0c315622009-05-25 21:10:36 +00002979/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2980static stmt_ty
2981ast_for_with_stmt(struct compiling *c, const node *n)
2982{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002983 int i, n_items;
2984 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00002985
2986 REQ(n, with_stmt);
2987
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002988 n_items = (NCH(n) - 2) / 2;
2989 items = asdl_seq_new(n_items, c->c_arena);
2990 for (i = 1; i < NCH(n) - 2; i += 2) {
2991 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
2992 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00002993 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002994 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00002995 }
2996
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002997 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2998 if (!body)
2999 return NULL;
3000
3001 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003002}
3003
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003005ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003007 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003008 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003009 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003010 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003011
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012 REQ(n, classdef);
3013
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003014 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 s = ast_for_suite(c, CHILD(n, 3));
3016 if (!s)
3017 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003018 classname = NEW_IDENTIFIER(CHILD(n, 1));
3019 if (!classname)
3020 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003021 if (forbidden_name(classname, CHILD(n, 3), 0))
3022 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003023 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3024 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003026
3027 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003028 s = ast_for_suite(c, CHILD(n,5));
3029 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003030 return NULL;
3031 classname = NEW_IDENTIFIER(CHILD(n, 1));
3032 if (!classname)
3033 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003034 if (forbidden_name(classname, CHILD(n, 3), 0))
3035 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003036 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3037 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 }
3039
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003040 /* class NAME '(' arglist ')' ':' suite */
3041 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003042 {
3043 PyObject *dummy_name;
3044 expr_ty dummy;
3045 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3046 if (!dummy_name)
3047 return NULL;
3048 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3049 call = ast_for_call(c, CHILD(n, 3), dummy);
3050 if (!call)
3051 return NULL;
3052 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003054 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003056 classname = NEW_IDENTIFIER(CHILD(n, 1));
3057 if (!classname)
3058 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003059 if (forbidden_name(classname, CHILD(n, 1), 0))
3060 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003061
Benjamin Peterson30760062008-11-25 04:02:28 +00003062 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003063 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003064 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065}
3066
3067static stmt_ty
3068ast_for_stmt(struct compiling *c, const node *n)
3069{
3070 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003071 assert(NCH(n) == 1);
3072 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 }
3074 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 assert(num_stmts(n) == 1);
3076 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 }
3078 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003079 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003080 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3081 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003082 */
3083 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 case expr_stmt:
3085 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 case del_stmt:
3087 return ast_for_del_stmt(c, n);
3088 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003089 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090 case flow_stmt:
3091 return ast_for_flow_stmt(c, n);
3092 case import_stmt:
3093 return ast_for_import_stmt(c, n);
3094 case global_stmt:
3095 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003096 case nonlocal_stmt:
3097 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098 case assert_stmt:
3099 return ast_for_assert_stmt(c, n);
3100 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003101 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3103 TYPE(n), NCH(n));
3104 return NULL;
3105 }
3106 }
3107 else {
3108 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003109 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003110 */
3111 node *ch = CHILD(n, 0);
3112 REQ(n, compound_stmt);
3113 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 case if_stmt:
3115 return ast_for_if_stmt(c, ch);
3116 case while_stmt:
3117 return ast_for_while_stmt(c, ch);
3118 case for_stmt:
3119 return ast_for_for_stmt(c, ch);
3120 case try_stmt:
3121 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003122 case with_stmt:
3123 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003125 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003127 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 case decorated:
3129 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003131 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3133 TYPE(n), NCH(n));
3134 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003135 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 }
3137}
3138
3139static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003140parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003142 const char *end;
3143 long x;
3144 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003145 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003146 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003148 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003149 errno = 0;
3150 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003151 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003152 if (s[0] == '0') {
3153 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3154 if (x < 0 && errno == 0) {
3155 return PyLong_FromString((char *)s,
3156 (char **)0,
3157 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003158 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 }
3160 else
3161 x = PyOS_strtol((char *)s, (char **)&end, 0);
3162 if (*end == '\0') {
3163 if (errno != 0)
3164 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003165 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 }
3167 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003168 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003169 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003170 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3171 if (compl.imag == -1.0 && PyErr_Occurred())
3172 return NULL;
3173 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 }
3175 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003177 dx = PyOS_string_to_double(s, NULL, NULL);
3178 if (dx == -1.0 && PyErr_Occurred())
3179 return NULL;
3180 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003181 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182}
3183
3184static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003185decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 PyObject *u, *v;
3188 char *s, *t;
3189 t = s = (char *)*sPtr;
3190 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3191 while (s < end && (*s & 0x80)) s++;
3192 *sPtr = s;
3193 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3194 if (u == NULL)
3195 return NULL;
3196 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3197 Py_DECREF(u);
3198 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199}
3200
3201static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003202decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 PyObject *v, *u;
3205 char *buf;
3206 char *p;
3207 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003208
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003212 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003213 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003214 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003215 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3216 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3217 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218 if (u == NULL)
3219 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003220 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 end = s + len;
3222 while (s < end) {
3223 if (*s == '\\') {
3224 *p++ = *s++;
3225 if (*s & 0x80) {
3226 strcpy(p, "u005c");
3227 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003228 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 }
3230 if (*s & 0x80) { /* XXX inefficient */
3231 PyObject *w;
3232 char *r;
3233 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003234 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003235 if (w == NULL) {
3236 Py_DECREF(u);
3237 return NULL;
3238 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003239 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003240 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003241 assert(rn % 4 == 0);
3242 for (i = 0; i < rn; i += 4) {
3243 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003244 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003245 r[i + 1] & 0xFF,
3246 r[i + 2] & 0xFF,
3247 r[i + 3] & 0xFF);
3248 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003249 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003250 /* Should be impossible to overflow */
3251 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003252 Py_DECREF(w);
3253 } else {
3254 *p++ = *s++;
3255 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003256 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 len = p - buf;
3258 s = buf;
3259 }
3260 if (rawmode)
3261 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3262 else
3263 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3264 Py_XDECREF(u);
3265 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266}
3267
3268/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003269 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 * parsestr parses it, and returns the decoded Python string object.
3271 */
3272static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003273parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003275 size_t len;
3276 const char *s = STR(n);
3277 int quote = Py_CHARMASK(*s);
3278 int rawmode = 0;
3279 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003280 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003281 if (quote == 'b' || quote == 'B') {
3282 quote = *++s;
3283 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003285 if (quote == 'r' || quote == 'R') {
3286 quote = *++s;
3287 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003288 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003289 }
3290 if (quote != '\'' && quote != '\"') {
3291 PyErr_BadInternalCall();
3292 return NULL;
3293 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003294 s++;
3295 len = strlen(s);
3296 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003298 "string to parse is too long");
3299 return NULL;
3300 }
3301 if (s[--len] != quote) {
3302 PyErr_BadInternalCall();
3303 return NULL;
3304 }
3305 if (len >= 4 && s[0] == quote && s[1] == quote) {
3306 s += 2;
3307 len -= 2;
3308 if (s[--len] != quote || s[--len] != quote) {
3309 PyErr_BadInternalCall();
3310 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003311 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003312 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003313 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003314 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003315 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003316 if (*bytesmode) {
3317 /* Disallow non-ascii characters (but not escapes) */
3318 const char *c;
3319 for (c = s; *c; c++) {
3320 if (Py_CHARMASK(*c) >= 0x80) {
3321 ast_error(n, "bytes can only contain ASCII "
3322 "literal characters.");
3323 return NULL;
3324 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003325 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003326 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003327 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003328 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003329 if (rawmode || strchr(s, '\\') == NULL) {
3330 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003331 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003332 if (u == NULL || !*bytesmode)
3333 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003334 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003335 Py_DECREF(u);
3336 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003337 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003338 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003339 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003340 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003342 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003343 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003344 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003345 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003346 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347}
3348
Guido van Rossum29fd7122007-11-12 01:13:56 +00003349/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350 * compile-time literal catenation, calling parsestr() on each piece, and
3351 * pasting the intermediate results together.
3352 */
3353static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003354parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003356 PyObject *v;
3357 int i;
3358 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003359 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003360 if (v != NULL) {
3361 /* String literal concatenation */
3362 for (i = 1; i < NCH(n); i++) {
3363 PyObject *s;
3364 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003365 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003366 if (s == NULL)
3367 goto onError;
3368 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003369 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003370 goto onError;
3371 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003372 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3373 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003374 if (v == NULL)
3375 goto onError;
3376 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003377 else {
3378 PyObject *temp = PyUnicode_Concat(v, s);
3379 Py_DECREF(s);
3380 Py_DECREF(v);
3381 v = temp;
3382 if (v == NULL)
3383 goto onError;
3384 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003385 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003386 }
3387 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388
Guido van Rossumd8faa362007-04-27 19:54:29 +00003389 onError:
3390 Py_XDECREF(v);
3391 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392}