blob: 8b68182582dc6792f61175095a0c19dd5157e550 [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
37static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000038static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
39static 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);
Martin v. Löwis47383402007-08-15 07:32:56 +000054 Py_UNICODE *u = PyUnicode_AS_UNICODE(id);
55 /* Check whether there are non-ASCII characters in the
56 identifier; if so, normalize to NFKC. */
57 for (; *u; u++) {
58 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000059 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000060 PyObject *id2;
61 if (!m)
62 return NULL;
63 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
64 Py_DECREF(m);
65 if (!id2)
66 return NULL;
67 Py_DECREF(id);
68 id = id2;
69 break;
70 }
71 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000072 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000073 PyArena_AddPyObject(arena, id);
74 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075}
76
Neal Norwitzadb69fc2005-12-17 20:54:49 +000077#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078
79/* This routine provides an invalid object for the syntax error.
80 The outermost routine must unpack this error and create the
81 proper object. We do this so that we don't have to pass
82 the filename to everything function.
83
84 XXX Maybe we should just pass the filename...
85*/
86
87static int
88ast_error(const node *n, const char *errstr)
89{
90 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
91 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000092 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093 PyErr_SetObject(PyExc_SyntaxError, u);
94 Py_DECREF(u);
95 return 0;
96}
97
98static void
99ast_error_finish(const char *filename)
100{
101 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000102 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103
104 assert(PyErr_Occurred());
105 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000106 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107
108 PyErr_Fetch(&type, &value, &tback);
109 errstr = PyTuple_GetItem(value, 0);
110 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000111 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000113 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000114 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 Py_DECREF(errstr);
116 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118 Py_DECREF(value);
119
120 loc = PyErr_ProgramText(filename, lineno);
121 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000122 Py_INCREF(Py_None);
123 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000125 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000127 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000128 Py_DECREF(errstr);
129 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132 Py_DECREF(errstr);
133 Py_DECREF(tmp);
134 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000135 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000136 PyErr_Restore(type, value, tback);
137}
138
139/* num_stmts() returns number of contained statements.
140
141 Use this routine to determine how big a sequence is needed for
142 the statements in a parse tree. Its raison d'etre is this bit of
143 grammar:
144
145 stmt: simple_stmt | compound_stmt
146 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
147
148 A simple_stmt can contain multiple small_stmt elements joined
149 by semicolons. If the arg is a simple_stmt, the number of
150 small_stmt elements is returned.
151*/
152
153static int
154num_stmts(const node *n)
155{
156 int i, l;
157 node *ch;
158
159 switch (TYPE(n)) {
160 case single_input:
161 if (TYPE(CHILD(n, 0)) == NEWLINE)
162 return 0;
163 else
164 return num_stmts(CHILD(n, 0));
165 case file_input:
166 l = 0;
167 for (i = 0; i < NCH(n); i++) {
168 ch = CHILD(n, i);
169 if (TYPE(ch) == stmt)
170 l += num_stmts(ch);
171 }
172 return l;
173 case stmt:
174 return num_stmts(CHILD(n, 0));
175 case compound_stmt:
176 return 1;
177 case simple_stmt:
178 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
179 case suite:
180 if (NCH(n) == 1)
181 return num_stmts(CHILD(n, 0));
182 else {
183 l = 0;
184 for (i = 2; i < (NCH(n) - 1); i++)
185 l += num_stmts(CHILD(n, i));
186 return l;
187 }
188 default: {
189 char buf[128];
190
191 sprintf(buf, "Non-statement found: %d %d\n",
192 TYPE(n), NCH(n));
193 Py_FatalError(buf);
194 }
195 }
196 assert(0);
197 return 0;
198}
199
200/* Transform the CST rooted at node * to the appropriate AST
201*/
202
203mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
205 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000207 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208 asdl_seq *stmts = NULL;
209 stmt_ty s;
210 node *ch;
211 struct compiling c;
212
213 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000214 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000215 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000216#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 ast_error(n, "encoding declaration in Unicode string");
218 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000219#endif
220 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222 } else if (TYPE(n) == encoding_decl) {
223 c.c_encoding = STR(n);
224 n = CHILD(n, 0);
225 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000226 /* PEP 3120 */
227 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000229 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000230 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231
Jeremy Hyltona8293132006-02-28 17:58:27 +0000232 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 switch (TYPE(n)) {
234 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 for (i = 0; i < NCH(n) - 1; i++) {
239 ch = CHILD(n, i);
240 if (TYPE(ch) == NEWLINE)
241 continue;
242 REQ(ch, stmt);
243 num = num_stmts(ch);
244 if (num == 1) {
245 s = ast_for_stmt(&c, ch);
246 if (!s)
247 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000248 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 }
250 else {
251 ch = CHILD(ch, 0);
252 REQ(ch, simple_stmt);
253 for (j = 0; j < num; j++) {
254 s = ast_for_stmt(&c, CHILD(ch, j * 2));
255 if (!s)
256 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000257 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 }
259 }
260 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000261 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 case eval_input: {
263 expr_ty testlist_ast;
264
Nick Coghlan650f0d02007-04-15 12:05:43 +0000265 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000266 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 if (!testlist_ast)
268 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000269 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 }
271 case single_input:
272 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000273 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000275 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000276 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
277 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000278 if (!asdl_seq_GET(stmts, 0))
279 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000280 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281 }
282 else {
283 n = CHILD(n, 0);
284 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000285 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000287 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000289 s = ast_for_stmt(&c, n);
290 if (!s)
291 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000292 asdl_seq_SET(stmts, 0, s);
293 }
294 else {
295 /* Only a simple_stmt can contain multiple statements. */
296 REQ(n, simple_stmt);
297 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 if (TYPE(CHILD(n, i)) == NEWLINE)
299 break;
300 s = ast_for_stmt(&c, CHILD(n, i));
301 if (!s)
302 goto error;
303 asdl_seq_SET(stmts, i / 2, s);
304 }
305 }
306
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000307 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000308 }
309 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000310 PyErr_Format(PyExc_SystemError,
311 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312 goto error;
313 }
314 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 ast_error_finish(filename);
316 return NULL;
317}
318
319/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
320*/
321
322static operator_ty
323get_operator(const node *n)
324{
325 switch (TYPE(n)) {
326 case VBAR:
327 return BitOr;
328 case CIRCUMFLEX:
329 return BitXor;
330 case AMPER:
331 return BitAnd;
332 case LEFTSHIFT:
333 return LShift;
334 case RIGHTSHIFT:
335 return RShift;
336 case PLUS:
337 return Add;
338 case MINUS:
339 return Sub;
340 case STAR:
341 return Mult;
342 case SLASH:
343 return Div;
344 case DOUBLESLASH:
345 return FloorDiv;
346 case PERCENT:
347 return Mod;
348 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000349 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350 }
351}
352
Guido van Rossume7ba4952007-06-06 23:52:48 +0000353static const char* FORBIDDEN[] = {
354 "None",
355 "True",
356 "False",
357 NULL,
358};
359
360static int
361forbidden_name(expr_ty e, const node *n)
362{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000363 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000364 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000366 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 ast_error(n, "assignment to keyword");
368 return 1;
369 }
370 }
371 return 0;
372}
373
Jeremy Hyltona8293132006-02-28 17:58:27 +0000374/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375
376 Only sets context for expr kinds that "can appear in assignment context"
377 (according to ../Parser/Python.asdl). For other expr kinds, it sets
378 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379*/
380
381static int
382set_context(expr_ty e, expr_context_ty ctx, const node *n)
383{
384 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000385 /* If a particular expression type can't be used for assign / delete,
386 set expr_name to its name and an error message will be generated.
387 */
388 const char* expr_name = NULL;
389
390 /* The ast defines augmented store and load contexts, but the
391 implementation here doesn't actually use them. The code may be
392 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000393 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000395 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000396 */
397 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
399 switch (e->kind) {
400 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 e->v.Attribute.ctx = ctx;
402 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404 e->v.Subscript.ctx = ctx;
405 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000406 case Starred_kind:
407 e->v.Starred.ctx = ctx;
408 if (!set_context(e->v.Starred.value, ctx, n))
409 return 0;
410 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000412 if (ctx == Store) {
413 if (forbidden_name(e, n))
414 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 }
416 e->v.Name.ctx = ctx;
417 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 e->v.List.ctx = ctx;
420 s = e->v.List.elts;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Tuple_kind:
423 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
424 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000425 e->v.Tuple.ctx = ctx;
426 s = e->v.Tuple.elts;
427 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000428 case Lambda_kind:
429 expr_name = "lambda";
430 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000434 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 case UnaryOp_kind:
437 expr_name = "operator";
438 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 expr_name = "generator expression";
441 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000442 case Yield_kind:
443 expr_name = "yield expression";
444 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000445 case ListComp_kind:
446 expr_name = "list comprehension";
447 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000448 case SetComp_kind:
449 expr_name = "set comprehension";
450 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000451 case DictComp_kind:
452 expr_name = "dict comprehension";
453 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000455 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000456 case Num_kind:
457 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 expr_name = "literal";
459 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000460 case Ellipsis_kind:
461 expr_name = "Ellipsis";
462 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000463 case Compare_kind:
464 expr_name = "comparison";
465 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466 case IfExp_kind:
467 expr_name = "conditional expression";
468 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000469 default:
470 PyErr_Format(PyExc_SystemError,
471 "unexpected expression in assignment %d (line %d)",
472 e->kind, e->lineno);
473 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000475 /* Check for error string set by switch */
476 if (expr_name) {
477 char buf[300];
478 PyOS_snprintf(buf, sizeof(buf),
479 "can't %s %s",
480 ctx == Store ? "assign to" : "delete",
481 expr_name);
482 return ast_error(n, buf);
483 }
484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000486 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487 */
488 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490
Thomas Wouters89f507f2006-12-13 04:49:30 +0000491 for (i = 0; i < asdl_seq_LEN(s); i++) {
492 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
493 return 0;
494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495 }
496 return 1;
497}
498
499static operator_ty
500ast_for_augassign(const node *n)
501{
502 REQ(n, augassign);
503 n = CHILD(n, 0);
504 switch (STR(n)[0]) {
505 case '+':
506 return Add;
507 case '-':
508 return Sub;
509 case '/':
510 if (STR(n)[1] == '/')
511 return FloorDiv;
512 else
513 return Div;
514 case '%':
515 return Mod;
516 case '<':
517 return LShift;
518 case '>':
519 return RShift;
520 case '&':
521 return BitAnd;
522 case '^':
523 return BitXor;
524 case '|':
525 return BitOr;
526 case '*':
527 if (STR(n)[1] == '*')
528 return Pow;
529 else
530 return Mult;
531 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000532 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000533 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534 }
535}
536
537static cmpop_ty
538ast_for_comp_op(const node *n)
539{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000540 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 |'is' 'not'
542 */
543 REQ(n, comp_op);
544 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000545 n = CHILD(n, 0);
546 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547 case LESS:
548 return Lt;
549 case GREATER:
550 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000551 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 return Eq;
553 case LESSEQUAL:
554 return LtE;
555 case GREATEREQUAL:
556 return GtE;
557 case NOTEQUAL:
558 return NotEq;
559 case NAME:
560 if (strcmp(STR(n), "in") == 0)
561 return In;
562 if (strcmp(STR(n), "is") == 0)
563 return Is;
564 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000565 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000567 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 }
570 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 /* handle "not in" and "is not" */
572 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 case NAME:
574 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
575 return NotIn;
576 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
577 return IsNot;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
Neal Norwitz79792652005-11-14 04:25:03 +0000584 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587}
588
589static asdl_seq *
590seq_for_testlist(struct compiling *c, const node *n)
591{
592 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000593 asdl_seq *seq;
594 expr_ty expression;
595 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000596 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000598 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 if (!seq)
600 return NULL;
601
602 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000603 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604
605 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000606 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 assert(i / 2 < seq->size);
610 asdl_seq_SET(seq, i / 2, expression);
611 }
612 return seq;
613}
614
Neal Norwitzc1505362006-12-28 06:47:50 +0000615static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000616compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000617{
618 identifier name;
619 expr_ty annotation = NULL;
620 node *ch;
621
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000622 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000623 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000624 name = NEW_IDENTIFIER(ch);
625 if (!name)
626 return NULL;
627
628 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
629 annotation = ast_for_expr(c, CHILD(n, 2));
630 if (!annotation)
631 return NULL;
632 }
633
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000634 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000635}
636
Guido van Rossum4f72a782006-10-27 23:31:49 +0000637/* returns -1 if failed to handle keyword only arguments
638 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000639 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000640 ^^^
641 start pointing here
642 */
643static int
644handle_keywordonly_args(struct compiling *c, const node *n, int start,
645 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
646{
647 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000648 expr_ty expression, annotation;
649 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 int i = start;
651 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000652
653 if (kwonlyargs == NULL) {
654 ast_error(CHILD(n, start), "named arguments must follow bare *");
655 return -1;
656 }
657 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000658 while (i < NCH(n)) {
659 ch = CHILD(n, i);
660 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000661 case vfpdef:
662 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000663 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000664 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000665 asdl_seq_SET(kwdefaults, j, expression);
666 i += 2; /* '=' and test */
667 }
668 else { /* setting NULL if no default value exists */
669 asdl_seq_SET(kwdefaults, j, NULL);
670 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000671 if (NCH(ch) == 3) {
672 /* ch is NAME ':' test */
673 annotation = ast_for_expr(c, CHILD(ch, 2));
674 if (!annotation) {
675 ast_error(ch, "expected expression");
676 goto error;
677 }
678 }
679 else {
680 annotation = NULL;
681 }
682 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000683 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000684 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000685 ast_error(ch, "expecting name");
686 goto error;
687 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000688 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 i += 2; /* the name and the comma */
690 break;
691 case DOUBLESTAR:
692 return i;
693 default:
694 ast_error(ch, "unexpected node");
695 goto error;
696 }
697 }
698 return i;
699 error:
700 return -1;
701}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702
Jeremy Hyltona8293132006-02-28 17:58:27 +0000703/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704
705static arguments_ty
706ast_for_arguments(struct compiling *c, const node *n)
707{
Neal Norwitzc1505362006-12-28 06:47:50 +0000708 /* This function handles both typedargslist (function definition)
709 and varargslist (lambda definition).
710
711 parameters: '(' [typedargslist] ')'
712 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000713 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
714 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000715 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000716 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000717 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000718 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
719 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000721 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000723 int i, j, k, nposargs = 0, nkwonlyargs = 0;
724 int nposdefaults = 0, found_default = 0;
725 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 arg_ty arg;
728 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 node *ch;
730
731 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000732 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000733 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
734 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738
Guido van Rossum4f72a782006-10-27 23:31:49 +0000739 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000741 ch = CHILD(n, i);
742 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000743 /* skip star and possible argument */
744 i++;
745 i += (TYPE(CHILD(n, i)) == tfpdef
746 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 break;
748 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000749 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000750 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000751 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 /* count the number of keyword only args &
754 defaults for keyword only args */
755 for ( ; i < NCH(n); ++i) {
756 ch = CHILD(n, i);
757 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000758 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000759 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000760 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
761 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000762 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000763 kwonlyargs = (nkwonlyargs ?
764 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
765 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 posdefaults = (nposdefaults ?
768 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
769 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000770 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000771 /* The length of kwonlyargs and kwdefaults are same
772 since we set NULL as default for keyword only argument w/o default
773 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000774 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000775 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
776 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000777 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778
779 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 ast_error(n, "more than 255 arguments");
781 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000782 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000784 /* tfpdef: NAME [':' test]
785 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 */
787 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000788 j = 0; /* index for defaults */
789 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 ch = CHILD(n, i);
792 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000793 case tfpdef:
794 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
796 anything other than EQUAL or a comma? */
797 /* XXX Should NCH(n) check be made a separate check? */
798 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000799 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
800 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 goto error;
802 assert(posdefaults != NULL);
803 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000805 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 else if (found_default) {
808 ast_error(n,
809 "non-default argument follows default argument");
810 goto error;
811 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000812 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000813 if (!arg)
814 goto error;
815 asdl_seq_SET(posargs, k++, arg);
816
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000817 i += 2; /* the name and the comma */
818 break;
819 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000821 ast_error(CHILD(n, i),
822 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000823 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000824 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000825 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000826 if (TYPE(ch) == COMMA) {
827 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000828 i += 2; /* now follows keyword only arguments */
829 res = handle_keywordonly_args(c, n, i,
830 kwonlyargs, kwdefaults);
831 if (res == -1) goto error;
832 i = res; /* res has new position to process */
833 }
834 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000835 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
836 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000837 /* there is an annotation on the vararg */
838 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000839 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000841 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
842 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000843 int res = 0;
844 res = handle_keywordonly_args(c, n, i,
845 kwonlyargs, kwdefaults);
846 if (res == -1) goto error;
847 i = res; /* res has new position to process */
848 }
849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000850 break;
851 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000852 ch = CHILD(n, i+1); /* tfpdef */
853 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000854 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
855 if (NCH(ch) > 1) {
856 /* there is an annotation on the kwarg */
857 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
858 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 i += 3;
860 break;
861 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000862 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863 "unexpected node in varargslist: %d @ %d",
864 TYPE(ch), i);
865 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000866 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000868 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
869 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000871 Py_XDECREF(vararg);
872 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 return NULL;
874}
875
876static expr_ty
877ast_for_dotted_name(struct compiling *c, const node *n)
878{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000879 expr_ty e;
880 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000881 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 int i;
883
884 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000885
886 lineno = LINENO(n);
887 col_offset = n->n_col_offset;
888
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889 id = NEW_IDENTIFIER(CHILD(n, 0));
890 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000891 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000892 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000893 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895
896 for (i = 2; i < NCH(n); i+=2) {
897 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 if (!id)
899 return NULL;
900 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
901 if (!e)
902 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 }
904
905 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906}
907
908static expr_ty
909ast_for_decorator(struct compiling *c, const node *n)
910{
911 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
912 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000913 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914
915 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000916 REQ(CHILD(n, 0), AT);
917 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918
919 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
920 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000921 return NULL;
922
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 d = name_expr;
925 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 }
927 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000928 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000929 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 if (!d)
931 return NULL;
932 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 }
934 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000935 d = ast_for_call(c, CHILD(n, 3), name_expr);
936 if (!d)
937 return NULL;
938 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 }
940
941 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942}
943
944static asdl_seq*
945ast_for_decorators(struct compiling *c, const node *n)
946{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000947 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000948 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 int i;
950
951 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000952 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 if (!decorator_seq)
954 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000955
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000957 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000958 if (!d)
959 return NULL;
960 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961 }
962 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000966ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000967{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000968 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000969 identifier name;
970 arguments_ty args;
971 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000972 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000973 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974
975 REQ(n, funcdef);
976
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 name = NEW_IDENTIFIER(CHILD(n, name_i));
978 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 args = ast_for_arguments(c, CHILD(n, name_i + 1));
981 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000982 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000983 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
984 returns = ast_for_expr(c, CHILD(n, name_i + 3));
985 if (!returns)
986 return NULL;
987 name_i += 2;
988 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 body = ast_for_suite(c, CHILD(n, name_i + 3));
990 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Neal Norwitzc1505362006-12-28 06:47:50 +0000993 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000994 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995}
996
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000997static stmt_ty
998ast_for_decorated(struct compiling *c, const node *n)
999{
1000 /* decorated: decorators (classdef | funcdef) */
1001 stmt_ty thing = NULL;
1002 asdl_seq *decorator_seq = NULL;
1003
1004 REQ(n, decorated);
1005
1006 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1007 if (!decorator_seq)
1008 return NULL;
1009
1010 assert(TYPE(CHILD(n, 1)) == funcdef ||
1011 TYPE(CHILD(n, 1)) == classdef);
1012
1013 if (TYPE(CHILD(n, 1)) == funcdef) {
1014 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1015 } else if (TYPE(CHILD(n, 1)) == classdef) {
1016 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1017 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001018 /* we count the decorators in when talking about the class' or
1019 * function's line number */
1020 if (thing) {
1021 thing->lineno = LINENO(n);
1022 thing->col_offset = n->n_col_offset;
1023 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001024 return thing;
1025}
1026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027static expr_ty
1028ast_for_lambdef(struct compiling *c, const node *n)
1029{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001030 /* lambdef: 'lambda' [varargslist] ':' test
1031 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 arguments_ty args;
1033 expr_ty expression;
1034
1035 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001036 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1037 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 if (!args)
1039 return NULL;
1040 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001041 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 }
1044 else {
1045 args = ast_for_arguments(c, CHILD(n, 1));
1046 if (!args)
1047 return NULL;
1048 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001049 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051 }
1052
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001053 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054}
1055
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001056static expr_ty
1057ast_for_ifexpr(struct compiling *c, const node *n)
1058{
1059 /* test: or_test 'if' or_test 'else' test */
1060 expr_ty expression, body, orelse;
1061
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001062 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001063 body = ast_for_expr(c, CHILD(n, 0));
1064 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001066 expression = ast_for_expr(c, CHILD(n, 2));
1067 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001068 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001069 orelse = ast_for_expr(c, CHILD(n, 4));
1070 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001071 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1073 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001074}
1075
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001077 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078
Nick Coghlan650f0d02007-04-15 12:05:43 +00001079 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080*/
1081
1082static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001083count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001085 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086
Guido van Rossumd8faa362007-04-27 19:54:29 +00001087 count_comp_for:
1088 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001089 REQ(n, comp_for);
1090 if (NCH(n) == 5)
1091 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001092 else
1093 return n_fors;
1094 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001095 REQ(n, comp_iter);
1096 n = CHILD(n, 0);
1097 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001099 else if (TYPE(n) == comp_if) {
1100 if (NCH(n) == 3) {
1101 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001102 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001103 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001104 else
1105 return n_fors;
1106 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001107
Guido van Rossumd8faa362007-04-27 19:54:29 +00001108 /* Should never be reached */
1109 PyErr_SetString(PyExc_SystemError,
1110 "logic error in count_comp_fors");
1111 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112}
1113
Nick Coghlan650f0d02007-04-15 12:05:43 +00001114/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115
Nick Coghlan650f0d02007-04-15 12:05:43 +00001116 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117*/
1118
1119static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001120count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123
Guido van Rossumd8faa362007-04-27 19:54:29 +00001124 while (1) {
1125 REQ(n, comp_iter);
1126 if (TYPE(CHILD(n, 0)) == comp_for)
1127 return n_ifs;
1128 n = CHILD(n, 0);
1129 REQ(n, comp_if);
1130 n_ifs++;
1131 if (NCH(n) == 2)
1132 return n_ifs;
1133 n = CHILD(n, 2);
1134 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135}
1136
Guido van Rossum992d4a32007-07-11 13:09:30 +00001137static asdl_seq *
1138ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001141 asdl_seq *comps;
1142
Nick Coghlan650f0d02007-04-15 12:05:43 +00001143 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144 if (n_fors == -1)
1145 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001146
Nick Coghlan650f0d02007-04-15 12:05:43 +00001147 comps = asdl_seq_new(n_fors, c->c_arena);
1148 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001150
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001152 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 asdl_seq *t;
1154 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001155 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156
Guido van Rossum992d4a32007-07-11 13:09:30 +00001157 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158
Guido van Rossum992d4a32007-07-11 13:09:30 +00001159 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001160 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001161 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001163 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001164 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001166
Thomas Wouters89f507f2006-12-13 04:49:30 +00001167 /* Check the # of children rather than the length of t, since
1168 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1169 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001170 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1171 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001173 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001174 c->c_arena),
1175 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001176
Nick Coghlan650f0d02007-04-15 12:05:43 +00001177 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001179
Guido van Rossum992d4a32007-07-11 13:09:30 +00001180 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 int j, n_ifs;
1182 asdl_seq *ifs;
1183
Guido van Rossum992d4a32007-07-11 13:09:30 +00001184 n = CHILD(n, 4);
1185 n_ifs = count_comp_ifs(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001186 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001188
1189 ifs = asdl_seq_new(n_ifs, c->c_arena);
1190 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001192
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 REQ(n, comp_iter);
1195 n = CHILD(n, 0);
1196 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197
Guido van Rossum992d4a32007-07-11 13:09:30 +00001198 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001199 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001200 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001201 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001202 if (NCH(n) == 3)
1203 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001205 /* on exit, must guarantee that n is a comp_for */
1206 if (TYPE(n) == comp_iter)
1207 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001208 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001210 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001212 return comps;
1213}
1214
1215static expr_ty
1216ast_for_itercomp(struct compiling *c, const node *n, int type)
1217{
1218 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1219 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1220 expr_ty elt;
1221 asdl_seq *comps;
1222
1223 assert(NCH(n) > 1);
1224
1225 elt = ast_for_expr(c, CHILD(n, 0));
1226 if (!elt)
1227 return NULL;
1228
1229 comps = ast_for_comprehension(c, CHILD(n, 1));
1230 if (!comps)
1231 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001232
1233 if (type == COMP_GENEXP)
1234 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1235 else if (type == COMP_LISTCOMP)
1236 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1237 else if (type == COMP_SETCOMP)
1238 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1239 else
1240 /* Should never happen */
1241 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001242}
1243
1244static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001245ast_for_dictcomp(struct compiling *c, const node *n)
1246{
1247 expr_ty key, value;
1248 asdl_seq *comps;
1249
1250 assert(NCH(n) > 3);
1251 REQ(CHILD(n, 1), COLON);
1252
1253 key = ast_for_expr(c, CHILD(n, 0));
1254 if (!key)
1255 return NULL;
1256
1257 value = ast_for_expr(c, CHILD(n, 2));
1258 if (!value)
1259 return NULL;
1260
1261 comps = ast_for_comprehension(c, CHILD(n, 3));
1262 if (!comps)
1263 return NULL;
1264
1265 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1266}
1267
1268static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001269ast_for_genexp(struct compiling *c, const node *n)
1270{
1271 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001272 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001273}
1274
1275static expr_ty
1276ast_for_listcomp(struct compiling *c, const node *n)
1277{
1278 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001279 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001280}
1281
1282static expr_ty
1283ast_for_setcomp(struct compiling *c, const node *n)
1284{
1285 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001286 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001287}
1288
1289
1290static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291ast_for_atom(struct compiling *c, const node *n)
1292{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001293 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1294 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001295 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 */
1297 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001298 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299
1300 switch (TYPE(ch)) {
1301 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001302 /* All names start in Load context, but may later be
1303 changed. */
1304 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001306 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001307 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001308 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001309 PyObject *type, *value, *tback, *errstr;
1310 PyErr_Fetch(&type, &value, &tback);
1311 errstr = ((PyUnicodeErrorObject *)value)->reason;
1312 if (errstr) {
1313 char *s = "";
1314 char buf[128];
Amaury Forgeot d'Arc39599dc2007-11-22 02:48:12 +00001315 s = PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001316 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1317 ast_error(n, buf);
1318 } else {
1319 ast_error(n, "(unicode error) unknown error");
1320 }
1321 Py_DECREF(type);
1322 Py_DECREF(value);
1323 Py_XDECREF(tback);
1324 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001325 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001326 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001327 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001328 if (bytesmode)
1329 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1330 else
1331 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 }
1333 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001334 PyObject *pynum = parsenumber(STR(ch));
1335 if (!pynum)
1336 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001337
Thomas Wouters89f507f2006-12-13 04:49:30 +00001338 PyArena_AddPyObject(c->c_arena, pynum);
1339 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 }
Georg Brandldde00282007-03-18 19:01:53 +00001341 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001342 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001344 ch = CHILD(n, 1);
1345
1346 if (TYPE(ch) == RPAR)
1347 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1348
1349 if (TYPE(ch) == yield_expr)
1350 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001351
1352 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1353 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001354 return ast_for_genexp(c, ch);
1355
Nick Coghlan650f0d02007-04-15 12:05:43 +00001356 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001358 ch = CHILD(n, 1);
1359
1360 if (TYPE(ch) == RSQB)
1361 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1362
Nick Coghlan650f0d02007-04-15 12:05:43 +00001363 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1365 asdl_seq *elts = seq_for_testlist(c, ch);
1366 if (!elts)
1367 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001368
Thomas Wouters89f507f2006-12-13 04:49:30 +00001369 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1370 }
1371 else
1372 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001374 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1375 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001376 int i, size;
1377 asdl_seq *keys, *values;
1378
1379 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001380 if (TYPE(ch) == RBRACE) {
1381 /* it's an empty dict */
1382 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1383 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1384 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001385 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001386 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001387 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001388 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001389 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001390 for (i = 0; i < NCH(ch); i += 2) {
1391 expr_ty expression;
1392 expression = ast_for_expr(c, CHILD(ch, i));
1393 if (!expression)
1394 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001395 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001396 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001397 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1398 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1399 /* it's a set comprehension */
1400 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001401 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1402 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001403 } else {
1404 /* it's a dict */
1405 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1406 keys = asdl_seq_new(size, c->c_arena);
1407 if (!keys)
1408 return NULL;
1409
1410 values = asdl_seq_new(size, c->c_arena);
1411 if (!values)
1412 return NULL;
1413
1414 for (i = 0; i < NCH(ch); i += 4) {
1415 expr_ty expression;
1416
1417 expression = ast_for_expr(c, CHILD(ch, i));
1418 if (!expression)
1419 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001420
Guido van Rossum86e58e22006-08-28 15:27:34 +00001421 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001422
Guido van Rossum86e58e22006-08-28 15:27:34 +00001423 expression = ast_for_expr(c, CHILD(ch, i + 2));
1424 if (!expression)
1425 return NULL;
1426
1427 asdl_seq_SET(values, i / 4, expression);
1428 }
1429 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1430 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1434 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 }
1436}
1437
1438static slice_ty
1439ast_for_slice(struct compiling *c, const node *n)
1440{
1441 node *ch;
1442 expr_ty lower = NULL, upper = NULL, step = NULL;
1443
1444 REQ(n, subscript);
1445
1446 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001447 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 sliceop: ':' [test]
1449 */
1450 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451 if (NCH(n) == 1 && TYPE(ch) == test) {
1452 /* 'step' variable hold no significance in terms of being used over
1453 other vars */
1454 step = ast_for_expr(c, ch);
1455 if (!step)
1456 return NULL;
1457
Thomas Wouters89f507f2006-12-13 04:49:30 +00001458 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 }
1460
1461 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 if (!lower)
1464 return NULL;
1465 }
1466
1467 /* If there's an upper bound it's in the second or third position. */
1468 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001469 if (NCH(n) > 1) {
1470 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471
Thomas Wouters89f507f2006-12-13 04:49:30 +00001472 if (TYPE(n2) == test) {
1473 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 if (!upper)
1475 return NULL;
1476 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001479 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480
Thomas Wouters89f507f2006-12-13 04:49:30 +00001481 if (TYPE(n2) == test) {
1482 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 if (!upper)
1484 return NULL;
1485 }
1486 }
1487
1488 ch = CHILD(n, NCH(n) - 1);
1489 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001490 if (NCH(ch) == 1) {
1491 /* No expression, so step is None */
1492 ch = CHILD(ch, 0);
1493 step = Name(new_identifier("None", c->c_arena), Load,
1494 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 if (!step)
1496 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001497 } else {
1498 ch = CHILD(ch, 1);
1499 if (TYPE(ch) == test) {
1500 step = ast_for_expr(c, ch);
1501 if (!step)
1502 return NULL;
1503 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 }
1505 }
1506
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001507 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508}
1509
1510static expr_ty
1511ast_for_binop(struct compiling *c, const node *n)
1512{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001513 /* Must account for a sequence of expressions.
1514 How should A op B op C by represented?
1515 BinOp(BinOp(A, op, B), op, C).
1516 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517
Guido van Rossumd8faa362007-04-27 19:54:29 +00001518 int i, nops;
1519 expr_ty expr1, expr2, result;
1520 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521
Guido van Rossumd8faa362007-04-27 19:54:29 +00001522 expr1 = ast_for_expr(c, CHILD(n, 0));
1523 if (!expr1)
1524 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525
Guido van Rossumd8faa362007-04-27 19:54:29 +00001526 expr2 = ast_for_expr(c, CHILD(n, 2));
1527 if (!expr2)
1528 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529
Guido van Rossumd8faa362007-04-27 19:54:29 +00001530 newoperator = get_operator(CHILD(n, 1));
1531 if (!newoperator)
1532 return NULL;
1533
1534 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1535 c->c_arena);
1536 if (!result)
1537 return NULL;
1538
1539 nops = (NCH(n) - 1) / 2;
1540 for (i = 1; i < nops; i++) {
1541 expr_ty tmp_result, tmp;
1542 const node* next_oper = CHILD(n, i * 2 + 1);
1543
1544 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001545 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546 return NULL;
1547
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1549 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550 return NULL;
1551
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 tmp_result = BinOp(result, newoperator, tmp,
1553 LINENO(next_oper), next_oper->n_col_offset,
1554 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001555 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556 return NULL;
1557 result = tmp_result;
1558 }
1559 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560}
1561
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001562static expr_ty
1563ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1564{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001565 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1566 subscriptlist: subscript (',' subscript)* [',']
1567 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1568 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001569 REQ(n, trailer);
1570 if (TYPE(CHILD(n, 0)) == LPAR) {
1571 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001572 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1573 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001574 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001575 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001576 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001577 else if (TYPE(CHILD(n, 0)) == DOT ) {
1578 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001579 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001580 }
1581 else {
1582 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001583 REQ(CHILD(n, 2), RSQB);
1584 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001585 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001586 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1587 if (!slc)
1588 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001589 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1590 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001591 }
1592 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001593 /* The grammar is ambiguous here. The ambiguity is resolved
1594 by treating the sequence as a tuple literal if there are
1595 no slice features.
1596 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001597 int j;
1598 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001599 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001600 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001601 asdl_seq *slices, *elts;
1602 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001603 if (!slices)
1604 return NULL;
1605 for (j = 0; j < NCH(n); j += 2) {
1606 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001607 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001608 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001609 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001610 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611 asdl_seq_SET(slices, j / 2, slc);
1612 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001613 if (!simple) {
1614 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001615 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001616 }
1617 /* extract Index values and put them in a Tuple */
1618 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001619 if (!elts)
1620 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001621 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1622 slc = (slice_ty)asdl_seq_GET(slices, j);
1623 assert(slc->kind == Index_kind && slc->v.Index.value);
1624 asdl_seq_SET(elts, j, slc->v.Index.value);
1625 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001626 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001627 if (!e)
1628 return NULL;
1629 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001630 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001631 }
1632 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001633}
1634
1635static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001636ast_for_factor(struct compiling *c, const node *n)
1637{
1638 node *pfactor, *ppower, *patom, *pnum;
1639 expr_ty expression;
1640
1641 /* If the unary - operator is applied to a constant, don't generate
1642 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1643 constant. The peephole optimizer already does something like
1644 this but it doesn't handle the case where the constant is
1645 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1646 PyLongObject.
1647 */
1648 if (TYPE(CHILD(n, 0)) == MINUS
1649 && NCH(n) == 2
1650 && TYPE((pfactor = CHILD(n, 1))) == factor
1651 && NCH(pfactor) == 1
1652 && TYPE((ppower = CHILD(pfactor, 0))) == power
1653 && NCH(ppower) == 1
1654 && TYPE((patom = CHILD(ppower, 0))) == atom
1655 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1656 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1657 if (s == NULL)
1658 return NULL;
1659 s[0] = '-';
1660 strcpy(s + 1, STR(pnum));
1661 PyObject_FREE(STR(pnum));
1662 STR(pnum) = s;
1663 return ast_for_atom(c, patom);
1664 }
1665
1666 expression = ast_for_expr(c, CHILD(n, 1));
1667 if (!expression)
1668 return NULL;
1669
1670 switch (TYPE(CHILD(n, 0))) {
1671 case PLUS:
1672 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1673 c->c_arena);
1674 case MINUS:
1675 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1676 c->c_arena);
1677 case TILDE:
1678 return UnaryOp(Invert, expression, LINENO(n),
1679 n->n_col_offset, c->c_arena);
1680 }
1681 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1682 TYPE(CHILD(n, 0)));
1683 return NULL;
1684}
1685
1686static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001687ast_for_power(struct compiling *c, const node *n)
1688{
1689 /* power: atom trailer* ('**' factor)*
1690 */
1691 int i;
1692 expr_ty e, tmp;
1693 REQ(n, power);
1694 e = ast_for_atom(c, CHILD(n, 0));
1695 if (!e)
1696 return NULL;
1697 if (NCH(n) == 1)
1698 return e;
1699 for (i = 1; i < NCH(n); i++) {
1700 node *ch = CHILD(n, i);
1701 if (TYPE(ch) != trailer)
1702 break;
1703 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001705 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001706 tmp->lineno = e->lineno;
1707 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001708 e = tmp;
1709 }
1710 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1711 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001712 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001713 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001714 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001715 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001716 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001717 e = tmp;
1718 }
1719 return e;
1720}
1721
Guido van Rossum0368b722007-05-11 16:50:42 +00001722static expr_ty
1723ast_for_starred(struct compiling *c, const node *n)
1724{
1725 expr_ty tmp;
1726 REQ(n, star_expr);
1727
1728 tmp = ast_for_expr(c, CHILD(n, 1));
1729 if (!tmp)
1730 return NULL;
1731
1732 /* The Load context is changed later. */
1733 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1734}
1735
1736
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737/* Do not name a variable 'expr'! Will cause a compile error.
1738*/
1739
1740static expr_ty
1741ast_for_expr(struct compiling *c, const node *n)
1742{
1743 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001744 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001745 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001746 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 and_test: not_test ('and' not_test)*
1748 not_test: 'not' not_test | comparison
1749 comparison: expr (comp_op expr)*
1750 expr: xor_expr ('|' xor_expr)*
1751 xor_expr: and_expr ('^' and_expr)*
1752 and_expr: shift_expr ('&' shift_expr)*
1753 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1754 arith_expr: term (('+'|'-') term)*
1755 term: factor (('*'|'/'|'%'|'//') factor)*
1756 factor: ('+'|'-'|'~') factor | power
1757 power: atom trailer* ('**' factor)*
1758 */
1759
1760 asdl_seq *seq;
1761 int i;
1762
1763 loop:
1764 switch (TYPE(n)) {
1765 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001766 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001767 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001768 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001770 else if (NCH(n) > 1)
1771 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001772 /* Fallthrough */
1773 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 case and_test:
1775 if (NCH(n) == 1) {
1776 n = CHILD(n, 0);
1777 goto loop;
1778 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001779 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 if (!seq)
1781 return NULL;
1782 for (i = 0; i < NCH(n); i += 2) {
1783 expr_ty e = ast_for_expr(c, CHILD(n, i));
1784 if (!e)
1785 return NULL;
1786 asdl_seq_SET(seq, i / 2, e);
1787 }
1788 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001789 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1790 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001791 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001792 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001793 case not_test:
1794 if (NCH(n) == 1) {
1795 n = CHILD(n, 0);
1796 goto loop;
1797 }
1798 else {
1799 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1800 if (!expression)
1801 return NULL;
1802
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1804 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 }
1806 case comparison:
1807 if (NCH(n) == 1) {
1808 n = CHILD(n, 0);
1809 goto loop;
1810 }
1811 else {
1812 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001813 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001814 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 if (!ops)
1817 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001818 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 return NULL;
1821 }
1822 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001823 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001825 newoperator = ast_for_comp_op(CHILD(n, i));
1826 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829
1830 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001831 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001833 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001835 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 asdl_seq_SET(cmps, i / 2, expression);
1837 }
1838 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001839 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001841 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843 return Compare(expression, ops, cmps, LINENO(n),
1844 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 }
1846 break;
1847
Guido van Rossum0368b722007-05-11 16:50:42 +00001848 case star_expr:
1849 if (TYPE(CHILD(n, 0)) == STAR) {
1850 return ast_for_starred(c, n);
1851 }
1852 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 /* The next five cases all handle BinOps. The main body of code
1854 is the same in each case, but the switch turned inside out to
1855 reuse the code for each type of operator.
1856 */
1857 case expr:
1858 case xor_expr:
1859 case and_expr:
1860 case shift_expr:
1861 case arith_expr:
1862 case term:
1863 if (NCH(n) == 1) {
1864 n = CHILD(n, 0);
1865 goto loop;
1866 }
1867 return ast_for_binop(c, n);
1868 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001869 expr_ty exp = NULL;
1870 if (NCH(n) == 2) {
1871 exp = ast_for_testlist(c, CHILD(n, 1));
1872 if (!exp)
1873 return NULL;
1874 }
1875 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1876 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001877 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 if (NCH(n) == 1) {
1879 n = CHILD(n, 0);
1880 goto loop;
1881 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001883 case power:
1884 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001886 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 return NULL;
1888 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001889 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 return NULL;
1891}
1892
1893static expr_ty
1894ast_for_call(struct compiling *c, const node *n, expr_ty func)
1895{
1896 /*
1897 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1898 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 */
1901
1902 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001903 asdl_seq *args;
1904 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 expr_ty vararg = NULL, kwarg = NULL;
1906
1907 REQ(n, arglist);
1908
1909 nargs = 0;
1910 nkeywords = 0;
1911 ngens = 0;
1912 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001913 node *ch = CHILD(n, i);
1914 if (TYPE(ch) == argument) {
1915 if (NCH(ch) == 1)
1916 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001918 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001920 nkeywords++;
1921 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 }
1923 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001924 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001925 "if not sole argument");
1926 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 }
1928
1929 if (nargs + nkeywords + ngens > 255) {
1930 ast_error(n, "more than 255 arguments");
1931 return NULL;
1932 }
1933
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001934 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001935 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001936 return NULL;
1937 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 nargs = 0;
1941 nkeywords = 0;
1942 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001943 node *ch = CHILD(n, i);
1944 if (TYPE(ch) == argument) {
1945 expr_ty e;
1946 if (NCH(ch) == 1) {
1947 if (nkeywords) {
1948 ast_error(CHILD(ch, 0),
1949 "non-keyword arg after keyword arg");
1950 return NULL;
1951 }
1952 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001954 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001955 asdl_seq_SET(args, nargs++, e);
1956 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001957 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001961 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001963 else {
1964 keyword_ty kw;
1965 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966
Thomas Wouters89f507f2006-12-13 04:49:30 +00001967 /* CHILD(ch, 0) is test, but must be an identifier? */
1968 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 /* f(lambda x: x[0] = 3) ends up getting parsed with
1972 * LHS test = lambda x: x[0], and RHS test = 3.
1973 * SF bug 132313 points out that complaining about a keyword
1974 * then is very confusing.
1975 */
1976 if (e->kind == Lambda_kind) {
1977 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979 } else if (e->kind != Name_kind) {
1980 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001981 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001982 } else if (forbidden_name(e, ch)) {
1983 return NULL;
1984 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 key = e->v.Name.id;
1986 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001991 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 asdl_seq_SET(keywords, nkeywords++, kw);
1993 }
1994 }
1995 else if (TYPE(ch) == STAR) {
1996 vararg = ast_for_expr(c, CHILD(n, i+1));
1997 i++;
1998 }
1999 else if (TYPE(ch) == DOUBLESTAR) {
2000 kwarg = ast_for_expr(c, CHILD(n, i+1));
2001 i++;
2002 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 }
2004
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002005 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006}
2007
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002009ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002011 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002012 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002013 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002015 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002016 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002017 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002018 }
2019 else {
2020 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002021 TYPE(n) == testlist1);
2022 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 else {
2026 asdl_seq *tmp = seq_for_testlist(c, n);
2027 if (!tmp)
2028 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002029 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002031}
2032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033static stmt_ty
2034ast_for_expr_stmt(struct compiling *c, const node *n)
2035{
2036 REQ(n, expr_stmt);
2037 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2038 | ('=' (yield_expr|testlist))*)
2039 testlist: test (',' test)* [',']
2040 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 test: ... here starts the operator precendence dance
2043 */
2044
2045 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002046 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 if (!e)
2048 return NULL;
2049
Thomas Wouters89f507f2006-12-13 04:49:30 +00002050 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051 }
2052 else if (TYPE(CHILD(n, 1)) == augassign) {
2053 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002054 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002055 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056
Thomas Wouters89f507f2006-12-13 04:49:30 +00002057 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 if (!expr1)
2059 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002060 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002061 switch (expr1->kind) {
2062 case GeneratorExp_kind:
2063 ast_error(ch, "augmented assignment to generator "
2064 "expression not possible");
2065 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002066 case Yield_kind:
2067 ast_error(ch, "augmented assignment to yield "
2068 "expression not possible");
2069 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002070 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002071 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002072 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002073 break;
2074 }
2075 case Attribute_kind:
2076 case Subscript_kind:
2077 break;
2078 default:
2079 ast_error(ch, "illegal expression for augmented "
2080 "assignment");
2081 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002083 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 ch = CHILD(n, 2);
2086 if (TYPE(ch) == testlist)
2087 expr2 = ast_for_testlist(c, ch);
2088 else
2089 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002090 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 return NULL;
2092
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002093 newoperator = ast_for_augassign(CHILD(n, 1));
2094 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 return NULL;
2096
Thomas Wouters89f507f2006-12-13 04:49:30 +00002097 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 }
2099 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002100 int i;
2101 asdl_seq *targets;
2102 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103 expr_ty expression;
2104
Thomas Wouters89f507f2006-12-13 04:49:30 +00002105 /* a normal assignment */
2106 REQ(CHILD(n, 1), EQUAL);
2107 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2108 if (!targets)
2109 return NULL;
2110 for (i = 0; i < NCH(n) - 2; i += 2) {
2111 expr_ty e;
2112 node *ch = CHILD(n, i);
2113 if (TYPE(ch) == yield_expr) {
2114 ast_error(ch, "assignment to yield expression not possible");
2115 return NULL;
2116 }
2117 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118
Thomas Wouters89f507f2006-12-13 04:49:30 +00002119 /* set context to assign */
2120 if (!e)
2121 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122
Thomas Wouters89f507f2006-12-13 04:49:30 +00002123 if (!set_context(e, Store, CHILD(n, i)))
2124 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125
Thomas Wouters89f507f2006-12-13 04:49:30 +00002126 asdl_seq_SET(targets, i / 2, e);
2127 }
2128 value = CHILD(n, NCH(n) - 1);
2129 if (TYPE(value) == testlist)
2130 expression = ast_for_testlist(c, value);
2131 else
2132 expression = ast_for_expr(c, value);
2133 if (!expression)
2134 return NULL;
2135 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137}
2138
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002140ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141{
2142 asdl_seq *seq;
2143 int i;
2144 expr_ty e;
2145
2146 REQ(n, exprlist);
2147
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002148 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002152 e = ast_for_expr(c, CHILD(n, i));
2153 if (!e)
2154 return NULL;
2155 asdl_seq_SET(seq, i / 2, e);
2156 if (context && !set_context(e, context, CHILD(n, i)))
2157 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 }
2159 return seq;
2160}
2161
2162static stmt_ty
2163ast_for_del_stmt(struct compiling *c, const node *n)
2164{
2165 asdl_seq *expr_list;
2166
2167 /* del_stmt: 'del' exprlist */
2168 REQ(n, del_stmt);
2169
2170 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2171 if (!expr_list)
2172 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002173 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174}
2175
2176static stmt_ty
2177ast_for_flow_stmt(struct compiling *c, const node *n)
2178{
2179 /*
2180 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2181 | yield_stmt
2182 break_stmt: 'break'
2183 continue_stmt: 'continue'
2184 return_stmt: 'return' [testlist]
2185 yield_stmt: yield_expr
2186 yield_expr: 'yield' testlist
2187 raise_stmt: 'raise' [test [',' test [',' test]]]
2188 */
2189 node *ch;
2190
2191 REQ(n, flow_stmt);
2192 ch = CHILD(n, 0);
2193 switch (TYPE(ch)) {
2194 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002195 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002197 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002199 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2200 if (!exp)
2201 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002202 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 }
2204 case return_stmt:
2205 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002206 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002208 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209 if (!expression)
2210 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002211 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212 }
2213 case raise_stmt:
2214 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002215 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2216 else if (NCH(ch) >= 2) {
2217 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2219 if (!expression)
2220 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002221 if (NCH(ch) == 4) {
2222 cause = ast_for_expr(c, CHILD(ch, 3));
2223 if (!cause)
2224 return NULL;
2225 }
2226 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227 }
2228 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002229 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230 "unexpected flow_stmt: %d", TYPE(ch));
2231 return NULL;
2232 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002233
2234 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236}
2237
2238static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002239alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240{
2241 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002242 import_as_name: NAME ['as' NAME]
2243 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 dotted_name: NAME ('.' NAME)*
2245 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002246 PyObject *str;
2247
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 loop:
2249 switch (TYPE(n)) {
2250 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002251 str = NULL;
2252 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002253 str = NEW_IDENTIFIER(CHILD(n, 2));
2254 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002255 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 case dotted_as_name:
2257 if (NCH(n) == 1) {
2258 n = CHILD(n, 0);
2259 goto loop;
2260 }
2261 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002262 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002263 if (!a)
2264 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 assert(!a->asname);
2266 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2267 return a;
2268 }
2269 break;
2270 case dotted_name:
2271 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002272 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 else {
2274 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002275 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002276 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002278 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279
2280 len = 0;
2281 for (i = 0; i < NCH(n); i += 2)
2282 /* length of string plus one for the dot */
2283 len += strlen(STR(CHILD(n, i))) + 1;
2284 len--; /* the last name doesn't have a dot */
2285 str = PyString_FromStringAndSize(NULL, len);
2286 if (!str)
2287 return NULL;
2288 s = PyString_AS_STRING(str);
2289 if (!s)
2290 return NULL;
2291 for (i = 0; i < NCH(n); i += 2) {
2292 char *sch = STR(CHILD(n, i));
2293 strcpy(s, STR(CHILD(n, i)));
2294 s += strlen(sch);
2295 *s++ = '.';
2296 }
2297 --s;
2298 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002299 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2300 PyString_GET_SIZE(str),
2301 NULL);
2302 Py_DECREF(str);
2303 if (!uni)
2304 return NULL;
2305 str = uni;
2306 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002307 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002308 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 }
2310 break;
2311 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002312 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002313 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002314 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002316 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 "unexpected import name: %d", TYPE(n));
2318 return NULL;
2319 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002320
2321 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 return NULL;
2323}
2324
2325static stmt_ty
2326ast_for_import_stmt(struct compiling *c, const node *n)
2327{
2328 /*
2329 import_stmt: import_name | import_from
2330 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002331 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2332 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002334 int lineno;
2335 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 int i;
2337 asdl_seq *aliases;
2338
2339 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002340 lineno = LINENO(n);
2341 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002343 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002345 REQ(n, dotted_as_names);
2346 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2347 if (!aliases)
2348 return NULL;
2349 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002350 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002351 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002353 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002355 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002357 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002359 int idx, ndots = 0;
2360 alias_ty mod = NULL;
2361 identifier modname;
2362
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002363 /* Count the number of dots (for relative imports) and check for the
2364 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002365 for (idx = 1; idx < NCH(n); idx++) {
2366 if (TYPE(CHILD(n, idx)) == dotted_name) {
2367 mod = alias_for_import_name(c, CHILD(n, idx));
2368 idx++;
2369 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002370 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2371 /* three consecutive dots are tokenized as one ELLIPSIS */
2372 ndots += 3;
2373 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002374 } else if (TYPE(CHILD(n, idx)) != DOT) {
2375 break;
2376 }
2377 ndots++;
2378 }
2379 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002380 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002381 case STAR:
2382 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002383 n = CHILD(n, idx);
2384 n_children = 1;
2385 if (ndots) {
2386 ast_error(n, "'import *' not allowed with 'from .'");
2387 return NULL;
2388 }
2389 break;
2390 case LPAR:
2391 /* from ... import (x, y, z) */
2392 n = CHILD(n, idx + 1);
2393 n_children = NCH(n);
2394 break;
2395 case import_as_names:
2396 /* from ... import x, y, z */
2397 n = CHILD(n, idx);
2398 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002399 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 ast_error(n, "trailing comma not allowed without"
2401 " surrounding parentheses");
2402 return NULL;
2403 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002404 break;
2405 default:
2406 ast_error(n, "Unexpected node-type in from-import");
2407 return NULL;
2408 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409
Thomas Wouters89f507f2006-12-13 04:49:30 +00002410 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2411 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413
2414 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002415 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002416 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002417 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002419 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002421 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002423 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2424 if (!import_alias)
2425 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002427 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002429 if (mod != NULL)
2430 modname = mod->name;
2431 else
2432 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002433 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002434 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 }
Neal Norwitz79792652005-11-14 04:25:03 +00002436 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437 "unknown import statement: starts with command '%s'",
2438 STR(CHILD(n, 0)));
2439 return NULL;
2440}
2441
2442static stmt_ty
2443ast_for_global_stmt(struct compiling *c, const node *n)
2444{
2445 /* global_stmt: 'global' NAME (',' NAME)* */
2446 identifier name;
2447 asdl_seq *s;
2448 int i;
2449
2450 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002451 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002453 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002455 name = NEW_IDENTIFIER(CHILD(n, i));
2456 if (!name)
2457 return NULL;
2458 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002460 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461}
2462
2463static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002464ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2465{
2466 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2467 identifier name;
2468 asdl_seq *s;
2469 int i;
2470
2471 REQ(n, nonlocal_stmt);
2472 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2473 if (!s)
2474 return NULL;
2475 for (i = 1; i < NCH(n); i += 2) {
2476 name = NEW_IDENTIFIER(CHILD(n, i));
2477 if (!name)
2478 return NULL;
2479 asdl_seq_SET(s, i / 2, name);
2480 }
2481 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2482}
2483
2484static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485ast_for_assert_stmt(struct compiling *c, const node *n)
2486{
2487 /* assert_stmt: 'assert' test [',' test] */
2488 REQ(n, assert_stmt);
2489 if (NCH(n) == 2) {
2490 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2491 if (!expression)
2492 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 }
2495 else if (NCH(n) == 4) {
2496 expr_ty expr1, expr2;
2497
2498 expr1 = ast_for_expr(c, CHILD(n, 1));
2499 if (!expr1)
2500 return NULL;
2501 expr2 = ast_for_expr(c, CHILD(n, 3));
2502 if (!expr2)
2503 return NULL;
2504
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 }
Neal Norwitz79792652005-11-14 04:25:03 +00002507 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 "improper number of parts to 'assert' statement: %d",
2509 NCH(n));
2510 return NULL;
2511}
2512
2513static asdl_seq *
2514ast_for_suite(struct compiling *c, const node *n)
2515{
2516 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002517 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518 stmt_ty s;
2519 int i, total, num, end, pos = 0;
2520 node *ch;
2521
2522 REQ(n, suite);
2523
2524 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002525 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002527 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002529 n = CHILD(n, 0);
2530 /* simple_stmt always ends with a NEWLINE,
2531 and may have a trailing SEMI
2532 */
2533 end = NCH(n) - 1;
2534 if (TYPE(CHILD(n, end - 1)) == SEMI)
2535 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002537 for (i = 0; i < end; i += 2) {
2538 ch = CHILD(n, i);
2539 s = ast_for_stmt(c, ch);
2540 if (!s)
2541 return NULL;
2542 asdl_seq_SET(seq, pos++, s);
2543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 }
2545 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002546 for (i = 2; i < (NCH(n) - 1); i++) {
2547 ch = CHILD(n, i);
2548 REQ(ch, stmt);
2549 num = num_stmts(ch);
2550 if (num == 1) {
2551 /* small_stmt or compound_stmt with only one child */
2552 s = ast_for_stmt(c, ch);
2553 if (!s)
2554 return NULL;
2555 asdl_seq_SET(seq, pos++, s);
2556 }
2557 else {
2558 int j;
2559 ch = CHILD(ch, 0);
2560 REQ(ch, simple_stmt);
2561 for (j = 0; j < NCH(ch); j += 2) {
2562 /* statement terminates with a semi-colon ';' */
2563 if (NCH(CHILD(ch, j)) == 0) {
2564 assert((j + 1) == NCH(ch));
2565 break;
2566 }
2567 s = ast_for_stmt(c, CHILD(ch, j));
2568 if (!s)
2569 return NULL;
2570 asdl_seq_SET(seq, pos++, s);
2571 }
2572 }
2573 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 }
2575 assert(pos == seq->size);
2576 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577}
2578
2579static stmt_ty
2580ast_for_if_stmt(struct compiling *c, const node *n)
2581{
2582 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2583 ['else' ':' suite]
2584 */
2585 char *s;
2586
2587 REQ(n, if_stmt);
2588
2589 if (NCH(n) == 4) {
2590 expr_ty expression;
2591 asdl_seq *suite_seq;
2592
2593 expression = ast_for_expr(c, CHILD(n, 1));
2594 if (!expression)
2595 return NULL;
2596 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002597 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 return NULL;
2599
Guido van Rossumd8faa362007-04-27 19:54:29 +00002600 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2601 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002603
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 s = STR(CHILD(n, 4));
2605 /* s[2], the third character in the string, will be
2606 's' for el_s_e, or
2607 'i' for el_i_f
2608 */
2609 if (s[2] == 's') {
2610 expr_ty expression;
2611 asdl_seq *seq1, *seq2;
2612
2613 expression = ast_for_expr(c, CHILD(n, 1));
2614 if (!expression)
2615 return NULL;
2616 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002617 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 return NULL;
2619 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002620 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 return NULL;
2622
Guido van Rossumd8faa362007-04-27 19:54:29 +00002623 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2624 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 }
2626 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002627 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002628 expr_ty expression;
2629 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 asdl_seq *orelse = NULL;
2631 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 /* must reference the child n_elif+1 since 'else' token is third,
2633 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2635 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2636 has_else = 1;
2637 n_elif -= 3;
2638 }
2639 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002642 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 orelse = asdl_seq_new(1, c->c_arena);
2645 if (!orelse)
2646 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002648 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002650 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2651 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002653 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2654 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656
Guido van Rossumd8faa362007-04-27 19:54:29 +00002657 asdl_seq_SET(orelse, 0,
2658 If(expression, suite_seq, suite_seq2,
2659 LINENO(CHILD(n, NCH(n) - 6)),
2660 CHILD(n, NCH(n) - 6)->n_col_offset,
2661 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002662 /* the just-created orelse handled the last elif */
2663 n_elif--;
2664 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665
Thomas Wouters89f507f2006-12-13 04:49:30 +00002666 for (i = 0; i < n_elif; i++) {
2667 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002668 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2669 if (!newobj)
2670 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002672 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002675 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 asdl_seq_SET(newobj, 0,
2679 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002680 LINENO(CHILD(n, off)),
2681 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 orelse = newobj;
2683 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002684 expression = ast_for_expr(c, CHILD(n, 1));
2685 if (!expression)
2686 return NULL;
2687 suite_seq = ast_for_suite(c, CHILD(n, 3));
2688 if (!suite_seq)
2689 return NULL;
2690 return If(expression, suite_seq, orelse,
2691 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693
2694 PyErr_Format(PyExc_SystemError,
2695 "unexpected token in 'if' statement: %s", s);
2696 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697}
2698
2699static stmt_ty
2700ast_for_while_stmt(struct compiling *c, const node *n)
2701{
2702 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2703 REQ(n, while_stmt);
2704
2705 if (NCH(n) == 4) {
2706 expr_ty expression;
2707 asdl_seq *suite_seq;
2708
2709 expression = ast_for_expr(c, CHILD(n, 1));
2710 if (!expression)
2711 return NULL;
2712 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002713 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 }
2717 else if (NCH(n) == 7) {
2718 expr_ty expression;
2719 asdl_seq *seq1, *seq2;
2720
2721 expression = ast_for_expr(c, CHILD(n, 1));
2722 if (!expression)
2723 return NULL;
2724 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002725 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 return NULL;
2727 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002728 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 return NULL;
2730
Thomas Wouters89f507f2006-12-13 04:49:30 +00002731 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002733
2734 PyErr_Format(PyExc_SystemError,
2735 "wrong number of tokens for 'while' statement: %d",
2736 NCH(n));
2737 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738}
2739
2740static stmt_ty
2741ast_for_for_stmt(struct compiling *c, const node *n)
2742{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002743 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 expr_ty expression;
2745 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002746 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2748 REQ(n, for_stmt);
2749
2750 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002751 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 if (!seq)
2753 return NULL;
2754 }
2755
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002756 node_target = CHILD(n, 1);
2757 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002758 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002760 /* Check the # of children rather than the length of _target, since
2761 for x, in ... has 1 element in _target, but still requires a Tuple. */
2762 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002763 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002765 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002767 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002768 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 return NULL;
2770 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002771 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 return NULL;
2773
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002774 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2775 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776}
2777
2778static excepthandler_ty
2779ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2780{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002781 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 REQ(exc, except_clause);
2783 REQ(body, suite);
2784
2785 if (NCH(exc) == 1) {
2786 asdl_seq *suite_seq = ast_for_suite(c, body);
2787 if (!suite_seq)
2788 return NULL;
2789
Thomas Wouters89f507f2006-12-13 04:49:30 +00002790 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002791 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 }
2793 else if (NCH(exc) == 2) {
2794 expr_ty expression;
2795 asdl_seq *suite_seq;
2796
2797 expression = ast_for_expr(c, CHILD(exc, 1));
2798 if (!expression)
2799 return NULL;
2800 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002801 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 return NULL;
2803
Thomas Wouters89f507f2006-12-13 04:49:30 +00002804 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002805 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806 }
2807 else if (NCH(exc) == 4) {
2808 asdl_seq *suite_seq;
2809 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002810 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002811 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002814 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 return NULL;
2816 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002817 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 return NULL;
2819
Thomas Wouters89f507f2006-12-13 04:49:30 +00002820 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002821 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002823
2824 PyErr_Format(PyExc_SystemError,
2825 "wrong number of children for 'except' clause: %d",
2826 NCH(exc));
2827 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828}
2829
2830static stmt_ty
2831ast_for_try_stmt(struct compiling *c, const node *n)
2832{
Neal Norwitzf599f422005-12-17 21:33:47 +00002833 const int nch = NCH(n);
2834 int n_except = (nch - 3)/3;
2835 asdl_seq *body, *orelse = NULL, *finally = NULL;
2836
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 REQ(n, try_stmt);
2838
Neal Norwitzf599f422005-12-17 21:33:47 +00002839 body = ast_for_suite(c, CHILD(n, 2));
2840 if (body == NULL)
2841 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842
Neal Norwitzf599f422005-12-17 21:33:47 +00002843 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2844 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2845 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2846 /* we can assume it's an "else",
2847 because nch >= 9 for try-else-finally and
2848 it would otherwise have a type of except_clause */
2849 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2850 if (orelse == NULL)
2851 return NULL;
2852 n_except--;
2853 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854
Neal Norwitzf599f422005-12-17 21:33:47 +00002855 finally = ast_for_suite(c, CHILD(n, nch - 1));
2856 if (finally == NULL)
2857 return NULL;
2858 n_except--;
2859 }
2860 else {
2861 /* we can assume it's an "else",
2862 otherwise it would have a type of except_clause */
2863 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2864 if (orelse == NULL)
2865 return NULL;
2866 n_except--;
2867 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002869 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002870 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 return NULL;
2872 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002873
2874 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002875 int i;
2876 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002877 /* process except statements to create a try ... except */
2878 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2879 if (handlers == NULL)
2880 return NULL;
2881
2882 for (i = 0; i < n_except; i++) {
2883 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2884 CHILD(n, 5 + i * 3));
2885 if (!e)
2886 return NULL;
2887 asdl_seq_SET(handlers, i, e);
2888 }
2889
Thomas Wouters89f507f2006-12-13 04:49:30 +00002890 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002891 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002892 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002894
2895 /* if a 'finally' is present too, we nest the TryExcept within a
2896 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002897 body = asdl_seq_new(1, c->c_arena);
2898 if (body == NULL)
2899 return NULL;
2900 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002901 }
2902
2903 /* must be a try ... finally (except clauses are in body, if any exist) */
2904 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002905 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906}
2907
Guido van Rossumc2e20742006-02-27 22:32:47 +00002908static expr_ty
2909ast_for_with_var(struct compiling *c, const node *n)
2910{
2911 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002912 return ast_for_expr(c, CHILD(n, 1));
2913}
2914
2915/* with_stmt: 'with' test [ with_var ] ':' suite */
2916static stmt_ty
2917ast_for_with_stmt(struct compiling *c, const node *n)
2918{
2919 expr_ty context_expr, optional_vars = NULL;
2920 int suite_index = 3; /* skip 'with', test, and ':' */
2921 asdl_seq *suite_seq;
2922
2923 assert(TYPE(n) == with_stmt);
2924 context_expr = ast_for_expr(c, CHILD(n, 1));
2925 if (TYPE(CHILD(n, 2)) == with_var) {
2926 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2927
2928 if (!optional_vars) {
2929 return NULL;
2930 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002931 if (!set_context(optional_vars, Store, n)) {
2932 return NULL;
2933 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002934 suite_index = 4;
2935 }
2936
2937 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2938 if (!suite_seq) {
2939 return NULL;
2940 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002941 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002942 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002943}
2944
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002946ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002948 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2949 asdl_seq *s;
2950 expr_ty call, dummy;
2951
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 REQ(n, classdef);
2953
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002954 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955 s = ast_for_suite(c, CHILD(n, 3));
2956 if (!s)
2957 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002958 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002959 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002961
2962 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 s = ast_for_suite(c, CHILD(n,5));
2964 if (!s)
2965 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002966 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002967 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 }
2969
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002970 /* class NAME '(' arglist ')' ':' suite */
2971 /* build up a fake Call node so we can extract its pieces */
2972 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2973 call = ast_for_call(c, CHILD(n, 3), dummy);
2974 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002977 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002979
2980 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2981 call->v.Call.args, call->v.Call.keywords,
2982 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002983 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984}
2985
2986static stmt_ty
2987ast_for_stmt(struct compiling *c, const node *n)
2988{
2989 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 assert(NCH(n) == 1);
2991 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 }
2993 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002994 assert(num_stmts(n) == 1);
2995 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996 }
2997 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002998 REQ(n, small_stmt);
2999 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003000 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3001 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003002 */
3003 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 case expr_stmt:
3005 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 case del_stmt:
3007 return ast_for_del_stmt(c, n);
3008 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003009 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010 case flow_stmt:
3011 return ast_for_flow_stmt(c, n);
3012 case import_stmt:
3013 return ast_for_import_stmt(c, n);
3014 case global_stmt:
3015 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003016 case nonlocal_stmt:
3017 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018 case assert_stmt:
3019 return ast_for_assert_stmt(c, n);
3020 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003021 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3023 TYPE(n), NCH(n));
3024 return NULL;
3025 }
3026 }
3027 else {
3028 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003029 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003030 */
3031 node *ch = CHILD(n, 0);
3032 REQ(n, compound_stmt);
3033 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 case if_stmt:
3035 return ast_for_if_stmt(c, ch);
3036 case while_stmt:
3037 return ast_for_while_stmt(c, ch);
3038 case for_stmt:
3039 return ast_for_for_stmt(c, ch);
3040 case try_stmt:
3041 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003042 case with_stmt:
3043 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003045 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003047 return ast_for_classdef(c, ch, NULL);
3048 case decorated:
3049 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003051 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3053 TYPE(n), NCH(n));
3054 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003055 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 }
3057}
3058
3059static PyObject *
3060parsenumber(const char *s)
3061{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003062 const char *end;
3063 long x;
3064 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003066 Py_complex c;
3067 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068#endif
3069
Guido van Rossumd8faa362007-04-27 19:54:29 +00003070 errno = 0;
3071 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003073 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003075 if (s[0] == '0') {
3076 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3077 if (x < 0 && errno == 0) {
3078 return PyLong_FromString((char *)s,
3079 (char **)0,
3080 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003082 }
3083 else
3084 x = PyOS_strtol((char *)s, (char **)&end, 0);
3085 if (*end == '\0') {
3086 if (errno != 0)
3087 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003088 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003089 }
3090 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003091#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003092 if (imflag) {
3093 c.real = 0.;
3094 PyFPE_START_PROTECT("atof", return 0)
3095 c.imag = PyOS_ascii_atof(s);
3096 PyFPE_END_PROTECT(c)
3097 return PyComplex_FromCComplex(c);
3098 }
3099 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003101 {
3102 PyFPE_START_PROTECT("atof", return 0)
3103 dx = PyOS_ascii_atof(s);
3104 PyFPE_END_PROTECT(dx)
3105 return PyFloat_FromDouble(dx);
3106 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107}
3108
3109static PyObject *
3110decode_utf8(const char **sPtr, const char *end, char* encoding)
3111{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003112 PyObject *u, *v;
3113 char *s, *t;
3114 t = s = (char *)*sPtr;
3115 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3116 while (s < end && (*s & 0x80)) s++;
3117 *sPtr = s;
3118 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3119 if (u == NULL)
3120 return NULL;
3121 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3122 Py_DECREF(u);
3123 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124}
3125
3126static PyObject *
3127decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3128{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003129 PyObject *v, *u;
3130 char *buf;
3131 char *p;
3132 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003133
Guido van Rossumd8faa362007-04-27 19:54:29 +00003134 if (encoding == NULL) {
3135 buf = (char *)s;
3136 u = NULL;
3137 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3138 buf = (char *)s;
3139 u = NULL;
3140 } else {
3141 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3142 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3143 if (u == NULL)
3144 return NULL;
3145 p = buf = PyString_AsString(u);
3146 end = s + len;
3147 while (s < end) {
3148 if (*s == '\\') {
3149 *p++ = *s++;
3150 if (*s & 0x80) {
3151 strcpy(p, "u005c");
3152 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003153 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003154 }
3155 if (*s & 0x80) { /* XXX inefficient */
3156 PyObject *w;
3157 char *r;
3158 Py_ssize_t rn, i;
3159 w = decode_utf8(&s, end, "utf-16-be");
3160 if (w == NULL) {
3161 Py_DECREF(u);
3162 return NULL;
3163 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00003164 r = PyString_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003165 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 assert(rn % 2 == 0);
3167 for (i = 0; i < rn; i += 2) {
3168 sprintf(p, "\\u%02x%02x",
3169 r[i + 0] & 0xFF,
3170 r[i + 1] & 0xFF);
3171 p += 6;
3172 }
3173 Py_DECREF(w);
3174 } else {
3175 *p++ = *s++;
3176 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003177 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 len = p - buf;
3179 s = buf;
3180 }
3181 if (rawmode)
3182 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3183 else
3184 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3185 Py_XDECREF(u);
3186 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187}
3188
3189/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003190 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191 * parsestr parses it, and returns the decoded Python string object.
3192 */
3193static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003194parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 size_t len;
3197 const char *s = STR(n);
3198 int quote = Py_CHARMASK(*s);
3199 int rawmode = 0;
3200 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201
Guido van Rossum98297ee2007-11-06 21:34:58 +00003202 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 if (quote == 'b' || quote == 'B') {
3204 quote = *++s;
3205 *bytesmode = 1;
3206 }
3207 if (quote == 'r' || quote == 'R') {
3208 quote = *++s;
3209 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003210 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 }
3212 if (quote != '\'' && quote != '\"') {
3213 PyErr_BadInternalCall();
3214 return NULL;
3215 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 s++;
3217 len = strlen(s);
3218 if (len > INT_MAX) {
3219 PyErr_SetString(PyExc_OverflowError,
3220 "string to parse is too long");
3221 return NULL;
3222 }
3223 if (s[--len] != quote) {
3224 PyErr_BadInternalCall();
3225 return NULL;
3226 }
3227 if (len >= 4 && s[0] == quote && s[1] == quote) {
3228 s += 2;
3229 len -= 2;
3230 if (s[--len] != quote || s[--len] != quote) {
3231 PyErr_BadInternalCall();
3232 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003233 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 }
Guido van Rossum29fd7122007-11-12 01:13:56 +00003235 if (!*bytesmode && !rawmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 return decode_unicode(s, len, rawmode, encoding);
3237 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 if (*bytesmode) {
3239 /* Disallow non-ascii characters (but not escapes) */
3240 const char *c;
3241 for (c = s; *c; c++) {
3242 if (Py_CHARMASK(*c) >= 0x80) {
3243 ast_error(n, "bytes can only contain ASCII "
3244 "literal characters.");
3245 return NULL;
3246 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003247 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003248 }
3249 need_encoding = (!*bytesmode && encoding != NULL &&
3250 strcmp(encoding, "utf-8") != 0 &&
3251 strcmp(encoding, "iso-8859-1") != 0);
3252 if (rawmode || strchr(s, '\\') == NULL) {
3253 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003254 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003255 if (u == NULL || !*bytesmode)
3256 return u;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3258 Py_DECREF(u);
3259 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003260 } else if (*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003261 return PyString_FromStringAndSize(s, len);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003262 } else if (strcmp(encoding, "utf-8") == 0) {
3263 return PyUnicode_FromStringAndSize(s, len);
3264 } else {
3265 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003266 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003267 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268
Guido van Rossumbdde0112007-05-11 16:26:27 +00003269 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003270 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271}
3272
Guido van Rossum29fd7122007-11-12 01:13:56 +00003273/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274 * compile-time literal catenation, calling parsestr() on each piece, and
3275 * pasting the intermediate results together.
3276 */
3277static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003278parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003280 PyObject *v;
3281 int i;
3282 REQ(CHILD(n, 0), STRING);
3283 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3284 if (v != NULL) {
3285 /* String literal concatenation */
3286 for (i = 1; i < NCH(n); i++) {
3287 PyObject *s;
3288 int subbm = 0;
3289 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3290 if (s == NULL)
3291 goto onError;
3292 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003293 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003294 goto onError;
3295 }
3296 if (PyString_Check(v) && PyString_Check(s)) {
3297 PyString_ConcatAndDel(&v, s);
3298 if (v == NULL)
3299 goto onError;
3300 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003301 else {
3302 PyObject *temp = PyUnicode_Concat(v, s);
3303 Py_DECREF(s);
3304 Py_DECREF(v);
3305 v = temp;
3306 if (v == NULL)
3307 goto onError;
3308 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003309 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003310 }
3311 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312
Guido van Rossumd8faa362007-04-27 19:54:29 +00003313 onError:
3314 Py_XDECREF(v);
3315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316}