blob: 3169de9216da296b512dd2ea86f1afa4d9c5ccb8 [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) {
59 PyObject *m = PyImport_ImportModule("unicodedata");
60 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 }
1018 return thing;
1019}
1020
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021static expr_ty
1022ast_for_lambdef(struct compiling *c, const node *n)
1023{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001024 /* lambdef: 'lambda' [varargslist] ':' test
1025 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001026 arguments_ty args;
1027 expr_ty expression;
1028
1029 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001030 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1031 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 if (!args)
1033 return NULL;
1034 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001035 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 }
1038 else {
1039 args = ast_for_arguments(c, CHILD(n, 1));
1040 if (!args)
1041 return NULL;
1042 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001043 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045 }
1046
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001047 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048}
1049
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001050static expr_ty
1051ast_for_ifexpr(struct compiling *c, const node *n)
1052{
1053 /* test: or_test 'if' or_test 'else' test */
1054 expr_ty expression, body, orelse;
1055
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001056 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001057 body = ast_for_expr(c, CHILD(n, 0));
1058 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001059 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001060 expression = ast_for_expr(c, CHILD(n, 2));
1061 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001062 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001063 orelse = ast_for_expr(c, CHILD(n, 4));
1064 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001066 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1067 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001068}
1069
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001071 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072
Nick Coghlan650f0d02007-04-15 12:05:43 +00001073 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074*/
1075
1076static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001077count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001079 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080
Guido van Rossumd8faa362007-04-27 19:54:29 +00001081 count_comp_for:
1082 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001083 REQ(n, comp_for);
1084 if (NCH(n) == 5)
1085 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001086 else
1087 return n_fors;
1088 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001089 REQ(n, comp_iter);
1090 n = CHILD(n, 0);
1091 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001092 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001093 else if (TYPE(n) == comp_if) {
1094 if (NCH(n) == 3) {
1095 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001096 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001097 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098 else
1099 return n_fors;
1100 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001101
Guido van Rossumd8faa362007-04-27 19:54:29 +00001102 /* Should never be reached */
1103 PyErr_SetString(PyExc_SystemError,
1104 "logic error in count_comp_fors");
1105 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106}
1107
Nick Coghlan650f0d02007-04-15 12:05:43 +00001108/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Nick Coghlan650f0d02007-04-15 12:05:43 +00001110 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111*/
1112
1113static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001114count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117
Guido van Rossumd8faa362007-04-27 19:54:29 +00001118 while (1) {
1119 REQ(n, comp_iter);
1120 if (TYPE(CHILD(n, 0)) == comp_for)
1121 return n_ifs;
1122 n = CHILD(n, 0);
1123 REQ(n, comp_if);
1124 n_ifs++;
1125 if (NCH(n) == 2)
1126 return n_ifs;
1127 n = CHILD(n, 2);
1128 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129}
1130
Guido van Rossum992d4a32007-07-11 13:09:30 +00001131static asdl_seq *
1132ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001135 asdl_seq *comps;
1136
Nick Coghlan650f0d02007-04-15 12:05:43 +00001137 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 if (n_fors == -1)
1139 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001140
Nick Coghlan650f0d02007-04-15 12:05:43 +00001141 comps = asdl_seq_new(n_fors, c->c_arena);
1142 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001144
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001146 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 asdl_seq *t;
1148 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001149 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150
Guido van Rossum992d4a32007-07-11 13:09:30 +00001151 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152
Guido van Rossum992d4a32007-07-11 13:09:30 +00001153 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001154 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001155 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001157 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001158 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001160
Thomas Wouters89f507f2006-12-13 04:49:30 +00001161 /* Check the # of children rather than the length of t, since
1162 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1163 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001164 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1165 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001167 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001168 c->c_arena),
1169 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001170
Nick Coghlan650f0d02007-04-15 12:05:43 +00001171 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001173
Guido van Rossum992d4a32007-07-11 13:09:30 +00001174 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175 int j, n_ifs;
1176 asdl_seq *ifs;
1177
Guido van Rossum992d4a32007-07-11 13:09:30 +00001178 n = CHILD(n, 4);
1179 n_ifs = count_comp_ifs(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182
1183 ifs = asdl_seq_new(n_ifs, c->c_arena);
1184 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001186
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001188 REQ(n, comp_iter);
1189 n = CHILD(n, 0);
1190 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191
Guido van Rossum992d4a32007-07-11 13:09:30 +00001192 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001193 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001194 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001195 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001196 if (NCH(n) == 3)
1197 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001199 /* on exit, must guarantee that n is a comp_for */
1200 if (TYPE(n) == comp_iter)
1201 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001202 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001204 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001206 return comps;
1207}
1208
1209static expr_ty
1210ast_for_itercomp(struct compiling *c, const node *n, int type)
1211{
1212 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1213 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1214 expr_ty elt;
1215 asdl_seq *comps;
1216
1217 assert(NCH(n) > 1);
1218
1219 elt = ast_for_expr(c, CHILD(n, 0));
1220 if (!elt)
1221 return NULL;
1222
1223 comps = ast_for_comprehension(c, CHILD(n, 1));
1224 if (!comps)
1225 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001226
1227 if (type == COMP_GENEXP)
1228 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1229 else if (type == COMP_LISTCOMP)
1230 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1231 else if (type == COMP_SETCOMP)
1232 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1233 else
1234 /* Should never happen */
1235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236}
1237
1238static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001239ast_for_dictcomp(struct compiling *c, const node *n)
1240{
1241 expr_ty key, value;
1242 asdl_seq *comps;
1243
1244 assert(NCH(n) > 3);
1245 REQ(CHILD(n, 1), COLON);
1246
1247 key = ast_for_expr(c, CHILD(n, 0));
1248 if (!key)
1249 return NULL;
1250
1251 value = ast_for_expr(c, CHILD(n, 2));
1252 if (!value)
1253 return NULL;
1254
1255 comps = ast_for_comprehension(c, CHILD(n, 3));
1256 if (!comps)
1257 return NULL;
1258
1259 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1260}
1261
1262static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001263ast_for_genexp(struct compiling *c, const node *n)
1264{
1265 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001266 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001267}
1268
1269static expr_ty
1270ast_for_listcomp(struct compiling *c, const node *n)
1271{
1272 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001273 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001274}
1275
1276static expr_ty
1277ast_for_setcomp(struct compiling *c, const node *n)
1278{
1279 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001280 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001281}
1282
1283
1284static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285ast_for_atom(struct compiling *c, const node *n)
1286{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001287 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1288 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001289 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290 */
1291 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001292 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293
1294 switch (TYPE(ch)) {
1295 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001296 /* All names start in Load context, but may later be
1297 changed. */
1298 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001300 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001301 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001302 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001303 PyObject *type, *value, *tback, *errstr;
1304 PyErr_Fetch(&type, &value, &tback);
1305 errstr = ((PyUnicodeErrorObject *)value)->reason;
1306 if (errstr) {
1307 char *s = "";
1308 char buf[128];
Amaury Forgeot d'Arc39599dc2007-11-22 02:48:12 +00001309 s = PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001310 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1311 ast_error(n, buf);
1312 } else {
1313 ast_error(n, "(unicode error) unknown error");
1314 }
1315 Py_DECREF(type);
1316 Py_DECREF(value);
1317 Py_XDECREF(tback);
1318 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001319 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001320 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001321 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001322 if (bytesmode)
1323 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1324 else
1325 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001326 }
1327 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001328 PyObject *pynum = parsenumber(STR(ch));
1329 if (!pynum)
1330 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001331
Thomas Wouters89f507f2006-12-13 04:49:30 +00001332 PyArena_AddPyObject(c->c_arena, pynum);
1333 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334 }
Georg Brandldde00282007-03-18 19:01:53 +00001335 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001336 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001338 ch = CHILD(n, 1);
1339
1340 if (TYPE(ch) == RPAR)
1341 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1342
1343 if (TYPE(ch) == yield_expr)
1344 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001345
1346 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1347 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001348 return ast_for_genexp(c, ch);
1349
Nick Coghlan650f0d02007-04-15 12:05:43 +00001350 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001352 ch = CHILD(n, 1);
1353
1354 if (TYPE(ch) == RSQB)
1355 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1356
Nick Coghlan650f0d02007-04-15 12:05:43 +00001357 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001358 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1359 asdl_seq *elts = seq_for_testlist(c, ch);
1360 if (!elts)
1361 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001362
Thomas Wouters89f507f2006-12-13 04:49:30 +00001363 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1364 }
1365 else
1366 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001368 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1369 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001370 int i, size;
1371 asdl_seq *keys, *values;
1372
1373 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001374 if (TYPE(ch) == RBRACE) {
1375 /* it's an empty dict */
1376 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1377 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1378 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001379 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001380 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001381 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001382 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001383 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001384 for (i = 0; i < NCH(ch); i += 2) {
1385 expr_ty expression;
1386 expression = ast_for_expr(c, CHILD(ch, i));
1387 if (!expression)
1388 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001389 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001390 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001391 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1392 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1393 /* it's a set comprehension */
1394 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001395 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1396 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001397 } else {
1398 /* it's a dict */
1399 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1400 keys = asdl_seq_new(size, c->c_arena);
1401 if (!keys)
1402 return NULL;
1403
1404 values = asdl_seq_new(size, c->c_arena);
1405 if (!values)
1406 return NULL;
1407
1408 for (i = 0; i < NCH(ch); i += 4) {
1409 expr_ty expression;
1410
1411 expression = ast_for_expr(c, CHILD(ch, i));
1412 if (!expression)
1413 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001414
Guido van Rossum86e58e22006-08-28 15:27:34 +00001415 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001416
Guido van Rossum86e58e22006-08-28 15:27:34 +00001417 expression = ast_for_expr(c, CHILD(ch, i + 2));
1418 if (!expression)
1419 return NULL;
1420
1421 asdl_seq_SET(values, i / 4, expression);
1422 }
1423 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1424 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001427 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1428 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429 }
1430}
1431
1432static slice_ty
1433ast_for_slice(struct compiling *c, const node *n)
1434{
1435 node *ch;
1436 expr_ty lower = NULL, upper = NULL, step = NULL;
1437
1438 REQ(n, subscript);
1439
1440 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001441 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442 sliceop: ':' [test]
1443 */
1444 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 if (NCH(n) == 1 && TYPE(ch) == test) {
1446 /* 'step' variable hold no significance in terms of being used over
1447 other vars */
1448 step = ast_for_expr(c, ch);
1449 if (!step)
1450 return NULL;
1451
Thomas Wouters89f507f2006-12-13 04:49:30 +00001452 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 }
1454
1455 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001456 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 if (!lower)
1458 return NULL;
1459 }
1460
1461 /* If there's an upper bound it's in the second or third position. */
1462 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001463 if (NCH(n) > 1) {
1464 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 if (TYPE(n2) == test) {
1467 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 if (!upper)
1469 return NULL;
1470 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001473 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474
Thomas Wouters89f507f2006-12-13 04:49:30 +00001475 if (TYPE(n2) == test) {
1476 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 if (!upper)
1478 return NULL;
1479 }
1480 }
1481
1482 ch = CHILD(n, NCH(n) - 1);
1483 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001484 if (NCH(ch) == 1) {
1485 /* No expression, so step is None */
1486 ch = CHILD(ch, 0);
1487 step = Name(new_identifier("None", c->c_arena), Load,
1488 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 if (!step)
1490 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001491 } else {
1492 ch = CHILD(ch, 1);
1493 if (TYPE(ch) == test) {
1494 step = ast_for_expr(c, ch);
1495 if (!step)
1496 return NULL;
1497 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 }
1499 }
1500
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001501 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502}
1503
1504static expr_ty
1505ast_for_binop(struct compiling *c, const node *n)
1506{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001507 /* Must account for a sequence of expressions.
1508 How should A op B op C by represented?
1509 BinOp(BinOp(A, op, B), op, C).
1510 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511
Guido van Rossumd8faa362007-04-27 19:54:29 +00001512 int i, nops;
1513 expr_ty expr1, expr2, result;
1514 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515
Guido van Rossumd8faa362007-04-27 19:54:29 +00001516 expr1 = ast_for_expr(c, CHILD(n, 0));
1517 if (!expr1)
1518 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519
Guido van Rossumd8faa362007-04-27 19:54:29 +00001520 expr2 = ast_for_expr(c, CHILD(n, 2));
1521 if (!expr2)
1522 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523
Guido van Rossumd8faa362007-04-27 19:54:29 +00001524 newoperator = get_operator(CHILD(n, 1));
1525 if (!newoperator)
1526 return NULL;
1527
1528 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1529 c->c_arena);
1530 if (!result)
1531 return NULL;
1532
1533 nops = (NCH(n) - 1) / 2;
1534 for (i = 1; i < nops; i++) {
1535 expr_ty tmp_result, tmp;
1536 const node* next_oper = CHILD(n, i * 2 + 1);
1537
1538 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001539 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001540 return NULL;
1541
Guido van Rossumd8faa362007-04-27 19:54:29 +00001542 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1543 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544 return NULL;
1545
Guido van Rossumd8faa362007-04-27 19:54:29 +00001546 tmp_result = BinOp(result, newoperator, tmp,
1547 LINENO(next_oper), next_oper->n_col_offset,
1548 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001549 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001550 return NULL;
1551 result = tmp_result;
1552 }
1553 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001554}
1555
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001556static expr_ty
1557ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1558{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001559 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1560 subscriptlist: subscript (',' subscript)* [',']
1561 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1562 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001563 REQ(n, trailer);
1564 if (TYPE(CHILD(n, 0)) == LPAR) {
1565 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001566 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1567 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001568 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001569 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001570 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001571 else if (TYPE(CHILD(n, 0)) == DOT ) {
1572 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001573 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001574 }
1575 else {
1576 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001577 REQ(CHILD(n, 2), RSQB);
1578 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001579 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001580 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1581 if (!slc)
1582 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001583 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1584 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001585 }
1586 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001587 /* The grammar is ambiguous here. The ambiguity is resolved
1588 by treating the sequence as a tuple literal if there are
1589 no slice features.
1590 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001591 int j;
1592 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001593 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001594 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001595 asdl_seq *slices, *elts;
1596 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001597 if (!slices)
1598 return NULL;
1599 for (j = 0; j < NCH(n); j += 2) {
1600 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001601 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001602 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001603 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001604 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001605 asdl_seq_SET(slices, j / 2, slc);
1606 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001607 if (!simple) {
1608 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001609 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001610 }
1611 /* extract Index values and put them in a Tuple */
1612 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001613 if (!elts)
1614 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001615 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1616 slc = (slice_ty)asdl_seq_GET(slices, j);
1617 assert(slc->kind == Index_kind && slc->v.Index.value);
1618 asdl_seq_SET(elts, j, slc->v.Index.value);
1619 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001620 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001621 if (!e)
1622 return NULL;
1623 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001624 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625 }
1626 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001627}
1628
1629static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001630ast_for_factor(struct compiling *c, const node *n)
1631{
1632 node *pfactor, *ppower, *patom, *pnum;
1633 expr_ty expression;
1634
1635 /* If the unary - operator is applied to a constant, don't generate
1636 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1637 constant. The peephole optimizer already does something like
1638 this but it doesn't handle the case where the constant is
1639 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1640 PyLongObject.
1641 */
1642 if (TYPE(CHILD(n, 0)) == MINUS
1643 && NCH(n) == 2
1644 && TYPE((pfactor = CHILD(n, 1))) == factor
1645 && NCH(pfactor) == 1
1646 && TYPE((ppower = CHILD(pfactor, 0))) == power
1647 && NCH(ppower) == 1
1648 && TYPE((patom = CHILD(ppower, 0))) == atom
1649 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1650 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1651 if (s == NULL)
1652 return NULL;
1653 s[0] = '-';
1654 strcpy(s + 1, STR(pnum));
1655 PyObject_FREE(STR(pnum));
1656 STR(pnum) = s;
1657 return ast_for_atom(c, patom);
1658 }
1659
1660 expression = ast_for_expr(c, CHILD(n, 1));
1661 if (!expression)
1662 return NULL;
1663
1664 switch (TYPE(CHILD(n, 0))) {
1665 case PLUS:
1666 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1667 c->c_arena);
1668 case MINUS:
1669 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1670 c->c_arena);
1671 case TILDE:
1672 return UnaryOp(Invert, expression, LINENO(n),
1673 n->n_col_offset, c->c_arena);
1674 }
1675 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1676 TYPE(CHILD(n, 0)));
1677 return NULL;
1678}
1679
1680static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001681ast_for_power(struct compiling *c, const node *n)
1682{
1683 /* power: atom trailer* ('**' factor)*
1684 */
1685 int i;
1686 expr_ty e, tmp;
1687 REQ(n, power);
1688 e = ast_for_atom(c, CHILD(n, 0));
1689 if (!e)
1690 return NULL;
1691 if (NCH(n) == 1)
1692 return e;
1693 for (i = 1; i < NCH(n); i++) {
1694 node *ch = CHILD(n, i);
1695 if (TYPE(ch) != trailer)
1696 break;
1697 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001698 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001699 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001700 tmp->lineno = e->lineno;
1701 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001702 e = tmp;
1703 }
1704 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1705 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001706 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001707 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001708 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001709 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001710 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001711 e = tmp;
1712 }
1713 return e;
1714}
1715
Guido van Rossum0368b722007-05-11 16:50:42 +00001716static expr_ty
1717ast_for_starred(struct compiling *c, const node *n)
1718{
1719 expr_ty tmp;
1720 REQ(n, star_expr);
1721
1722 tmp = ast_for_expr(c, CHILD(n, 1));
1723 if (!tmp)
1724 return NULL;
1725
1726 /* The Load context is changed later. */
1727 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1728}
1729
1730
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731/* Do not name a variable 'expr'! Will cause a compile error.
1732*/
1733
1734static expr_ty
1735ast_for_expr(struct compiling *c, const node *n)
1736{
1737 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001738 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001739 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001740 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 and_test: not_test ('and' not_test)*
1742 not_test: 'not' not_test | comparison
1743 comparison: expr (comp_op expr)*
1744 expr: xor_expr ('|' xor_expr)*
1745 xor_expr: and_expr ('^' and_expr)*
1746 and_expr: shift_expr ('&' shift_expr)*
1747 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1748 arith_expr: term (('+'|'-') term)*
1749 term: factor (('*'|'/'|'%'|'//') factor)*
1750 factor: ('+'|'-'|'~') factor | power
1751 power: atom trailer* ('**' factor)*
1752 */
1753
1754 asdl_seq *seq;
1755 int i;
1756
1757 loop:
1758 switch (TYPE(n)) {
1759 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001760 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001761 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001762 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001764 else if (NCH(n) > 1)
1765 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001766 /* Fallthrough */
1767 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768 case and_test:
1769 if (NCH(n) == 1) {
1770 n = CHILD(n, 0);
1771 goto loop;
1772 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001773 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 if (!seq)
1775 return NULL;
1776 for (i = 0; i < NCH(n); i += 2) {
1777 expr_ty e = ast_for_expr(c, CHILD(n, i));
1778 if (!e)
1779 return NULL;
1780 asdl_seq_SET(seq, i / 2, e);
1781 }
1782 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001783 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1784 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001785 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001786 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 case not_test:
1788 if (NCH(n) == 1) {
1789 n = CHILD(n, 0);
1790 goto loop;
1791 }
1792 else {
1793 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1794 if (!expression)
1795 return NULL;
1796
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001797 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1798 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799 }
1800 case comparison:
1801 if (NCH(n) == 1) {
1802 n = CHILD(n, 0);
1803 goto loop;
1804 }
1805 else {
1806 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001807 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001808 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001809 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 if (!ops)
1811 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001812 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 return NULL;
1815 }
1816 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001817 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001819 newoperator = ast_for_comp_op(CHILD(n, i));
1820 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823
1824 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001825 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001827 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 asdl_seq_SET(cmps, i / 2, expression);
1831 }
1832 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001833 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001835 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001837 return Compare(expression, ops, cmps, LINENO(n),
1838 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 }
1840 break;
1841
Guido van Rossum0368b722007-05-11 16:50:42 +00001842 case star_expr:
1843 if (TYPE(CHILD(n, 0)) == STAR) {
1844 return ast_for_starred(c, n);
1845 }
1846 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 /* The next five cases all handle BinOps. The main body of code
1848 is the same in each case, but the switch turned inside out to
1849 reuse the code for each type of operator.
1850 */
1851 case expr:
1852 case xor_expr:
1853 case and_expr:
1854 case shift_expr:
1855 case arith_expr:
1856 case term:
1857 if (NCH(n) == 1) {
1858 n = CHILD(n, 0);
1859 goto loop;
1860 }
1861 return ast_for_binop(c, n);
1862 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 expr_ty exp = NULL;
1864 if (NCH(n) == 2) {
1865 exp = ast_for_testlist(c, CHILD(n, 1));
1866 if (!exp)
1867 return NULL;
1868 }
1869 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1870 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001871 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 if (NCH(n) == 1) {
1873 n = CHILD(n, 0);
1874 goto loop;
1875 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001877 case power:
1878 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001880 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 return NULL;
1882 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001883 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884 return NULL;
1885}
1886
1887static expr_ty
1888ast_for_call(struct compiling *c, const node *n, expr_ty func)
1889{
1890 /*
1891 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1892 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001893 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894 */
1895
1896 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001897 asdl_seq *args;
1898 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899 expr_ty vararg = NULL, kwarg = NULL;
1900
1901 REQ(n, arglist);
1902
1903 nargs = 0;
1904 nkeywords = 0;
1905 ngens = 0;
1906 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 node *ch = CHILD(n, i);
1908 if (TYPE(ch) == argument) {
1909 if (NCH(ch) == 1)
1910 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001911 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001912 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001914 nkeywords++;
1915 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 }
1917 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001918 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001919 "if not sole argument");
1920 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 }
1922
1923 if (nargs + nkeywords + ngens > 255) {
1924 ast_error(n, "more than 255 arguments");
1925 return NULL;
1926 }
1927
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001928 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001930 return NULL;
1931 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001933 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934 nargs = 0;
1935 nkeywords = 0;
1936 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001937 node *ch = CHILD(n, i);
1938 if (TYPE(ch) == argument) {
1939 expr_ty e;
1940 if (NCH(ch) == 1) {
1941 if (nkeywords) {
1942 ast_error(CHILD(ch, 0),
1943 "non-keyword arg after keyword arg");
1944 return NULL;
1945 }
1946 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001948 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 asdl_seq_SET(args, nargs++, e);
1950 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001951 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001952 e = ast_for_genexp(c, ch);
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);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001957 else {
1958 keyword_ty kw;
1959 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960
Thomas Wouters89f507f2006-12-13 04:49:30 +00001961 /* CHILD(ch, 0) is test, but must be an identifier? */
1962 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001964 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 /* f(lambda x: x[0] = 3) ends up getting parsed with
1966 * LHS test = lambda x: x[0], and RHS test = 3.
1967 * SF bug 132313 points out that complaining about a keyword
1968 * then is very confusing.
1969 */
1970 if (e->kind == Lambda_kind) {
1971 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001972 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 } else if (e->kind != Name_kind) {
1974 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001975 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001976 } else if (forbidden_name(e, ch)) {
1977 return NULL;
1978 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001979 key = e->v.Name.id;
1980 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001982 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001985 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 asdl_seq_SET(keywords, nkeywords++, kw);
1987 }
1988 }
1989 else if (TYPE(ch) == STAR) {
1990 vararg = ast_for_expr(c, CHILD(n, i+1));
1991 i++;
1992 }
1993 else if (TYPE(ch) == DOUBLESTAR) {
1994 kwarg = ast_for_expr(c, CHILD(n, i+1));
1995 i++;
1996 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 }
1998
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001999 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000}
2001
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002003ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002005 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002006 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002007 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002009 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002010 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002011 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002012 }
2013 else {
2014 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002015 TYPE(n) == testlist1);
2016 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 else {
2020 asdl_seq *tmp = seq_for_testlist(c, n);
2021 if (!tmp)
2022 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002023 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002025}
2026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027static stmt_ty
2028ast_for_expr_stmt(struct compiling *c, const node *n)
2029{
2030 REQ(n, expr_stmt);
2031 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2032 | ('=' (yield_expr|testlist))*)
2033 testlist: test (',' test)* [',']
2034 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002035 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 test: ... here starts the operator precendence dance
2037 */
2038
2039 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002040 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041 if (!e)
2042 return NULL;
2043
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 }
2046 else if (TYPE(CHILD(n, 1)) == augassign) {
2047 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002048 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002049 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050
Thomas Wouters89f507f2006-12-13 04:49:30 +00002051 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052 if (!expr1)
2053 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002054 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002055 switch (expr1->kind) {
2056 case GeneratorExp_kind:
2057 ast_error(ch, "augmented assignment to generator "
2058 "expression not possible");
2059 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002060 case Yield_kind:
2061 ast_error(ch, "augmented assignment to yield "
2062 "expression not possible");
2063 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002064 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002065 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002066 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002067 break;
2068 }
2069 case Attribute_kind:
2070 case Subscript_kind:
2071 break;
2072 default:
2073 ast_error(ch, "illegal expression for augmented "
2074 "assignment");
2075 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002077 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078
Thomas Wouters89f507f2006-12-13 04:49:30 +00002079 ch = CHILD(n, 2);
2080 if (TYPE(ch) == testlist)
2081 expr2 = ast_for_testlist(c, ch);
2082 else
2083 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002084 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 return NULL;
2086
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002087 newoperator = ast_for_augassign(CHILD(n, 1));
2088 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 return NULL;
2090
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 }
2093 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002094 int i;
2095 asdl_seq *targets;
2096 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 expr_ty expression;
2098
Thomas Wouters89f507f2006-12-13 04:49:30 +00002099 /* a normal assignment */
2100 REQ(CHILD(n, 1), EQUAL);
2101 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2102 if (!targets)
2103 return NULL;
2104 for (i = 0; i < NCH(n) - 2; i += 2) {
2105 expr_ty e;
2106 node *ch = CHILD(n, i);
2107 if (TYPE(ch) == yield_expr) {
2108 ast_error(ch, "assignment to yield expression not possible");
2109 return NULL;
2110 }
2111 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112
Thomas Wouters89f507f2006-12-13 04:49:30 +00002113 /* set context to assign */
2114 if (!e)
2115 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116
Thomas Wouters89f507f2006-12-13 04:49:30 +00002117 if (!set_context(e, Store, CHILD(n, i)))
2118 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119
Thomas Wouters89f507f2006-12-13 04:49:30 +00002120 asdl_seq_SET(targets, i / 2, e);
2121 }
2122 value = CHILD(n, NCH(n) - 1);
2123 if (TYPE(value) == testlist)
2124 expression = ast_for_testlist(c, value);
2125 else
2126 expression = ast_for_expr(c, value);
2127 if (!expression)
2128 return NULL;
2129 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131}
2132
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002134ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135{
2136 asdl_seq *seq;
2137 int i;
2138 expr_ty e;
2139
2140 REQ(n, exprlist);
2141
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002142 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002144 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002146 e = ast_for_expr(c, CHILD(n, i));
2147 if (!e)
2148 return NULL;
2149 asdl_seq_SET(seq, i / 2, e);
2150 if (context && !set_context(e, context, CHILD(n, i)))
2151 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002152 }
2153 return seq;
2154}
2155
2156static stmt_ty
2157ast_for_del_stmt(struct compiling *c, const node *n)
2158{
2159 asdl_seq *expr_list;
2160
2161 /* del_stmt: 'del' exprlist */
2162 REQ(n, del_stmt);
2163
2164 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2165 if (!expr_list)
2166 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002167 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168}
2169
2170static stmt_ty
2171ast_for_flow_stmt(struct compiling *c, const node *n)
2172{
2173 /*
2174 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2175 | yield_stmt
2176 break_stmt: 'break'
2177 continue_stmt: 'continue'
2178 return_stmt: 'return' [testlist]
2179 yield_stmt: yield_expr
2180 yield_expr: 'yield' testlist
2181 raise_stmt: 'raise' [test [',' test [',' test]]]
2182 */
2183 node *ch;
2184
2185 REQ(n, flow_stmt);
2186 ch = CHILD(n, 0);
2187 switch (TYPE(ch)) {
2188 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002189 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002191 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002192 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002193 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2194 if (!exp)
2195 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002196 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197 }
2198 case return_stmt:
2199 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002200 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002202 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 if (!expression)
2204 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002205 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206 }
2207 case raise_stmt:
2208 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002209 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2210 else if (NCH(ch) >= 2) {
2211 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2213 if (!expression)
2214 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002215 if (NCH(ch) == 4) {
2216 cause = ast_for_expr(c, CHILD(ch, 3));
2217 if (!cause)
2218 return NULL;
2219 }
2220 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221 }
2222 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002223 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 "unexpected flow_stmt: %d", TYPE(ch));
2225 return NULL;
2226 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002227
2228 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2229 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230}
2231
2232static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002233alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234{
2235 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002236 import_as_name: NAME ['as' NAME]
2237 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 dotted_name: NAME ('.' NAME)*
2239 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002240 PyObject *str;
2241
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 loop:
2243 switch (TYPE(n)) {
2244 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002245 str = NULL;
2246 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002247 str = NEW_IDENTIFIER(CHILD(n, 2));
2248 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002249 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 case dotted_as_name:
2251 if (NCH(n) == 1) {
2252 n = CHILD(n, 0);
2253 goto loop;
2254 }
2255 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002256 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002257 if (!a)
2258 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 assert(!a->asname);
2260 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2261 return a;
2262 }
2263 break;
2264 case dotted_name:
2265 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002266 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 else {
2268 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002269 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002270 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002272 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273
2274 len = 0;
2275 for (i = 0; i < NCH(n); i += 2)
2276 /* length of string plus one for the dot */
2277 len += strlen(STR(CHILD(n, i))) + 1;
2278 len--; /* the last name doesn't have a dot */
2279 str = PyString_FromStringAndSize(NULL, len);
2280 if (!str)
2281 return NULL;
2282 s = PyString_AS_STRING(str);
2283 if (!s)
2284 return NULL;
2285 for (i = 0; i < NCH(n); i += 2) {
2286 char *sch = STR(CHILD(n, i));
2287 strcpy(s, STR(CHILD(n, i)));
2288 s += strlen(sch);
2289 *s++ = '.';
2290 }
2291 --s;
2292 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002293 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2294 PyString_GET_SIZE(str),
2295 NULL);
2296 Py_DECREF(str);
2297 if (!uni)
2298 return NULL;
2299 str = uni;
2300 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002301 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002302 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 }
2304 break;
2305 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002306 str = PyUnicode_InternFromString("*");
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 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002310 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 "unexpected import name: %d", TYPE(n));
2312 return NULL;
2313 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002314
2315 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 return NULL;
2317}
2318
2319static stmt_ty
2320ast_for_import_stmt(struct compiling *c, const node *n)
2321{
2322 /*
2323 import_stmt: import_name | import_from
2324 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002325 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2326 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002328 int lineno;
2329 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 int i;
2331 asdl_seq *aliases;
2332
2333 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002334 lineno = LINENO(n);
2335 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002337 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002339 REQ(n, dotted_as_names);
2340 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2341 if (!aliases)
2342 return NULL;
2343 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002344 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002345 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002347 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002349 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002351 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002353 int idx, ndots = 0;
2354 alias_ty mod = NULL;
2355 identifier modname;
2356
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002357 /* Count the number of dots (for relative imports) and check for the
2358 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002359 for (idx = 1; idx < NCH(n); idx++) {
2360 if (TYPE(CHILD(n, idx)) == dotted_name) {
2361 mod = alias_for_import_name(c, CHILD(n, idx));
2362 idx++;
2363 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002364 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2365 /* three consecutive dots are tokenized as one ELLIPSIS */
2366 ndots += 3;
2367 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002368 } else if (TYPE(CHILD(n, idx)) != DOT) {
2369 break;
2370 }
2371 ndots++;
2372 }
2373 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002374 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002375 case STAR:
2376 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002377 n = CHILD(n, idx);
2378 n_children = 1;
2379 if (ndots) {
2380 ast_error(n, "'import *' not allowed with 'from .'");
2381 return NULL;
2382 }
2383 break;
2384 case LPAR:
2385 /* from ... import (x, y, z) */
2386 n = CHILD(n, idx + 1);
2387 n_children = NCH(n);
2388 break;
2389 case import_as_names:
2390 /* from ... import x, y, z */
2391 n = CHILD(n, idx);
2392 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002393 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 ast_error(n, "trailing comma not allowed without"
2395 " surrounding parentheses");
2396 return NULL;
2397 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002398 break;
2399 default:
2400 ast_error(n, "Unexpected node-type in from-import");
2401 return NULL;
2402 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403
Thomas Wouters89f507f2006-12-13 04:49:30 +00002404 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2405 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407
2408 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002409 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002410 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002411 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002413 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002415 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002416 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002417 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2418 if (!import_alias)
2419 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002421 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002423 if (mod != NULL)
2424 modname = mod->name;
2425 else
2426 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002427 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002428 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 }
Neal Norwitz79792652005-11-14 04:25:03 +00002430 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431 "unknown import statement: starts with command '%s'",
2432 STR(CHILD(n, 0)));
2433 return NULL;
2434}
2435
2436static stmt_ty
2437ast_for_global_stmt(struct compiling *c, const node *n)
2438{
2439 /* global_stmt: 'global' NAME (',' NAME)* */
2440 identifier name;
2441 asdl_seq *s;
2442 int i;
2443
2444 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002445 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002447 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 name = NEW_IDENTIFIER(CHILD(n, i));
2450 if (!name)
2451 return NULL;
2452 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002454 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455}
2456
2457static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002458ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2459{
2460 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2461 identifier name;
2462 asdl_seq *s;
2463 int i;
2464
2465 REQ(n, nonlocal_stmt);
2466 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2467 if (!s)
2468 return NULL;
2469 for (i = 1; i < NCH(n); i += 2) {
2470 name = NEW_IDENTIFIER(CHILD(n, i));
2471 if (!name)
2472 return NULL;
2473 asdl_seq_SET(s, i / 2, name);
2474 }
2475 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2476}
2477
2478static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479ast_for_assert_stmt(struct compiling *c, const node *n)
2480{
2481 /* assert_stmt: 'assert' test [',' test] */
2482 REQ(n, assert_stmt);
2483 if (NCH(n) == 2) {
2484 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2485 if (!expression)
2486 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
2489 else if (NCH(n) == 4) {
2490 expr_ty expr1, expr2;
2491
2492 expr1 = ast_for_expr(c, CHILD(n, 1));
2493 if (!expr1)
2494 return NULL;
2495 expr2 = ast_for_expr(c, CHILD(n, 3));
2496 if (!expr2)
2497 return NULL;
2498
Thomas Wouters89f507f2006-12-13 04:49:30 +00002499 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500 }
Neal Norwitz79792652005-11-14 04:25:03 +00002501 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 "improper number of parts to 'assert' statement: %d",
2503 NCH(n));
2504 return NULL;
2505}
2506
2507static asdl_seq *
2508ast_for_suite(struct compiling *c, const node *n)
2509{
2510 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002511 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 stmt_ty s;
2513 int i, total, num, end, pos = 0;
2514 node *ch;
2515
2516 REQ(n, suite);
2517
2518 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002519 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002520 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002523 n = CHILD(n, 0);
2524 /* simple_stmt always ends with a NEWLINE,
2525 and may have a trailing SEMI
2526 */
2527 end = NCH(n) - 1;
2528 if (TYPE(CHILD(n, end - 1)) == SEMI)
2529 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002531 for (i = 0; i < end; i += 2) {
2532 ch = CHILD(n, i);
2533 s = ast_for_stmt(c, ch);
2534 if (!s)
2535 return NULL;
2536 asdl_seq_SET(seq, pos++, s);
2537 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 }
2539 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002540 for (i = 2; i < (NCH(n) - 1); i++) {
2541 ch = CHILD(n, i);
2542 REQ(ch, stmt);
2543 num = num_stmts(ch);
2544 if (num == 1) {
2545 /* small_stmt or compound_stmt with only one child */
2546 s = ast_for_stmt(c, ch);
2547 if (!s)
2548 return NULL;
2549 asdl_seq_SET(seq, pos++, s);
2550 }
2551 else {
2552 int j;
2553 ch = CHILD(ch, 0);
2554 REQ(ch, simple_stmt);
2555 for (j = 0; j < NCH(ch); j += 2) {
2556 /* statement terminates with a semi-colon ';' */
2557 if (NCH(CHILD(ch, j)) == 0) {
2558 assert((j + 1) == NCH(ch));
2559 break;
2560 }
2561 s = ast_for_stmt(c, CHILD(ch, j));
2562 if (!s)
2563 return NULL;
2564 asdl_seq_SET(seq, pos++, s);
2565 }
2566 }
2567 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 }
2569 assert(pos == seq->size);
2570 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571}
2572
2573static stmt_ty
2574ast_for_if_stmt(struct compiling *c, const node *n)
2575{
2576 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2577 ['else' ':' suite]
2578 */
2579 char *s;
2580
2581 REQ(n, if_stmt);
2582
2583 if (NCH(n) == 4) {
2584 expr_ty expression;
2585 asdl_seq *suite_seq;
2586
2587 expression = ast_for_expr(c, CHILD(n, 1));
2588 if (!expression)
2589 return NULL;
2590 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002591 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 return NULL;
2593
Guido van Rossumd8faa362007-04-27 19:54:29 +00002594 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2595 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002597
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 s = STR(CHILD(n, 4));
2599 /* s[2], the third character in the string, will be
2600 's' for el_s_e, or
2601 'i' for el_i_f
2602 */
2603 if (s[2] == 's') {
2604 expr_ty expression;
2605 asdl_seq *seq1, *seq2;
2606
2607 expression = ast_for_expr(c, CHILD(n, 1));
2608 if (!expression)
2609 return NULL;
2610 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002611 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 return NULL;
2613 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002614 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 return NULL;
2616
Guido van Rossumd8faa362007-04-27 19:54:29 +00002617 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2618 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 }
2620 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002622 expr_ty expression;
2623 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002624 asdl_seq *orelse = NULL;
2625 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 /* must reference the child n_elif+1 since 'else' token is third,
2627 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2629 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2630 has_else = 1;
2631 n_elif -= 3;
2632 }
2633 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002636 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637
Thomas Wouters89f507f2006-12-13 04:49:30 +00002638 orelse = asdl_seq_new(1, c->c_arena);
2639 if (!orelse)
2640 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002642 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002644 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2645 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002647 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2648 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650
Guido van Rossumd8faa362007-04-27 19:54:29 +00002651 asdl_seq_SET(orelse, 0,
2652 If(expression, suite_seq, suite_seq2,
2653 LINENO(CHILD(n, NCH(n) - 6)),
2654 CHILD(n, NCH(n) - 6)->n_col_offset,
2655 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 /* the just-created orelse handled the last elif */
2657 n_elif--;
2658 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659
Thomas Wouters89f507f2006-12-13 04:49:30 +00002660 for (i = 0; i < n_elif; i++) {
2661 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002662 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2663 if (!newobj)
2664 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002666 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002669 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671
Thomas Wouters89f507f2006-12-13 04:49:30 +00002672 asdl_seq_SET(newobj, 0,
2673 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002674 LINENO(CHILD(n, off)),
2675 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 orelse = newobj;
2677 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002678 expression = ast_for_expr(c, CHILD(n, 1));
2679 if (!expression)
2680 return NULL;
2681 suite_seq = ast_for_suite(c, CHILD(n, 3));
2682 if (!suite_seq)
2683 return NULL;
2684 return If(expression, suite_seq, orelse,
2685 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002687
2688 PyErr_Format(PyExc_SystemError,
2689 "unexpected token in 'if' statement: %s", s);
2690 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691}
2692
2693static stmt_ty
2694ast_for_while_stmt(struct compiling *c, const node *n)
2695{
2696 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2697 REQ(n, while_stmt);
2698
2699 if (NCH(n) == 4) {
2700 expr_ty expression;
2701 asdl_seq *suite_seq;
2702
2703 expression = ast_for_expr(c, CHILD(n, 1));
2704 if (!expression)
2705 return NULL;
2706 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002707 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 }
2711 else if (NCH(n) == 7) {
2712 expr_ty expression;
2713 asdl_seq *seq1, *seq2;
2714
2715 expression = ast_for_expr(c, CHILD(n, 1));
2716 if (!expression)
2717 return NULL;
2718 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002719 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 return NULL;
2721 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002722 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 return NULL;
2724
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002727
2728 PyErr_Format(PyExc_SystemError,
2729 "wrong number of tokens for 'while' statement: %d",
2730 NCH(n));
2731 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732}
2733
2734static stmt_ty
2735ast_for_for_stmt(struct compiling *c, const node *n)
2736{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002737 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 expr_ty expression;
2739 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002740 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2742 REQ(n, for_stmt);
2743
2744 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002745 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 if (!seq)
2747 return NULL;
2748 }
2749
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002750 node_target = CHILD(n, 1);
2751 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002752 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002754 /* Check the # of children rather than the length of _target, since
2755 for x, in ... has 1 element in _target, but still requires a Tuple. */
2756 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002757 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002759 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002761 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002762 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 return NULL;
2764 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002765 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 return NULL;
2767
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002768 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2769 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770}
2771
2772static excepthandler_ty
2773ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2774{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002775 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776 REQ(exc, except_clause);
2777 REQ(body, suite);
2778
2779 if (NCH(exc) == 1) {
2780 asdl_seq *suite_seq = ast_for_suite(c, body);
2781 if (!suite_seq)
2782 return NULL;
2783
Thomas Wouters89f507f2006-12-13 04:49:30 +00002784 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002785 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 }
2787 else if (NCH(exc) == 2) {
2788 expr_ty expression;
2789 asdl_seq *suite_seq;
2790
2791 expression = ast_for_expr(c, CHILD(exc, 1));
2792 if (!expression)
2793 return NULL;
2794 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002795 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 return NULL;
2797
Thomas Wouters89f507f2006-12-13 04:49:30 +00002798 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002799 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 }
2801 else if (NCH(exc) == 4) {
2802 asdl_seq *suite_seq;
2803 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002804 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002805 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002808 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 return NULL;
2810 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002811 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return NULL;
2813
Thomas Wouters89f507f2006-12-13 04:49:30 +00002814 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002815 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002817
2818 PyErr_Format(PyExc_SystemError,
2819 "wrong number of children for 'except' clause: %d",
2820 NCH(exc));
2821 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822}
2823
2824static stmt_ty
2825ast_for_try_stmt(struct compiling *c, const node *n)
2826{
Neal Norwitzf599f422005-12-17 21:33:47 +00002827 const int nch = NCH(n);
2828 int n_except = (nch - 3)/3;
2829 asdl_seq *body, *orelse = NULL, *finally = NULL;
2830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 REQ(n, try_stmt);
2832
Neal Norwitzf599f422005-12-17 21:33:47 +00002833 body = ast_for_suite(c, CHILD(n, 2));
2834 if (body == NULL)
2835 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836
Neal Norwitzf599f422005-12-17 21:33:47 +00002837 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2838 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2839 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2840 /* we can assume it's an "else",
2841 because nch >= 9 for try-else-finally and
2842 it would otherwise have a type of except_clause */
2843 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2844 if (orelse == NULL)
2845 return NULL;
2846 n_except--;
2847 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848
Neal Norwitzf599f422005-12-17 21:33:47 +00002849 finally = ast_for_suite(c, CHILD(n, nch - 1));
2850 if (finally == NULL)
2851 return NULL;
2852 n_except--;
2853 }
2854 else {
2855 /* we can assume it's an "else",
2856 otherwise it would have a type of except_clause */
2857 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2858 if (orelse == NULL)
2859 return NULL;
2860 n_except--;
2861 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002863 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002864 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 return NULL;
2866 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002867
2868 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002869 int i;
2870 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002871 /* process except statements to create a try ... except */
2872 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2873 if (handlers == NULL)
2874 return NULL;
2875
2876 for (i = 0; i < n_except; i++) {
2877 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2878 CHILD(n, 5 + i * 3));
2879 if (!e)
2880 return NULL;
2881 asdl_seq_SET(handlers, i, e);
2882 }
2883
Thomas Wouters89f507f2006-12-13 04:49:30 +00002884 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002885 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002886 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002887 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002888
2889 /* if a 'finally' is present too, we nest the TryExcept within a
2890 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002891 body = asdl_seq_new(1, c->c_arena);
2892 if (body == NULL)
2893 return NULL;
2894 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002895 }
2896
2897 /* must be a try ... finally (except clauses are in body, if any exist) */
2898 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002899 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900}
2901
Guido van Rossumc2e20742006-02-27 22:32:47 +00002902static expr_ty
2903ast_for_with_var(struct compiling *c, const node *n)
2904{
2905 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002906 return ast_for_expr(c, CHILD(n, 1));
2907}
2908
2909/* with_stmt: 'with' test [ with_var ] ':' suite */
2910static stmt_ty
2911ast_for_with_stmt(struct compiling *c, const node *n)
2912{
2913 expr_ty context_expr, optional_vars = NULL;
2914 int suite_index = 3; /* skip 'with', test, and ':' */
2915 asdl_seq *suite_seq;
2916
2917 assert(TYPE(n) == with_stmt);
2918 context_expr = ast_for_expr(c, CHILD(n, 1));
2919 if (TYPE(CHILD(n, 2)) == with_var) {
2920 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2921
2922 if (!optional_vars) {
2923 return NULL;
2924 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002925 if (!set_context(optional_vars, Store, n)) {
2926 return NULL;
2927 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002928 suite_index = 4;
2929 }
2930
2931 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2932 if (!suite_seq) {
2933 return NULL;
2934 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002935 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002937}
2938
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002940ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002942 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2943 asdl_seq *s;
2944 expr_ty call, dummy;
2945
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946 REQ(n, classdef);
2947
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002948 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 s = ast_for_suite(c, CHILD(n, 3));
2950 if (!s)
2951 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002952 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002953 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002955
2956 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002957 s = ast_for_suite(c, CHILD(n,5));
2958 if (!s)
2959 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002960 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002961 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 }
2963
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002964 /* class NAME '(' arglist ')' ':' suite */
2965 /* build up a fake Call node so we can extract its pieces */
2966 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2967 call = ast_for_call(c, CHILD(n, 3), dummy);
2968 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002971 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002973
2974 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2975 call->v.Call.args, call->v.Call.keywords,
2976 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002977 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978}
2979
2980static stmt_ty
2981ast_for_stmt(struct compiling *c, const node *n)
2982{
2983 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 assert(NCH(n) == 1);
2985 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 }
2987 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002988 assert(num_stmts(n) == 1);
2989 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 }
2991 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002992 REQ(n, small_stmt);
2993 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002994 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2995 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002996 */
2997 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998 case expr_stmt:
2999 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 case del_stmt:
3001 return ast_for_del_stmt(c, n);
3002 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003003 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 case flow_stmt:
3005 return ast_for_flow_stmt(c, n);
3006 case import_stmt:
3007 return ast_for_import_stmt(c, n);
3008 case global_stmt:
3009 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003010 case nonlocal_stmt:
3011 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012 case assert_stmt:
3013 return ast_for_assert_stmt(c, n);
3014 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003015 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3017 TYPE(n), NCH(n));
3018 return NULL;
3019 }
3020 }
3021 else {
3022 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003023 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003024 */
3025 node *ch = CHILD(n, 0);
3026 REQ(n, compound_stmt);
3027 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028 case if_stmt:
3029 return ast_for_if_stmt(c, ch);
3030 case while_stmt:
3031 return ast_for_while_stmt(c, ch);
3032 case for_stmt:
3033 return ast_for_for_stmt(c, ch);
3034 case try_stmt:
3035 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003036 case with_stmt:
3037 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003039 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003041 return ast_for_classdef(c, ch, NULL);
3042 case decorated:
3043 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003045 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3047 TYPE(n), NCH(n));
3048 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003049 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050 }
3051}
3052
3053static PyObject *
3054parsenumber(const char *s)
3055{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003056 const char *end;
3057 long x;
3058 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003060 Py_complex c;
3061 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062#endif
3063
Guido van Rossumd8faa362007-04-27 19:54:29 +00003064 errno = 0;
3065 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003067 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003069 if (s[0] == '0') {
3070 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3071 if (x < 0 && errno == 0) {
3072 return PyLong_FromString((char *)s,
3073 (char **)0,
3074 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003076 }
3077 else
3078 x = PyOS_strtol((char *)s, (char **)&end, 0);
3079 if (*end == '\0') {
3080 if (errno != 0)
3081 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003082 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003083 }
3084 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003086 if (imflag) {
3087 c.real = 0.;
3088 PyFPE_START_PROTECT("atof", return 0)
3089 c.imag = PyOS_ascii_atof(s);
3090 PyFPE_END_PROTECT(c)
3091 return PyComplex_FromCComplex(c);
3092 }
3093 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003095 {
3096 PyFPE_START_PROTECT("atof", return 0)
3097 dx = PyOS_ascii_atof(s);
3098 PyFPE_END_PROTECT(dx)
3099 return PyFloat_FromDouble(dx);
3100 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101}
3102
3103static PyObject *
3104decode_utf8(const char **sPtr, const char *end, char* encoding)
3105{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003106 PyObject *u, *v;
3107 char *s, *t;
3108 t = s = (char *)*sPtr;
3109 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3110 while (s < end && (*s & 0x80)) s++;
3111 *sPtr = s;
3112 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3113 if (u == NULL)
3114 return NULL;
3115 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3116 Py_DECREF(u);
3117 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118}
3119
3120static PyObject *
3121decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3122{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003123 PyObject *v, *u;
3124 char *buf;
3125 char *p;
3126 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003127
Guido van Rossumd8faa362007-04-27 19:54:29 +00003128 if (encoding == NULL) {
3129 buf = (char *)s;
3130 u = NULL;
3131 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3132 buf = (char *)s;
3133 u = NULL;
3134 } else {
3135 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3136 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3137 if (u == NULL)
3138 return NULL;
3139 p = buf = PyString_AsString(u);
3140 end = s + len;
3141 while (s < end) {
3142 if (*s == '\\') {
3143 *p++ = *s++;
3144 if (*s & 0x80) {
3145 strcpy(p, "u005c");
3146 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003147 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003148 }
3149 if (*s & 0x80) { /* XXX inefficient */
3150 PyObject *w;
3151 char *r;
3152 Py_ssize_t rn, i;
3153 w = decode_utf8(&s, end, "utf-16-be");
3154 if (w == NULL) {
3155 Py_DECREF(u);
3156 return NULL;
3157 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00003158 r = PyString_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003159 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003160 assert(rn % 2 == 0);
3161 for (i = 0; i < rn; i += 2) {
3162 sprintf(p, "\\u%02x%02x",
3163 r[i + 0] & 0xFF,
3164 r[i + 1] & 0xFF);
3165 p += 6;
3166 }
3167 Py_DECREF(w);
3168 } else {
3169 *p++ = *s++;
3170 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003171 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 len = p - buf;
3173 s = buf;
3174 }
3175 if (rawmode)
3176 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3177 else
3178 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3179 Py_XDECREF(u);
3180 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181}
3182
3183/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003184 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185 * parsestr parses it, and returns the decoded Python string object.
3186 */
3187static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003188parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 size_t len;
3191 const char *s = STR(n);
3192 int quote = Py_CHARMASK(*s);
3193 int rawmode = 0;
3194 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195
Guido van Rossum98297ee2007-11-06 21:34:58 +00003196 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003197 if (quote == 'b' || quote == 'B') {
3198 quote = *++s;
3199 *bytesmode = 1;
3200 }
3201 if (quote == 'r' || quote == 'R') {
3202 quote = *++s;
3203 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 }
3206 if (quote != '\'' && quote != '\"') {
3207 PyErr_BadInternalCall();
3208 return NULL;
3209 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 s++;
3211 len = strlen(s);
3212 if (len > INT_MAX) {
3213 PyErr_SetString(PyExc_OverflowError,
3214 "string to parse is too long");
3215 return NULL;
3216 }
3217 if (s[--len] != quote) {
3218 PyErr_BadInternalCall();
3219 return NULL;
3220 }
3221 if (len >= 4 && s[0] == quote && s[1] == quote) {
3222 s += 2;
3223 len -= 2;
3224 if (s[--len] != quote || s[--len] != quote) {
3225 PyErr_BadInternalCall();
3226 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003227 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228 }
Guido van Rossum29fd7122007-11-12 01:13:56 +00003229 if (!*bytesmode && !rawmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230 return decode_unicode(s, len, rawmode, encoding);
3231 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 if (*bytesmode) {
3233 /* Disallow non-ascii characters (but not escapes) */
3234 const char *c;
3235 for (c = s; *c; c++) {
3236 if (Py_CHARMASK(*c) >= 0x80) {
3237 ast_error(n, "bytes can only contain ASCII "
3238 "literal characters.");
3239 return NULL;
3240 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003241 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 }
3243 need_encoding = (!*bytesmode && encoding != NULL &&
3244 strcmp(encoding, "utf-8") != 0 &&
3245 strcmp(encoding, "iso-8859-1") != 0);
3246 if (rawmode || strchr(s, '\\') == NULL) {
3247 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003248 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003249 if (u == NULL || !*bytesmode)
3250 return u;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003251 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3252 Py_DECREF(u);
3253 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003254 } else if (*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003255 return PyString_FromStringAndSize(s, len);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003256 } else if (strcmp(encoding, "utf-8") == 0) {
3257 return PyUnicode_FromStringAndSize(s, len);
3258 } else {
3259 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003260 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003261 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262
Guido van Rossumbdde0112007-05-11 16:26:27 +00003263 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003264 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265}
3266
Guido van Rossum29fd7122007-11-12 01:13:56 +00003267/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 * compile-time literal catenation, calling parsestr() on each piece, and
3269 * pasting the intermediate results together.
3270 */
3271static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003272parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003274 PyObject *v;
3275 int i;
3276 REQ(CHILD(n, 0), STRING);
3277 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3278 if (v != NULL) {
3279 /* String literal concatenation */
3280 for (i = 1; i < NCH(n); i++) {
3281 PyObject *s;
3282 int subbm = 0;
3283 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3284 if (s == NULL)
3285 goto onError;
3286 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003287 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003288 goto onError;
3289 }
3290 if (PyString_Check(v) && PyString_Check(s)) {
3291 PyString_ConcatAndDel(&v, s);
3292 if (v == NULL)
3293 goto onError;
3294 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003295 else {
3296 PyObject *temp = PyUnicode_Concat(v, s);
3297 Py_DECREF(s);
3298 Py_DECREF(v);
3299 v = temp;
3300 if (v == NULL)
3301 goto onError;
3302 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003304 }
3305 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306
Guido van Rossumd8faa362007-04-27 19:54:29 +00003307 onError:
3308 Py_XDECREF(v);
3309 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310}