blob: ce9f21135ac88121b69267b832eb4ff0b03e0294 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000061 if (*u >= 128) {
62 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
63 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
Martin v. Löwis47383402007-08-15 07:32:56 +000074 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
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 {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000229 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000230 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",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000360 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000361 NULL,
362};
363
364static int
365forbidden_name(expr_ty e, const node *n)
366{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000368 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000369 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000370 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000371 ast_error(n, "assignment to keyword");
372 return 1;
373 }
374 }
375 return 0;
376}
377
Jeremy Hyltona8293132006-02-28 17:58:27 +0000378/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379
380 Only sets context for expr kinds that "can appear in assignment context"
381 (according to ../Parser/Python.asdl). For other expr kinds, it sets
382 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383*/
384
385static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000386set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387{
388 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000389 /* If a particular expression type can't be used for assign / delete,
390 set expr_name to its name and an error message will be generated.
391 */
392 const char* expr_name = NULL;
393
394 /* The ast defines augmented store and load contexts, but the
395 implementation here doesn't actually use them. The code may be
396 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000398 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000399 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000400 */
401 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402
403 switch (e->kind) {
404 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 e->v.Attribute.ctx = ctx;
406 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000408 e->v.Subscript.ctx = ctx;
409 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000410 case Starred_kind:
411 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000412 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000413 return 0;
414 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000416 if (ctx == Store) {
417 if (forbidden_name(e, n))
418 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 }
420 e->v.Name.ctx = ctx;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 e->v.List.ctx = ctx;
424 s = e->v.List.elts;
425 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 case Tuple_kind:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000427 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 e->v.Tuple.ctx = ctx;
430 s = e->v.Tuple.elts;
431 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 case Lambda_kind:
433 expr_name = "lambda";
434 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000437 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000438 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 case UnaryOp_kind:
441 expr_name = "operator";
442 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000444 expr_name = "generator expression";
445 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000446 case Yield_kind:
447 expr_name = "yield expression";
448 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000449 case ListComp_kind:
450 expr_name = "list comprehension";
451 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000452 case SetComp_kind:
453 expr_name = "set comprehension";
454 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000455 case DictComp_kind:
456 expr_name = "dict comprehension";
457 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000459 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460 case Num_kind:
461 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000462 expr_name = "literal";
463 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000464 case Ellipsis_kind:
465 expr_name = "Ellipsis";
466 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000467 case Compare_kind:
468 expr_name = "comparison";
469 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000470 case IfExp_kind:
471 expr_name = "conditional expression";
472 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 default:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000474 PyErr_Format(PyExc_SystemError,
475 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000476 e->kind, e->lineno);
477 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000479 /* Check for error string set by switch */
480 if (expr_name) {
481 char buf[300];
482 PyOS_snprintf(buf, sizeof(buf),
483 "can't %s %s",
484 ctx == Store ? "assign to" : "delete",
485 expr_name);
486 return ast_error(n, buf);
487 }
488
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000490 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000491 */
492 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000496 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000497 return 0;
498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 }
500 return 1;
501}
502
503static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000504ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505{
506 REQ(n, augassign);
507 n = CHILD(n, 0);
508 switch (STR(n)[0]) {
509 case '+':
510 return Add;
511 case '-':
512 return Sub;
513 case '/':
514 if (STR(n)[1] == '/')
515 return FloorDiv;
516 else
517 return Div;
518 case '%':
519 return Mod;
520 case '<':
521 return LShift;
522 case '>':
523 return RShift;
524 case '&':
525 return BitAnd;
526 case '^':
527 return BitXor;
528 case '|':
529 return BitOr;
530 case '*':
531 if (STR(n)[1] == '*')
532 return Pow;
533 else
534 return Mult;
535 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000536 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000537 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538 }
539}
540
541static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000542ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000544 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 |'is' 'not'
546 */
547 REQ(n, comp_op);
548 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 n = CHILD(n, 0);
550 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551 case LESS:
552 return Lt;
553 case GREATER:
554 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000555 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 return Eq;
557 case LESSEQUAL:
558 return LtE;
559 case GREATEREQUAL:
560 return GtE;
561 case NOTEQUAL:
562 return NotEq;
563 case NAME:
564 if (strcmp(STR(n), "in") == 0)
565 return In;
566 if (strcmp(STR(n), "is") == 0)
567 return Is;
568 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000569 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000571 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 }
574 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000575 /* handle "not in" and "is not" */
576 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577 case NAME:
578 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
579 return NotIn;
580 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
581 return IsNot;
582 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000583 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000585 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 }
Neal Norwitz79792652005-11-14 04:25:03 +0000588 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000590 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591}
592
593static asdl_seq *
594seq_for_testlist(struct compiling *c, const node *n)
595{
596 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000597 asdl_seq *seq;
598 expr_ty expression;
599 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000600 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000602 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 if (!seq)
604 return NULL;
605
606 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000607 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000610 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612
613 assert(i / 2 < seq->size);
614 asdl_seq_SET(seq, i / 2, expression);
615 }
616 return seq;
617}
618
Neal Norwitzc1505362006-12-28 06:47:50 +0000619static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000620compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000621{
622 identifier name;
623 expr_ty annotation = NULL;
624 node *ch;
625
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000626 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000627 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000628 name = NEW_IDENTIFIER(ch);
629 if (!name)
630 return NULL;
631
632 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
633 annotation = ast_for_expr(c, CHILD(n, 2));
634 if (!annotation)
635 return NULL;
636 }
637
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000638 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000639#if 0
640 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
641 if (!set_context(c, result, Store, n))
642 return NULL;
643 return result;
644#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645}
646
Guido van Rossum4f72a782006-10-27 23:31:49 +0000647/* returns -1 if failed to handle keyword only arguments
648 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000649 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 ^^^
651 start pointing here
652 */
653static int
654handle_keywordonly_args(struct compiling *c, const node *n, int start,
655 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
656{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000657 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000658 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000659 expr_ty expression, annotation;
660 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000661 int i = start;
662 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000663
664 if (kwonlyargs == NULL) {
665 ast_error(CHILD(n, start), "named arguments must follow bare *");
666 return -1;
667 }
668 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000669 while (i < NCH(n)) {
670 ch = CHILD(n, i);
671 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000672 case vfpdef:
673 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000675 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000676 asdl_seq_SET(kwdefaults, j, expression);
677 i += 2; /* '=' and test */
678 }
679 else { /* setting NULL if no default value exists */
680 asdl_seq_SET(kwdefaults, j, NULL);
681 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000682 if (NCH(ch) == 3) {
683 /* ch is NAME ':' test */
684 annotation = ast_for_expr(c, CHILD(ch, 2));
685 if (!annotation) {
686 ast_error(ch, "expected expression");
687 goto error;
688 }
689 }
690 else {
691 annotation = NULL;
692 }
693 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000694 argname = NEW_IDENTIFIER(ch);
695 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000696 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000697 arg = arg(argname, annotation, c->c_arena);
698 if (!arg)
699 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000700 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000701 i += 2; /* the name and the comma */
702 break;
703 case DOUBLESTAR:
704 return i;
705 default:
706 ast_error(ch, "unexpected node");
707 goto error;
708 }
709 }
710 return i;
711 error:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000712 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000713}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714
Jeremy Hyltona8293132006-02-28 17:58:27 +0000715/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716
717static arguments_ty
718ast_for_arguments(struct compiling *c, const node *n)
719{
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 /* This function handles both typedargslist (function definition)
721 and varargslist (lambda definition).
722
723 parameters: '(' [typedargslist] ')'
724 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000725 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000726 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000728 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000729 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000730 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000731 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000732 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000733 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 int i, j, k, nposargs = 0, nkwonlyargs = 0;
736 int nposdefaults = 0, found_default = 0;
737 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000739 arg_ty arg;
740 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741 node *ch;
742
743 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000745 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
746 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
Jeremy Hyltone921e022008-07-17 16:37:17 +0000751 /* First count the number of positional args & defaults. The
752 variable i is the loop index for this for loop and the next.
753 The next loop picks up where the first leaves off.
754 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000756 ch = CHILD(n, i);
757 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000758 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000759 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000760 if (i < NCH(n) && /* skip argument following star */
761 (TYPE(CHILD(n, i)) == tfpdef ||
762 TYPE(CHILD(n, i)) == vfpdef)) {
763 i++;
764 }
765 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000767 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000768 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000771 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000772 defaults for keyword only args */
773 for ( ; i < NCH(n); ++i) {
774 ch = CHILD(n, i);
775 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000776 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000777 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
779 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 kwonlyargs = (nkwonlyargs ?
782 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
783 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000784 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000785 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000786 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
787 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000788 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000789 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000790 since we set NULL as default for keyword only argument w/o default
791 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000792 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000793 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
794 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000795 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000796
797 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000798 ast_error(n, "more than 255 arguments");
799 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000800 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000802 /* tfpdef: NAME [':' test]
803 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 */
805 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000806 j = 0; /* index for defaults */
807 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000808 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000809 ch = CHILD(n, i);
810 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000811 case tfpdef:
812 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
814 anything other than EQUAL or a comma? */
815 /* XXX Should NCH(n) check be made a separate check? */
816 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000817 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
818 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000819 goto error;
820 assert(posdefaults != NULL);
821 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000825 else if (found_default) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000826 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000827 "non-default argument follows default argument");
828 goto error;
829 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000830 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000831 if (!arg)
832 goto error;
833 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 i += 2; /* the name and the comma */
835 break;
836 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 if (i+1 >= NCH(n)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000838 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000839 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000840 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000841 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000842 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000843 if (TYPE(ch) == COMMA) {
844 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000845 i += 2; /* now follows keyword only arguments */
846 res = handle_keywordonly_args(c, n, i,
847 kwonlyargs, kwdefaults);
848 if (res == -1) goto error;
849 i = res; /* res has new position to process */
850 }
851 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000852 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000853 if (!vararg)
854 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000855 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000856 /* there is an annotation on the vararg */
857 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000858 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000860 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
861 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000862 int res = 0;
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 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869 break;
870 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000871 ch = CHILD(n, i+1); /* tfpdef */
872 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000873 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
874 if (NCH(ch) > 1) {
875 /* there is an annotation on the kwarg */
876 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
877 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000878 if (!kwarg)
879 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 i += 3;
881 break;
882 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000883 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884 "unexpected node in varargslist: %d @ %d",
885 TYPE(ch), i);
886 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000887 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
890 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000892 Py_XDECREF(vararg);
893 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894 return NULL;
895}
896
897static expr_ty
898ast_for_dotted_name(struct compiling *c, const node *n)
899{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000900 expr_ty e;
901 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000902 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 int i;
904
905 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000906
907 lineno = LINENO(n);
908 col_offset = n->n_col_offset;
909
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 id = NEW_IDENTIFIER(CHILD(n, 0));
911 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000912 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000913 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916
917 for (i = 2; i < NCH(n); i+=2) {
918 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 if (!id)
920 return NULL;
921 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
922 if (!e)
923 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 }
925
926 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927}
928
929static expr_ty
930ast_for_decorator(struct compiling *c, const node *n)
931{
932 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
933 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000934 expr_ty name_expr;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000935
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 REQ(CHILD(n, 0), AT);
938 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000939
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
941 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000943
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 d = name_expr;
946 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 }
948 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000950 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 if (!d)
952 return NULL;
953 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 }
955 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000956 d = ast_for_call(c, CHILD(n, 3), name_expr);
957 if (!d)
958 return NULL;
959 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960 }
961
962 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static asdl_seq*
966ast_for_decorators(struct compiling *c, const node *n)
967{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000968 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000969 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 int i;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000971
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000973 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 if (!decorator_seq)
975 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000976
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000978 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979 if (!d)
980 return NULL;
981 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 }
983 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984}
985
986static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000987ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000989 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000990 identifier name;
991 arguments_ty args;
992 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000993 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000994 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995
996 REQ(n, funcdef);
997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 name = NEW_IDENTIFIER(CHILD(n, name_i));
999 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1002 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001003 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001004 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1005 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1006 if (!returns)
1007 return NULL;
1008 name_i += 2;
1009 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 body = ast_for_suite(c, CHILD(n, name_i + 3));
1011 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001012 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013
Neal Norwitzc1505362006-12-28 06:47:50 +00001014 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001015 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016}
1017
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001018static stmt_ty
1019ast_for_decorated(struct compiling *c, const node *n)
1020{
1021 /* decorated: decorators (classdef | funcdef) */
1022 stmt_ty thing = NULL;
1023 asdl_seq *decorator_seq = NULL;
1024
1025 REQ(n, decorated);
1026
1027 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1028 if (!decorator_seq)
1029 return NULL;
1030
1031 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001032 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001033
1034 if (TYPE(CHILD(n, 1)) == funcdef) {
1035 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1036 } else if (TYPE(CHILD(n, 1)) == classdef) {
1037 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1038 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001039 /* we count the decorators in when talking about the class' or
1040 * function's line number */
1041 if (thing) {
1042 thing->lineno = LINENO(n);
1043 thing->col_offset = n->n_col_offset;
1044 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001045 return thing;
1046}
1047
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048static expr_ty
1049ast_for_lambdef(struct compiling *c, const node *n)
1050{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001051 /* lambdef: 'lambda' [varargslist] ':' test
1052 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 arguments_ty args;
1054 expr_ty expression;
1055
1056 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001057 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1058 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059 if (!args)
1060 return NULL;
1061 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001062 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 }
1065 else {
1066 args = ast_for_arguments(c, CHILD(n, 1));
1067 if (!args)
1068 return NULL;
1069 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001070 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 }
1073
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001074 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001077static expr_ty
1078ast_for_ifexpr(struct compiling *c, const node *n)
1079{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001080 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001081 expr_ty expression, body, orelse;
1082
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001083 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001084 body = ast_for_expr(c, CHILD(n, 0));
1085 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001086 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001087 expression = ast_for_expr(c, CHILD(n, 2));
1088 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001090 orelse = ast_for_expr(c, CHILD(n, 4));
1091 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001093 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1094 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001095}
1096
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001098 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099
Nick Coghlan650f0d02007-04-15 12:05:43 +00001100 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101*/
1102
1103static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001104count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001106 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107
Guido van Rossumd8faa362007-04-27 19:54:29 +00001108 count_comp_for:
1109 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001110 REQ(n, comp_for);
1111 if (NCH(n) == 5)
1112 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001113 else
1114 return n_fors;
1115 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001116 REQ(n, comp_iter);
1117 n = CHILD(n, 0);
1118 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001119 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001120 else if (TYPE(n) == comp_if) {
1121 if (NCH(n) == 3) {
1122 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001123 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001125 else
1126 return n_fors;
1127 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001128
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 /* Should never be reached */
1130 PyErr_SetString(PyExc_SystemError,
1131 "logic error in count_comp_fors");
1132 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133}
1134
Nick Coghlan650f0d02007-04-15 12:05:43 +00001135/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
Nick Coghlan650f0d02007-04-15 12:05:43 +00001137 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138*/
1139
1140static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001141count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144
Guido van Rossumd8faa362007-04-27 19:54:29 +00001145 while (1) {
1146 REQ(n, comp_iter);
1147 if (TYPE(CHILD(n, 0)) == comp_for)
1148 return n_ifs;
1149 n = CHILD(n, 0);
1150 REQ(n, comp_if);
1151 n_ifs++;
1152 if (NCH(n) == 2)
1153 return n_ifs;
1154 n = CHILD(n, 2);
1155 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156}
1157
Guido van Rossum992d4a32007-07-11 13:09:30 +00001158static asdl_seq *
1159ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001162 asdl_seq *comps;
1163
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001164 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 if (n_fors == -1)
1166 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167
Nick Coghlan650f0d02007-04-15 12:05:43 +00001168 comps = asdl_seq_new(n_fors, c->c_arena);
1169 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001171
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001173 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 asdl_seq *t;
1175 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001176 node *for_ch;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001177
Guido van Rossum992d4a32007-07-11 13:09:30 +00001178 REQ(n, comp_for);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001179
Guido van Rossum992d4a32007-07-11 13:09:30 +00001180 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001181 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001184 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001185 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001187
Thomas Wouters89f507f2006-12-13 04:49:30 +00001188 /* Check the # of children rather than the length of t, since
1189 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1190 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001191 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1192 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001195 c->c_arena),
1196 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
Nick Coghlan650f0d02007-04-15 12:05:43 +00001198 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200
Guido van Rossum992d4a32007-07-11 13:09:30 +00001201 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 int j, n_ifs;
1203 asdl_seq *ifs;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001204
Guido van Rossum992d4a32007-07-11 13:09:30 +00001205 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001206 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001209
1210 ifs = asdl_seq_new(n_ifs, c->c_arena);
1211 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001215 REQ(n, comp_iter);
1216 n = CHILD(n, 0);
1217 REQ(n, comp_if);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001218
Guido van Rossum992d4a32007-07-11 13:09:30 +00001219 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001221 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001222 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001223 if (NCH(n) == 3)
1224 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001226 /* on exit, must guarantee that n is a comp_for */
1227 if (TYPE(n) == comp_iter)
1228 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001229 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001231 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001233 return comps;
1234}
1235
1236static expr_ty
1237ast_for_itercomp(struct compiling *c, const node *n, int type)
1238{
1239 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1240 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1241 expr_ty elt;
1242 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001243
Guido van Rossum992d4a32007-07-11 13:09:30 +00001244 assert(NCH(n) > 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001245
Guido van Rossum992d4a32007-07-11 13:09:30 +00001246 elt = ast_for_expr(c, CHILD(n, 0));
1247 if (!elt)
1248 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001249
Guido van Rossum992d4a32007-07-11 13:09:30 +00001250 comps = ast_for_comprehension(c, CHILD(n, 1));
1251 if (!comps)
1252 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001253
1254 if (type == COMP_GENEXP)
1255 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1256 else if (type == COMP_LISTCOMP)
1257 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1258 else if (type == COMP_SETCOMP)
1259 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1260 else
1261 /* Should never happen */
1262 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263}
1264
1265static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001266ast_for_dictcomp(struct compiling *c, const node *n)
1267{
1268 expr_ty key, value;
1269 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001270
Guido van Rossum992d4a32007-07-11 13:09:30 +00001271 assert(NCH(n) > 3);
1272 REQ(CHILD(n, 1), COLON);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001273
Guido van Rossum992d4a32007-07-11 13:09:30 +00001274 key = ast_for_expr(c, CHILD(n, 0));
1275 if (!key)
1276 return NULL;
1277
1278 value = ast_for_expr(c, CHILD(n, 2));
1279 if (!value)
1280 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001281
Guido van Rossum992d4a32007-07-11 13:09:30 +00001282 comps = ast_for_comprehension(c, CHILD(n, 3));
1283 if (!comps)
1284 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001285
Guido van Rossum992d4a32007-07-11 13:09:30 +00001286 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1287}
1288
1289static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001290ast_for_genexp(struct compiling *c, const node *n)
1291{
1292 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001293 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001294}
1295
1296static expr_ty
1297ast_for_listcomp(struct compiling *c, const node *n)
1298{
1299 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001300 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001301}
1302
1303static expr_ty
1304ast_for_setcomp(struct compiling *c, const node *n)
1305{
1306 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001307 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001308}
1309
1310
1311static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312ast_for_atom(struct compiling *c, const node *n)
1313{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001314 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1315 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001316 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 */
1318 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001319 int bytesmode = 0;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001320
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001322 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001323 /* All names start in Load context, but may later be
1324 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001325 PyObject *name = NEW_IDENTIFIER(ch);
1326 if (!name)
1327 return NULL;
1328 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1329 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001331 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001332 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001333 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001334 PyObject *type, *value, *tback, *errstr;
1335 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001336 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001337 if (errstr) {
1338 char *s = "";
1339 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001340 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001341 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1342 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001343 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001344 } else {
1345 ast_error(n, "(unicode error) unknown error");
1346 }
1347 Py_DECREF(type);
1348 Py_DECREF(value);
1349 Py_XDECREF(tback);
1350 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001351 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001352 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001353 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001354 if (bytesmode)
1355 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1356 else
1357 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 }
1359 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001360 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001361 if (!pynum)
1362 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001363
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 PyArena_AddPyObject(c->c_arena, pynum);
1365 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 }
Georg Brandldde00282007-03-18 19:01:53 +00001367 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001368 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001370 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001371
Thomas Wouters89f507f2006-12-13 04:49:30 +00001372 if (TYPE(ch) == RPAR)
1373 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001374
Thomas Wouters89f507f2006-12-13 04:49:30 +00001375 if (TYPE(ch) == yield_expr)
1376 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001377
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001378 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001379 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001380 return ast_for_genexp(c, ch);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001381
Nick Coghlan650f0d02007-04-15 12:05:43 +00001382 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001384 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001385
Thomas Wouters89f507f2006-12-13 04:49:30 +00001386 if (TYPE(ch) == RSQB)
1387 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001388
Nick Coghlan650f0d02007-04-15 12:05:43 +00001389 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1391 asdl_seq *elts = seq_for_testlist(c, ch);
1392 if (!elts)
1393 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001394
Thomas Wouters89f507f2006-12-13 04:49:30 +00001395 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1396 }
1397 else
1398 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001400 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1401 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001402 int i, size;
1403 asdl_seq *keys, *values;
1404
1405 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001406 if (TYPE(ch) == RBRACE) {
1407 /* it's an empty dict */
1408 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1409 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1410 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001411 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001412 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001413 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001414 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001415 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001416 for (i = 0; i < NCH(ch); i += 2) {
1417 expr_ty expression;
1418 expression = ast_for_expr(c, CHILD(ch, i));
1419 if (!expression)
1420 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001421 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001422 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001423 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1424 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1425 /* it's a set comprehension */
1426 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001427 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1428 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001429 } else {
1430 /* it's a dict */
1431 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1432 keys = asdl_seq_new(size, c->c_arena);
1433 if (!keys)
1434 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001435
Guido van Rossum86e58e22006-08-28 15:27:34 +00001436 values = asdl_seq_new(size, c->c_arena);
1437 if (!values)
1438 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001439
Guido van Rossum86e58e22006-08-28 15:27:34 +00001440 for (i = 0; i < NCH(ch); i += 4) {
1441 expr_ty expression;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001442
Guido van Rossum86e58e22006-08-28 15:27:34 +00001443 expression = ast_for_expr(c, CHILD(ch, i));
1444 if (!expression)
1445 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001446
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001448
Guido van Rossum86e58e22006-08-28 15:27:34 +00001449 expression = ast_for_expr(c, CHILD(ch, i + 2));
1450 if (!expression)
1451 return NULL;
1452
1453 asdl_seq_SET(values, i / 4, expression);
1454 }
1455 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1456 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1460 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 }
1462}
1463
1464static slice_ty
1465ast_for_slice(struct compiling *c, const node *n)
1466{
1467 node *ch;
1468 expr_ty lower = NULL, upper = NULL, step = NULL;
1469
1470 REQ(n, subscript);
1471
1472 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001473 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 sliceop: ':' [test]
1475 */
1476 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 if (NCH(n) == 1 && TYPE(ch) == test) {
1478 /* 'step' variable hold no significance in terms of being used over
1479 other vars */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001480 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481 if (!step)
1482 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001483
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 }
1486
1487 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001488 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 if (!lower)
1490 return NULL;
1491 }
1492
1493 /* If there's an upper bound it's in the second or third position. */
1494 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 if (NCH(n) > 1) {
1496 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 if (TYPE(n2) == test) {
1499 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 if (!upper)
1501 return NULL;
1502 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506
Thomas Wouters89f507f2006-12-13 04:49:30 +00001507 if (TYPE(n2) == test) {
1508 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 if (!upper)
1510 return NULL;
1511 }
1512 }
1513
1514 ch = CHILD(n, NCH(n) - 1);
1515 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001516 if (NCH(ch) == 1) {
1517 /* No expression, so step is None */
1518 ch = CHILD(ch, 0);
1519 step = Name(new_identifier("None", c->c_arena), Load,
1520 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 if (!step)
1522 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001523 } else {
1524 ch = CHILD(ch, 1);
1525 if (TYPE(ch) == test) {
1526 step = ast_for_expr(c, ch);
1527 if (!step)
1528 return NULL;
1529 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530 }
1531 }
1532
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001533 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534}
1535
1536static expr_ty
1537ast_for_binop(struct compiling *c, const node *n)
1538{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001539 /* Must account for a sequence of expressions.
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001540 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541 BinOp(BinOp(A, op, B), op, C).
1542 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 int i, nops;
1545 expr_ty expr1, expr2, result;
1546 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 expr1 = ast_for_expr(c, CHILD(n, 0));
1549 if (!expr1)
1550 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 expr2 = ast_for_expr(c, CHILD(n, 2));
1553 if (!expr2)
1554 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556 newoperator = get_operator(CHILD(n, 1));
1557 if (!newoperator)
1558 return NULL;
1559
1560 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1561 c->c_arena);
1562 if (!result)
1563 return NULL;
1564
1565 nops = (NCH(n) - 1) / 2;
1566 for (i = 1; i < nops; i++) {
1567 expr_ty tmp_result, tmp;
1568 const node* next_oper = CHILD(n, i * 2 + 1);
1569
1570 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001571 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 return NULL;
1573
Guido van Rossumd8faa362007-04-27 19:54:29 +00001574 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1575 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 return NULL;
1577
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001578 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579 LINENO(next_oper), next_oper->n_col_offset,
1580 c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001581 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001582 return NULL;
1583 result = tmp_result;
1584 }
1585 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586}
1587
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001588static expr_ty
1589ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1590{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001591 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001592 subscriptlist: subscript (',' subscript)* [',']
1593 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1594 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001595 REQ(n, trailer);
1596 if (TYPE(CHILD(n, 0)) == LPAR) {
1597 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001598 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1599 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001601 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001602 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001603 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001604 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1605 if (!attr_id)
1606 return NULL;
1607 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001608 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001609 }
1610 else {
1611 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612 REQ(CHILD(n, 2), RSQB);
1613 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001614 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001615 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1616 if (!slc)
1617 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001618 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1619 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001620 }
1621 else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001622 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001623 by treating the sequence as a tuple literal if there are
1624 no slice features.
1625 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 int j;
1627 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001629 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001630 asdl_seq *slices, *elts;
1631 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001632 if (!slices)
1633 return NULL;
1634 for (j = 0; j < NCH(n); j += 2) {
1635 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001636 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001638 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001639 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001640 asdl_seq_SET(slices, j / 2, slc);
1641 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 if (!simple) {
1643 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001644 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001645 }
1646 /* extract Index values and put them in a Tuple */
1647 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001648 if (!elts)
1649 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001650 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1651 slc = (slice_ty)asdl_seq_GET(slices, j);
1652 assert(slc->kind == Index_kind && slc->v.Index.value);
1653 asdl_seq_SET(elts, j, slc->v.Index.value);
1654 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 if (!e)
1657 return NULL;
1658 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001659 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660 }
1661 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001662}
1663
1664static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001665ast_for_factor(struct compiling *c, const node *n)
1666{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001667 expr_ty expression;
1668
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001669 expression = ast_for_expr(c, CHILD(n, 1));
1670 if (!expression)
1671 return NULL;
1672
1673 switch (TYPE(CHILD(n, 0))) {
1674 case PLUS:
1675 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1676 c->c_arena);
1677 case MINUS:
1678 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1679 c->c_arena);
1680 case TILDE:
1681 return UnaryOp(Invert, expression, LINENO(n),
1682 n->n_col_offset, c->c_arena);
1683 }
1684 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1685 TYPE(CHILD(n, 0)));
1686 return NULL;
1687}
1688
1689static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001690ast_for_power(struct compiling *c, const node *n)
1691{
1692 /* power: atom trailer* ('**' factor)*
1693 */
1694 int i;
1695 expr_ty e, tmp;
1696 REQ(n, power);
1697 e = ast_for_atom(c, CHILD(n, 0));
1698 if (!e)
1699 return NULL;
1700 if (NCH(n) == 1)
1701 return e;
1702 for (i = 1; i < NCH(n); i++) {
1703 node *ch = CHILD(n, i);
1704 if (TYPE(ch) != trailer)
1705 break;
1706 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001708 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001709 tmp->lineno = e->lineno;
1710 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001711 e = tmp;
1712 }
1713 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1714 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001715 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001716 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001717 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001719 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001720 e = tmp;
1721 }
1722 return e;
1723}
1724
Guido van Rossum0368b722007-05-11 16:50:42 +00001725static expr_ty
1726ast_for_starred(struct compiling *c, const node *n)
1727{
1728 expr_ty tmp;
1729 REQ(n, star_expr);
1730
1731 tmp = ast_for_expr(c, CHILD(n, 1));
1732 if (!tmp)
1733 return NULL;
1734
1735 /* The Load context is changed later. */
1736 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1737}
1738
1739
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740/* Do not name a variable 'expr'! Will cause a compile error.
1741*/
1742
1743static expr_ty
1744ast_for_expr(struct compiling *c, const node *n)
1745{
1746 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001747 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001748 test_nocond: or_test | lambdef_nocond
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001749 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750 and_test: not_test ('and' not_test)*
1751 not_test: 'not' not_test | comparison
1752 comparison: expr (comp_op expr)*
1753 expr: xor_expr ('|' xor_expr)*
1754 xor_expr: and_expr ('^' and_expr)*
1755 and_expr: shift_expr ('&' shift_expr)*
1756 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1757 arith_expr: term (('+'|'-') term)*
1758 term: factor (('*'|'/'|'%'|'//') factor)*
1759 factor: ('+'|'-'|'~') factor | power
1760 power: atom trailer* ('**' factor)*
1761 */
1762
1763 asdl_seq *seq;
1764 int i;
1765
1766 loop:
1767 switch (TYPE(n)) {
1768 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001769 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001770 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001771 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001772 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001773 else if (NCH(n) > 1)
1774 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001775 /* Fallthrough */
1776 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 case and_test:
1778 if (NCH(n) == 1) {
1779 n = CHILD(n, 0);
1780 goto loop;
1781 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001782 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783 if (!seq)
1784 return NULL;
1785 for (i = 0; i < NCH(n); i += 2) {
1786 expr_ty e = ast_for_expr(c, CHILD(n, i));
1787 if (!e)
1788 return NULL;
1789 asdl_seq_SET(seq, i / 2, e);
1790 }
1791 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001792 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1793 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001794 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001795 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796 case not_test:
1797 if (NCH(n) == 1) {
1798 n = CHILD(n, 0);
1799 goto loop;
1800 }
1801 else {
1802 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1803 if (!expression)
1804 return NULL;
1805
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001806 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1807 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 }
1809 case comparison:
1810 if (NCH(n) == 1) {
1811 n = CHILD(n, 0);
1812 goto loop;
1813 }
1814 else {
1815 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001816 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001817 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001818 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 if (!ops)
1820 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001821 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 return NULL;
1824 }
1825 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001826 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001828 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001831 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832
1833 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001834 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001836 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001837
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001838 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 asdl_seq_SET(cmps, i / 2, expression);
1840 }
1841 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001842 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001844 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001845
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846 return Compare(expression, ops, cmps, LINENO(n),
1847 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 }
1849 break;
1850
Guido van Rossum0368b722007-05-11 16:50:42 +00001851 case star_expr:
1852 if (TYPE(CHILD(n, 0)) == STAR) {
1853 return ast_for_starred(c, n);
1854 }
1855 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 /* The next five cases all handle BinOps. The main body of code
1857 is the same in each case, but the switch turned inside out to
1858 reuse the code for each type of operator.
1859 */
1860 case expr:
1861 case xor_expr:
1862 case and_expr:
1863 case shift_expr:
1864 case arith_expr:
1865 case term:
1866 if (NCH(n) == 1) {
1867 n = CHILD(n, 0);
1868 goto loop;
1869 }
1870 return ast_for_binop(c, n);
1871 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 expr_ty exp = NULL;
1873 if (NCH(n) == 2) {
1874 exp = ast_for_testlist(c, CHILD(n, 1));
1875 if (!exp)
1876 return NULL;
1877 }
1878 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1879 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001880 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 if (NCH(n) == 1) {
1882 n = CHILD(n, 0);
1883 goto loop;
1884 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001886 case power:
1887 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001889 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 return NULL;
1891 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001892 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 return NULL;
1894}
1895
1896static expr_ty
1897ast_for_call(struct compiling *c, const node *n, expr_ty func)
1898{
1899 /*
1900 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1901 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001902 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 */
1904
1905 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001906 asdl_seq *args;
1907 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 expr_ty vararg = NULL, kwarg = NULL;
1909
1910 REQ(n, arglist);
1911
1912 nargs = 0;
1913 nkeywords = 0;
1914 ngens = 0;
1915 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001916 node *ch = CHILD(n, i);
1917 if (TYPE(ch) == argument) {
1918 if (NCH(ch) == 1)
1919 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001921 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001923 nkeywords++;
1924 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 }
1926 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001927 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001928 "if not sole argument");
1929 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 }
1931
1932 if (nargs + nkeywords + ngens > 255) {
1933 ast_error(n, "more than 255 arguments");
1934 return NULL;
1935 }
1936
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001937 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001939 return NULL;
1940 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001942 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 nargs = 0;
1944 nkeywords = 0;
1945 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001946 node *ch = CHILD(n, i);
1947 if (TYPE(ch) == argument) {
1948 expr_ty e;
1949 if (NCH(ch) == 1) {
1950 if (nkeywords) {
1951 ast_error(CHILD(ch, 0),
1952 "non-keyword arg after keyword arg");
1953 return NULL;
1954 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001955 if (vararg) {
1956 ast_error(CHILD(ch, 0),
1957 "only named arguments may follow *expression");
1958 return NULL;
1959 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001960 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001962 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001963 asdl_seq_SET(args, nargs++, e);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001964 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001965 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001966 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001968 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001969 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001971 else {
1972 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001973 identifier key, tmp;
1974 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001976 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001977 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001979 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 /* f(lambda x: x[0] = 3) ends up getting parsed with
1981 * LHS test = lambda x: x[0], and RHS test = 3.
1982 * SF bug 132313 points out that complaining about a keyword
1983 * then is very confusing.
1984 */
1985 if (e->kind == Lambda_kind) {
1986 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001987 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 } else if (e->kind != Name_kind) {
1989 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001991 } else if (forbidden_name(e, ch)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001992 return NULL;
1993 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001995 for (k = 0; k < nkeywords; k++) {
1996 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
1997 if (!PyUnicode_Compare(tmp, key)) {
1998 ast_error(CHILD(ch, 0), "keyword argument repeated");
1999 return NULL;
2000 }
2001 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002004 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002007 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 asdl_seq_SET(keywords, nkeywords++, kw);
2009 }
2010 }
2011 else if (TYPE(ch) == STAR) {
2012 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002013 if (!vararg)
2014 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 i++;
2016 }
2017 else if (TYPE(ch) == DOUBLESTAR) {
2018 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002019 if (!kwarg)
2020 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 i++;
2022 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 }
2024
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002025 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026}
2027
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002029ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002031 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002032 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002033 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002035 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002036 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002037 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002038 }
2039 else {
2040 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002041 TYPE(n) == testlist1);
2042 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 else {
2046 asdl_seq *tmp = seq_for_testlist(c, n);
2047 if (!tmp)
2048 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002049 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002051}
2052
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053static stmt_ty
2054ast_for_expr_stmt(struct compiling *c, const node *n)
2055{
2056 REQ(n, expr_stmt);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002057 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 | ('=' (yield_expr|testlist))*)
2059 testlist: test (',' test)* [',']
2060 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002061 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 test: ... here starts the operator precendence dance
2063 */
2064
2065 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002066 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 if (!e)
2068 return NULL;
2069
Thomas Wouters89f507f2006-12-13 04:49:30 +00002070 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 }
2072 else if (TYPE(CHILD(n, 1)) == augassign) {
2073 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002074 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002075 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076
Thomas Wouters89f507f2006-12-13 04:49:30 +00002077 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 if (!expr1)
2079 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002080 if(!set_context(c, expr1, Store, ch))
2081 return NULL;
Benjamin Peterson4fac7062009-10-03 20:28:47 +00002082 /* set_context checks that most expressions are not the left side.
2083 Augmented assignments can only have a name, a subscript, or an
2084 attribute on the left, though, so we have to explicitly check for
2085 those. */
2086 switch (expr1->kind) {
2087 case Name_kind:
2088 case Attribute_kind:
2089 case Subscript_kind:
2090 break;
2091 default:
2092 ast_error(ch, "illegal expression for augmented assignment");
2093 return NULL;
2094 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095
Thomas Wouters89f507f2006-12-13 04:49:30 +00002096 ch = CHILD(n, 2);
2097 if (TYPE(ch) == testlist)
2098 expr2 = ast_for_testlist(c, ch);
2099 else
2100 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002101 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102 return NULL;
2103
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002104 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002105 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106 return NULL;
2107
Thomas Wouters89f507f2006-12-13 04:49:30 +00002108 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 }
2110 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002111 int i;
2112 asdl_seq *targets;
2113 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 expr_ty expression;
2115
Thomas Wouters89f507f2006-12-13 04:49:30 +00002116 /* a normal assignment */
2117 REQ(CHILD(n, 1), EQUAL);
2118 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2119 if (!targets)
2120 return NULL;
2121 for (i = 0; i < NCH(n) - 2; i += 2) {
2122 expr_ty e;
2123 node *ch = CHILD(n, i);
2124 if (TYPE(ch) == yield_expr) {
2125 ast_error(ch, "assignment to yield expression not possible");
2126 return NULL;
2127 }
2128 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129
Thomas Wouters89f507f2006-12-13 04:49:30 +00002130 /* set context to assign */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002131 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002132 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002134 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002135 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137 asdl_seq_SET(targets, i / 2, e);
2138 }
2139 value = CHILD(n, NCH(n) - 1);
2140 if (TYPE(value) == testlist)
2141 expression = ast_for_testlist(c, value);
2142 else
2143 expression = ast_for_expr(c, value);
2144 if (!expression)
2145 return NULL;
2146 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148}
2149
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002151ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002152{
2153 asdl_seq *seq;
2154 int i;
2155 expr_ty e;
2156
2157 REQ(n, exprlist);
2158
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002159 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002161 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002163 e = ast_for_expr(c, CHILD(n, i));
2164 if (!e)
2165 return NULL;
2166 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002167 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002168 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 }
2170 return seq;
2171}
2172
2173static stmt_ty
2174ast_for_del_stmt(struct compiling *c, const node *n)
2175{
2176 asdl_seq *expr_list;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002177
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178 /* del_stmt: 'del' exprlist */
2179 REQ(n, del_stmt);
2180
2181 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2182 if (!expr_list)
2183 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002184 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185}
2186
2187static stmt_ty
2188ast_for_flow_stmt(struct compiling *c, const node *n)
2189{
2190 /*
2191 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2192 | yield_stmt
2193 break_stmt: 'break'
2194 continue_stmt: 'continue'
2195 return_stmt: 'return' [testlist]
2196 yield_stmt: yield_expr
2197 yield_expr: 'yield' testlist
2198 raise_stmt: 'raise' [test [',' test [',' test]]]
2199 */
2200 node *ch;
2201
2202 REQ(n, flow_stmt);
2203 ch = CHILD(n, 0);
2204 switch (TYPE(ch)) {
2205 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002206 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002208 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002210 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2211 if (!exp)
2212 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002213 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214 }
2215 case return_stmt:
2216 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002217 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002219 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 if (!expression)
2221 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002222 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 }
2224 case raise_stmt:
2225 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002226 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2227 else if (NCH(ch) >= 2) {
2228 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2230 if (!expression)
2231 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002232 if (NCH(ch) == 4) {
2233 cause = ast_for_expr(c, CHILD(ch, 3));
2234 if (!cause)
2235 return NULL;
2236 }
2237 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 }
2239 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002240 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 "unexpected flow_stmt: %d", TYPE(ch));
2242 return NULL;
2243 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002244
2245 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2246 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247}
2248
2249static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002250alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251{
2252 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002253 import_as_name: NAME ['as' NAME]
2254 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002255 dotted_name: NAME ('.' NAME)*
2256 */
Benjamin Peterson30760062008-11-25 04:02:28 +00002257 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002258
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 loop:
2260 switch (TYPE(n)) {
2261 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002262 str = NULL;
2263 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002264 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002265 if (!str)
2266 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002267 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002268 name = NEW_IDENTIFIER(CHILD(n, 0));
2269 if (!name)
2270 return NULL;
2271 return alias(name, str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 case dotted_as_name:
2273 if (NCH(n) == 1) {
2274 n = CHILD(n, 0);
2275 goto loop;
2276 }
2277 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002278 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002279 if (!a)
2280 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 assert(!a->asname);
2282 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002283 if (!a->asname)
2284 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 return a;
2286 }
2287 break;
2288 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002289 if (NCH(n) == 1) {
2290 name = NEW_IDENTIFIER(CHILD(n, 0));
2291 if (!name)
2292 return NULL;
2293 return alias(name, NULL, c->c_arena);
2294 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295 else {
2296 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002297 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002298 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 char *s;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002300 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301
2302 len = 0;
2303 for (i = 0; i < NCH(n); i += 2)
2304 /* length of string plus one for the dot */
2305 len += strlen(STR(CHILD(n, i))) + 1;
2306 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002307 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 if (!str)
2309 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002310 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 if (!s)
2312 return NULL;
2313 for (i = 0; i < NCH(n); i += 2) {
2314 char *sch = STR(CHILD(n, i));
2315 strcpy(s, STR(CHILD(n, i)));
2316 s += strlen(sch);
2317 *s++ = '.';
2318 }
2319 --s;
2320 *s = '\0';
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002321 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2322 PyBytes_GET_SIZE(str),
2323 NULL);
2324 Py_DECREF(str);
2325 if (!uni)
2326 return NULL;
2327 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002328 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002329 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002330 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 }
2332 break;
2333 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002334 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002335 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002336 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002338 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 "unexpected import name: %d", TYPE(n));
2340 return NULL;
2341 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002342
2343 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 return NULL;
2345}
2346
2347static stmt_ty
2348ast_for_import_stmt(struct compiling *c, const node *n)
2349{
2350 /*
2351 import_stmt: import_name | import_from
2352 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002353 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2354 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002356 int lineno;
2357 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 int i;
2359 asdl_seq *aliases;
2360
2361 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002362 lineno = LINENO(n);
2363 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002365 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002367 REQ(n, dotted_as_names);
2368 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2369 if (!aliases)
2370 return NULL;
2371 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002372 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002373 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002375 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002377 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002378 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002379 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002381 int idx, ndots = 0;
2382 alias_ty mod = NULL;
2383 identifier modname;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002384
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002385 /* Count the number of dots (for relative imports) and check for the
2386 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 for (idx = 1; idx < NCH(n); idx++) {
2388 if (TYPE(CHILD(n, idx)) == dotted_name) {
2389 mod = alias_for_import_name(c, CHILD(n, idx));
2390 idx++;
2391 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002392 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002393 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002394 ndots += 3;
2395 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002396 } else if (TYPE(CHILD(n, idx)) != DOT) {
2397 break;
2398 }
2399 ndots++;
2400 }
2401 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002402 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002403 case STAR:
2404 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002405 n = CHILD(n, idx);
2406 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002407 break;
2408 case LPAR:
2409 /* from ... import (x, y, z) */
2410 n = CHILD(n, idx + 1);
2411 n_children = NCH(n);
2412 break;
2413 case import_as_names:
2414 /* from ... import x, y, z */
2415 n = CHILD(n, idx);
2416 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002417 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 ast_error(n, "trailing comma not allowed without"
2419 " surrounding parentheses");
2420 return NULL;
2421 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 break;
2423 default:
2424 ast_error(n, "Unexpected node-type in from-import");
2425 return NULL;
2426 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427
Thomas Wouters89f507f2006-12-13 04:49:30 +00002428 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2429 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431
2432 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002433 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002434 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002435 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002439 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002441 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2442 if (!import_alias)
2443 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002444 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002445 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002447 if (mod != NULL)
2448 modname = mod->name;
2449 else
2450 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002451 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002452 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 }
Neal Norwitz79792652005-11-14 04:25:03 +00002454 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 "unknown import statement: starts with command '%s'",
2456 STR(CHILD(n, 0)));
2457 return NULL;
2458}
2459
2460static stmt_ty
2461ast_for_global_stmt(struct compiling *c, const node *n)
2462{
2463 /* global_stmt: 'global' NAME (',' NAME)* */
2464 identifier name;
2465 asdl_seq *s;
2466 int i;
2467
2468 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002469 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 name = NEW_IDENTIFIER(CHILD(n, i));
2474 if (!name)
2475 return NULL;
2476 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002478 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479}
2480
2481static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002482ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2483{
2484 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2485 identifier name;
2486 asdl_seq *s;
2487 int i;
2488
2489 REQ(n, nonlocal_stmt);
2490 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2491 if (!s)
2492 return NULL;
2493 for (i = 1; i < NCH(n); i += 2) {
2494 name = NEW_IDENTIFIER(CHILD(n, i));
2495 if (!name)
2496 return NULL;
2497 asdl_seq_SET(s, i / 2, name);
2498 }
2499 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2500}
2501
2502static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503ast_for_assert_stmt(struct compiling *c, const node *n)
2504{
2505 /* assert_stmt: 'assert' test [',' test] */
2506 REQ(n, assert_stmt);
2507 if (NCH(n) == 2) {
2508 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2509 if (!expression)
2510 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 }
2513 else if (NCH(n) == 4) {
2514 expr_ty expr1, expr2;
2515
2516 expr1 = ast_for_expr(c, CHILD(n, 1));
2517 if (!expr1)
2518 return NULL;
2519 expr2 = ast_for_expr(c, CHILD(n, 3));
2520 if (!expr2)
2521 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002522
Thomas Wouters89f507f2006-12-13 04:49:30 +00002523 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 }
Neal Norwitz79792652005-11-14 04:25:03 +00002525 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 "improper number of parts to 'assert' statement: %d",
2527 NCH(n));
2528 return NULL;
2529}
2530
2531static asdl_seq *
2532ast_for_suite(struct compiling *c, const node *n)
2533{
2534 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002535 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 stmt_ty s;
2537 int i, total, num, end, pos = 0;
2538 node *ch;
2539
2540 REQ(n, suite);
2541
2542 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002543 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002547 n = CHILD(n, 0);
2548 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002549 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002550 */
2551 end = NCH(n) - 1;
2552 if (TYPE(CHILD(n, end - 1)) == SEMI)
2553 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002555 for (i = 0; i < end; i += 2) {
2556 ch = CHILD(n, i);
2557 s = ast_for_stmt(c, ch);
2558 if (!s)
2559 return NULL;
2560 asdl_seq_SET(seq, pos++, s);
2561 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 }
2563 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 for (i = 2; i < (NCH(n) - 1); i++) {
2565 ch = CHILD(n, i);
2566 REQ(ch, stmt);
2567 num = num_stmts(ch);
2568 if (num == 1) {
2569 /* small_stmt or compound_stmt with only one child */
2570 s = ast_for_stmt(c, ch);
2571 if (!s)
2572 return NULL;
2573 asdl_seq_SET(seq, pos++, s);
2574 }
2575 else {
2576 int j;
2577 ch = CHILD(ch, 0);
2578 REQ(ch, simple_stmt);
2579 for (j = 0; j < NCH(ch); j += 2) {
2580 /* statement terminates with a semi-colon ';' */
2581 if (NCH(CHILD(ch, j)) == 0) {
2582 assert((j + 1) == NCH(ch));
2583 break;
2584 }
2585 s = ast_for_stmt(c, CHILD(ch, j));
2586 if (!s)
2587 return NULL;
2588 asdl_seq_SET(seq, pos++, s);
2589 }
2590 }
2591 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 }
2593 assert(pos == seq->size);
2594 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595}
2596
2597static stmt_ty
2598ast_for_if_stmt(struct compiling *c, const node *n)
2599{
2600 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2601 ['else' ':' suite]
2602 */
2603 char *s;
2604
2605 REQ(n, if_stmt);
2606
2607 if (NCH(n) == 4) {
2608 expr_ty expression;
2609 asdl_seq *suite_seq;
2610
2611 expression = ast_for_expr(c, CHILD(n, 1));
2612 if (!expression)
2613 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002614 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002615 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002617
Guido van Rossumd8faa362007-04-27 19:54:29 +00002618 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2619 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002621
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 s = STR(CHILD(n, 4));
2623 /* s[2], the third character in the string, will be
2624 's' for el_s_e, or
2625 'i' for el_i_f
2626 */
2627 if (s[2] == 's') {
2628 expr_ty expression;
2629 asdl_seq *seq1, *seq2;
2630
2631 expression = ast_for_expr(c, CHILD(n, 1));
2632 if (!expression)
2633 return NULL;
2634 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002635 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 return NULL;
2637 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002638 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 return NULL;
2640
Guido van Rossumd8faa362007-04-27 19:54:29 +00002641 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2642 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 }
2644 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002646 expr_ty expression;
2647 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002648 asdl_seq *orelse = NULL;
2649 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 /* must reference the child n_elif+1 since 'else' token is third,
2651 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002652 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2653 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2654 has_else = 1;
2655 n_elif -= 3;
2656 }
2657 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658
Thomas Wouters89f507f2006-12-13 04:49:30 +00002659 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002660 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661
Thomas Wouters89f507f2006-12-13 04:49:30 +00002662 orelse = asdl_seq_new(1, c->c_arena);
2663 if (!orelse)
2664 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002666 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002668 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2669 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2672 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002675 asdl_seq_SET(orelse, 0,
2676 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002677 LINENO(CHILD(n, NCH(n) - 6)),
2678 CHILD(n, NCH(n) - 6)->n_col_offset,
2679 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 /* the just-created orelse handled the last elif */
2681 n_elif--;
2682 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 for (i = 0; i < n_elif; i++) {
2685 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2687 if (!newobj)
2688 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002690 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695
Thomas Wouters89f507f2006-12-13 04:49:30 +00002696 asdl_seq_SET(newobj, 0,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002697 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002698 LINENO(CHILD(n, off)),
2699 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002700 orelse = newobj;
2701 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002702 expression = ast_for_expr(c, CHILD(n, 1));
2703 if (!expression)
2704 return NULL;
2705 suite_seq = ast_for_suite(c, CHILD(n, 3));
2706 if (!suite_seq)
2707 return NULL;
2708 return If(expression, suite_seq, orelse,
2709 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002711
2712 PyErr_Format(PyExc_SystemError,
2713 "unexpected token in 'if' statement: %s", s);
2714 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715}
2716
2717static stmt_ty
2718ast_for_while_stmt(struct compiling *c, const node *n)
2719{
2720 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2721 REQ(n, while_stmt);
2722
2723 if (NCH(n) == 4) {
2724 expr_ty expression;
2725 asdl_seq *suite_seq;
2726
2727 expression = ast_for_expr(c, CHILD(n, 1));
2728 if (!expression)
2729 return NULL;
2730 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002731 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002733 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 }
2735 else if (NCH(n) == 7) {
2736 expr_ty expression;
2737 asdl_seq *seq1, *seq2;
2738
2739 expression = ast_for_expr(c, CHILD(n, 1));
2740 if (!expression)
2741 return NULL;
2742 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002743 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 return NULL;
2745 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002746 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 return NULL;
2748
Thomas Wouters89f507f2006-12-13 04:49:30 +00002749 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002751
2752 PyErr_Format(PyExc_SystemError,
2753 "wrong number of tokens for 'while' statement: %d",
2754 NCH(n));
2755 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756}
2757
2758static stmt_ty
2759ast_for_for_stmt(struct compiling *c, const node *n)
2760{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002761 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 expr_ty expression;
2763 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002764 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2766 REQ(n, for_stmt);
2767
2768 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002769 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 if (!seq)
2771 return NULL;
2772 }
2773
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002774 node_target = CHILD(n, 1);
2775 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002778 /* Check the # of children rather than the length of _target, since
2779 for x, in ... has 1 element in _target, but still requires a Tuple. */
2780 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002781 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002783 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002785 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 return NULL;
2788 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002789 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 return NULL;
2791
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002792 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2793 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794}
2795
2796static excepthandler_ty
2797ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2798{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002799 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 REQ(exc, except_clause);
2801 REQ(body, suite);
2802
2803 if (NCH(exc) == 1) {
2804 asdl_seq *suite_seq = ast_for_suite(c, body);
2805 if (!suite_seq)
2806 return NULL;
2807
Neal Norwitzad74aa82008-03-31 05:14:30 +00002808 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002809 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 }
2811 else if (NCH(exc) == 2) {
2812 expr_ty expression;
2813 asdl_seq *suite_seq;
2814
2815 expression = ast_for_expr(c, CHILD(exc, 1));
2816 if (!expression)
2817 return NULL;
2818 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002819 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 return NULL;
2821
Neal Norwitzad74aa82008-03-31 05:14:30 +00002822 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002823 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 }
2825 else if (NCH(exc) == 4) {
2826 asdl_seq *suite_seq;
2827 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002828 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002829 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002832 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 return NULL;
2834 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002835 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 return NULL;
2837
Neal Norwitzad74aa82008-03-31 05:14:30 +00002838 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002839 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002841
2842 PyErr_Format(PyExc_SystemError,
2843 "wrong number of children for 'except' clause: %d",
2844 NCH(exc));
2845 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846}
2847
2848static stmt_ty
2849ast_for_try_stmt(struct compiling *c, const node *n)
2850{
Neal Norwitzf599f422005-12-17 21:33:47 +00002851 const int nch = NCH(n);
2852 int n_except = (nch - 3)/3;
2853 asdl_seq *body, *orelse = NULL, *finally = NULL;
2854
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 REQ(n, try_stmt);
2856
Neal Norwitzf599f422005-12-17 21:33:47 +00002857 body = ast_for_suite(c, CHILD(n, 2));
2858 if (body == NULL)
2859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860
Neal Norwitzf599f422005-12-17 21:33:47 +00002861 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2862 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2863 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2864 /* we can assume it's an "else",
2865 because nch >= 9 for try-else-finally and
2866 it would otherwise have a type of except_clause */
2867 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2868 if (orelse == NULL)
2869 return NULL;
2870 n_except--;
2871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872
Neal Norwitzf599f422005-12-17 21:33:47 +00002873 finally = ast_for_suite(c, CHILD(n, nch - 1));
2874 if (finally == NULL)
2875 return NULL;
2876 n_except--;
2877 }
2878 else {
2879 /* we can assume it's an "else",
2880 otherwise it would have a type of except_clause */
2881 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2882 if (orelse == NULL)
2883 return NULL;
2884 n_except--;
2885 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002887 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002888 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 return NULL;
2890 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002891
Neal Norwitzf599f422005-12-17 21:33:47 +00002892 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 int i;
2894 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002895 /* process except statements to create a try ... except */
2896 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2897 if (handlers == NULL)
2898 return NULL;
2899
2900 for (i = 0; i < n_except; i++) {
2901 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2902 CHILD(n, 5 + i * 3));
2903 if (!e)
2904 return NULL;
2905 asdl_seq_SET(handlers, i, e);
2906 }
2907
Thomas Wouters89f507f2006-12-13 04:49:30 +00002908 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002909 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002910 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002912
2913 /* if a 'finally' is present too, we nest the TryExcept within a
2914 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002915 body = asdl_seq_new(1, c->c_arena);
2916 if (body == NULL)
2917 return NULL;
2918 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002919 }
2920
2921 /* must be a try ... finally (except clauses are in body, if any exist) */
2922 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002923 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924}
2925
Georg Brandl0c315622009-05-25 21:10:36 +00002926/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002927static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002928ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002929{
2930 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002931
Georg Brandl0c315622009-05-25 21:10:36 +00002932 REQ(n, with_item);
2933 context_expr = ast_for_expr(c, CHILD(n, 0));
2934 if (NCH(n) == 3) {
2935 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002936
2937 if (!optional_vars) {
2938 return NULL;
2939 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002940 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 return NULL;
2942 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002943 }
2944
Georg Brandl0c315622009-05-25 21:10:36 +00002945 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002947}
2948
Georg Brandl0c315622009-05-25 21:10:36 +00002949/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2950static stmt_ty
2951ast_for_with_stmt(struct compiling *c, const node *n)
2952{
2953 int i;
2954 stmt_ty ret;
2955 asdl_seq *inner;
2956
2957 REQ(n, with_stmt);
2958
2959 /* process the with items inside-out */
2960 i = NCH(n) - 1;
2961 /* the suite of the innermost with item is the suite of the with stmt */
2962 inner = ast_for_suite(c, CHILD(n, i));
2963 if (!inner)
2964 return NULL;
2965
2966 for (;;) {
2967 i -= 2;
2968 ret = ast_for_with_item(c, CHILD(n, i), inner);
2969 if (!ret)
2970 return NULL;
2971 /* was this the last item? */
2972 if (i == 1)
2973 break;
2974 /* if not, wrap the result so far in a new sequence */
2975 inner = asdl_seq_new(1, c->c_arena);
2976 if (!inner)
2977 return NULL;
2978 asdl_seq_SET(inner, 0, ret);
2979 }
2980
2981 return ret;
2982}
2983
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002985ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002987 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00002988 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002989 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00002990 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002991
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 REQ(n, classdef);
2993
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002994 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 s = ast_for_suite(c, CHILD(n, 3));
2996 if (!s)
2997 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002998 classname = NEW_IDENTIFIER(CHILD(n, 1));
2999 if (!classname)
3000 return NULL;
3001 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3002 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003004
3005 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003006 s = ast_for_suite(c, CHILD(n,5));
3007 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003008 return NULL;
3009 classname = NEW_IDENTIFIER(CHILD(n, 1));
3010 if (!classname)
3011 return NULL;
3012 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3013 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 }
3015
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003016 /* class NAME '(' arglist ')' ':' suite */
3017 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003018 {
3019 PyObject *dummy_name;
3020 expr_ty dummy;
3021 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3022 if (!dummy_name)
3023 return NULL;
3024 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3025 call = ast_for_call(c, CHILD(n, 3), dummy);
3026 if (!call)
3027 return NULL;
3028 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003030 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003032 classname = NEW_IDENTIFIER(CHILD(n, 1));
3033 if (!classname)
3034 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003035
Benjamin Peterson30760062008-11-25 04:02:28 +00003036 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003037 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003038 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039}
3040
3041static stmt_ty
3042ast_for_stmt(struct compiling *c, const node *n)
3043{
3044 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 assert(NCH(n) == 1);
3046 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047 }
3048 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003049 assert(num_stmts(n) == 1);
3050 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 }
3052 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003053 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003054 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3055 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003056 */
3057 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 case expr_stmt:
3059 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 case del_stmt:
3061 return ast_for_del_stmt(c, n);
3062 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003063 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 case flow_stmt:
3065 return ast_for_flow_stmt(c, n);
3066 case import_stmt:
3067 return ast_for_import_stmt(c, n);
3068 case global_stmt:
3069 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003070 case nonlocal_stmt:
3071 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 case assert_stmt:
3073 return ast_for_assert_stmt(c, n);
3074 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003075 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3077 TYPE(n), NCH(n));
3078 return NULL;
3079 }
3080 }
3081 else {
3082 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003083 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003084 */
3085 node *ch = CHILD(n, 0);
3086 REQ(n, compound_stmt);
3087 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 case if_stmt:
3089 return ast_for_if_stmt(c, ch);
3090 case while_stmt:
3091 return ast_for_while_stmt(c, ch);
3092 case for_stmt:
3093 return ast_for_for_stmt(c, ch);
3094 case try_stmt:
3095 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003096 case with_stmt:
3097 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003099 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003101 return ast_for_classdef(c, ch, NULL);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003102 case decorated:
3103 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003105 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3107 TYPE(n), NCH(n));
3108 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003109 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 }
3111}
3112
3113static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003114parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003116 const char *end;
3117 long x;
3118 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003120 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003121 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122#endif
3123
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003124 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003125 errno = 0;
3126 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003128 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003130 if (s[0] == '0') {
3131 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3132 if (x < 0 && errno == 0) {
3133 return PyLong_FromString((char *)s,
3134 (char **)0,
3135 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003136 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003137 }
3138 else
3139 x = PyOS_strtol((char *)s, (char **)&end, 0);
3140 if (*end == '\0') {
3141 if (errno != 0)
3142 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003143 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003144 }
3145 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003147 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003148 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003149 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3150 if (compl.imag == -1.0 && PyErr_Occurred())
3151 return NULL;
3152 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003153 }
3154 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003156 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003157 dx = PyOS_string_to_double(s, NULL, NULL);
3158 if (dx == -1.0 && PyErr_Occurred())
3159 return NULL;
3160 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003162}
3163
3164static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003165decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003167 PyObject *u, *v;
3168 char *s, *t;
3169 t = s = (char *)*sPtr;
3170 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3171 while (s < end && (*s & 0x80)) s++;
3172 *sPtr = s;
3173 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3174 if (u == NULL)
3175 return NULL;
3176 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3177 Py_DECREF(u);
3178 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179}
3180
3181static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003182decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003184 PyObject *v, *u;
3185 char *buf;
3186 char *p;
3187 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003188
Guido van Rossumd8faa362007-04-27 19:54:29 +00003189 if (encoding == NULL) {
3190 buf = (char *)s;
3191 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003192 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003193 /* check for integer overflow */
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003194 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003195 return NULL;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003196 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3197 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3198 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003199 if (u == NULL)
3200 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003201 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 end = s + len;
3203 while (s < end) {
3204 if (*s == '\\') {
3205 *p++ = *s++;
3206 if (*s & 0x80) {
3207 strcpy(p, "u005c");
3208 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003209 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 }
3211 if (*s & 0x80) { /* XXX inefficient */
3212 PyObject *w;
3213 char *r;
3214 Py_ssize_t rn, i;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003215 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 if (w == NULL) {
3217 Py_DECREF(u);
3218 return NULL;
3219 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003220 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003221 rn = Py_SIZE(w);
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003222 assert(rn % 4 == 0);
3223 for (i = 0; i < rn; i += 4) {
3224 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003225 r[i + 0] & 0xFF,
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003226 r[i + 1] & 0xFF,
3227 r[i + 2] & 0xFF,
3228 r[i + 3] & 0xFF);
3229 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230 }
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003231 /* Should be impossible to overflow */
3232 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003233 Py_DECREF(w);
3234 } else {
3235 *p++ = *s++;
3236 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003237 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 len = p - buf;
3239 s = buf;
3240 }
3241 if (rawmode)
3242 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3243 else
3244 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3245 Py_XDECREF(u);
3246 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247}
3248
3249/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003250 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 * parsestr parses it, and returns the decoded Python string object.
3252 */
3253static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003254parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003256 size_t len;
3257 const char *s = STR(n);
3258 int quote = Py_CHARMASK(*s);
3259 int rawmode = 0;
3260 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003261 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003262 if (quote == 'b' || quote == 'B') {
3263 quote = *++s;
3264 *bytesmode = 1;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003265 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003266 if (quote == 'r' || quote == 'R') {
3267 quote = *++s;
3268 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003269 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003270 }
3271 if (quote != '\'' && quote != '\"') {
3272 PyErr_BadInternalCall();
3273 return NULL;
3274 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003275 s++;
3276 len = strlen(s);
3277 if (len > INT_MAX) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003278 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003279 "string to parse is too long");
3280 return NULL;
3281 }
3282 if (s[--len] != quote) {
3283 PyErr_BadInternalCall();
3284 return NULL;
3285 }
3286 if (len >= 4 && s[0] == quote && s[1] == quote) {
3287 s += 2;
3288 len -= 2;
3289 if (s[--len] != quote || s[--len] != quote) {
3290 PyErr_BadInternalCall();
3291 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003292 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003293 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003294 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003295 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003296 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003297 if (*bytesmode) {
3298 /* Disallow non-ascii characters (but not escapes) */
3299 const char *c;
3300 for (c = s; *c; c++) {
3301 if (Py_CHARMASK(*c) >= 0x80) {
3302 ast_error(n, "bytes can only contain ASCII "
3303 "literal characters.");
3304 return NULL;
3305 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003306 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003307 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003308 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003309 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003310 if (rawmode || strchr(s, '\\') == NULL) {
3311 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003312 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003313 if (u == NULL || !*bytesmode)
3314 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003315 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003316 Py_DECREF(u);
3317 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003318 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003319 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003320 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003321 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003322 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003323 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003324 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003325 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003326 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003327 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328}
3329
Guido van Rossum29fd7122007-11-12 01:13:56 +00003330/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003331 * compile-time literal catenation, calling parsestr() on each piece, and
3332 * pasting the intermediate results together.
3333 */
3334static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003335parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 PyObject *v;
3338 int i;
3339 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003340 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003341 if (v != NULL) {
3342 /* String literal concatenation */
3343 for (i = 1; i < NCH(n); i++) {
3344 PyObject *s;
3345 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003346 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003347 if (s == NULL)
3348 goto onError;
3349 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003350 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003351 goto onError;
3352 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003353 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3354 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003355 if (v == NULL)
3356 goto onError;
3357 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003358 else {
3359 PyObject *temp = PyUnicode_Concat(v, s);
3360 Py_DECREF(s);
3361 Py_DECREF(v);
3362 v = temp;
3363 if (v == NULL)
3364 goto onError;
3365 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003366 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003367 }
3368 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369
Guido van Rossumd8faa362007-04-27 19:54:29 +00003370 onError:
3371 Py_XDECREF(v);
3372 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373}