blob: dfcc8e32e150745975412eed258e7355ae16e965 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
61 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000062 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000063 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
74 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 Py_DECREF(value);
122
123 loc = PyErr_ProgramText(filename, lineno);
124 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000125 Py_INCREF(Py_None);
126 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000128 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_DECREF(errstr);
132 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000133 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 Py_DECREF(errstr);
136 Py_DECREF(tmp);
137 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyErr_Restore(type, value, tback);
140}
141
142/* num_stmts() returns number of contained statements.
143
144 Use this routine to determine how big a sequence is needed for
145 the statements in a parse tree. Its raison d'etre is this bit of
146 grammar:
147
148 stmt: simple_stmt | compound_stmt
149 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
150
151 A simple_stmt can contain multiple small_stmt elements joined
152 by semicolons. If the arg is a simple_stmt, the number of
153 small_stmt elements is returned.
154*/
155
156static int
157num_stmts(const node *n)
158{
159 int i, l;
160 node *ch;
161
162 switch (TYPE(n)) {
163 case single_input:
164 if (TYPE(CHILD(n, 0)) == NEWLINE)
165 return 0;
166 else
167 return num_stmts(CHILD(n, 0));
168 case file_input:
169 l = 0;
170 for (i = 0; i < NCH(n); i++) {
171 ch = CHILD(n, i);
172 if (TYPE(ch) == stmt)
173 l += num_stmts(ch);
174 }
175 return l;
176 case stmt:
177 return num_stmts(CHILD(n, 0));
178 case compound_stmt:
179 return 1;
180 case simple_stmt:
181 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
182 case suite:
183 if (NCH(n) == 1)
184 return num_stmts(CHILD(n, 0));
185 else {
186 l = 0;
187 for (i = 2; i < (NCH(n) - 1); i++)
188 l += num_stmts(CHILD(n, i));
189 return l;
190 }
191 default: {
192 char buf[128];
193
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000194 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195 TYPE(n), NCH(n));
196 Py_FatalError(buf);
197 }
198 }
199 assert(0);
200 return 0;
201}
202
203/* Transform the CST rooted at node * to the appropriate AST
204*/
205
206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 asdl_seq *stmts = NULL;
212 stmt_ty s;
213 node *ch;
214 struct compiling c;
215
216 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000218 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000219#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220 ast_error(n, "encoding declaration in Unicode string");
221 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000222#endif
223 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 } else if (TYPE(n) == encoding_decl) {
226 c.c_encoding = STR(n);
227 n = CHILD(n, 0);
228 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000229 /* PEP 3120 */
230 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000232 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000233 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 switch (TYPE(n)) {
237 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 for (i = 0; i < NCH(n) - 1; i++) {
242 ch = CHILD(n, i);
243 if (TYPE(ch) == NEWLINE)
244 continue;
245 REQ(ch, stmt);
246 num = num_stmts(ch);
247 if (num == 1) {
248 s = ast_for_stmt(&c, ch);
249 if (!s)
250 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000251 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 ch = CHILD(ch, 0);
255 REQ(ch, simple_stmt);
256 for (j = 0; j < num; j++) {
257 s = ast_for_stmt(&c, CHILD(ch, j * 2));
258 if (!s)
259 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000260 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 }
262 }
263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000264 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 case eval_input: {
266 expr_ty testlist_ast;
267
Nick Coghlan650f0d02007-04-15 12:05:43 +0000268 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000269 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!testlist_ast)
271 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000272 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 }
274 case single_input:
275 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000276 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000279 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
280 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000281 if (!asdl_seq_GET(stmts, 0))
282 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 }
285 else {
286 n = CHILD(n, 0);
287 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 s = ast_for_stmt(&c, n);
293 if (!s)
294 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 asdl_seq_SET(stmts, 0, s);
296 }
297 else {
298 /* Only a simple_stmt can contain multiple statements. */
299 REQ(n, simple_stmt);
300 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (TYPE(CHILD(n, i)) == NEWLINE)
302 break;
303 s = ast_for_stmt(&c, CHILD(n, i));
304 if (!s)
305 goto error;
306 asdl_seq_SET(stmts, i / 2, s);
307 }
308 }
309
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000313 PyErr_Format(PyExc_SystemError,
314 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 goto error;
316 }
317 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 ast_error_finish(filename);
319 return NULL;
320}
321
322/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
323*/
324
325static operator_ty
326get_operator(const node *n)
327{
328 switch (TYPE(n)) {
329 case VBAR:
330 return BitOr;
331 case CIRCUMFLEX:
332 return BitXor;
333 case AMPER:
334 return BitAnd;
335 case LEFTSHIFT:
336 return LShift;
337 case RIGHTSHIFT:
338 return RShift;
339 case PLUS:
340 return Add;
341 case MINUS:
342 return Sub;
343 case STAR:
344 return Mult;
345 case SLASH:
346 return Div;
347 case DOUBLESLASH:
348 return FloorDiv;
349 case PERCENT:
350 return Mod;
351 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 }
354}
355
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356static const char* FORBIDDEN[] = {
357 "None",
358 "True",
359 "False",
360 NULL,
361};
362
363static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000364forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000366 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000367 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
368 ast_error(n, "assignment to keyword");
369 return 1;
370 }
371 if (full_checks) {
372 const char **p;
373 for (p = FORBIDDEN; *p; p++) {
374 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
375 ast_error(n, "assignment to keyword");
376 return 1;
377 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000378 }
379 }
380 return 0;
381}
382
Jeremy Hyltona8293132006-02-28 17:58:27 +0000383/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000384
385 Only sets context for expr kinds that "can appear in assignment context"
386 (according to ../Parser/Python.asdl). For other expr kinds, it sets
387 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000388*/
389
390static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000391set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392{
393 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 /* If a particular expression type can't be used for assign / delete,
395 set expr_name to its name and an error message will be generated.
396 */
397 const char* expr_name = NULL;
398
399 /* The ast defines augmented store and load contexts, but the
400 implementation here doesn't actually use them. The code may be
401 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000402 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000404 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000405 */
406 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407
408 switch (e->kind) {
409 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000411 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
412 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 e->v.Subscript.ctx = ctx;
416 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000417 case Starred_kind:
418 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000419 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000420 return 0;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000423 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000424 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000425 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 }
427 e->v.Name.ctx = ctx;
428 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430 e->v.List.ctx = ctx;
431 s = e->v.List.elts;
432 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000434 if (asdl_seq_LEN(e->v.Tuple.elts)) {
435 e->v.Tuple.ctx = ctx;
436 s = e->v.Tuple.elts;
437 }
438 else {
439 expr_name = "()";
440 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 case Lambda_kind:
443 expr_name = "lambda";
444 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 case UnaryOp_kind:
451 expr_name = "operator";
452 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 expr_name = "generator expression";
455 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456 case Yield_kind:
457 expr_name = "yield expression";
458 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 case ListComp_kind:
460 expr_name = "list comprehension";
461 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000462 case SetComp_kind:
463 expr_name = "set comprehension";
464 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000465 case DictComp_kind:
466 expr_name = "dict comprehension";
467 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000469 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 case Num_kind:
471 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000472 expr_name = "literal";
473 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000474 case Ellipsis_kind:
475 expr_name = "Ellipsis";
476 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000477 case Compare_kind:
478 expr_name = "comparison";
479 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000480 case IfExp_kind:
481 expr_name = "conditional expression";
482 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000483 default:
484 PyErr_Format(PyExc_SystemError,
485 "unexpected expression in assignment %d (line %d)",
486 e->kind, e->lineno);
487 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000489 /* Check for error string set by switch */
490 if (expr_name) {
491 char buf[300];
492 PyOS_snprintf(buf, sizeof(buf),
493 "can't %s %s",
494 ctx == Store ? "assign to" : "delete",
495 expr_name);
496 return ast_error(n, buf);
497 }
498
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000500 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501 */
502 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000503 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504
Thomas Wouters89f507f2006-12-13 04:49:30 +0000505 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000506 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000507 return 0;
508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 return 1;
511}
512
513static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000514ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515{
516 REQ(n, augassign);
517 n = CHILD(n, 0);
518 switch (STR(n)[0]) {
519 case '+':
520 return Add;
521 case '-':
522 return Sub;
523 case '/':
524 if (STR(n)[1] == '/')
525 return FloorDiv;
526 else
527 return Div;
528 case '%':
529 return Mod;
530 case '<':
531 return LShift;
532 case '>':
533 return RShift;
534 case '&':
535 return BitAnd;
536 case '^':
537 return BitXor;
538 case '|':
539 return BitOr;
540 case '*':
541 if (STR(n)[1] == '*')
542 return Pow;
543 else
544 return Mult;
545 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000546 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 }
549}
550
551static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000552ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000554 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 |'is' 'not'
556 */
557 REQ(n, comp_op);
558 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000559 n = CHILD(n, 0);
560 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561 case LESS:
562 return Lt;
563 case GREATER:
564 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000565 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 return Eq;
567 case LESSEQUAL:
568 return LtE;
569 case GREATEREQUAL:
570 return GtE;
571 case NOTEQUAL:
572 return NotEq;
573 case NAME:
574 if (strcmp(STR(n), "in") == 0)
575 return In;
576 if (strcmp(STR(n), "is") == 0)
577 return Is;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
584 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 /* handle "not in" and "is not" */
586 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 case NAME:
588 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
589 return NotIn;
590 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
591 return IsNot;
592 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000593 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 }
Neal Norwitz79792652005-11-14 04:25:03 +0000598 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000600 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601}
602
603static asdl_seq *
604seq_for_testlist(struct compiling *c, const node *n)
605{
Benjamin Peterson4905e802009-09-27 02:43:28 +0000606 /* testlist: test (',' test)* [',']
607 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
608 */
Armin Rigo31441302005-10-21 12:57:31 +0000609 asdl_seq *seq;
610 expr_ty expression;
611 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000612 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000614 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615 if (!seq)
616 return NULL;
617
618 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson4905e802009-09-27 02:43:28 +0000619 const node *ch = CHILD(n, i);
620 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621
Benjamin Peterson4905e802009-09-27 02:43:28 +0000622 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000623 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000625
626 assert(i / 2 < seq->size);
627 asdl_seq_SET(seq, i / 2, expression);
628 }
629 return seq;
630}
631
Neal Norwitzc1505362006-12-28 06:47:50 +0000632static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000633compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000634{
635 identifier name;
636 expr_ty annotation = NULL;
637 node *ch;
638
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000639 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000640 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000641 name = NEW_IDENTIFIER(ch);
642 if (!name)
643 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000644 if (forbidden_name(name, ch, 0))
645 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000646
647 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
648 annotation = ast_for_expr(c, CHILD(n, 2));
649 if (!annotation)
650 return NULL;
651 }
652
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000653 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000654#if 0
655 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
656 if (!set_context(c, result, Store, n))
657 return NULL;
658 return result;
659#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660}
661
Guido van Rossum4f72a782006-10-27 23:31:49 +0000662/* returns -1 if failed to handle keyword only arguments
663 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000664 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000665 ^^^
666 start pointing here
667 */
668static int
669handle_keywordonly_args(struct compiling *c, const node *n, int start,
670 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
671{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000672 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000673 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000674 expr_ty expression, annotation;
675 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000676 int i = start;
677 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000678
679 if (kwonlyargs == NULL) {
680 ast_error(CHILD(n, start), "named arguments must follow bare *");
681 return -1;
682 }
683 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000684 while (i < NCH(n)) {
685 ch = CHILD(n, i);
686 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000687 case vfpdef:
688 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000690 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000691 asdl_seq_SET(kwdefaults, j, expression);
692 i += 2; /* '=' and test */
693 }
694 else { /* setting NULL if no default value exists */
695 asdl_seq_SET(kwdefaults, j, NULL);
696 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000697 if (NCH(ch) == 3) {
698 /* ch is NAME ':' test */
699 annotation = ast_for_expr(c, CHILD(ch, 2));
700 if (!annotation) {
701 ast_error(ch, "expected expression");
702 goto error;
703 }
704 }
705 else {
706 annotation = NULL;
707 }
708 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000709 argname = NEW_IDENTIFIER(ch);
710 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000711 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000712 if (forbidden_name(argname, ch, 0))
713 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000714 arg = arg(argname, annotation, c->c_arena);
715 if (!arg)
716 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000717 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000718 i += 2; /* the name and the comma */
719 break;
720 case DOUBLESTAR:
721 return i;
722 default:
723 ast_error(ch, "unexpected node");
724 goto error;
725 }
726 }
727 return i;
728 error:
729 return -1;
730}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731
Jeremy Hyltona8293132006-02-28 17:58:27 +0000732/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733
734static arguments_ty
735ast_for_arguments(struct compiling *c, const node *n)
736{
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 /* This function handles both typedargslist (function definition)
738 and varargslist (lambda definition).
739
740 parameters: '(' [typedargslist] ')'
741 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000742 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
743 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000744 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000745 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000747 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
748 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000750 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000752 int i, j, k, nposargs = 0, nkwonlyargs = 0;
753 int nposdefaults = 0, found_default = 0;
754 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 arg_ty arg;
757 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 node *ch;
759
760 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000762 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
763 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000764 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767
Jeremy Hyltone921e022008-07-17 16:37:17 +0000768 /* First count the number of positional args & defaults. The
769 variable i is the loop index for this for loop and the next.
770 The next loop picks up where the first leaves off.
771 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000773 ch = CHILD(n, i);
774 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000775 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000776 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000777 if (i < NCH(n) && /* skip argument following star */
778 (TYPE(CHILD(n, i)) == tfpdef ||
779 TYPE(CHILD(n, i)) == vfpdef)) {
780 i++;
781 }
782 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000783 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000784 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000785 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000786 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 /* count the number of keyword only args &
789 defaults for keyword only args */
790 for ( ; i < NCH(n); ++i) {
791 ch = CHILD(n, i);
792 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000793 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
796 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000797 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 kwonlyargs = (nkwonlyargs ?
799 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
800 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000801 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000802 posdefaults = (nposdefaults ?
803 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
804 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000805 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000806 /* The length of kwonlyargs and kwdefaults are same
807 since we set NULL as default for keyword only argument w/o default
808 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
811 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000812 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000813
814 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000815 ast_error(n, "more than 255 arguments");
816 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000817 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000819 /* tfpdef: NAME [':' test]
820 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821 */
822 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000823 j = 0; /* index for defaults */
824 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000826 ch = CHILD(n, i);
827 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000828 case tfpdef:
829 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
831 anything other than EQUAL or a comma? */
832 /* XXX Should NCH(n) check be made a separate check? */
833 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000834 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
835 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000836 goto error;
837 assert(posdefaults != NULL);
838 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000839 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000842 else if (found_default) {
843 ast_error(n,
844 "non-default argument follows default argument");
845 goto error;
846 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000847 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000848 if (!arg)
849 goto error;
850 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851 i += 2; /* the name and the comma */
852 break;
853 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000854 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000855 ast_error(CHILD(n, i),
856 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000857 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000858 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000859 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000860 if (TYPE(ch) == COMMA) {
861 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000862 i += 2; /* now follows keyword only arguments */
863 res = handle_keywordonly_args(c, n, i,
864 kwonlyargs, kwdefaults);
865 if (res == -1) goto error;
866 i = res; /* res has new position to process */
867 }
868 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000869 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000870 if (!vararg)
871 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000872 if (forbidden_name(vararg, CHILD(ch, 0), 0))
873 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000874 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000875 /* there is an annotation on the vararg */
876 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000877 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000878 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000879 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
880 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000881 int res = 0;
882 res = handle_keywordonly_args(c, n, i,
883 kwonlyargs, kwdefaults);
884 if (res == -1) goto error;
885 i = res; /* res has new position to process */
886 }
887 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 break;
889 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000890 ch = CHILD(n, i+1); /* tfpdef */
891 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000892 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
893 if (NCH(ch) > 1) {
894 /* there is an annotation on the kwarg */
895 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
896 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000897 if (!kwarg)
898 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000899 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
900 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901 i += 3;
902 break;
903 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000904 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 "unexpected node in varargslist: %d @ %d",
906 TYPE(ch), i);
907 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000908 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000910 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
911 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000913 Py_XDECREF(vararg);
914 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000915 return NULL;
916}
917
918static expr_ty
919ast_for_dotted_name(struct compiling *c, const node *n)
920{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000921 expr_ty e;
922 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000923 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 int i;
925
926 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000927
928 lineno = LINENO(n);
929 col_offset = n->n_col_offset;
930
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931 id = NEW_IDENTIFIER(CHILD(n, 0));
932 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000933 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000934 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000936 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937
938 for (i = 2; i < NCH(n); i+=2) {
939 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000940 if (!id)
941 return NULL;
942 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
943 if (!e)
944 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 }
946
947 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948}
949
950static expr_ty
951ast_for_decorator(struct compiling *c, const node *n)
952{
953 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
954 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000955 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956
957 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000958 REQ(CHILD(n, 0), AT);
959 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960
961 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
962 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000963 return NULL;
964
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000966 d = name_expr;
967 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 }
969 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000970 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000971 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000972 if (!d)
973 return NULL;
974 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 }
976 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000977 d = ast_for_call(c, CHILD(n, 3), name_expr);
978 if (!d)
979 return NULL;
980 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 }
982
983 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984}
985
986static asdl_seq*
987ast_for_decorators(struct compiling *c, const node *n)
988{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000989 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000990 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 int i;
992
993 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000994 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 if (!decorator_seq)
996 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000999 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 if (!d)
1001 return NULL;
1002 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 }
1004 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005}
1006
1007static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001008ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001010 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001011 identifier name;
1012 arguments_ty args;
1013 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001014 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001015 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016
1017 REQ(n, funcdef);
1018
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019 name = NEW_IDENTIFIER(CHILD(n, name_i));
1020 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001021 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001022 if (forbidden_name(name, CHILD(n, name_i), 0))
1023 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1025 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001026 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001027 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1028 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1029 if (!returns)
1030 return NULL;
1031 name_i += 2;
1032 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033 body = ast_for_suite(c, CHILD(n, name_i + 3));
1034 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001035 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036
Neal Norwitzc1505362006-12-28 06:47:50 +00001037 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001038 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039}
1040
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001041static stmt_ty
1042ast_for_decorated(struct compiling *c, const node *n)
1043{
1044 /* decorated: decorators (classdef | funcdef) */
1045 stmt_ty thing = NULL;
1046 asdl_seq *decorator_seq = NULL;
1047
1048 REQ(n, decorated);
1049
1050 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1051 if (!decorator_seq)
1052 return NULL;
1053
1054 assert(TYPE(CHILD(n, 1)) == funcdef ||
1055 TYPE(CHILD(n, 1)) == classdef);
1056
1057 if (TYPE(CHILD(n, 1)) == funcdef) {
1058 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1059 } else if (TYPE(CHILD(n, 1)) == classdef) {
1060 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1061 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001062 /* we count the decorators in when talking about the class' or
1063 * function's line number */
1064 if (thing) {
1065 thing->lineno = LINENO(n);
1066 thing->col_offset = n->n_col_offset;
1067 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001068 return thing;
1069}
1070
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071static expr_ty
1072ast_for_lambdef(struct compiling *c, const node *n)
1073{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001074 /* lambdef: 'lambda' [varargslist] ':' test
1075 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076 arguments_ty args;
1077 expr_ty expression;
1078
1079 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001080 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1081 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 if (!args)
1083 return NULL;
1084 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001085 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 }
1088 else {
1089 args = ast_for_arguments(c, CHILD(n, 1));
1090 if (!args)
1091 return NULL;
1092 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001093 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 }
1096
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001097 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098}
1099
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001100static expr_ty
1101ast_for_ifexpr(struct compiling *c, const node *n)
1102{
1103 /* test: or_test 'if' or_test 'else' test */
1104 expr_ty expression, body, orelse;
1105
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001106 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001107 body = ast_for_expr(c, CHILD(n, 0));
1108 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001109 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001110 expression = ast_for_expr(c, CHILD(n, 2));
1111 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001112 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001113 orelse = ast_for_expr(c, CHILD(n, 4));
1114 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001115 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001116 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1117 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001118}
1119
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001121 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122
Nick Coghlan650f0d02007-04-15 12:05:43 +00001123 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124*/
1125
1126static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001127count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130
Guido van Rossumd8faa362007-04-27 19:54:29 +00001131 count_comp_for:
1132 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001133 REQ(n, comp_for);
1134 if (NCH(n) == 5)
1135 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001136 else
1137 return n_fors;
1138 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001139 REQ(n, comp_iter);
1140 n = CHILD(n, 0);
1141 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001142 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001143 else if (TYPE(n) == comp_if) {
1144 if (NCH(n) == 3) {
1145 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001147 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001148 else
1149 return n_fors;
1150 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001151
Guido van Rossumd8faa362007-04-27 19:54:29 +00001152 /* Should never be reached */
1153 PyErr_SetString(PyExc_SystemError,
1154 "logic error in count_comp_fors");
1155 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156}
1157
Nick Coghlan650f0d02007-04-15 12:05:43 +00001158/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159
Nick Coghlan650f0d02007-04-15 12:05:43 +00001160 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161*/
1162
1163static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001164count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001166 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167
Guido van Rossumd8faa362007-04-27 19:54:29 +00001168 while (1) {
1169 REQ(n, comp_iter);
1170 if (TYPE(CHILD(n, 0)) == comp_for)
1171 return n_ifs;
1172 n = CHILD(n, 0);
1173 REQ(n, comp_if);
1174 n_ifs++;
1175 if (NCH(n) == 2)
1176 return n_ifs;
1177 n = CHILD(n, 2);
1178 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179}
1180
Guido van Rossum992d4a32007-07-11 13:09:30 +00001181static asdl_seq *
1182ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001185 asdl_seq *comps;
1186
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001187 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001188 if (n_fors == -1)
1189 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190
Nick Coghlan650f0d02007-04-15 12:05:43 +00001191 comps = asdl_seq_new(n_fors, c->c_arena);
1192 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001196 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001198 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001199 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200
Guido van Rossum992d4a32007-07-11 13:09:30 +00001201 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202
Guido van Rossum992d4a32007-07-11 13:09:30 +00001203 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001204 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001207 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001208 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210
Thomas Wouters89f507f2006-12-13 04:49:30 +00001211 /* Check the # of children rather than the length of t, since
1212 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001213 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001214 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001215 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001217 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1218 c->c_arena),
1219 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001220 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001222
Guido van Rossum992d4a32007-07-11 13:09:30 +00001223 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 int j, n_ifs;
1225 asdl_seq *ifs;
1226
Guido van Rossum992d4a32007-07-11 13:09:30 +00001227 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001228 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001229 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001231
1232 ifs = asdl_seq_new(n_ifs, c->c_arena);
1233 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001235
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001237 REQ(n, comp_iter);
1238 n = CHILD(n, 0);
1239 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240
Guido van Rossum992d4a32007-07-11 13:09:30 +00001241 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001242 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001243 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001244 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001245 if (NCH(n) == 3)
1246 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001248 /* on exit, must guarantee that n is a comp_for */
1249 if (TYPE(n) == comp_iter)
1250 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001251 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001253 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001255 return comps;
1256}
1257
1258static expr_ty
1259ast_for_itercomp(struct compiling *c, const node *n, int type)
1260{
1261 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1262 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1263 expr_ty elt;
1264 asdl_seq *comps;
1265
1266 assert(NCH(n) > 1);
1267
1268 elt = ast_for_expr(c, CHILD(n, 0));
1269 if (!elt)
1270 return NULL;
1271
1272 comps = ast_for_comprehension(c, CHILD(n, 1));
1273 if (!comps)
1274 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001275
1276 if (type == COMP_GENEXP)
1277 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1278 else if (type == COMP_LISTCOMP)
1279 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1280 else if (type == COMP_SETCOMP)
1281 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1282 else
1283 /* Should never happen */
1284 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285}
1286
1287static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001288ast_for_dictcomp(struct compiling *c, const node *n)
1289{
1290 expr_ty key, value;
1291 asdl_seq *comps;
1292
1293 assert(NCH(n) > 3);
1294 REQ(CHILD(n, 1), COLON);
1295
1296 key = ast_for_expr(c, CHILD(n, 0));
1297 if (!key)
1298 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001299 value = ast_for_expr(c, CHILD(n, 2));
1300 if (!value)
1301 return NULL;
1302
1303 comps = ast_for_comprehension(c, CHILD(n, 3));
1304 if (!comps)
1305 return NULL;
1306
1307 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1308}
1309
1310static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001311ast_for_genexp(struct compiling *c, const node *n)
1312{
1313 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001314 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001315}
1316
1317static expr_ty
1318ast_for_listcomp(struct compiling *c, const node *n)
1319{
1320 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001321 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001322}
1323
1324static expr_ty
1325ast_for_setcomp(struct compiling *c, const node *n)
1326{
1327 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001328 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001329}
1330
1331
1332static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333ast_for_atom(struct compiling *c, const node *n)
1334{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001335 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1336 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001337 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338 */
1339 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001340 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001341
1342 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001343 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001344 /* All names start in Load context, but may later be
1345 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001346 PyObject *name = NEW_IDENTIFIER(ch);
1347 if (!name)
1348 return NULL;
1349 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1350 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001352 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001353 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001354 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001355 PyObject *type, *value, *tback, *errstr;
1356 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001357 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001358 if (errstr) {
1359 char *s = "";
1360 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001361 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001362 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1363 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001364 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001365 } else {
1366 ast_error(n, "(unicode error) unknown error");
1367 }
1368 Py_DECREF(type);
1369 Py_DECREF(value);
1370 Py_XDECREF(tback);
1371 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001372 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001373 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001374 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001375 if (bytesmode)
1376 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1377 else
1378 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 }
1380 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001381 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 if (!pynum)
1383 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001384
Thomas Wouters89f507f2006-12-13 04:49:30 +00001385 PyArena_AddPyObject(c->c_arena, pynum);
1386 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 }
Georg Brandldde00282007-03-18 19:01:53 +00001388 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001389 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001390 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001391 ch = CHILD(n, 1);
1392
1393 if (TYPE(ch) == RPAR)
1394 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1395
1396 if (TYPE(ch) == yield_expr)
1397 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001398
1399 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1400 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001401 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001402
Nick Coghlan650f0d02007-04-15 12:05:43 +00001403 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001405 ch = CHILD(n, 1);
1406
1407 if (TYPE(ch) == RSQB)
1408 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1409
Nick Coghlan650f0d02007-04-15 12:05:43 +00001410 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001411 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1412 asdl_seq *elts = seq_for_testlist(c, ch);
1413 if (!elts)
1414 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001415
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1417 }
1418 else
1419 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001421 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1422 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001423 int i, size;
1424 asdl_seq *keys, *values;
1425
1426 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001427 if (TYPE(ch) == RBRACE) {
1428 /* it's an empty dict */
1429 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1430 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1431 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001432 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001433 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001434 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001435 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001436 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001437 for (i = 0; i < NCH(ch); i += 2) {
1438 expr_ty expression;
1439 expression = ast_for_expr(c, CHILD(ch, i));
1440 if (!expression)
1441 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001442 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001443 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001444 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1445 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1446 /* it's a set comprehension */
1447 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001448 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1449 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001450 } else {
1451 /* it's a dict */
1452 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1453 keys = asdl_seq_new(size, c->c_arena);
1454 if (!keys)
1455 return NULL;
1456
1457 values = asdl_seq_new(size, c->c_arena);
1458 if (!values)
1459 return NULL;
1460
1461 for (i = 0; i < NCH(ch); i += 4) {
1462 expr_ty expression;
1463
1464 expression = ast_for_expr(c, CHILD(ch, i));
1465 if (!expression)
1466 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001467
Guido van Rossum86e58e22006-08-28 15:27:34 +00001468 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001469
Guido van Rossum86e58e22006-08-28 15:27:34 +00001470 expression = ast_for_expr(c, CHILD(ch, i + 2));
1471 if (!expression)
1472 return NULL;
1473
1474 asdl_seq_SET(values, i / 4, expression);
1475 }
1476 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001480 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1481 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 }
1483}
1484
1485static slice_ty
1486ast_for_slice(struct compiling *c, const node *n)
1487{
1488 node *ch;
1489 expr_ty lower = NULL, upper = NULL, step = NULL;
1490
1491 REQ(n, subscript);
1492
1493 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001494 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 sliceop: ':' [test]
1496 */
1497 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 if (NCH(n) == 1 && TYPE(ch) == test) {
1499 /* 'step' variable hold no significance in terms of being used over
1500 other vars */
1501 step = ast_for_expr(c, ch);
1502 if (!step)
1503 return NULL;
1504
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 }
1507
1508 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001509 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 if (!lower)
1511 return NULL;
1512 }
1513
1514 /* If there's an upper bound it's in the second or third position. */
1515 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001516 if (NCH(n) > 1) {
1517 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518
Thomas Wouters89f507f2006-12-13 04:49:30 +00001519 if (TYPE(n2) == test) {
1520 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 if (!upper)
1522 return NULL;
1523 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001524 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001526 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527
Thomas Wouters89f507f2006-12-13 04:49:30 +00001528 if (TYPE(n2) == test) {
1529 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530 if (!upper)
1531 return NULL;
1532 }
1533 }
1534
1535 ch = CHILD(n, NCH(n) - 1);
1536 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001537 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001538 ch = CHILD(ch, 1);
1539 if (TYPE(ch) == test) {
1540 step = ast_for_expr(c, ch);
1541 if (!step)
1542 return NULL;
1543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544 }
1545 }
1546
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001547 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548}
1549
1550static expr_ty
1551ast_for_binop(struct compiling *c, const node *n)
1552{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001553 /* Must account for a sequence of expressions.
1554 How should A op B op C by represented?
1555 BinOp(BinOp(A, op, B), op, C).
1556 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557
Guido van Rossumd8faa362007-04-27 19:54:29 +00001558 int i, nops;
1559 expr_ty expr1, expr2, result;
1560 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562 expr1 = ast_for_expr(c, CHILD(n, 0));
1563 if (!expr1)
1564 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565
Guido van Rossumd8faa362007-04-27 19:54:29 +00001566 expr2 = ast_for_expr(c, CHILD(n, 2));
1567 if (!expr2)
1568 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569
Guido van Rossumd8faa362007-04-27 19:54:29 +00001570 newoperator = get_operator(CHILD(n, 1));
1571 if (!newoperator)
1572 return NULL;
1573
1574 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1575 c->c_arena);
1576 if (!result)
1577 return NULL;
1578
1579 nops = (NCH(n) - 1) / 2;
1580 for (i = 1; i < nops; i++) {
1581 expr_ty tmp_result, tmp;
1582 const node* next_oper = CHILD(n, i * 2 + 1);
1583
1584 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001585 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586 return NULL;
1587
Guido van Rossumd8faa362007-04-27 19:54:29 +00001588 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1589 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590 return NULL;
1591
Guido van Rossumd8faa362007-04-27 19:54:29 +00001592 tmp_result = BinOp(result, newoperator, tmp,
1593 LINENO(next_oper), next_oper->n_col_offset,
1594 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001595 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001596 return NULL;
1597 result = tmp_result;
1598 }
1599 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600}
1601
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001602static expr_ty
1603ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1604{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001605 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1606 subscriptlist: subscript (',' subscript)* [',']
1607 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1608 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 REQ(n, trailer);
1610 if (TYPE(CHILD(n, 0)) == LPAR) {
1611 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001612 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1613 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001614 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001615 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001616 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001617 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001618 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1619 if (!attr_id)
1620 return NULL;
1621 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001622 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001623 }
1624 else {
1625 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 REQ(CHILD(n, 2), RSQB);
1627 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001629 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1630 if (!slc)
1631 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001632 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1633 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001634 }
1635 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001636 /* The grammar is ambiguous here. The ambiguity is resolved
1637 by treating the sequence as a tuple literal if there are
1638 no slice features.
1639 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001640 int j;
1641 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001643 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001644 asdl_seq *slices, *elts;
1645 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 if (!slices)
1647 return NULL;
1648 for (j = 0; j < NCH(n); j += 2) {
1649 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001650 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001651 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001652 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001653 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 asdl_seq_SET(slices, j / 2, slc);
1655 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 if (!simple) {
1657 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001658 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001659 }
1660 /* extract Index values and put them in a Tuple */
1661 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001662 if (!elts)
1663 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001664 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1665 slc = (slice_ty)asdl_seq_GET(slices, j);
1666 assert(slc->kind == Index_kind && slc->v.Index.value);
1667 asdl_seq_SET(elts, j, slc->v.Index.value);
1668 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001669 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001670 if (!e)
1671 return NULL;
1672 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001673 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001674 }
1675 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001676}
1677
1678static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001679ast_for_factor(struct compiling *c, const node *n)
1680{
1681 node *pfactor, *ppower, *patom, *pnum;
1682 expr_ty expression;
1683
1684 /* If the unary - operator is applied to a constant, don't generate
1685 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1686 constant. The peephole optimizer already does something like
1687 this but it doesn't handle the case where the constant is
1688 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1689 PyLongObject.
1690 */
1691 if (TYPE(CHILD(n, 0)) == MINUS
1692 && NCH(n) == 2
1693 && TYPE((pfactor = CHILD(n, 1))) == factor
1694 && NCH(pfactor) == 1
1695 && TYPE((ppower = CHILD(pfactor, 0))) == power
1696 && NCH(ppower) == 1
1697 && TYPE((patom = CHILD(ppower, 0))) == atom
1698 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1699 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1700 if (s == NULL)
1701 return NULL;
1702 s[0] = '-';
1703 strcpy(s + 1, STR(pnum));
1704 PyObject_FREE(STR(pnum));
1705 STR(pnum) = s;
1706 return ast_for_atom(c, patom);
1707 }
1708
1709 expression = ast_for_expr(c, CHILD(n, 1));
1710 if (!expression)
1711 return NULL;
1712
1713 switch (TYPE(CHILD(n, 0))) {
1714 case PLUS:
1715 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1716 c->c_arena);
1717 case MINUS:
1718 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1719 c->c_arena);
1720 case TILDE:
1721 return UnaryOp(Invert, expression, LINENO(n),
1722 n->n_col_offset, c->c_arena);
1723 }
1724 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1725 TYPE(CHILD(n, 0)));
1726 return NULL;
1727}
1728
1729static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001730ast_for_power(struct compiling *c, const node *n)
1731{
1732 /* power: atom trailer* ('**' factor)*
1733 */
1734 int i;
1735 expr_ty e, tmp;
1736 REQ(n, power);
1737 e = ast_for_atom(c, CHILD(n, 0));
1738 if (!e)
1739 return NULL;
1740 if (NCH(n) == 1)
1741 return e;
1742 for (i = 1; i < NCH(n); i++) {
1743 node *ch = CHILD(n, i);
1744 if (TYPE(ch) != trailer)
1745 break;
1746 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001747 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001748 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001749 tmp->lineno = e->lineno;
1750 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001751 e = tmp;
1752 }
1753 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1754 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001755 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001756 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001757 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001758 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001759 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001760 e = tmp;
1761 }
1762 return e;
1763}
1764
Guido van Rossum0368b722007-05-11 16:50:42 +00001765static expr_ty
1766ast_for_starred(struct compiling *c, const node *n)
1767{
1768 expr_ty tmp;
1769 REQ(n, star_expr);
1770
1771 tmp = ast_for_expr(c, CHILD(n, 1));
1772 if (!tmp)
1773 return NULL;
1774
1775 /* The Load context is changed later. */
1776 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1777}
1778
1779
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780/* Do not name a variable 'expr'! Will cause a compile error.
1781*/
1782
1783static expr_ty
1784ast_for_expr(struct compiling *c, const node *n)
1785{
1786 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001787 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001788 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001789 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790 and_test: not_test ('and' not_test)*
1791 not_test: 'not' not_test | comparison
1792 comparison: expr (comp_op expr)*
1793 expr: xor_expr ('|' xor_expr)*
1794 xor_expr: and_expr ('^' and_expr)*
1795 and_expr: shift_expr ('&' shift_expr)*
1796 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1797 arith_expr: term (('+'|'-') term)*
1798 term: factor (('*'|'/'|'%'|'//') factor)*
1799 factor: ('+'|'-'|'~') factor | power
1800 power: atom trailer* ('**' factor)*
1801 */
1802
1803 asdl_seq *seq;
1804 int i;
1805
1806 loop:
1807 switch (TYPE(n)) {
1808 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001809 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001810 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001811 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001813 else if (NCH(n) > 1)
1814 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001815 /* Fallthrough */
1816 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817 case and_test:
1818 if (NCH(n) == 1) {
1819 n = CHILD(n, 0);
1820 goto loop;
1821 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001822 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 if (!seq)
1824 return NULL;
1825 for (i = 0; i < NCH(n); i += 2) {
1826 expr_ty e = ast_for_expr(c, CHILD(n, i));
1827 if (!e)
1828 return NULL;
1829 asdl_seq_SET(seq, i / 2, e);
1830 }
1831 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001832 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1833 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001834 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001835 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 case not_test:
1837 if (NCH(n) == 1) {
1838 n = CHILD(n, 0);
1839 goto loop;
1840 }
1841 else {
1842 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1843 if (!expression)
1844 return NULL;
1845
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1847 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 }
1849 case comparison:
1850 if (NCH(n) == 1) {
1851 n = CHILD(n, 0);
1852 goto loop;
1853 }
1854 else {
1855 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001856 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001857 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001858 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 if (!ops)
1860 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001861 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 return NULL;
1864 }
1865 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001868 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872
1873 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001874 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001878 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 asdl_seq_SET(cmps, i / 2, expression);
1880 }
1881 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001882 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001886 return Compare(expression, ops, cmps, LINENO(n),
1887 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 }
1889 break;
1890
Guido van Rossum0368b722007-05-11 16:50:42 +00001891 case star_expr:
Benjamin Petersondefa04e2009-09-27 14:08:59 +00001892 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 /* The next five cases all handle BinOps. The main body of code
1894 is the same in each case, but the switch turned inside out to
1895 reuse the code for each type of operator.
1896 */
1897 case expr:
1898 case xor_expr:
1899 case and_expr:
1900 case shift_expr:
1901 case arith_expr:
1902 case term:
1903 if (NCH(n) == 1) {
1904 n = CHILD(n, 0);
1905 goto loop;
1906 }
1907 return ast_for_binop(c, n);
1908 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 expr_ty exp = NULL;
1910 if (NCH(n) == 2) {
1911 exp = ast_for_testlist(c, CHILD(n, 1));
1912 if (!exp)
1913 return NULL;
1914 }
1915 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1916 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001917 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 if (NCH(n) == 1) {
1919 n = CHILD(n, 0);
1920 goto loop;
1921 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001922 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001923 case power:
1924 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001926 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 return NULL;
1928 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001929 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 return NULL;
1931}
1932
1933static expr_ty
1934ast_for_call(struct compiling *c, const node *n, expr_ty func)
1935{
1936 /*
1937 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1938 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001939 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 */
1941
1942 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001943 asdl_seq *args;
1944 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 expr_ty vararg = NULL, kwarg = NULL;
1946
1947 REQ(n, arglist);
1948
1949 nargs = 0;
1950 nkeywords = 0;
1951 ngens = 0;
1952 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001953 node *ch = CHILD(n, i);
1954 if (TYPE(ch) == argument) {
1955 if (NCH(ch) == 1)
1956 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001957 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001960 nkeywords++;
1961 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 }
1963 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001964 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001965 "if not sole argument");
1966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 }
1968
1969 if (nargs + nkeywords + ngens > 255) {
1970 ast_error(n, "more than 255 arguments");
1971 return NULL;
1972 }
1973
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001974 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001976 return NULL;
1977 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001979 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 nargs = 0;
1981 nkeywords = 0;
1982 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 node *ch = CHILD(n, i);
1984 if (TYPE(ch) == argument) {
1985 expr_ty e;
1986 if (NCH(ch) == 1) {
1987 if (nkeywords) {
1988 ast_error(CHILD(ch, 0),
1989 "non-keyword arg after keyword arg");
1990 return NULL;
1991 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001992 if (vararg) {
1993 ast_error(CHILD(ch, 0),
1994 "only named arguments may follow *expression");
1995 return NULL;
1996 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001999 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 asdl_seq_SET(args, nargs++, e);
2001 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002002 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 else {
2009 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002010 identifier key, tmp;
2011 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 /* CHILD(ch, 0) is test, but must be an identifier? */
2014 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002016 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 /* f(lambda x: x[0] = 3) ends up getting parsed with
2018 * LHS test = lambda x: x[0], and RHS test = 3.
2019 * SF bug 132313 points out that complaining about a keyword
2020 * then is very confusing.
2021 */
2022 if (e->kind == Lambda_kind) {
2023 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002024 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 } else if (e->kind != Name_kind) {
2026 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002027 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002028 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002029 return NULL;
2030 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002032 for (k = 0; k < nkeywords; k++) {
2033 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2034 if (!PyUnicode_Compare(tmp, key)) {
2035 ast_error(CHILD(ch, 0), "keyword argument repeated");
2036 return NULL;
2037 }
2038 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002044 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 asdl_seq_SET(keywords, nkeywords++, kw);
2046 }
2047 }
2048 else if (TYPE(ch) == STAR) {
2049 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002050 if (!vararg)
2051 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002052 i++;
2053 }
2054 else if (TYPE(ch) == DOUBLESTAR) {
2055 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002056 if (!kwarg)
2057 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002058 i++;
2059 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 }
2061
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002062 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063}
2064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002066ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002068 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002069 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002071 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002072 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002073 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002074 }
2075 else {
2076 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002077 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002078 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 else {
2082 asdl_seq *tmp = seq_for_testlist(c, n);
2083 if (!tmp)
2084 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002087}
2088
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089static stmt_ty
2090ast_for_expr_stmt(struct compiling *c, const node *n)
2091{
2092 REQ(n, expr_stmt);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002093 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002095 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002097 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 test: ... here starts the operator precendence dance
2099 */
2100
2101 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002102 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103 if (!e)
2104 return NULL;
2105
Thomas Wouters89f507f2006-12-13 04:49:30 +00002106 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107 }
2108 else if (TYPE(CHILD(n, 1)) == augassign) {
2109 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002110 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002111 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112
Thomas Wouters89f507f2006-12-13 04:49:30 +00002113 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 if (!expr1)
2115 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002116 if(!set_context(c, expr1, Store, ch))
2117 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118
Thomas Wouters89f507f2006-12-13 04:49:30 +00002119 ch = CHILD(n, 2);
2120 if (TYPE(ch) == testlist)
2121 expr2 = ast_for_testlist(c, ch);
2122 else
2123 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002124 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 return NULL;
2126
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002127 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002128 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 return NULL;
2130
Thomas Wouters89f507f2006-12-13 04:49:30 +00002131 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132 }
2133 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002134 int i;
2135 asdl_seq *targets;
2136 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 expr_ty expression;
2138
Thomas Wouters89f507f2006-12-13 04:49:30 +00002139 /* a normal assignment */
2140 REQ(CHILD(n, 1), EQUAL);
2141 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2142 if (!targets)
2143 return NULL;
2144 for (i = 0; i < NCH(n) - 2; i += 2) {
2145 expr_ty e;
2146 node *ch = CHILD(n, i);
2147 if (TYPE(ch) == yield_expr) {
2148 ast_error(ch, "assignment to yield expression not possible");
2149 return NULL;
2150 }
2151 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002152
Thomas Wouters89f507f2006-12-13 04:49:30 +00002153 /* set context to assign */
2154 if (!e)
2155 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156
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;
2201
2202 /* 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;
Martin v. Löwis5b222132007-06-10 09:51:05 +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';
Christian Heimes72b710a2008-05-26 13:28:38 +00002360 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2361 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002362 NULL);
2363 Py_DECREF(str);
2364 if (!uni)
2365 return NULL;
2366 str = uni;
2367 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;
Thomas Wouters89f507f2006-12-13 04:49:30 +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) {
2434 /* three consecutive dots are tokenized as one ELLIPSIS */
2435 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;
2561
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,
2588 and may have a trailing SEMI
2589 */
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;
2653 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;
2656
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
Guido van Rossumd8faa362007-04-27 19:54:29 +00002714 asdl_seq_SET(orelse, 0,
2715 If(expression, suite_seq, suite_seq2,
2716 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,
2736 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 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002933
2934 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));
2976 if (NCH(n) == 3) {
2977 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002978
2979 if (!optional_vars) {
2980 return NULL;
2981 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002982 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002983 return NULL;
2984 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002985 }
2986
Georg Brandl0c315622009-05-25 21:10:36 +00002987 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002988 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002989}
2990
Georg Brandl0c315622009-05-25 21:10:36 +00002991/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2992static stmt_ty
2993ast_for_with_stmt(struct compiling *c, const node *n)
2994{
2995 int i;
2996 stmt_ty ret;
2997 asdl_seq *inner;
2998
2999 REQ(n, with_stmt);
3000
3001 /* process the with items inside-out */
3002 i = NCH(n) - 1;
3003 /* the suite of the innermost with item is the suite of the with stmt */
3004 inner = ast_for_suite(c, CHILD(n, i));
3005 if (!inner)
3006 return NULL;
3007
3008 for (;;) {
3009 i -= 2;
3010 ret = ast_for_with_item(c, CHILD(n, i), inner);
3011 if (!ret)
3012 return NULL;
3013 /* was this the last item? */
3014 if (i == 1)
3015 break;
3016 /* if not, wrap the result so far in a new sequence */
3017 inner = asdl_seq_new(1, c->c_arena);
3018 if (!inner)
3019 return NULL;
3020 asdl_seq_SET(inner, 0, ret);
3021 }
3022
3023 return ret;
3024}
3025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003027ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003029 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003030 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003031 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003032 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003033
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 REQ(n, classdef);
3035
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003036 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 s = ast_for_suite(c, CHILD(n, 3));
3038 if (!s)
3039 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003040 classname = NEW_IDENTIFIER(CHILD(n, 1));
3041 if (!classname)
3042 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003043 if (forbidden_name(classname, CHILD(n, 3), 0))
3044 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003045 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3046 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003048
3049 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003050 s = ast_for_suite(c, CHILD(n,5));
3051 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003052 return NULL;
3053 classname = NEW_IDENTIFIER(CHILD(n, 1));
3054 if (!classname)
3055 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003056 if (forbidden_name(classname, CHILD(n, 3), 0))
3057 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003058 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3059 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 }
3061
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003062 /* class NAME '(' arglist ')' ':' suite */
3063 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003064 {
3065 PyObject *dummy_name;
3066 expr_ty dummy;
3067 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3068 if (!dummy_name)
3069 return NULL;
3070 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3071 call = ast_for_call(c, CHILD(n, 3), dummy);
3072 if (!call)
3073 return NULL;
3074 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003076 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003078 classname = NEW_IDENTIFIER(CHILD(n, 1));
3079 if (!classname)
3080 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003081 if (forbidden_name(classname, CHILD(n, 1), 0))
3082 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003083
Benjamin Peterson30760062008-11-25 04:02:28 +00003084 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003085 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003086 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087}
3088
3089static stmt_ty
3090ast_for_stmt(struct compiling *c, const node *n)
3091{
3092 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003093 assert(NCH(n) == 1);
3094 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 }
3096 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003097 assert(num_stmts(n) == 1);
3098 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099 }
3100 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003101 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003102 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3103 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003104 */
3105 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 case expr_stmt:
3107 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 case del_stmt:
3109 return ast_for_del_stmt(c, n);
3110 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003111 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 case flow_stmt:
3113 return ast_for_flow_stmt(c, n);
3114 case import_stmt:
3115 return ast_for_import_stmt(c, n);
3116 case global_stmt:
3117 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003118 case nonlocal_stmt:
3119 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003120 case assert_stmt:
3121 return ast_for_assert_stmt(c, n);
3122 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003123 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3125 TYPE(n), NCH(n));
3126 return NULL;
3127 }
3128 }
3129 else {
3130 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003131 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003132 */
3133 node *ch = CHILD(n, 0);
3134 REQ(n, compound_stmt);
3135 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 case if_stmt:
3137 return ast_for_if_stmt(c, ch);
3138 case while_stmt:
3139 return ast_for_while_stmt(c, ch);
3140 case for_stmt:
3141 return ast_for_for_stmt(c, ch);
3142 case try_stmt:
3143 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003144 case with_stmt:
3145 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003147 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003149 return ast_for_classdef(c, ch, NULL);
3150 case decorated:
3151 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003153 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3155 TYPE(n), NCH(n));
3156 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003157 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 }
3159}
3160
3161static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003162parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003164 const char *end;
3165 long x;
3166 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003168 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170#endif
3171
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;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 if (s[0] == '0') {
3179 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3180 if (x < 0 && errno == 0) {
3181 return PyLong_FromString((char *)s,
3182 (char **)0,
3183 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003184 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 }
3186 else
3187 x = PyOS_strtol((char *)s, (char **)&end, 0);
3188 if (*end == '\0') {
3189 if (errno != 0)
3190 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003191 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003192 }
3193 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003195 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003196 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003197 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3198 if (compl.imag == -1.0 && PyErr_Occurred())
3199 return NULL;
3200 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 }
3202 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003205 dx = PyOS_string_to_double(s, NULL, NULL);
3206 if (dx == -1.0 && PyErr_Occurred())
3207 return NULL;
3208 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210}
3211
3212static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003213decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 PyObject *u, *v;
3216 char *s, *t;
3217 t = s = (char *)*sPtr;
3218 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3219 while (s < end && (*s & 0x80)) s++;
3220 *sPtr = s;
3221 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3222 if (u == NULL)
3223 return NULL;
3224 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3225 Py_DECREF(u);
3226 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227}
3228
3229static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003230decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 PyObject *v, *u;
3233 char *buf;
3234 char *p;
3235 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003236
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 if (encoding == NULL) {
3238 buf = (char *)s;
3239 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003240 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003241 /* check for integer overflow */
3242 if (len > PY_SIZE_MAX / 4)
3243 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003244 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003245 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 if (u == NULL)
3247 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003248 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003249 end = s + len;
3250 while (s < end) {
3251 if (*s == '\\') {
3252 *p++ = *s++;
3253 if (*s & 0x80) {
3254 strcpy(p, "u005c");
3255 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003256 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 }
3258 if (*s & 0x80) { /* XXX inefficient */
3259 PyObject *w;
3260 char *r;
3261 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003262 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 if (w == NULL) {
3264 Py_DECREF(u);
3265 return NULL;
3266 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003267 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003268 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 assert(rn % 2 == 0);
3270 for (i = 0; i < rn; i += 2) {
3271 sprintf(p, "\\u%02x%02x",
3272 r[i + 0] & 0xFF,
3273 r[i + 1] & 0xFF);
3274 p += 6;
3275 }
3276 Py_DECREF(w);
3277 } else {
3278 *p++ = *s++;
3279 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003280 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003281 len = p - buf;
3282 s = buf;
3283 }
3284 if (rawmode)
3285 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3286 else
3287 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3288 Py_XDECREF(u);
3289 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290}
3291
3292/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003293 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 * parsestr parses it, and returns the decoded Python string object.
3295 */
3296static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003297parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003299 size_t len;
3300 const char *s = STR(n);
3301 int quote = Py_CHARMASK(*s);
3302 int rawmode = 0;
3303 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003304 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003305 if (quote == 'b' || quote == 'B') {
3306 quote = *++s;
3307 *bytesmode = 1;
3308 }
3309 if (quote == 'r' || quote == 'R') {
3310 quote = *++s;
3311 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003312 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003313 }
3314 if (quote != '\'' && quote != '\"') {
3315 PyErr_BadInternalCall();
3316 return NULL;
3317 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003318 s++;
3319 len = strlen(s);
3320 if (len > INT_MAX) {
3321 PyErr_SetString(PyExc_OverflowError,
3322 "string to parse is too long");
3323 return NULL;
3324 }
3325 if (s[--len] != quote) {
3326 PyErr_BadInternalCall();
3327 return NULL;
3328 }
3329 if (len >= 4 && s[0] == quote && s[1] == quote) {
3330 s += 2;
3331 len -= 2;
3332 if (s[--len] != quote || s[--len] != quote) {
3333 PyErr_BadInternalCall();
3334 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003335 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003336 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003337 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003338 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003339 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003340 if (*bytesmode) {
3341 /* Disallow non-ascii characters (but not escapes) */
3342 const char *c;
3343 for (c = s; *c; c++) {
3344 if (Py_CHARMASK(*c) >= 0x80) {
3345 ast_error(n, "bytes can only contain ASCII "
3346 "literal characters.");
3347 return NULL;
3348 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003349 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003350 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003351 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003352 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003353 if (rawmode || strchr(s, '\\') == NULL) {
3354 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003355 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003356 if (u == NULL || !*bytesmode)
3357 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003358 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003359 Py_DECREF(u);
3360 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003361 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003362 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003363 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003364 return PyUnicode_FromStringAndSize(s, len);
3365 } else {
3366 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003367 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003368 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003369 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003370 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371}
3372
Guido van Rossum29fd7122007-11-12 01:13:56 +00003373/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 * compile-time literal catenation, calling parsestr() on each piece, and
3375 * pasting the intermediate results together.
3376 */
3377static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003378parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003380 PyObject *v;
3381 int i;
3382 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003383 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003384 if (v != NULL) {
3385 /* String literal concatenation */
3386 for (i = 1; i < NCH(n); i++) {
3387 PyObject *s;
3388 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003389 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003390 if (s == NULL)
3391 goto onError;
3392 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003393 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003394 goto onError;
3395 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003396 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3397 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003398 if (v == NULL)
3399 goto onError;
3400 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003401 else {
3402 PyObject *temp = PyUnicode_Concat(v, s);
3403 Py_DECREF(s);
3404 Py_DECREF(v);
3405 v = temp;
3406 if (v == NULL)
3407 goto onError;
3408 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003409 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003410 }
3411 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003412
Guido van Rossumd8faa362007-04-27 19:54:29 +00003413 onError:
3414 Py_XDECREF(v);
3415 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003416}