blob: 4edf335c338fa3ff70f05936fde5c4d0d0211bf0 [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:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000486 expr_name = "literal";
487 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000488 case Ellipsis_kind:
489 expr_name = "Ellipsis";
490 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000491 case Compare_kind:
492 expr_name = "comparison";
493 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000494 case IfExp_kind:
495 expr_name = "conditional expression";
496 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000497 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 PyErr_Format(PyExc_SystemError,
499 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000500 e->kind, e->lineno);
501 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000503 /* Check for error string set by switch */
504 if (expr_name) {
505 char buf[300];
506 PyOS_snprintf(buf, sizeof(buf),
507 "can't %s %s",
508 ctx == Store ? "assign to" : "delete",
509 expr_name);
510 return ast_error(n, buf);
511 }
512
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515 */
516 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000517 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518
Thomas Wouters89f507f2006-12-13 04:49:30 +0000519 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000520 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000521 return 0;
522 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
524 return 1;
525}
526
527static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000528ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529{
530 REQ(n, augassign);
531 n = CHILD(n, 0);
532 switch (STR(n)[0]) {
533 case '+':
534 return Add;
535 case '-':
536 return Sub;
537 case '/':
538 if (STR(n)[1] == '/')
539 return FloorDiv;
540 else
541 return Div;
542 case '%':
543 return Mod;
544 case '<':
545 return LShift;
546 case '>':
547 return RShift;
548 case '&':
549 return BitAnd;
550 case '^':
551 return BitXor;
552 case '|':
553 return BitOr;
554 case '*':
555 if (STR(n)[1] == '*')
556 return Pow;
557 else
558 return Mult;
559 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000560 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000561 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562 }
563}
564
565static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000566ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000568 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 |'is' 'not'
570 */
571 REQ(n, comp_op);
572 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000573 n = CHILD(n, 0);
574 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575 case LESS:
576 return Lt;
577 case GREATER:
578 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 return Eq;
581 case LESSEQUAL:
582 return LtE;
583 case GREATEREQUAL:
584 return GtE;
585 case NOTEQUAL:
586 return NotEq;
587 case NAME:
588 if (strcmp(STR(n), "in") == 0)
589 return In;
590 if (strcmp(STR(n), "is") == 0)
591 return Is;
592 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000593 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 }
598 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000599 /* handle "not in" and "is not" */
600 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601 case NAME:
602 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
603 return NotIn;
604 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
605 return IsNot;
606 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000607 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000609 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000610 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 }
Neal Norwitz79792652005-11-14 04:25:03 +0000612 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000614 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615}
616
617static asdl_seq *
618seq_for_testlist(struct compiling *c, const node *n)
619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +0000621 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
622 */
Armin Rigo31441302005-10-21 12:57:31 +0000623 asdl_seq *seq;
624 expr_ty expression;
625 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000626 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000628 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629 if (!seq)
630 return NULL;
631
632 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +0000634 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000635
Benjamin Peterson4905e802009-09-27 02:43:28 +0000636 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000637 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639
640 assert(i / 2 < seq->size);
641 asdl_seq_SET(seq, i / 2, expression);
642 }
643 return seq;
644}
645
Neal Norwitzc1505362006-12-28 06:47:50 +0000646static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000647compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000648{
649 identifier name;
650 expr_ty annotation = NULL;
651 node *ch;
652
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000653 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000654 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000655 name = NEW_IDENTIFIER(ch);
656 if (!name)
657 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000658 if (forbidden_name(name, ch, 0))
659 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000660
661 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
662 annotation = ast_for_expr(c, CHILD(n, 2));
663 if (!annotation)
664 return NULL;
665 }
666
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000667 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000668#if 0
669 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
670 if (!set_context(c, result, Store, n))
671 return NULL;
672 return result;
673#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674}
675
Guido van Rossum4f72a782006-10-27 23:31:49 +0000676/* returns -1 if failed to handle keyword only arguments
677 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000678 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000679 ^^^
680 start pointing here
681 */
682static int
683handle_keywordonly_args(struct compiling *c, const node *n, int start,
684 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
685{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000686 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000687 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000688 expr_ty expression, annotation;
689 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000690 int i = start;
691 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000692
693 if (kwonlyargs == NULL) {
694 ast_error(CHILD(n, start), "named arguments must follow bare *");
695 return -1;
696 }
697 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000698 while (i < NCH(n)) {
699 ch = CHILD(n, i);
700 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000701 case vfpdef:
702 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000703 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000705 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000706 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000707 asdl_seq_SET(kwdefaults, j, expression);
708 i += 2; /* '=' and test */
709 }
710 else { /* setting NULL if no default value exists */
711 asdl_seq_SET(kwdefaults, j, NULL);
712 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000713 if (NCH(ch) == 3) {
714 /* ch is NAME ':' test */
715 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000716 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000717 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000718 }
719 else {
720 annotation = NULL;
721 }
722 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000723 argname = NEW_IDENTIFIER(ch);
724 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000725 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000726 if (forbidden_name(argname, ch, 0))
727 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000728 arg = arg(argname, annotation, c->c_arena);
729 if (!arg)
730 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000731 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000732 i += 2; /* the name and the comma */
733 break;
734 case DOUBLESTAR:
735 return i;
736 default:
737 ast_error(ch, "unexpected node");
738 goto error;
739 }
740 }
741 return i;
742 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745
Jeremy Hyltona8293132006-02-28 17:58:27 +0000746/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747
748static arguments_ty
749ast_for_arguments(struct compiling *c, const node *n)
750{
Neal Norwitzc1505362006-12-28 06:47:50 +0000751 /* This function handles both typedargslist (function definition)
752 and varargslist (lambda definition).
753
754 parameters: '(' [typedargslist] ')'
755 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000757 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000758 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000759 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000760 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000762 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000763 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000764 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 int i, j, k, nposargs = 0, nkwonlyargs = 0;
767 int nposdefaults = 0, found_default = 0;
768 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000770 arg_ty arg;
771 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 node *ch;
773
774 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000775 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000776 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
777 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781
Jeremy Hyltone921e022008-07-17 16:37:17 +0000782 /* First count the number of positional args & defaults. The
783 variable i is the loop index for this for loop and the next.
784 The next loop picks up where the first leaves off.
785 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000787 ch = CHILD(n, i);
788 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000789 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000790 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000791 if (i < NCH(n) && /* skip argument following star */
792 (TYPE(CHILD(n, i)) == tfpdef ||
793 TYPE(CHILD(n, i)) == vfpdef)) {
794 i++;
795 }
796 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000797 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000798 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000799 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000800 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 defaults for keyword only args */
804 for ( ; i < NCH(n); ++i) {
805 ch = CHILD(n, i);
806 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000807 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000808 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000809 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
810 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000811 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000812 kwonlyargs = (nkwonlyargs ?
813 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
814 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000815 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000817 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
818 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000819 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000821 since we set NULL as default for keyword only argument w/o default
822 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000823 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000824 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
825 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000826 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000827
828 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000829 ast_error(n, "more than 255 arguments");
830 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000831 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000833 /* tfpdef: NAME [':' test]
834 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 */
836 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000837 j = 0; /* index for defaults */
838 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000839 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 ch = CHILD(n, i);
841 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000842 case tfpdef:
843 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
845 anything other than EQUAL or a comma? */
846 /* XXX Should NCH(n) check be made a separate check? */
847 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000848 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
849 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000850 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000851 assert(posdefaults != NULL);
852 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000854 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000855 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000856 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000858 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000859 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000860 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000861 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000862 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000863 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000864 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865 i += 2; /* the name and the comma */
866 break;
867 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000868 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000870 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000871 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000872 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000873 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000874 if (TYPE(ch) == COMMA) {
875 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000876 i += 2; /* now follows keyword only arguments */
877 res = handle_keywordonly_args(c, n, i,
878 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000879 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000880 i = res; /* res has new position to process */
881 }
882 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000883 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000884 if (!vararg)
885 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000886 if (forbidden_name(vararg, CHILD(ch, 0), 0))
887 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000888 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000889 /* there is an annotation on the vararg */
890 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000891 if (!varargannotation)
892 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000893 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000894 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000895 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
896 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000897 int res = 0;
898 res = handle_keywordonly_args(c, n, i,
899 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000900 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000901 i = res; /* res has new position to process */
902 }
903 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000904 break;
905 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000906 ch = CHILD(n, i+1); /* tfpdef */
907 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000908 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000909 if (!kwarg)
910 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000911 if (NCH(ch) > 1) {
912 /* there is an annotation on the kwarg */
913 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000914 if (!kwargannotation)
915 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000916 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000917 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000918 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919 i += 3;
920 break;
921 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000922 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923 "unexpected node in varargslist: %d @ %d",
924 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000925 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000926 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000928 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
929 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000930}
931
932static expr_ty
933ast_for_dotted_name(struct compiling *c, const node *n)
934{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000935 expr_ty e;
936 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000937 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938 int i;
939
940 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000941
942 lineno = LINENO(n);
943 col_offset = n->n_col_offset;
944
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 id = NEW_IDENTIFIER(CHILD(n, 0));
946 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000947 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000948 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951
952 for (i = 2; i < NCH(n); i+=2) {
953 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000954 if (!id)
955 return NULL;
956 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
957 if (!e)
958 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959 }
960
961 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962}
963
964static expr_ty
965ast_for_decorator(struct compiling *c, const node *n)
966{
967 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
968 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000969 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000972 REQ(CHILD(n, 0), AT);
973 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
976 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000977 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000979 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000980 d = name_expr;
981 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 }
983 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000984 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000985 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000986 if (!d)
987 return NULL;
988 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 }
990 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 d = ast_for_call(c, CHILD(n, 3), name_expr);
992 if (!d)
993 return NULL;
994 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 }
996
997 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998}
999
1000static asdl_seq*
1001ast_for_decorators(struct compiling *c, const node *n)
1002{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001003 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001004 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001008 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009 if (!decorator_seq)
1010 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001013 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001014 if (!d)
1015 return NULL;
1016 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017 }
1018 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019}
1020
1021static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001022ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001024 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001025 identifier name;
1026 arguments_ty args;
1027 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001028 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001029 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030
1031 REQ(n, funcdef);
1032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033 name = NEW_IDENTIFIER(CHILD(n, name_i));
1034 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001035 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001036 if (forbidden_name(name, CHILD(n, name_i), 0))
1037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1039 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001040 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001041 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1042 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1043 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001044 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001045 name_i += 2;
1046 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047 body = ast_for_suite(c, CHILD(n, name_i + 3));
1048 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001049 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050
Neal Norwitzc1505362006-12-28 06:47:50 +00001051 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001052 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053}
1054
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001055static stmt_ty
1056ast_for_decorated(struct compiling *c, const node *n)
1057{
1058 /* decorated: decorators (classdef | funcdef) */
1059 stmt_ty thing = NULL;
1060 asdl_seq *decorator_seq = NULL;
1061
1062 REQ(n, decorated);
1063
1064 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1065 if (!decorator_seq)
1066 return NULL;
1067
1068 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001070
1071 if (TYPE(CHILD(n, 1)) == funcdef) {
1072 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1073 } else if (TYPE(CHILD(n, 1)) == classdef) {
1074 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1075 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001076 /* we count the decorators in when talking about the class' or
1077 * function's line number */
1078 if (thing) {
1079 thing->lineno = LINENO(n);
1080 thing->col_offset = n->n_col_offset;
1081 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001082 return thing;
1083}
1084
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085static expr_ty
1086ast_for_lambdef(struct compiling *c, const node *n)
1087{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001088 /* lambdef: 'lambda' [varargslist] ':' test
1089 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090 arguments_ty args;
1091 expr_ty expression;
1092
1093 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001094 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1095 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096 if (!args)
1097 return NULL;
1098 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001099 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101 }
1102 else {
1103 args = ast_for_arguments(c, CHILD(n, 1));
1104 if (!args)
1105 return NULL;
1106 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001107 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 }
1110
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001111 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112}
1113
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001114static expr_ty
1115ast_for_ifexpr(struct compiling *c, const node *n)
1116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001118 expr_ty expression, body, orelse;
1119
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001120 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001121 body = ast_for_expr(c, CHILD(n, 0));
1122 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001123 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001124 expression = ast_for_expr(c, CHILD(n, 2));
1125 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001126 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001127 orelse = ast_for_expr(c, CHILD(n, 4));
1128 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001129 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001130 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1131 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001132}
1133
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001135 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
Nick Coghlan650f0d02007-04-15 12:05:43 +00001137 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138*/
1139
1140static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001141count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144
Guido van Rossumd8faa362007-04-27 19:54:29 +00001145 count_comp_for:
1146 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001147 REQ(n, comp_for);
1148 if (NCH(n) == 5)
1149 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001150 else
1151 return n_fors;
1152 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001153 REQ(n, comp_iter);
1154 n = CHILD(n, 0);
1155 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001156 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001157 else if (TYPE(n) == comp_if) {
1158 if (NCH(n) == 3) {
1159 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001160 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001161 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001162 else
1163 return n_fors;
1164 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001165
Guido van Rossumd8faa362007-04-27 19:54:29 +00001166 /* Should never be reached */
1167 PyErr_SetString(PyExc_SystemError,
1168 "logic error in count_comp_fors");
1169 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170}
1171
Nick Coghlan650f0d02007-04-15 12:05:43 +00001172/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173
Nick Coghlan650f0d02007-04-15 12:05:43 +00001174 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175*/
1176
1177static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001178count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001180 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181
Guido van Rossumd8faa362007-04-27 19:54:29 +00001182 while (1) {
1183 REQ(n, comp_iter);
1184 if (TYPE(CHILD(n, 0)) == comp_for)
1185 return n_ifs;
1186 n = CHILD(n, 0);
1187 REQ(n, comp_if);
1188 n_ifs++;
1189 if (NCH(n) == 2)
1190 return n_ifs;
1191 n = CHILD(n, 2);
1192 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193}
1194
Guido van Rossum992d4a32007-07-11 13:09:30 +00001195static asdl_seq *
1196ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001199 asdl_seq *comps;
1200
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001201 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 if (n_fors == -1)
1203 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001204
Nick Coghlan650f0d02007-04-15 12:05:43 +00001205 comps = asdl_seq_new(n_fors, c->c_arena);
1206 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001208
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001210 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001212 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001213 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214
Guido van Rossum992d4a32007-07-11 13:09:30 +00001215 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216
Guido van Rossum992d4a32007-07-11 13:09:30 +00001217 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001218 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001219 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001221 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001222 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001224
Thomas Wouters89f507f2006-12-13 04:49:30 +00001225 /* Check the # of children rather than the length of t, since
1226 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001227 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001228 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001229 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001231 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1232 c->c_arena),
1233 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001234 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001236
Guido van Rossum992d4a32007-07-11 13:09:30 +00001237 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238 int j, n_ifs;
1239 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240
Guido van Rossum992d4a32007-07-11 13:09:30 +00001241 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001242 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001243 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001245
1246 ifs = asdl_seq_new(n_ifs, c->c_arena);
1247 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001249
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001251 REQ(n, comp_iter);
1252 n = CHILD(n, 0);
1253 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254
Guido van Rossum992d4a32007-07-11 13:09:30 +00001255 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001256 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001257 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001258 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001259 if (NCH(n) == 3)
1260 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001262 /* on exit, must guarantee that n is a comp_for */
1263 if (TYPE(n) == comp_iter)
1264 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001265 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001267 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001269 return comps;
1270}
1271
1272static expr_ty
1273ast_for_itercomp(struct compiling *c, const node *n, int type)
1274{
1275 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1276 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1277 expr_ty elt;
1278 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279
Guido van Rossum992d4a32007-07-11 13:09:30 +00001280 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281
Guido van Rossum992d4a32007-07-11 13:09:30 +00001282 elt = ast_for_expr(c, CHILD(n, 0));
1283 if (!elt)
1284 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285
Guido van Rossum992d4a32007-07-11 13:09:30 +00001286 comps = ast_for_comprehension(c, CHILD(n, 1));
1287 if (!comps)
1288 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001289
1290 if (type == COMP_GENEXP)
1291 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1292 else if (type == COMP_LISTCOMP)
1293 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1294 else if (type == COMP_SETCOMP)
1295 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1296 else
1297 /* Should never happen */
1298 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299}
1300
1301static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001302ast_for_dictcomp(struct compiling *c, const node *n)
1303{
1304 expr_ty key, value;
1305 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306
Guido van Rossum992d4a32007-07-11 13:09:30 +00001307 assert(NCH(n) > 3);
1308 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309
Guido van Rossum992d4a32007-07-11 13:09:30 +00001310 key = ast_for_expr(c, CHILD(n, 0));
1311 if (!key)
1312 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001313 value = ast_for_expr(c, CHILD(n, 2));
1314 if (!value)
1315 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316
Guido van Rossum992d4a32007-07-11 13:09:30 +00001317 comps = ast_for_comprehension(c, CHILD(n, 3));
1318 if (!comps)
1319 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320
Guido van Rossum992d4a32007-07-11 13:09:30 +00001321 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1322}
1323
1324static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001325ast_for_genexp(struct compiling *c, const node *n)
1326{
1327 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001328 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001329}
1330
1331static expr_ty
1332ast_for_listcomp(struct compiling *c, const node *n)
1333{
1334 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001335 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001336}
1337
1338static expr_ty
1339ast_for_setcomp(struct compiling *c, const node *n)
1340{
1341 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001342 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001343}
1344
1345
1346static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347ast_for_atom(struct compiling *c, const node *n)
1348{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001349 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1350 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001351 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 */
1353 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001354 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001357 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001358 /* All names start in Load context, but may later be
1359 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001360 PyObject *name = NEW_IDENTIFIER(ch);
1361 if (!name)
1362 return NULL;
1363 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1364 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001366 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001367 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001368 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001369 PyObject *type, *value, *tback, *errstr;
1370 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001371 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001372 if (errstr) {
1373 char *s = "";
1374 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001375 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001376 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1377 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001378 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001379 } else {
1380 ast_error(n, "(unicode error) unknown error");
1381 }
1382 Py_DECREF(type);
1383 Py_DECREF(value);
1384 Py_XDECREF(tback);
1385 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001386 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001387 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001388 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001389 if (bytesmode)
1390 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1391 else
1392 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393 }
1394 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001395 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 if (!pynum)
1397 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001398
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 PyArena_AddPyObject(c->c_arena, pynum);
1400 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 }
Georg Brandldde00282007-03-18 19:01:53 +00001402 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001403 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001405 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406
Thomas Wouters89f507f2006-12-13 04:49:30 +00001407 if (TYPE(ch) == RPAR)
1408 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 if (TYPE(ch) == yield_expr)
1411 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001414 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001415 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001416
Nick Coghlan650f0d02007-04-15 12:05:43 +00001417 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001419 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420
Thomas Wouters89f507f2006-12-13 04:49:30 +00001421 if (TYPE(ch) == RSQB)
1422 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423
Nick Coghlan650f0d02007-04-15 12:05:43 +00001424 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001425 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1426 asdl_seq *elts = seq_for_testlist(c, ch);
1427 if (!elts)
1428 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001429
Thomas Wouters89f507f2006-12-13 04:49:30 +00001430 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1431 }
1432 else
1433 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001435 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1436 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001437 int i, size;
1438 asdl_seq *keys, *values;
1439
1440 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001441 if (TYPE(ch) == RBRACE) {
1442 /* it's an empty dict */
1443 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1444 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1445 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001446 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001448 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001449 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001450 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001451 for (i = 0; i < NCH(ch); i += 2) {
1452 expr_ty expression;
1453 expression = ast_for_expr(c, CHILD(ch, i));
1454 if (!expression)
1455 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001456 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001457 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001458 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1459 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1460 /* it's a set comprehension */
1461 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001462 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1463 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001464 } else {
1465 /* it's a dict */
1466 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1467 keys = asdl_seq_new(size, c->c_arena);
1468 if (!keys)
1469 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470
Guido van Rossum86e58e22006-08-28 15:27:34 +00001471 values = asdl_seq_new(size, c->c_arena);
1472 if (!values)
1473 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474
Guido van Rossum86e58e22006-08-28 15:27:34 +00001475 for (i = 0; i < NCH(ch); i += 4) {
1476 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477
Guido van Rossum86e58e22006-08-28 15:27:34 +00001478 expression = ast_for_expr(c, CHILD(ch, i));
1479 if (!expression)
1480 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001481
Guido van Rossum86e58e22006-08-28 15:27:34 +00001482 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001483
Guido van Rossum86e58e22006-08-28 15:27:34 +00001484 expression = ast_for_expr(c, CHILD(ch, i + 2));
1485 if (!expression)
1486 return NULL;
1487
1488 asdl_seq_SET(values, i / 4, expression);
1489 }
1490 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1491 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1495 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 }
1497}
1498
1499static slice_ty
1500ast_for_slice(struct compiling *c, const node *n)
1501{
1502 node *ch;
1503 expr_ty lower = NULL, upper = NULL, step = NULL;
1504
1505 REQ(n, subscript);
1506
1507 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001508 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 sliceop: ':' [test]
1510 */
1511 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 if (NCH(n) == 1 && TYPE(ch) == test) {
1513 /* 'step' variable hold no significance in terms of being used over
1514 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516 if (!step)
1517 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518
Thomas Wouters89f507f2006-12-13 04:49:30 +00001519 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 }
1521
1522 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001523 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524 if (!lower)
1525 return NULL;
1526 }
1527
1528 /* If there's an upper bound it's in the second or third position. */
1529 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001530 if (NCH(n) > 1) {
1531 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533 if (TYPE(n2) == test) {
1534 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535 if (!upper)
1536 return NULL;
1537 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001538 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001540 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541
Thomas Wouters89f507f2006-12-13 04:49:30 +00001542 if (TYPE(n2) == test) {
1543 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544 if (!upper)
1545 return NULL;
1546 }
1547 }
1548
1549 ch = CHILD(n, NCH(n) - 1);
1550 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001551 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001552 ch = CHILD(ch, 1);
1553 if (TYPE(ch) == test) {
1554 step = ast_for_expr(c, ch);
1555 if (!step)
1556 return NULL;
1557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 }
1559 }
1560
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001561 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562}
1563
1564static expr_ty
1565ast_for_binop(struct compiling *c, const node *n)
1566{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001569 BinOp(BinOp(A, op, B), op, C).
1570 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571
Guido van Rossumd8faa362007-04-27 19:54:29 +00001572 int i, nops;
1573 expr_ty expr1, expr2, result;
1574 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575
Guido van Rossumd8faa362007-04-27 19:54:29 +00001576 expr1 = ast_for_expr(c, CHILD(n, 0));
1577 if (!expr1)
1578 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579
Guido van Rossumd8faa362007-04-27 19:54:29 +00001580 expr2 = ast_for_expr(c, CHILD(n, 2));
1581 if (!expr2)
1582 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583
Guido van Rossumd8faa362007-04-27 19:54:29 +00001584 newoperator = get_operator(CHILD(n, 1));
1585 if (!newoperator)
1586 return NULL;
1587
1588 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1589 c->c_arena);
1590 if (!result)
1591 return NULL;
1592
1593 nops = (NCH(n) - 1) / 2;
1594 for (i = 1; i < nops; i++) {
1595 expr_ty tmp_result, tmp;
1596 const node* next_oper = CHILD(n, i * 2 + 1);
1597
1598 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001599 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600 return NULL;
1601
Guido van Rossumd8faa362007-04-27 19:54:29 +00001602 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1603 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604 return NULL;
1605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001607 LINENO(next_oper), next_oper->n_col_offset,
1608 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001610 return NULL;
1611 result = tmp_result;
1612 }
1613 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001614}
1615
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001616static expr_ty
1617ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001620 subscriptlist: subscript (',' subscript)* [',']
1621 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1622 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001623 REQ(n, trailer);
1624 if (TYPE(CHILD(n, 0)) == LPAR) {
1625 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001626 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1627 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001628 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001629 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001630 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001631 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001632 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1633 if (!attr_id)
1634 return NULL;
1635 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001636 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001637 }
1638 else {
1639 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001640 REQ(CHILD(n, 2), RSQB);
1641 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001643 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1644 if (!slc)
1645 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001646 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1647 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001648 }
1649 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001651 by treating the sequence as a tuple literal if there are
1652 no slice features.
1653 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 int j;
1655 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001657 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001658 asdl_seq *slices, *elts;
1659 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660 if (!slices)
1661 return NULL;
1662 for (j = 0; j < NCH(n); j += 2) {
1663 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001664 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001665 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001666 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001667 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001668 asdl_seq_SET(slices, j / 2, slc);
1669 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001670 if (!simple) {
1671 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001672 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001673 }
1674 /* extract Index values and put them in a Tuple */
1675 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001676 if (!elts)
1677 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001678 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1679 slc = (slice_ty)asdl_seq_GET(slices, j);
1680 assert(slc->kind == Index_kind && slc->v.Index.value);
1681 asdl_seq_SET(elts, j, slc->v.Index.value);
1682 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001683 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001684 if (!e)
1685 return NULL;
1686 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001687 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001688 }
1689 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001690}
1691
1692static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001693ast_for_factor(struct compiling *c, const node *n)
1694{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001695 expr_ty expression;
1696
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001697 expression = ast_for_expr(c, CHILD(n, 1));
1698 if (!expression)
1699 return NULL;
1700
1701 switch (TYPE(CHILD(n, 0))) {
1702 case PLUS:
1703 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1704 c->c_arena);
1705 case MINUS:
1706 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1707 c->c_arena);
1708 case TILDE:
1709 return UnaryOp(Invert, expression, LINENO(n),
1710 n->n_col_offset, c->c_arena);
1711 }
1712 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1713 TYPE(CHILD(n, 0)));
1714 return NULL;
1715}
1716
1717static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001718ast_for_power(struct compiling *c, const node *n)
1719{
1720 /* power: atom trailer* ('**' factor)*
1721 */
1722 int i;
1723 expr_ty e, tmp;
1724 REQ(n, power);
1725 e = ast_for_atom(c, CHILD(n, 0));
1726 if (!e)
1727 return NULL;
1728 if (NCH(n) == 1)
1729 return e;
1730 for (i = 1; i < NCH(n); i++) {
1731 node *ch = CHILD(n, i);
1732 if (TYPE(ch) != trailer)
1733 break;
1734 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001735 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001736 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001737 tmp->lineno = e->lineno;
1738 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001739 e = tmp;
1740 }
1741 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1742 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001743 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001744 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001745 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001746 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001747 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001748 e = tmp;
1749 }
1750 return e;
1751}
1752
Guido van Rossum0368b722007-05-11 16:50:42 +00001753static expr_ty
1754ast_for_starred(struct compiling *c, const node *n)
1755{
1756 expr_ty tmp;
1757 REQ(n, star_expr);
1758
1759 tmp = ast_for_expr(c, CHILD(n, 1));
1760 if (!tmp)
1761 return NULL;
1762
1763 /* The Load context is changed later. */
1764 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1765}
1766
1767
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768/* Do not name a variable 'expr'! Will cause a compile error.
1769*/
1770
1771static expr_ty
1772ast_for_expr(struct compiling *c, const node *n)
1773{
1774 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001775 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001776 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 and_test: not_test ('and' not_test)*
1779 not_test: 'not' not_test | comparison
1780 comparison: expr (comp_op expr)*
1781 expr: xor_expr ('|' xor_expr)*
1782 xor_expr: and_expr ('^' and_expr)*
1783 and_expr: shift_expr ('&' shift_expr)*
1784 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1785 arith_expr: term (('+'|'-') term)*
1786 term: factor (('*'|'/'|'%'|'//') factor)*
1787 factor: ('+'|'-'|'~') factor | power
1788 power: atom trailer* ('**' factor)*
1789 */
1790
1791 asdl_seq *seq;
1792 int i;
1793
1794 loop:
1795 switch (TYPE(n)) {
1796 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001797 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001798 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001799 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001801 else if (NCH(n) > 1)
1802 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001803 /* Fallthrough */
1804 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 case and_test:
1806 if (NCH(n) == 1) {
1807 n = CHILD(n, 0);
1808 goto loop;
1809 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001810 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811 if (!seq)
1812 return NULL;
1813 for (i = 0; i < NCH(n); i += 2) {
1814 expr_ty e = ast_for_expr(c, CHILD(n, i));
1815 if (!e)
1816 return NULL;
1817 asdl_seq_SET(seq, i / 2, e);
1818 }
1819 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001820 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1821 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001822 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001823 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 case not_test:
1825 if (NCH(n) == 1) {
1826 n = CHILD(n, 0);
1827 goto loop;
1828 }
1829 else {
1830 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1831 if (!expression)
1832 return NULL;
1833
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001834 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1835 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 }
1837 case comparison:
1838 if (NCH(n) == 1) {
1839 n = CHILD(n, 0);
1840 goto loop;
1841 }
1842 else {
1843 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001844 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001845 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 if (!ops)
1848 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001849 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851 return NULL;
1852 }
1853 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001854 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001856 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001857 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001859 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860
1861 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001862 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 asdl_seq_SET(cmps, i / 2, expression);
1868 }
1869 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001870 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001874 return Compare(expression, ops, cmps, LINENO(n),
1875 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 }
1877 break;
1878
Guido van Rossum0368b722007-05-11 16:50:42 +00001879 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 /* The next five cases all handle BinOps. The main body of code
1882 is the same in each case, but the switch turned inside out to
1883 reuse the code for each type of operator.
1884 */
1885 case expr:
1886 case xor_expr:
1887 case and_expr:
1888 case shift_expr:
1889 case arith_expr:
1890 case term:
1891 if (NCH(n) == 1) {
1892 n = CHILD(n, 0);
1893 goto loop;
1894 }
1895 return ast_for_binop(c, n);
1896 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 expr_ty exp = NULL;
1898 if (NCH(n) == 2) {
1899 exp = ast_for_testlist(c, CHILD(n, 1));
1900 if (!exp)
1901 return NULL;
1902 }
1903 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1904 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001905 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 if (NCH(n) == 1) {
1907 n = CHILD(n, 0);
1908 goto loop;
1909 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001910 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001911 case power:
1912 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001914 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915 return NULL;
1916 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001917 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 return NULL;
1919}
1920
1921static expr_ty
1922ast_for_call(struct compiling *c, const node *n, expr_ty func)
1923{
1924 /*
1925 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1926 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001927 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928 */
1929
1930 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001931 asdl_seq *args;
1932 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 expr_ty vararg = NULL, kwarg = NULL;
1934
1935 REQ(n, arglist);
1936
1937 nargs = 0;
1938 nkeywords = 0;
1939 ngens = 0;
1940 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001941 node *ch = CHILD(n, i);
1942 if (TYPE(ch) == argument) {
1943 if (NCH(ch) == 1)
1944 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001945 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001946 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001948 nkeywords++;
1949 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001950 }
1951 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001952 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001953 "if not sole argument");
1954 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955 }
1956
1957 if (nargs + nkeywords + ngens > 255) {
1958 ast_error(n, "more than 255 arguments");
1959 return NULL;
1960 }
1961
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001962 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001964 return NULL;
1965 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001967 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 nargs = 0;
1969 nkeywords = 0;
1970 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001971 node *ch = CHILD(n, i);
1972 if (TYPE(ch) == argument) {
1973 expr_ty e;
1974 if (NCH(ch) == 1) {
1975 if (nkeywords) {
1976 ast_error(CHILD(ch, 0),
1977 "non-keyword arg after keyword arg");
1978 return NULL;
1979 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001980 if (vararg) {
1981 ast_error(CHILD(ch, 0),
1982 "only named arguments may follow *expression");
1983 return NULL;
1984 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001987 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001988 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001990 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001993 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001996 else {
1997 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001998 identifier key, tmp;
1999 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002004 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 /* f(lambda x: x[0] = 3) ends up getting parsed with
2006 * LHS test = lambda x: x[0], and RHS test = 3.
2007 * SF bug 132313 points out that complaining about a keyword
2008 * then is very confusing.
2009 */
2010 if (e->kind == Lambda_kind) {
2011 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002012 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 } else if (e->kind != Name_kind) {
2014 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002015 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002016 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 return NULL;
2018 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002020 for (k = 0; k < nkeywords; k++) {
2021 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2022 if (!PyUnicode_Compare(tmp, key)) {
2023 ast_error(CHILD(ch, 0), "keyword argument repeated");
2024 return NULL;
2025 }
2026 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002027 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002029 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002030 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002032 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002033 asdl_seq_SET(keywords, nkeywords++, kw);
2034 }
2035 }
2036 else if (TYPE(ch) == STAR) {
2037 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002038 if (!vararg)
2039 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002040 i++;
2041 }
2042 else if (TYPE(ch) == DOUBLESTAR) {
2043 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002044 if (!kwarg)
2045 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002046 i++;
2047 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 }
2049
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002050 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051}
2052
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002054ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002056 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002057 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002059 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002060 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002061 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002062 }
2063 else {
2064 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002065 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002066 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002068 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 else {
2070 asdl_seq *tmp = seq_for_testlist(c, n);
2071 if (!tmp)
2072 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002073 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002075}
2076
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077static stmt_ty
2078ast_for_expr_stmt(struct compiling *c, const node *n)
2079{
2080 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002083 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 test: ... here starts the operator precendence dance
2087 */
2088
2089 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002090 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 if (!e)
2092 return NULL;
2093
Thomas Wouters89f507f2006-12-13 04:49:30 +00002094 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 }
2096 else if (TYPE(CHILD(n, 1)) == augassign) {
2097 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002098 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002099 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100
Thomas Wouters89f507f2006-12-13 04:49:30 +00002101 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102 if (!expr1)
2103 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002104 if(!set_context(c, expr1, Store, ch))
2105 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002106 /* set_context checks that most expressions are not the left side.
2107 Augmented assignments can only have a name, a subscript, or an
2108 attribute on the left, though, so we have to explicitly check for
2109 those. */
2110 switch (expr1->kind) {
2111 case Name_kind:
2112 case Attribute_kind:
2113 case Subscript_kind:
2114 break;
2115 default:
2116 ast_error(ch, "illegal expression for augmented assignment");
2117 return NULL;
2118 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119
Thomas Wouters89f507f2006-12-13 04:49:30 +00002120 ch = CHILD(n, 2);
2121 if (TYPE(ch) == testlist)
2122 expr2 = ast_for_testlist(c, ch);
2123 else
2124 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002125 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 return NULL;
2127
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002128 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002129 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130 return NULL;
2131
Thomas Wouters89f507f2006-12-13 04:49:30 +00002132 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 }
2134 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002135 int i;
2136 asdl_seq *targets;
2137 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 expr_ty expression;
2139
Thomas Wouters89f507f2006-12-13 04:49:30 +00002140 /* a normal assignment */
2141 REQ(CHILD(n, 1), EQUAL);
2142 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2143 if (!targets)
2144 return NULL;
2145 for (i = 0; i < NCH(n) - 2; i += 2) {
2146 expr_ty e;
2147 node *ch = CHILD(n, i);
2148 if (TYPE(ch) == yield_expr) {
2149 ast_error(ch, "assignment to yield expression not possible");
2150 return NULL;
2151 }
2152 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002156 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002157 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002158 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159
Thomas Wouters89f507f2006-12-13 04:49:30 +00002160 asdl_seq_SET(targets, i / 2, e);
2161 }
2162 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002163 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002164 expression = ast_for_testlist(c, value);
2165 else
2166 expression = ast_for_expr(c, value);
2167 if (!expression)
2168 return NULL;
2169 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171}
2172
Benjamin Peterson78565b22009-06-28 19:19:51 +00002173
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002175ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176{
2177 asdl_seq *seq;
2178 int i;
2179 expr_ty e;
2180
2181 REQ(n, exprlist);
2182
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002183 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002185 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002187 e = ast_for_expr(c, CHILD(n, i));
2188 if (!e)
2189 return NULL;
2190 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002191 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002192 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 }
2194 return seq;
2195}
2196
2197static stmt_ty
2198ast_for_del_stmt(struct compiling *c, const node *n)
2199{
2200 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202 /* del_stmt: 'del' exprlist */
2203 REQ(n, del_stmt);
2204
2205 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2206 if (!expr_list)
2207 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002208 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209}
2210
2211static stmt_ty
2212ast_for_flow_stmt(struct compiling *c, const node *n)
2213{
2214 /*
2215 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2216 | yield_stmt
2217 break_stmt: 'break'
2218 continue_stmt: 'continue'
2219 return_stmt: 'return' [testlist]
2220 yield_stmt: yield_expr
2221 yield_expr: 'yield' testlist
2222 raise_stmt: 'raise' [test [',' test [',' test]]]
2223 */
2224 node *ch;
2225
2226 REQ(n, flow_stmt);
2227 ch = CHILD(n, 0);
2228 switch (TYPE(ch)) {
2229 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002230 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002232 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002234 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2235 if (!exp)
2236 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002237 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 }
2239 case return_stmt:
2240 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002241 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002243 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 if (!expression)
2245 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002246 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247 }
2248 case raise_stmt:
2249 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002250 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2251 else if (NCH(ch) >= 2) {
2252 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2254 if (!expression)
2255 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002256 if (NCH(ch) == 4) {
2257 cause = ast_for_expr(c, CHILD(ch, 3));
2258 if (!cause)
2259 return NULL;
2260 }
2261 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 }
2263 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002264 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 "unexpected flow_stmt: %d", TYPE(ch));
2266 return NULL;
2267 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002268
2269 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2270 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271}
2272
2273static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002274alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275{
2276 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002277 import_as_name: NAME ['as' NAME]
2278 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 dotted_name: NAME ('.' NAME)*
2280 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002281 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002282
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 loop:
2284 switch (TYPE(n)) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002285 case import_as_name: {
2286 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002287 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002288 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002289 if (!name)
2290 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002291 if (NCH(n) == 3) {
2292 node *str_node = CHILD(n, 2);
2293 str = NEW_IDENTIFIER(str_node);
2294 if (!str)
2295 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002296 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002297 return NULL;
2298 }
2299 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002300 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002301 return NULL;
2302 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002303 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002304 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 case dotted_as_name:
2306 if (NCH(n) == 1) {
2307 n = CHILD(n, 0);
2308 goto loop;
2309 }
2310 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002311 node *asname_node = CHILD(n, 2);
2312 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002313 if (!a)
2314 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002316 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002317 if (!a->asname)
2318 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002319 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002320 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 return a;
2322 }
2323 break;
2324 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002325 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002326 node *name_node = CHILD(n, 0);
2327 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002328 if (!name)
2329 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002330 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002331 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002332 return alias(name, NULL, c->c_arena);
2333 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 else {
2335 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002336 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002337 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340
2341 len = 0;
2342 for (i = 0; i < NCH(n); i += 2)
2343 /* length of string plus one for the dot */
2344 len += strlen(STR(CHILD(n, i))) + 1;
2345 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002346 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 if (!str)
2348 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002349 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 if (!s)
2351 return NULL;
2352 for (i = 0; i < NCH(n); i += 2) {
2353 char *sch = STR(CHILD(n, i));
2354 strcpy(s, STR(CHILD(n, i)));
2355 s += strlen(sch);
2356 *s++ = '.';
2357 }
2358 --s;
2359 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2361 PyBytes_GET_SIZE(str),
2362 NULL);
2363 Py_DECREF(str);
2364 if (!uni)
2365 return NULL;
2366 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002367 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002368 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002369 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 }
2371 break;
2372 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002373 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002374 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002375 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002377 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002378 "unexpected import name: %d", TYPE(n));
2379 return NULL;
2380 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002381
2382 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 return NULL;
2384}
2385
2386static stmt_ty
2387ast_for_import_stmt(struct compiling *c, const node *n)
2388{
2389 /*
2390 import_stmt: import_name | import_from
2391 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002392 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2393 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002395 int lineno;
2396 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 int i;
2398 asdl_seq *aliases;
2399
2400 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002401 lineno = LINENO(n);
2402 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002404 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002406 REQ(n, dotted_as_names);
2407 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2408 if (!aliases)
2409 return NULL;
2410 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002411 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002412 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002414 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002416 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002418 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 int idx, ndots = 0;
2421 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002422 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002424 /* Count the number of dots (for relative imports) and check for the
2425 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 for (idx = 1; idx < NCH(n); idx++) {
2427 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002428 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2429 if (!mod)
2430 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 idx++;
2432 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002433 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002435 ndots += 3;
2436 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 } else if (TYPE(CHILD(n, idx)) != DOT) {
2438 break;
2439 }
2440 ndots++;
2441 }
2442 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002443 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002444 case STAR:
2445 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002446 n = CHILD(n, idx);
2447 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448 break;
2449 case LPAR:
2450 /* from ... import (x, y, z) */
2451 n = CHILD(n, idx + 1);
2452 n_children = NCH(n);
2453 break;
2454 case import_as_names:
2455 /* from ... import x, y, z */
2456 n = CHILD(n, idx);
2457 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002458 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459 ast_error(n, "trailing comma not allowed without"
2460 " surrounding parentheses");
2461 return NULL;
2462 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 break;
2464 default:
2465 ast_error(n, "Unexpected node-type in from-import");
2466 return NULL;
2467 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2470 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472
2473 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002474 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002475 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002476 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002478 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002480 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002482 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002483 if (!import_alias)
2484 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002485 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002486 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002488 if (mod != NULL)
2489 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002490 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002491 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 }
Neal Norwitz79792652005-11-14 04:25:03 +00002493 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 "unknown import statement: starts with command '%s'",
2495 STR(CHILD(n, 0)));
2496 return NULL;
2497}
2498
2499static stmt_ty
2500ast_for_global_stmt(struct compiling *c, const node *n)
2501{
2502 /* global_stmt: 'global' NAME (',' NAME)* */
2503 identifier name;
2504 asdl_seq *s;
2505 int i;
2506
2507 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002508 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002512 name = NEW_IDENTIFIER(CHILD(n, i));
2513 if (!name)
2514 return NULL;
2515 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002517 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518}
2519
2520static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002521ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2522{
2523 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2524 identifier name;
2525 asdl_seq *s;
2526 int i;
2527
2528 REQ(n, nonlocal_stmt);
2529 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2530 if (!s)
2531 return NULL;
2532 for (i = 1; i < NCH(n); i += 2) {
2533 name = NEW_IDENTIFIER(CHILD(n, i));
2534 if (!name)
2535 return NULL;
2536 asdl_seq_SET(s, i / 2, name);
2537 }
2538 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2539}
2540
2541static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542ast_for_assert_stmt(struct compiling *c, const node *n)
2543{
2544 /* assert_stmt: 'assert' test [',' test] */
2545 REQ(n, assert_stmt);
2546 if (NCH(n) == 2) {
2547 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2548 if (!expression)
2549 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002550 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 }
2552 else if (NCH(n) == 4) {
2553 expr_ty expr1, expr2;
2554
2555 expr1 = ast_for_expr(c, CHILD(n, 1));
2556 if (!expr1)
2557 return NULL;
2558 expr2 = ast_for_expr(c, CHILD(n, 3));
2559 if (!expr2)
2560 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561
Thomas Wouters89f507f2006-12-13 04:49:30 +00002562 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 }
Neal Norwitz79792652005-11-14 04:25:03 +00002564 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 "improper number of parts to 'assert' statement: %d",
2566 NCH(n));
2567 return NULL;
2568}
2569
2570static asdl_seq *
2571ast_for_suite(struct compiling *c, const node *n)
2572{
2573 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002574 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 stmt_ty s;
2576 int i, total, num, end, pos = 0;
2577 node *ch;
2578
2579 REQ(n, suite);
2580
2581 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002582 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002584 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002586 n = CHILD(n, 0);
2587 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 */
2590 end = NCH(n) - 1;
2591 if (TYPE(CHILD(n, end - 1)) == SEMI)
2592 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 for (i = 0; i < end; i += 2) {
2595 ch = CHILD(n, i);
2596 s = ast_for_stmt(c, ch);
2597 if (!s)
2598 return NULL;
2599 asdl_seq_SET(seq, pos++, s);
2600 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 }
2602 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002603 for (i = 2; i < (NCH(n) - 1); i++) {
2604 ch = CHILD(n, i);
2605 REQ(ch, stmt);
2606 num = num_stmts(ch);
2607 if (num == 1) {
2608 /* small_stmt or compound_stmt with only one child */
2609 s = ast_for_stmt(c, ch);
2610 if (!s)
2611 return NULL;
2612 asdl_seq_SET(seq, pos++, s);
2613 }
2614 else {
2615 int j;
2616 ch = CHILD(ch, 0);
2617 REQ(ch, simple_stmt);
2618 for (j = 0; j < NCH(ch); j += 2) {
2619 /* statement terminates with a semi-colon ';' */
2620 if (NCH(CHILD(ch, j)) == 0) {
2621 assert((j + 1) == NCH(ch));
2622 break;
2623 }
2624 s = ast_for_stmt(c, CHILD(ch, j));
2625 if (!s)
2626 return NULL;
2627 asdl_seq_SET(seq, pos++, s);
2628 }
2629 }
2630 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631 }
2632 assert(pos == seq->size);
2633 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634}
2635
2636static stmt_ty
2637ast_for_if_stmt(struct compiling *c, const node *n)
2638{
2639 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2640 ['else' ':' suite]
2641 */
2642 char *s;
2643
2644 REQ(n, if_stmt);
2645
2646 if (NCH(n) == 4) {
2647 expr_ty expression;
2648 asdl_seq *suite_seq;
2649
2650 expression = ast_for_expr(c, CHILD(n, 1));
2651 if (!expression)
2652 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002654 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656
Guido van Rossumd8faa362007-04-27 19:54:29 +00002657 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2658 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002660
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 s = STR(CHILD(n, 4));
2662 /* s[2], the third character in the string, will be
2663 's' for el_s_e, or
2664 'i' for el_i_f
2665 */
2666 if (s[2] == 's') {
2667 expr_ty expression;
2668 asdl_seq *seq1, *seq2;
2669
2670 expression = ast_for_expr(c, CHILD(n, 1));
2671 if (!expression)
2672 return NULL;
2673 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002674 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 return NULL;
2676 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 return NULL;
2679
Guido van Rossumd8faa362007-04-27 19:54:29 +00002680 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2681 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 }
2683 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002685 expr_ty expression;
2686 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 asdl_seq *orelse = NULL;
2688 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 /* must reference the child n_elif+1 since 'else' token is third,
2690 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002691 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2692 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2693 has_else = 1;
2694 n_elif -= 3;
2695 }
2696 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697
Thomas Wouters89f507f2006-12-13 04:49:30 +00002698 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002699 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Thomas Wouters89f507f2006-12-13 04:49:30 +00002701 orelse = asdl_seq_new(1, c->c_arena);
2702 if (!orelse)
2703 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002705 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002707 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2708 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002710 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2711 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 asdl_seq_SET(orelse, 0,
2715 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002716 LINENO(CHILD(n, NCH(n) - 6)),
2717 CHILD(n, NCH(n) - 6)->n_col_offset,
2718 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 /* the just-created orelse handled the last elif */
2720 n_elif--;
2721 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722
Thomas Wouters89f507f2006-12-13 04:49:30 +00002723 for (i = 0; i < n_elif; i++) {
2724 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2726 if (!newobj)
2727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002729 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002732 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002737 LINENO(CHILD(n, off)),
2738 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002739 orelse = newobj;
2740 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002741 expression = ast_for_expr(c, CHILD(n, 1));
2742 if (!expression)
2743 return NULL;
2744 suite_seq = ast_for_suite(c, CHILD(n, 3));
2745 if (!suite_seq)
2746 return NULL;
2747 return If(expression, suite_seq, orelse,
2748 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002750
2751 PyErr_Format(PyExc_SystemError,
2752 "unexpected token in 'if' statement: %s", s);
2753 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754}
2755
2756static stmt_ty
2757ast_for_while_stmt(struct compiling *c, const node *n)
2758{
2759 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2760 REQ(n, while_stmt);
2761
2762 if (NCH(n) == 4) {
2763 expr_ty expression;
2764 asdl_seq *suite_seq;
2765
2766 expression = ast_for_expr(c, CHILD(n, 1));
2767 if (!expression)
2768 return NULL;
2769 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002770 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002772 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773 }
2774 else if (NCH(n) == 7) {
2775 expr_ty expression;
2776 asdl_seq *seq1, *seq2;
2777
2778 expression = ast_for_expr(c, CHILD(n, 1));
2779 if (!expression)
2780 return NULL;
2781 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002782 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 return NULL;
2784 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 return NULL;
2787
Thomas Wouters89f507f2006-12-13 04:49:30 +00002788 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002790
2791 PyErr_Format(PyExc_SystemError,
2792 "wrong number of tokens for 'while' statement: %d",
2793 NCH(n));
2794 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795}
2796
2797static stmt_ty
2798ast_for_for_stmt(struct compiling *c, const node *n)
2799{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002800 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002802 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002803 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2805 REQ(n, for_stmt);
2806
2807 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002808 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 if (!seq)
2810 return NULL;
2811 }
2812
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002813 node_target = CHILD(n, 1);
2814 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002815 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002817 /* Check the # of children rather than the length of _target, since
2818 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002819 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002820 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002821 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002823 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002825 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002826 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 return NULL;
2828 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002829 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 return NULL;
2831
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002832 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2833 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834}
2835
2836static excepthandler_ty
2837ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2838{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002839 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 REQ(exc, except_clause);
2841 REQ(body, suite);
2842
2843 if (NCH(exc) == 1) {
2844 asdl_seq *suite_seq = ast_for_suite(c, body);
2845 if (!suite_seq)
2846 return NULL;
2847
Neal Norwitzad74aa82008-03-31 05:14:30 +00002848 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002849 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 }
2851 else if (NCH(exc) == 2) {
2852 expr_ty expression;
2853 asdl_seq *suite_seq;
2854
2855 expression = ast_for_expr(c, CHILD(exc, 1));
2856 if (!expression)
2857 return NULL;
2858 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002859 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 return NULL;
2861
Neal Norwitzad74aa82008-03-31 05:14:30 +00002862 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002863 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 }
2865 else if (NCH(exc) == 4) {
2866 asdl_seq *suite_seq;
2867 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002868 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002869 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002871 if (forbidden_name(e, CHILD(exc, 3), 0))
2872 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002874 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 return NULL;
2876 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002877 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 return NULL;
2879
Neal Norwitzad74aa82008-03-31 05:14:30 +00002880 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002881 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002883
2884 PyErr_Format(PyExc_SystemError,
2885 "wrong number of children for 'except' clause: %d",
2886 NCH(exc));
2887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888}
2889
2890static stmt_ty
2891ast_for_try_stmt(struct compiling *c, const node *n)
2892{
Neal Norwitzf599f422005-12-17 21:33:47 +00002893 const int nch = NCH(n);
2894 int n_except = (nch - 3)/3;
2895 asdl_seq *body, *orelse = NULL, *finally = NULL;
2896
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 REQ(n, try_stmt);
2898
Neal Norwitzf599f422005-12-17 21:33:47 +00002899 body = ast_for_suite(c, CHILD(n, 2));
2900 if (body == NULL)
2901 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902
Neal Norwitzf599f422005-12-17 21:33:47 +00002903 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2904 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2905 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2906 /* we can assume it's an "else",
2907 because nch >= 9 for try-else-finally and
2908 it would otherwise have a type of except_clause */
2909 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2910 if (orelse == NULL)
2911 return NULL;
2912 n_except--;
2913 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914
Neal Norwitzf599f422005-12-17 21:33:47 +00002915 finally = ast_for_suite(c, CHILD(n, nch - 1));
2916 if (finally == NULL)
2917 return NULL;
2918 n_except--;
2919 }
2920 else {
2921 /* we can assume it's an "else",
2922 otherwise it would have a type of except_clause */
2923 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2924 if (orelse == NULL)
2925 return NULL;
2926 n_except--;
2927 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002929 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002930 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002931 return NULL;
2932 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933
Neal Norwitzf599f422005-12-17 21:33:47 +00002934 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002935 int i;
2936 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002937 /* process except statements to create a try ... except */
2938 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2939 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 }
2949
Thomas Wouters89f507f2006-12-13 04:49:30 +00002950 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002951 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002952 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002953 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002954
2955 /* if a 'finally' is present too, we nest the TryExcept within a
2956 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002957 body = asdl_seq_new(1, c->c_arena);
2958 if (body == NULL)
2959 return NULL;
2960 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002961 }
2962
2963 /* must be a try ... finally (except clauses are in body, if any exist) */
2964 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002965 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966}
2967
Georg Brandl0c315622009-05-25 21:10:36 +00002968/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002969static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002970ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002971{
2972 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973
Georg Brandl0c315622009-05-25 21:10:36 +00002974 REQ(n, with_item);
2975 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002976 if (!context_expr)
2977 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002978 if (NCH(n) == 3) {
2979 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002980
2981 if (!optional_vars) {
2982 return NULL;
2983 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002984 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002985 return NULL;
2986 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002987 }
2988
Georg Brandl0c315622009-05-25 21:10:36 +00002989 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002991}
2992
Georg Brandl0c315622009-05-25 21:10:36 +00002993/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2994static stmt_ty
2995ast_for_with_stmt(struct compiling *c, const node *n)
2996{
2997 int i;
2998 stmt_ty ret;
2999 asdl_seq *inner;
3000
3001 REQ(n, with_stmt);
3002
3003 /* process the with items inside-out */
3004 i = NCH(n) - 1;
3005 /* the suite of the innermost with item is the suite of the with stmt */
3006 inner = ast_for_suite(c, CHILD(n, i));
3007 if (!inner)
3008 return NULL;
3009
3010 for (;;) {
3011 i -= 2;
3012 ret = ast_for_with_item(c, CHILD(n, i), inner);
3013 if (!ret)
3014 return NULL;
3015 /* was this the last item? */
3016 if (i == 1)
3017 break;
3018 /* if not, wrap the result so far in a new sequence */
3019 inner = asdl_seq_new(1, c->c_arena);
3020 if (!inner)
3021 return NULL;
3022 asdl_seq_SET(inner, 0, ret);
3023 }
3024
3025 return ret;
3026}
3027
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003029ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003031 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003032 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003033 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003034 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036 REQ(n, classdef);
3037
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003038 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 s = ast_for_suite(c, CHILD(n, 3));
3040 if (!s)
3041 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003042 classname = NEW_IDENTIFIER(CHILD(n, 1));
3043 if (!classname)
3044 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003045 if (forbidden_name(classname, CHILD(n, 3), 0))
3046 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003047 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3048 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003050
3051 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003052 s = ast_for_suite(c, CHILD(n,5));
3053 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003054 return NULL;
3055 classname = NEW_IDENTIFIER(CHILD(n, 1));
3056 if (!classname)
3057 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003058 if (forbidden_name(classname, CHILD(n, 3), 0))
3059 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003060 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3061 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 }
3063
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003064 /* class NAME '(' arglist ')' ':' suite */
3065 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003066 {
3067 PyObject *dummy_name;
3068 expr_ty dummy;
3069 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3070 if (!dummy_name)
3071 return NULL;
3072 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3073 call = ast_for_call(c, CHILD(n, 3), dummy);
3074 if (!call)
3075 return NULL;
3076 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003078 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003080 classname = NEW_IDENTIFIER(CHILD(n, 1));
3081 if (!classname)
3082 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003083 if (forbidden_name(classname, CHILD(n, 1), 0))
3084 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003085
Benjamin Peterson30760062008-11-25 04:02:28 +00003086 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003087 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003088 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089}
3090
3091static stmt_ty
3092ast_for_stmt(struct compiling *c, const node *n)
3093{
3094 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003095 assert(NCH(n) == 1);
3096 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 }
3098 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003099 assert(num_stmts(n) == 1);
3100 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 }
3102 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003103 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003104 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3105 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003106 */
3107 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 case expr_stmt:
3109 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 case del_stmt:
3111 return ast_for_del_stmt(c, n);
3112 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003113 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 case flow_stmt:
3115 return ast_for_flow_stmt(c, n);
3116 case import_stmt:
3117 return ast_for_import_stmt(c, n);
3118 case global_stmt:
3119 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003120 case nonlocal_stmt:
3121 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122 case assert_stmt:
3123 return ast_for_assert_stmt(c, n);
3124 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003125 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3127 TYPE(n), NCH(n));
3128 return NULL;
3129 }
3130 }
3131 else {
3132 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003133 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003134 */
3135 node *ch = CHILD(n, 0);
3136 REQ(n, compound_stmt);
3137 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 case if_stmt:
3139 return ast_for_if_stmt(c, ch);
3140 case while_stmt:
3141 return ast_for_while_stmt(c, ch);
3142 case for_stmt:
3143 return ast_for_for_stmt(c, ch);
3144 case try_stmt:
3145 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003146 case with_stmt:
3147 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003149 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003151 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 case decorated:
3153 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003155 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3157 TYPE(n), NCH(n));
3158 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003159 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160 }
3161}
3162
3163static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003164parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003165{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 const char *end;
3167 long x;
3168 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003169 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003172 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 errno = 0;
3174 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 if (s[0] == '0') {
3177 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3178 if (x < 0 && errno == 0) {
3179 return PyLong_FromString((char *)s,
3180 (char **)0,
3181 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003182 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003183 }
3184 else
3185 x = PyOS_strtol((char *)s, (char **)&end, 0);
3186 if (*end == '\0') {
3187 if (errno != 0)
3188 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003189 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 }
3191 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003192 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003193 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003194 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3195 if (compl.imag == -1.0 && PyErr_Occurred())
3196 return NULL;
3197 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003198 }
3199 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003200 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003201 dx = PyOS_string_to_double(s, NULL, NULL);
3202 if (dx == -1.0 && PyErr_Occurred())
3203 return NULL;
3204 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206}
3207
3208static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003209decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 PyObject *u, *v;
3212 char *s, *t;
3213 t = s = (char *)*sPtr;
3214 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3215 while (s < end && (*s & 0x80)) s++;
3216 *sPtr = s;
3217 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3218 if (u == NULL)
3219 return NULL;
3220 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3221 Py_DECREF(u);
3222 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223}
3224
3225static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003226decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228 PyObject *v, *u;
3229 char *buf;
3230 char *p;
3231 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003232
Guido van Rossumd8faa362007-04-27 19:54:29 +00003233 if (encoding == NULL) {
3234 buf = (char *)s;
3235 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003237 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003238 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003239 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003240 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3241 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3242 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003243 if (u == NULL)
3244 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003245 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 end = s + len;
3247 while (s < end) {
3248 if (*s == '\\') {
3249 *p++ = *s++;
3250 if (*s & 0x80) {
3251 strcpy(p, "u005c");
3252 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003253 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003254 }
3255 if (*s & 0x80) { /* XXX inefficient */
3256 PyObject *w;
3257 char *r;
3258 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003259 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003260 if (w == NULL) {
3261 Py_DECREF(u);
3262 return NULL;
3263 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003264 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003265 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003266 assert(rn % 4 == 0);
3267 for (i = 0; i < rn; i += 4) {
3268 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003270 r[i + 1] & 0xFF,
3271 r[i + 2] & 0xFF,
3272 r[i + 3] & 0xFF);
3273 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003274 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003275 /* Should be impossible to overflow */
3276 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003277 Py_DECREF(w);
3278 } else {
3279 *p++ = *s++;
3280 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003281 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003282 len = p - buf;
3283 s = buf;
3284 }
3285 if (rawmode)
3286 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3287 else
3288 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3289 Py_XDECREF(u);
3290 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291}
3292
3293/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003294 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 * parsestr parses it, and returns the decoded Python string object.
3296 */
3297static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003298parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003300 size_t len;
3301 const char *s = STR(n);
3302 int quote = Py_CHARMASK(*s);
3303 int rawmode = 0;
3304 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003305 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003306 if (quote == 'b' || quote == 'B') {
3307 quote = *++s;
3308 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003310 if (quote == 'r' || quote == 'R') {
3311 quote = *++s;
3312 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003313 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003314 }
3315 if (quote != '\'' && quote != '\"') {
3316 PyErr_BadInternalCall();
3317 return NULL;
3318 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003319 s++;
3320 len = strlen(s);
3321 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003323 "string to parse is too long");
3324 return NULL;
3325 }
3326 if (s[--len] != quote) {
3327 PyErr_BadInternalCall();
3328 return NULL;
3329 }
3330 if (len >= 4 && s[0] == quote && s[1] == quote) {
3331 s += 2;
3332 len -= 2;
3333 if (s[--len] != quote || s[--len] != quote) {
3334 PyErr_BadInternalCall();
3335 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003336 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003338 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003339 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003340 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003341 if (*bytesmode) {
3342 /* Disallow non-ascii characters (but not escapes) */
3343 const char *c;
3344 for (c = s; *c; c++) {
3345 if (Py_CHARMASK(*c) >= 0x80) {
3346 ast_error(n, "bytes can only contain ASCII "
3347 "literal characters.");
3348 return NULL;
3349 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003350 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003351 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003352 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003353 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003354 if (rawmode || strchr(s, '\\') == NULL) {
3355 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003356 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003357 if (u == NULL || !*bytesmode)
3358 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003359 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003360 Py_DECREF(u);
3361 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003362 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003363 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003364 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003365 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003367 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003368 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003369 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003370 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003371 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003372}
3373
Guido van Rossum29fd7122007-11-12 01:13:56 +00003374/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 * compile-time literal catenation, calling parsestr() on each piece, and
3376 * pasting the intermediate results together.
3377 */
3378static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003379parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003381 PyObject *v;
3382 int i;
3383 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003384 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003385 if (v != NULL) {
3386 /* String literal concatenation */
3387 for (i = 1; i < NCH(n); i++) {
3388 PyObject *s;
3389 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003390 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003391 if (s == NULL)
3392 goto onError;
3393 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003394 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003395 goto onError;
3396 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003397 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3398 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003399 if (v == NULL)
3400 goto onError;
3401 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003402 else {
3403 PyObject *temp = PyUnicode_Concat(v, s);
3404 Py_DECREF(s);
3405 Py_DECREF(v);
3406 v = temp;
3407 if (v == NULL)
3408 goto onError;
3409 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003410 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003411 }
3412 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413
Guido van Rossumd8faa362007-04-27 19:54:29 +00003414 onError:
3415 Py_XDECREF(v);
3416 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003417}