blob: a415495a7027fc9bd5805b5276e8cdae813f8d5e [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 */
Christian Heimes3c608332008-03-26 22:01:37 +000021 int c_future_unicode; /* __future__ unicode literals flag */
Neal Norwitzadb69fc2005-12-17 20:54:49 +000022 PyArena *c_arena; /* arena for allocating memeory */
Christian Heimesffcd1e12007-11-24 01:36:02 +000023 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024};
25
26static asdl_seq *seq_for_testlist(struct compiling *, const node *);
27static expr_ty ast_for_expr(struct compiling *, const node *);
28static stmt_ty ast_for_stmt(struct compiling *, const node *);
29static asdl_seq *ast_for_suite(struct compiling *, const node *);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000030static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
31 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000032static expr_ty ast_for_testlist(struct compiling *, const node *);
Christian Heimes5224d282008-02-23 15:01:05 +000033static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000034static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000035
36/* Note different signature for ast_for_call */
37static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
38
Benjamin Peterson2b30ea02008-05-03 15:56:42 +000039static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes3c608332008-03-26 22:01:37 +000040static PyObject *parsestr(struct compiling *, const char *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041static PyObject *parsestrplus(struct compiling *, const node *n);
42
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#ifndef LINENO
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000044#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#endif
46
Neal Norwitzadb69fc2005-12-17 20:54:49 +000047static identifier
48new_identifier(const char* n, PyArena *arena) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000049 PyObject* id = PyString_InternFromString(n);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +000050 if (id != NULL)
51 PyArena_AddPyObject(arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000052 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000053}
54
Neal Norwitzadb69fc2005-12-17 20:54:49 +000055#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056
57/* This routine provides an invalid object for the syntax error.
58 The outermost routine must unpack this error and create the
59 proper object. We do this so that we don't have to pass
60 the filename to everything function.
61
62 XXX Maybe we should just pass the filename...
63*/
64
65static int
66ast_error(const node *n, const char *errstr)
67{
68 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
69 if (!u)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000070 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000071 PyErr_SetObject(PyExc_SyntaxError, u);
72 Py_DECREF(u);
73 return 0;
74}
75
76static void
77ast_error_finish(const char *filename)
78{
79 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000080 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82 assert(PyErr_Occurred());
83 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000084 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085
86 PyErr_Fetch(&type, &value, &tback);
87 errstr = PyTuple_GetItem(value, 0);
88 if (!errstr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000089 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000090 Py_INCREF(errstr);
91 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000092 if (lineno == -1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000093 Py_DECREF(errstr);
94 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000095 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 Py_DECREF(value);
97
98 loc = PyErr_ProgramText(filename, lineno);
99 if (!loc) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000100 Py_INCREF(Py_None);
101 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000102 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000103 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000105 if (!tmp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000106 Py_DECREF(errstr);
107 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000108 }
Georg Brandl7784f122006-05-26 20:04:44 +0000109 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110 Py_DECREF(errstr);
111 Py_DECREF(tmp);
112 if (!value)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000113 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114 PyErr_Restore(type, value, tback);
115}
116
Benjamin Petersoncbd78132008-06-08 15:45:23 +0000117static int
118ast_warn(struct compiling *c, const node *n, char *msg)
119{
120 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, LINENO(n),
121 NULL, NULL) < 0) {
122 /* if -Werr, change it to a SyntaxError */
123 if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning))
124 ast_error(n, msg);
125 return 0;
126 }
127 return 1;
128}
129
Benjamin Petersond5efd202008-06-08 22:52:37 +0000130static int
131forbidden_check(struct compiling *c, const node *n, const char *x)
132{
133 if (!strcmp(x, "None"))
Benjamin Peterson2c98faa2008-11-08 18:38:54 +0000134 return ast_error(n, "cannot assign to None");
135 if (!strcmp(x, "__debug__"))
136 return ast_error(n, "cannot assign to __debug__");
Benjamin Peterson399b1fe2008-10-25 02:53:28 +0000137 if (Py_Py3kWarningFlag) {
138 if (!(strcmp(x, "True") && strcmp(x, "False")) &&
139 !ast_warn(c, n, "assignment to True or False is forbidden in 3.x"))
140 return 0;
141 if (!strcmp(x, "nonlocal") &&
142 !ast_warn(c, n, "nonlocal is a keyword in 3.x"))
143 return 0;
144 }
Benjamin Petersond5efd202008-06-08 22:52:37 +0000145 return 1;
146}
147
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000148/* num_stmts() returns number of contained statements.
149
150 Use this routine to determine how big a sequence is needed for
151 the statements in a parse tree. Its raison d'etre is this bit of
152 grammar:
153
154 stmt: simple_stmt | compound_stmt
155 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
156
157 A simple_stmt can contain multiple small_stmt elements joined
158 by semicolons. If the arg is a simple_stmt, the number of
159 small_stmt elements is returned.
160*/
161
162static int
163num_stmts(const node *n)
164{
165 int i, l;
166 node *ch;
167
168 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000169 case single_input:
170 if (TYPE(CHILD(n, 0)) == NEWLINE)
171 return 0;
172 else
173 return num_stmts(CHILD(n, 0));
174 case file_input:
175 l = 0;
176 for (i = 0; i < NCH(n); i++) {
177 ch = CHILD(n, i);
178 if (TYPE(ch) == stmt)
179 l += num_stmts(ch);
180 }
181 return l;
182 case stmt:
183 return num_stmts(CHILD(n, 0));
184 case compound_stmt:
185 return 1;
186 case simple_stmt:
187 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
188 case suite:
189 if (NCH(n) == 1)
190 return num_stmts(CHILD(n, 0));
191 else {
192 l = 0;
193 for (i = 2; i < (NCH(n) - 1); i++)
194 l += num_stmts(CHILD(n, i));
195 return l;
196 }
197 default: {
198 char buf[128];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000199
Amaury Forgeot d'Arc59ce0422009-01-17 20:18:59 +0000200 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000201 TYPE(n), NCH(n));
202 Py_FatalError(buf);
203 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000204 }
205 assert(0);
206 return 0;
207}
208
209/* Transform the CST rooted at node * to the appropriate AST
210*/
211
212mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000213PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000214 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000216 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000217 asdl_seq *stmts = NULL;
218 stmt_ty s;
219 node *ch;
220 struct compiling c;
221
222 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000223 c.c_encoding = "utf-8";
224 if (TYPE(n) == encoding_decl) {
225 ast_error(n, "encoding declaration in Unicode string");
226 goto error;
227 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228 } else if (TYPE(n) == encoding_decl) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000229 c.c_encoding = STR(n);
230 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 } else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000232 c.c_encoding = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 }
Christian Heimes3c608332008-03-26 22:01:37 +0000234 c.c_future_unicode = flags && flags->cf_flags & CO_FUTURE_UNICODE_LITERALS;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 c.c_arena = arena;
Christian Heimesffcd1e12007-11-24 01:36:02 +0000236 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000237
Jeremy Hyltona8293132006-02-28 17:58:27 +0000238 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000240 case file_input:
241 stmts = asdl_seq_new(num_stmts(n), arena);
242 if (!stmts)
243 return NULL;
244 for (i = 0; i < NCH(n) - 1; i++) {
245 ch = CHILD(n, i);
246 if (TYPE(ch) == NEWLINE)
247 continue;
248 REQ(ch, stmt);
249 num = num_stmts(ch);
250 if (num == 1) {
251 s = ast_for_stmt(&c, ch);
252 if (!s)
253 goto error;
254 asdl_seq_SET(stmts, k++, s);
255 }
256 else {
257 ch = CHILD(ch, 0);
258 REQ(ch, simple_stmt);
259 for (j = 0; j < num; j++) {
260 s = ast_for_stmt(&c, CHILD(ch, j * 2));
261 if (!s)
262 goto error;
263 asdl_seq_SET(stmts, k++, s);
264 }
265 }
266 }
267 return Module(stmts, arena);
268 case eval_input: {
269 expr_ty testlist_ast;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000271 /* XXX Why not gen_for here? */
272 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
273 if (!testlist_ast)
274 goto error;
275 return Expression(testlist_ast, arena);
276 }
277 case single_input:
278 if (TYPE(CHILD(n, 0)) == NEWLINE) {
279 stmts = asdl_seq_new(1, arena);
280 if (!stmts)
281 goto error;
282 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
283 arena));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000284 if (!asdl_seq_GET(stmts, 0))
285 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000286 return Interactive(stmts, arena);
287 }
288 else {
289 n = CHILD(n, 0);
290 num = num_stmts(n);
291 stmts = asdl_seq_new(num, arena);
292 if (!stmts)
293 goto error;
294 if (num == 1) {
295 s = ast_for_stmt(&c, n);
296 if (!s)
297 goto error;
298 asdl_seq_SET(stmts, 0, s);
299 }
300 else {
301 /* Only a simple_stmt can contain multiple statements. */
302 REQ(n, simple_stmt);
303 for (i = 0; i < NCH(n); i += 2) {
304 if (TYPE(CHILD(n, i)) == NEWLINE)
305 break;
306 s = ast_for_stmt(&c, CHILD(n, i));
307 if (!s)
308 goto error;
309 asdl_seq_SET(stmts, i / 2, s);
310 }
311 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000313 return Interactive(stmts, arena);
314 }
315 default:
Georg Brandlb8ae3d02007-05-02 20:02:29 +0000316 PyErr_Format(PyExc_SystemError,
317 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000318 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319 }
320 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321 ast_error_finish(filename);
322 return NULL;
323}
324
325/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
326*/
327
328static operator_ty
329get_operator(const node *n)
330{
331 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000332 case VBAR:
333 return BitOr;
334 case CIRCUMFLEX:
335 return BitXor;
336 case AMPER:
337 return BitAnd;
338 case LEFTSHIFT:
339 return LShift;
340 case RIGHTSHIFT:
341 return RShift;
342 case PLUS:
343 return Add;
344 case MINUS:
345 return Sub;
346 case STAR:
347 return Mult;
348 case SLASH:
349 return Div;
350 case DOUBLESLASH:
351 return FloorDiv;
352 case PERCENT:
353 return Mod;
354 default:
355 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356 }
357}
358
Jeremy Hyltona8293132006-02-28 17:58:27 +0000359/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000360
361 Only sets context for expr kinds that "can appear in assignment context"
362 (according to ../Parser/Python.asdl). For other expr kinds, it sets
363 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000364*/
365
366static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000367set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368{
369 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000370 /* If a particular expression type can't be used for assign / delete,
371 set expr_name to its name and an error message will be generated.
372 */
373 const char* expr_name = NULL;
374
375 /* The ast defines augmented store and load contexts, but the
376 implementation here doesn't actually use them. The code may be
377 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000378 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000379 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000380 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000381 */
382 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383
384 switch (e->kind) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000385 case Attribute_kind:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000386 if (ctx == Store && !forbidden_check(c, n,
387 PyBytes_AS_STRING(e->v.Attribute.attr)))
388 return 0;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000389 e->v.Attribute.ctx = ctx;
390 break;
391 case Subscript_kind:
392 e->v.Subscript.ctx = ctx;
393 break;
394 case Name_kind:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000395 if (ctx == Store && !forbidden_check(c, n,
396 PyBytes_AS_STRING(e->v.Name.id)))
397 return 0;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000398 e->v.Name.ctx = ctx;
399 break;
400 case List_kind:
401 e->v.List.ctx = ctx;
402 s = e->v.List.elts;
403 break;
404 case Tuple_kind:
405 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
406 return ast_error(n, "can't assign to ()");
407 e->v.Tuple.ctx = ctx;
408 s = e->v.Tuple.elts;
409 break;
410 case Lambda_kind:
411 expr_name = "lambda";
412 break;
413 case Call_kind:
414 expr_name = "function call";
415 break;
416 case BoolOp_kind:
417 case BinOp_kind:
418 case UnaryOp_kind:
419 expr_name = "operator";
420 break;
421 case GeneratorExp_kind:
422 expr_name = "generator expression";
423 break;
424 case Yield_kind:
425 expr_name = "yield expression";
426 break;
427 case ListComp_kind:
428 expr_name = "list comprehension";
429 break;
430 case Dict_kind:
431 case Num_kind:
432 case Str_kind:
433 expr_name = "literal";
434 break;
435 case Compare_kind:
436 expr_name = "comparison";
437 break;
438 case Repr_kind:
439 expr_name = "repr";
440 break;
441 case IfExp_kind:
442 expr_name = "conditional expression";
443 break;
444 default:
445 PyErr_Format(PyExc_SystemError,
446 "unexpected expression in assignment %d (line %d)",
447 e->kind, e->lineno);
448 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 /* Check for error string set by switch */
451 if (expr_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000452 char buf[300];
453 PyOS_snprintf(buf, sizeof(buf),
454 "can't %s %s",
455 ctx == Store ? "assign to" : "delete",
456 expr_name);
457 return ast_error(n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 }
459
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000461 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000462 */
463 if (s) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000464 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000465
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000466 for (i = 0; i < asdl_seq_LEN(s); i++) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000467 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000468 return 0;
469 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 }
471 return 1;
472}
473
474static operator_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000475ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000476{
477 REQ(n, augassign);
478 n = CHILD(n, 0);
479 switch (STR(n)[0]) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000480 case '+':
481 return Add;
482 case '-':
483 return Sub;
484 case '/':
485 if (STR(n)[1] == '/')
486 return FloorDiv;
487 else
488 return Div;
489 case '%':
490 return Mod;
491 case '<':
492 return LShift;
493 case '>':
494 return RShift;
495 case '&':
496 return BitAnd;
497 case '^':
498 return BitXor;
499 case '|':
500 return BitOr;
501 case '*':
502 if (STR(n)[1] == '*')
503 return Pow;
504 else
505 return Mult;
506 default:
507 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
508 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510}
511
512static cmpop_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000513ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514{
515 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000516 |'is' 'not'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000517 */
518 REQ(n, comp_op);
519 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000520 n = CHILD(n, 0);
521 switch (TYPE(n)) {
522 case LESS:
523 return Lt;
524 case GREATER:
525 return Gt;
526 case EQEQUAL: /* == */
527 return Eq;
528 case LESSEQUAL:
529 return LtE;
530 case GREATEREQUAL:
531 return GtE;
532 case NOTEQUAL:
533 return NotEq;
534 case NAME:
535 if (strcmp(STR(n), "in") == 0)
536 return In;
537 if (strcmp(STR(n), "is") == 0)
538 return Is;
539 default:
540 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
541 STR(n));
542 return (cmpop_ty)0;
543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 }
545 else if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000546 /* handle "not in" and "is not" */
547 switch (TYPE(CHILD(n, 0))) {
548 case NAME:
549 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
550 return NotIn;
551 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
552 return IsNot;
553 default:
554 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
555 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
556 return (cmpop_ty)0;
557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558 }
Neal Norwitz79792652005-11-14 04:25:03 +0000559 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000560 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000561 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562}
563
564static asdl_seq *
565seq_for_testlist(struct compiling *c, const node *n)
566{
567 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000568 asdl_seq *seq;
569 expr_ty expression;
570 int i;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000571 assert(TYPE(n) == testlist ||
572 TYPE(n) == listmaker ||
573 TYPE(n) == testlist_gexp ||
574 TYPE(n) == testlist_safe ||
575 TYPE(n) == testlist1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000577 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000579 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580
581 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000582 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000584 expression = ast_for_expr(c, CHILD(n, i));
585 if (!expression)
586 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000588 assert(i / 2 < seq->size);
589 asdl_seq_SET(seq, i / 2, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590 }
591 return seq;
592}
593
594static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000595compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000596{
597 int i, len = (NCH(n) + 1) / 2;
598 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000599 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000601 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
Neal Norwitz3a230172006-09-22 08:18:10 +0000603 /* fpdef: NAME | '(' fplist ')'
604 fplist: fpdef (',' fpdef)* [',']
605 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 for (i = 0; i < len; i++) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000608 PyObject *arg_id;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000609 const node *fpdef_node = CHILD(n, 2*i);
610 const node *child;
611 expr_ty arg;
Neal Norwitz3a230172006-09-22 08:18:10 +0000612set_name:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000613 /* fpdef_node is either a NAME or an fplist */
614 child = CHILD(fpdef_node, 0);
615 if (TYPE(child) == NAME) {
Benjamin Petersond5efd202008-06-08 22:52:37 +0000616 if (!forbidden_check(c, n, STR(child)))
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000617 return NULL;
618 arg_id = NEW_IDENTIFIER(child);
619 if (!arg_id)
620 return NULL;
621 arg = Name(arg_id, Store, LINENO(child), child->n_col_offset,
622 c->c_arena);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000623 }
624 else {
625 assert(TYPE(fpdef_node) == fpdef);
626 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
627 child = CHILD(fpdef_node, 1);
628 assert(TYPE(child) == fplist);
629 /* NCH == 1 means we have (x), we need to elide the extra parens */
630 if (NCH(child) == 1) {
631 fpdef_node = CHILD(child, 0);
632 assert(TYPE(fpdef_node) == fpdef);
633 goto set_name;
634 }
635 arg = compiler_complex_args(c, child);
636 }
637 asdl_seq_SET(args, i, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638 }
639
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000640 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000641 if (!set_context(c, result, Store, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000642 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000643 return result;
644}
645
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000646
Jeremy Hyltona8293132006-02-28 17:58:27 +0000647/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000648
649static arguments_ty
650ast_for_arguments(struct compiling *c, const node *n)
651{
652 /* parameters: '(' [varargslist] ')'
653 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000654 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000655 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000656 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657 asdl_seq *args, *defaults;
658 identifier vararg = NULL, kwarg = NULL;
659 node *ch;
660
661 if (TYPE(n) == parameters) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000662 if (NCH(n) == 2) /* () as argument list */
663 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
664 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665 }
666 REQ(n, varargslist);
667
668 /* first count the number of normal args & defaults */
669 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000670 ch = CHILD(n, i);
671 if (TYPE(ch) == fpdef)
672 n_args++;
673 if (TYPE(ch) == EQUAL)
674 n_defaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000675 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000676 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 if (!args && n_args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000678 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000679 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680 if (!defaults && n_defaults)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000681 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000682
683 /* fpdef: NAME | '(' fplist ')'
684 fplist: fpdef (',' fpdef)* [',']
685 */
686 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000687 j = 0; /* index for defaults */
688 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689 while (i < NCH(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000690 ch = CHILD(n, i);
691 switch (TYPE(ch)) {
692 case fpdef:
693 handle_fpdef:
694 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
695 anything other than EQUAL or a comma? */
696 /* XXX Should NCH(n) check be made a separate check? */
697 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
698 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
699 if (!expression)
700 goto error;
701 assert(defaults != NULL);
702 asdl_seq_SET(defaults, j++, expression);
703 i += 2;
704 found_default = 1;
705 }
706 else if (found_default) {
707 ast_error(n,
708 "non-default argument follows default argument");
709 goto error;
710 }
711 if (NCH(ch) == 3) {
712 ch = CHILD(ch, 1);
713 /* def foo((x)): is not complex, special case. */
714 if (NCH(ch) != 1) {
715 /* We have complex arguments, setup for unpacking. */
Benjamin Petersonf4fcdb62008-06-08 23:00:00 +0000716 if (Py_Py3kWarningFlag && !ast_warn(c, ch,
717 "tuple parameter unpacking has been removed in 3.x"))
718 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000719 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000720 if (!asdl_seq_GET(args, k-1))
721 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000722 } else {
723 /* def foo((x)): setup for checking NAME below. */
724 /* Loop because there can be many parens and tuple
725 unpacking mixed in. */
726 ch = CHILD(ch, 0);
727 assert(TYPE(ch) == fpdef);
728 goto handle_fpdef;
729 }
730 }
731 if (TYPE(CHILD(ch, 0)) == NAME) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000732 PyObject *id;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000733 expr_ty name;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000734 if (!forbidden_check(c, n, STR(CHILD(ch, 0))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000735 goto error;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000736 id = NEW_IDENTIFIER(CHILD(ch, 0));
737 if (!id)
738 goto error;
739 name = Name(id, Param, LINENO(ch), ch->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000740 c->c_arena);
741 if (!name)
742 goto error;
743 asdl_seq_SET(args, k++, name);
744
745 }
746 i += 2; /* the name and the comma */
747 break;
748 case STAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000749 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000750 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000751 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000752 if (!vararg)
753 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000754 i += 3;
755 break;
756 case DOUBLESTAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000757 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000758 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000759 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
Benjamin Peterson9e6310d2008-11-25 03:43:14 +0000760 if (!kwarg)
761 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000762 i += 3;
763 break;
764 default:
765 PyErr_Format(PyExc_SystemError,
766 "unexpected node in varargslist: %d @ %d",
767 TYPE(ch), i);
768 goto error;
769 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 }
771
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000772 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773
774 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000775 Py_XDECREF(vararg);
776 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 return NULL;
778}
779
780static expr_ty
781ast_for_dotted_name(struct compiling *c, const node *n)
782{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000783 expr_ty e;
784 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000785 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 int i;
787
788 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000789
790 lineno = LINENO(n);
791 col_offset = n->n_col_offset;
792
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 id = NEW_IDENTIFIER(CHILD(n, 0));
794 if (!id)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000795 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000796 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000797 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000798 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799
800 for (i = 2; i < NCH(n); i+=2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000801 id = NEW_IDENTIFIER(CHILD(n, i));
802 if (!id)
803 return NULL;
804 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
805 if (!e)
806 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807 }
808
809 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810}
811
812static expr_ty
813ast_for_decorator(struct compiling *c, const node *n)
814{
815 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
816 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000817 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818
819 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000820 REQ(CHILD(n, 0), AT);
821 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822
823 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
824 if (!name_expr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000825 return NULL;
826
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 if (NCH(n) == 3) { /* No arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000828 d = name_expr;
829 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 }
831 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000832 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
833 n->n_col_offset, c->c_arena);
834 if (!d)
835 return NULL;
836 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 }
838 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000839 d = ast_for_call(c, CHILD(n, 3), name_expr);
840 if (!d)
841 return NULL;
842 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843 }
844
845 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846}
847
848static asdl_seq*
849ast_for_decorators(struct compiling *c, const node *n)
850{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000851 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000852 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 int i;
854
855 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000856 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857 if (!decorator_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000858 return NULL;
859
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000861 d = ast_for_decorator(c, CHILD(n, i));
862 if (!d)
863 return NULL;
864 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865 }
866 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867}
868
869static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +0000870ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871{
Christian Heimes5224d282008-02-23 15:01:05 +0000872 /* funcdef: 'def' NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000873 identifier name;
874 arguments_ty args;
875 asdl_seq *body;
Christian Heimes5224d282008-02-23 15:01:05 +0000876 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877
878 REQ(n, funcdef);
879
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 name = NEW_IDENTIFIER(CHILD(n, name_i));
881 if (!name)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000882 return NULL;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000883 else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000884 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885 args = ast_for_arguments(c, CHILD(n, name_i + 1));
886 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 body = ast_for_suite(c, CHILD(n, name_i + 3));
889 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000890 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000892 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000893 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894}
895
Christian Heimes5224d282008-02-23 15:01:05 +0000896static stmt_ty
897ast_for_decorated(struct compiling *c, const node *n)
898{
899 /* decorated: decorators (classdef | funcdef) */
900 stmt_ty thing = NULL;
901 asdl_seq *decorator_seq = NULL;
902
903 REQ(n, decorated);
904
905 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
906 if (!decorator_seq)
907 return NULL;
908
909 assert(TYPE(CHILD(n, 1)) == funcdef ||
910 TYPE(CHILD(n, 1)) == classdef);
911
912 if (TYPE(CHILD(n, 1)) == funcdef) {
913 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
914 } else if (TYPE(CHILD(n, 1)) == classdef) {
915 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
916 }
917 /* we count the decorators in when talking about the class' or
918 function's line number */
919 if (thing) {
920 thing->lineno = LINENO(n);
921 thing->col_offset = n->n_col_offset;
922 }
923 return thing;
924}
925
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926static expr_ty
927ast_for_lambdef(struct compiling *c, const node *n)
928{
929 /* lambdef: 'lambda' [varargslist] ':' test */
930 arguments_ty args;
931 expr_ty expression;
932
933 if (NCH(n) == 3) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000934 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
935 if (!args)
936 return NULL;
937 expression = ast_for_expr(c, CHILD(n, 2));
938 if (!expression)
939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 }
941 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000942 args = ast_for_arguments(c, CHILD(n, 1));
943 if (!args)
944 return NULL;
945 expression = ast_for_expr(c, CHILD(n, 3));
946 if (!expression)
947 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948 }
949
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000950 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951}
952
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000953static expr_ty
954ast_for_ifexpr(struct compiling *c, const node *n)
955{
956 /* test: or_test 'if' or_test 'else' test */
957 expr_ty expression, body, orelse;
958
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000959 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000960 body = ast_for_expr(c, CHILD(n, 0));
961 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000962 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000963 expression = ast_for_expr(c, CHILD(n, 2));
964 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000965 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000966 orelse = ast_for_expr(c, CHILD(n, 4));
967 if (!orelse)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000968 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000969 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000970 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000971}
972
Neal Norwitze4d4f002006-09-05 03:58:26 +0000973/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
974 so there is only a single version. Possibly for loops can also re-use
975 the code.
976*/
977
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978/* Count the number of 'for' loop in a list comprehension.
979
980 Helper for ast_for_listcomp().
981*/
982
983static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000984count_list_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985{
986 int n_fors = 0;
987 node *ch = CHILD(n, 1);
988
989 count_list_for:
990 n_fors++;
991 REQ(ch, list_for);
992 if (NCH(ch) == 5)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000993 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000995 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 count_list_iter:
997 REQ(ch, list_iter);
998 ch = CHILD(ch, 0);
999 if (TYPE(ch) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001000 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 else if (TYPE(ch) == list_if) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001002 if (NCH(ch) == 3) {
1003 ch = CHILD(ch, 2);
1004 goto count_list_iter;
1005 }
1006 else
1007 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001009
1010 /* Should never be reached */
1011 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
1012 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013}
1014
1015/* Count the number of 'if' statements in a list comprehension.
1016
1017 Helper for ast_for_listcomp().
1018*/
1019
1020static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001021count_list_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022{
1023 int n_ifs = 0;
1024
1025 count_list_iter:
1026 REQ(n, list_iter);
1027 if (TYPE(CHILD(n, 0)) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001028 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029 n = CHILD(n, 0);
1030 REQ(n, list_if);
1031 n_ifs++;
1032 if (NCH(n) == 2)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001033 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 n = CHILD(n, 2);
1035 goto count_list_iter;
1036}
1037
1038static expr_ty
1039ast_for_listcomp(struct compiling *c, const node *n)
1040{
1041 /* listmaker: test ( list_for | (',' test)* [','] )
1042 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1043 list_iter: list_for | list_if
1044 list_if: 'if' test [list_iter]
1045 testlist_safe: test [(',' test)+ [',']]
1046 */
1047 expr_ty elt;
1048 asdl_seq *listcomps;
1049 int i, n_fors;
1050 node *ch;
1051
1052 REQ(n, listmaker);
1053 assert(NCH(n) > 1);
1054
1055 elt = ast_for_expr(c, CHILD(n, 0));
1056 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001057 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001059 n_fors = count_list_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001061 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001062
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001063 listcomps = asdl_seq_new(n_fors, c->c_arena);
1064 if (!listcomps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001065 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001066
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067 ch = CHILD(n, 1);
1068 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001069 comprehension_ty lc;
1070 asdl_seq *t;
1071 expr_ty expression;
1072 node *for_ch;
1073
1074 REQ(ch, list_for);
1075
1076 for_ch = CHILD(ch, 1);
1077 t = ast_for_exprlist(c, for_ch, Store);
1078 if (!t)
1079 return NULL;
1080 expression = ast_for_testlist(c, CHILD(ch, 3));
1081 if (!expression)
1082 return NULL;
1083
1084 /* Check the # of children rather than the length of t, since
1085 [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1086 */
1087 if (NCH(for_ch) == 1)
1088 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
1089 c->c_arena);
1090 else
1091 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1092 c->c_arena),
1093 expression, NULL, c->c_arena);
1094 if (!lc)
1095 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001097 if (NCH(ch) == 5) {
1098 int j, n_ifs;
1099 asdl_seq *ifs;
1100 expr_ty list_for_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001102 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001103 n_ifs = count_list_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001104 if (n_ifs == -1)
1105 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001107 ifs = asdl_seq_new(n_ifs, c->c_arena);
1108 if (!ifs)
1109 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001111 for (j = 0; j < n_ifs; j++) {
1112 REQ(ch, list_iter);
1113 ch = CHILD(ch, 0);
1114 REQ(ch, list_if);
1115
1116 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1117 if (!list_for_expr)
1118 return NULL;
1119
1120 asdl_seq_SET(ifs, j, list_for_expr);
1121 if (NCH(ch) == 3)
1122 ch = CHILD(ch, 2);
1123 }
1124 /* on exit, must guarantee that ch is a list_for */
1125 if (TYPE(ch) == list_iter)
1126 ch = CHILD(ch, 0);
1127 lc->ifs = ifs;
1128 }
1129 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130 }
1131
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001132 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133}
1134
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001135/* Count the number of 'for' loops in a generator expression.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
1137 Helper for ast_for_genexp().
1138*/
1139
1140static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001141count_gen_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001143 int n_fors = 0;
1144 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145
1146 count_gen_for:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001147 n_fors++;
1148 REQ(ch, gen_for);
1149 if (NCH(ch) == 5)
1150 ch = CHILD(ch, 4);
1151 else
1152 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 count_gen_iter:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001154 REQ(ch, gen_iter);
1155 ch = CHILD(ch, 0);
1156 if (TYPE(ch) == gen_for)
1157 goto count_gen_for;
1158 else if (TYPE(ch) == gen_if) {
1159 if (NCH(ch) == 3) {
1160 ch = CHILD(ch, 2);
1161 goto count_gen_iter;
1162 }
1163 else
1164 return n_fors;
1165 }
1166
1167 /* Should never be reached */
1168 PyErr_SetString(PyExc_SystemError,
1169 "logic error in count_gen_fors");
1170 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171}
1172
1173/* Count the number of 'if' statements in a generator expression.
1174
1175 Helper for ast_for_genexp().
1176*/
1177
1178static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001179count_gen_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001181 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001183 while (1) {
1184 REQ(n, gen_iter);
1185 if (TYPE(CHILD(n, 0)) == gen_for)
1186 return n_ifs;
1187 n = CHILD(n, 0);
1188 REQ(n, gen_if);
1189 n_ifs++;
1190 if (NCH(n) == 2)
1191 return n_ifs;
1192 n = CHILD(n, 2);
1193 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194}
1195
Jeremy Hyltona8293132006-02-28 17:58:27 +00001196/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197static expr_ty
1198ast_for_genexp(struct compiling *c, const node *n)
1199{
1200 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001201 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 expr_ty elt;
1203 asdl_seq *genexps;
1204 int i, n_fors;
1205 node *ch;
1206
1207 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1208 assert(NCH(n) > 1);
1209
1210 elt = ast_for_expr(c, CHILD(n, 0));
1211 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001212 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001214 n_fors = count_gen_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001216 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217
1218 genexps = asdl_seq_new(n_fors, c->c_arena);
1219 if (!genexps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001220 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001221
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 ch = CHILD(n, 1);
1223 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001224 comprehension_ty ge;
1225 asdl_seq *t;
1226 expr_ty expression;
1227 node *for_ch;
1228
1229 REQ(ch, gen_for);
1230
1231 for_ch = CHILD(ch, 1);
1232 t = ast_for_exprlist(c, for_ch, Store);
1233 if (!t)
1234 return NULL;
1235 expression = ast_for_expr(c, CHILD(ch, 3));
1236 if (!expression)
1237 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001238
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001239 /* Check the # of children rather than the length of t, since
1240 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1241 if (NCH(for_ch) == 1)
1242 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1243 NULL, c->c_arena);
1244 else
1245 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1246 c->c_arena),
1247 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001248
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001249 if (!ge)
1250 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001251
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001252 if (NCH(ch) == 5) {
1253 int j, n_ifs;
1254 asdl_seq *ifs;
1255
1256 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001257 n_ifs = count_gen_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001258 if (n_ifs == -1)
1259 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001260
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001261 ifs = asdl_seq_new(n_ifs, c->c_arena);
1262 if (!ifs)
1263 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001264
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001265 for (j = 0; j < n_ifs; j++) {
1266 REQ(ch, gen_iter);
1267 ch = CHILD(ch, 0);
1268 REQ(ch, gen_if);
1269
1270 expression = ast_for_expr(c, CHILD(ch, 1));
1271 if (!expression)
1272 return NULL;
1273 asdl_seq_SET(ifs, j, expression);
1274 if (NCH(ch) == 3)
1275 ch = CHILD(ch, 2);
1276 }
1277 /* on exit, must guarantee that ch is a gen_for */
1278 if (TYPE(ch) == gen_iter)
1279 ch = CHILD(ch, 0);
1280 ge->ifs = ifs;
1281 }
1282 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 }
1284
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001285 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286}
1287
1288static expr_ty
1289ast_for_atom(struct compiling *c, const node *n)
1290{
1291 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1292 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1293 */
1294 node *ch = CHILD(n, 0);
1295
1296 switch (TYPE(ch)) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001297 case NAME: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001298 /* All names start in Load context, but may later be
1299 changed. */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001300 PyObject *name = NEW_IDENTIFIER(ch);
1301 if (!name)
1302 return NULL;
1303 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1304 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 case STRING: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001306 PyObject *str = parsestrplus(c, n);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001307 if (!str) {
Georg Brandldfe5dc82008-01-07 18:16:36 +00001308#ifdef Py_USING_UNICODE
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001309 if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
1310 PyObject *type, *value, *tback, *errstr;
1311 PyErr_Fetch(&type, &value, &tback);
Benjamin Petersonc078f922008-11-21 22:27:24 +00001312 errstr = PyObject_Str(value);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001313 if (errstr) {
1314 char *s = "";
1315 char buf[128];
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001316 s = PyString_AsString(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001317 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1318 ast_error(n, buf);
Benjamin Petersonc078f922008-11-21 22:27:24 +00001319 Py_DECREF(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001320 } else {
1321 ast_error(n, "(unicode error) unknown error");
1322 }
1323 Py_DECREF(type);
1324 Py_DECREF(value);
1325 Py_XDECREF(tback);
1326 }
Georg Brandldfe5dc82008-01-07 18:16:36 +00001327#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001328 return NULL;
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001329 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001330 PyArena_AddPyObject(c->c_arena, str);
1331 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 }
1333 case NUMBER: {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001334 PyObject *pynum = parsenumber(c, STR(ch));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001335 if (!pynum)
1336 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001337
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001338 PyArena_AddPyObject(c->c_arena, pynum);
1339 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 }
1341 case LPAR: /* some parenthesized expressions */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001342 ch = CHILD(n, 1);
1343
1344 if (TYPE(ch) == RPAR)
1345 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1346
1347 if (TYPE(ch) == yield_expr)
1348 return ast_for_expr(c, ch);
1349
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001350 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 case LSQB: /* list (or list comprehension) */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +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
1357 REQ(ch, listmaker);
1358 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
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +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: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001368 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1369 int i, size;
1370 asdl_seq *keys, *values;
1371
1372 ch = CHILD(n, 1);
1373 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1374 keys = asdl_seq_new(size, c->c_arena);
1375 if (!keys)
1376 return NULL;
1377
1378 values = asdl_seq_new(size, c->c_arena);
1379 if (!values)
1380 return NULL;
1381
1382 for (i = 0; i < NCH(ch); i += 4) {
1383 expr_ty expression;
1384
1385 expression = ast_for_expr(c, CHILD(ch, i));
1386 if (!expression)
1387 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001388
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001389 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001390
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001391 expression = ast_for_expr(c, CHILD(ch, i + 2));
1392 if (!expression)
1393 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001394
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001395 asdl_seq_SET(values, i / 4, expression);
1396 }
1397 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 }
1399 case BACKQUOTE: { /* repr */
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001400 expr_ty expression;
Benjamin Petersoncbd78132008-06-08 15:45:23 +00001401 if (Py_Py3kWarningFlag &&
1402 !ast_warn(c, n, "backquote not supported in 3.x; use repr()"))
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001403 return NULL;
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001404 expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001405 if (!expression)
1406 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001407
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001408 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 }
1410 default:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001411 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 }
1414}
1415
1416static slice_ty
1417ast_for_slice(struct compiling *c, const node *n)
1418{
1419 node *ch;
1420 expr_ty lower = NULL, upper = NULL, step = NULL;
1421
1422 REQ(n, subscript);
1423
1424 /*
1425 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1426 sliceop: ':' [test]
1427 */
1428 ch = CHILD(n, 0);
1429 if (TYPE(ch) == DOT)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001430 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431
1432 if (NCH(n) == 1 && TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001433 /* 'step' variable hold no significance in terms of being used over
1434 other vars */
1435 step = ast_for_expr(c, ch);
1436 if (!step)
1437 return NULL;
1438
1439 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 }
1441
1442 if (TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001443 lower = ast_for_expr(c, ch);
1444 if (!lower)
1445 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 }
1447
1448 /* If there's an upper bound it's in the second or third position. */
1449 if (TYPE(ch) == COLON) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001450 if (NCH(n) > 1) {
1451 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001453 if (TYPE(n2) == test) {
1454 upper = ast_for_expr(c, n2);
1455 if (!upper)
1456 return NULL;
1457 }
1458 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 } else if (NCH(n) > 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001460 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001462 if (TYPE(n2) == test) {
1463 upper = ast_for_expr(c, n2);
1464 if (!upper)
1465 return NULL;
1466 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 }
1468
1469 ch = CHILD(n, NCH(n) - 1);
1470 if (TYPE(ch) == sliceop) {
Benjamin Peterson4afbba32009-06-13 01:40:00 +00001471 if (NCH(ch) != 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001472 ch = CHILD(ch, 1);
1473 if (TYPE(ch) == test) {
1474 step = ast_for_expr(c, ch);
1475 if (!step)
1476 return NULL;
1477 }
1478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 }
1480
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001481 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482}
1483
1484static expr_ty
1485ast_for_binop(struct compiling *c, const node *n)
1486{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001487 /* Must account for a sequence of expressions.
1488 How should A op B op C by represented?
1489 BinOp(BinOp(A, op, B), op, C).
1490 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001492 int i, nops;
1493 expr_ty expr1, expr2, result;
1494 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001496 expr1 = ast_for_expr(c, CHILD(n, 0));
1497 if (!expr1)
1498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001500 expr2 = ast_for_expr(c, CHILD(n, 2));
1501 if (!expr2)
1502 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001504 newoperator = get_operator(CHILD(n, 1));
1505 if (!newoperator)
1506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001508 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1509 c->c_arena);
1510 if (!result)
1511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001513 nops = (NCH(n) - 1) / 2;
1514 for (i = 1; i < nops; i++) {
1515 expr_ty tmp_result, tmp;
1516 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001518 newoperator = get_operator(next_oper);
1519 if (!newoperator)
1520 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001522 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1523 if (!tmp)
1524 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001526 tmp_result = BinOp(result, newoperator, tmp,
1527 LINENO(next_oper), next_oper->n_col_offset,
1528 c->c_arena);
Neal Norwitz3adac212007-10-05 03:41:19 +00001529 if (!tmp_result)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001530 return NULL;
1531 result = tmp_result;
1532 }
1533 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534}
1535
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001536static expr_ty
1537ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1538{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001539 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1540 subscriptlist: subscript (',' subscript)* [',']
1541 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1542 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001543 REQ(n, trailer);
1544 if (TYPE(CHILD(n, 0)) == LPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001545 if (NCH(n) == 2)
1546 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1547 n->n_col_offset, c->c_arena);
1548 else
1549 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001550 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001551 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00001552 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1553 if (!attr_id)
1554 return NULL;
1555 return Attribute(left_expr, attr_id, Load,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001556 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001557 }
1558 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001559 REQ(CHILD(n, 0), LSQB);
1560 REQ(CHILD(n, 2), RSQB);
1561 n = CHILD(n, 1);
1562 if (NCH(n) == 1) {
1563 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1564 if (!slc)
1565 return NULL;
1566 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1567 c->c_arena);
1568 }
1569 else {
1570 /* The grammar is ambiguous here. The ambiguity is resolved
1571 by treating the sequence as a tuple literal if there are
1572 no slice features.
1573 */
1574 int j;
1575 slice_ty slc;
1576 expr_ty e;
1577 bool simple = true;
1578 asdl_seq *slices, *elts;
1579 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1580 if (!slices)
1581 return NULL;
1582 for (j = 0; j < NCH(n); j += 2) {
1583 slc = ast_for_slice(c, CHILD(n, j));
1584 if (!slc)
1585 return NULL;
1586 if (slc->kind != Index_kind)
1587 simple = false;
1588 asdl_seq_SET(slices, j / 2, slc);
1589 }
1590 if (!simple) {
1591 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1592 Load, LINENO(n), n->n_col_offset, c->c_arena);
1593 }
1594 /* extract Index values and put them in a Tuple */
1595 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1596 if (!elts)
1597 return NULL;
1598 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1599 slc = (slice_ty)asdl_seq_GET(slices, j);
1600 assert(slc->kind == Index_kind && slc->v.Index.value);
1601 asdl_seq_SET(elts, j, slc->v.Index.value);
1602 }
1603 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1604 if (!e)
1605 return NULL;
1606 return Subscript(left_expr, Index(e, c->c_arena),
1607 Load, LINENO(n), n->n_col_offset, c->c_arena);
1608 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001610}
1611
1612static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001613ast_for_factor(struct compiling *c, const node *n)
1614{
1615 node *pfactor, *ppower, *patom, *pnum;
1616 expr_ty expression;
1617
1618 /* If the unary - operator is applied to a constant, don't generate
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001619 a UNARY_NEGATIVE opcode. Just store the approriate value as a
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001620 constant. The peephole optimizer already does something like
1621 this but it doesn't handle the case where the constant is
1622 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1623 PyLongObject.
1624 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001625 if (TYPE(CHILD(n, 0)) == MINUS &&
1626 NCH(n) == 2 &&
1627 TYPE((pfactor = CHILD(n, 1))) == factor &&
1628 NCH(pfactor) == 1 &&
1629 TYPE((ppower = CHILD(pfactor, 0))) == power &&
1630 NCH(ppower) == 1 &&
1631 TYPE((patom = CHILD(ppower, 0))) == atom &&
1632 TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1633 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1634 if (s == NULL)
1635 return NULL;
1636 s[0] = '-';
1637 strcpy(s + 1, STR(pnum));
1638 PyObject_FREE(STR(pnum));
1639 STR(pnum) = s;
1640 return ast_for_atom(c, patom);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001641 }
1642
1643 expression = ast_for_expr(c, CHILD(n, 1));
1644 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001645 return NULL;
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001646
1647 switch (TYPE(CHILD(n, 0))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001648 case PLUS:
1649 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1650 c->c_arena);
1651 case MINUS:
1652 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1653 c->c_arena);
1654 case TILDE:
1655 return UnaryOp(Invert, expression, LINENO(n),
1656 n->n_col_offset, c->c_arena);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001657 }
1658 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001659 TYPE(CHILD(n, 0)));
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001660 return NULL;
1661}
1662
1663static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001664ast_for_power(struct compiling *c, const node *n)
1665{
1666 /* power: atom trailer* ('**' factor)*
1667 */
1668 int i;
1669 expr_ty e, tmp;
1670 REQ(n, power);
1671 e = ast_for_atom(c, CHILD(n, 0));
1672 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001673 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001674 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001675 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001676 for (i = 1; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001677 node *ch = CHILD(n, i);
1678 if (TYPE(ch) != trailer)
1679 break;
1680 tmp = ast_for_trailer(c, ch, e);
1681 if (!tmp)
1682 return NULL;
1683 tmp->lineno = e->lineno;
1684 tmp->col_offset = e->col_offset;
1685 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001686 }
1687 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001688 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1689 if (!f)
1690 return NULL;
1691 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1692 if (!tmp)
1693 return NULL;
1694 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001695 }
1696 return e;
1697}
1698
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699/* Do not name a variable 'expr'! Will cause a compile error.
1700*/
1701
1702static expr_ty
1703ast_for_expr(struct compiling *c, const node *n)
1704{
1705 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001706 test: or_test ['if' or_test 'else' test] | lambdef
1707 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 and_test: not_test ('and' not_test)*
1709 not_test: 'not' not_test | comparison
1710 comparison: expr (comp_op expr)*
1711 expr: xor_expr ('|' xor_expr)*
1712 xor_expr: and_expr ('^' and_expr)*
1713 and_expr: shift_expr ('&' shift_expr)*
1714 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1715 arith_expr: term (('+'|'-') term)*
1716 term: factor (('*'|'/'|'%'|'//') factor)*
1717 factor: ('+'|'-'|'~') factor | power
1718 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001719
1720 As well as modified versions that exist for backward compatibility,
1721 to explicitly allow:
1722 [ x for x in lambda: 0, lambda: 1 ]
1723 (which would be ambiguous without these extra rules)
1724
1725 old_test: or_test | old_lambdef
1726 old_lambdef: 'lambda' [vararglist] ':' old_test
1727
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 */
1729
1730 asdl_seq *seq;
1731 int i;
1732
1733 loop:
1734 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001735 case test:
1736 case old_test:
1737 if (TYPE(CHILD(n, 0)) == lambdef ||
1738 TYPE(CHILD(n, 0)) == old_lambdef)
1739 return ast_for_lambdef(c, CHILD(n, 0));
1740 else if (NCH(n) > 1)
1741 return ast_for_ifexpr(c, n);
1742 /* Fallthrough */
1743 case or_test:
1744 case and_test:
1745 if (NCH(n) == 1) {
1746 n = CHILD(n, 0);
1747 goto loop;
1748 }
1749 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1750 if (!seq)
1751 return NULL;
1752 for (i = 0; i < NCH(n); i += 2) {
1753 expr_ty e = ast_for_expr(c, CHILD(n, i));
1754 if (!e)
1755 return NULL;
1756 asdl_seq_SET(seq, i / 2, e);
1757 }
1758 if (!strcmp(STR(CHILD(n, 1)), "and"))
1759 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1760 c->c_arena);
1761 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1762 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1763 case not_test:
1764 if (NCH(n) == 1) {
1765 n = CHILD(n, 0);
1766 goto loop;
1767 }
1768 else {
1769 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1770 if (!expression)
1771 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001772
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001773 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1774 c->c_arena);
1775 }
1776 case comparison:
1777 if (NCH(n) == 1) {
1778 n = CHILD(n, 0);
1779 goto loop;
1780 }
1781 else {
1782 expr_ty expression;
1783 asdl_int_seq *ops;
1784 asdl_seq *cmps;
1785 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1786 if (!ops)
1787 return NULL;
1788 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1789 if (!cmps) {
1790 return NULL;
1791 }
1792 for (i = 1; i < NCH(n); i += 2) {
1793 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001795 newoperator = ast_for_comp_op(c, CHILD(n, i));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001796 if (!newoperator) {
1797 return NULL;
1798 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001800 expression = ast_for_expr(c, CHILD(n, i + 1));
1801 if (!expression) {
1802 return NULL;
1803 }
1804
1805 asdl_seq_SET(ops, i / 2, newoperator);
1806 asdl_seq_SET(cmps, i / 2, expression);
1807 }
1808 expression = ast_for_expr(c, CHILD(n, 0));
1809 if (!expression) {
1810 return NULL;
1811 }
1812
1813 return Compare(expression, ops, cmps, LINENO(n),
1814 n->n_col_offset, c->c_arena);
1815 }
1816 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001818 /* The next five cases all handle BinOps. The main body of code
1819 is the same in each case, but the switch turned inside out to
1820 reuse the code for each type of operator.
1821 */
1822 case expr:
1823 case xor_expr:
1824 case and_expr:
1825 case shift_expr:
1826 case arith_expr:
1827 case term:
1828 if (NCH(n) == 1) {
1829 n = CHILD(n, 0);
1830 goto loop;
1831 }
1832 return ast_for_binop(c, n);
1833 case yield_expr: {
1834 expr_ty exp = NULL;
1835 if (NCH(n) == 2) {
1836 exp = ast_for_testlist(c, CHILD(n, 1));
1837 if (!exp)
1838 return NULL;
1839 }
1840 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1841 }
1842 case factor:
1843 if (NCH(n) == 1) {
1844 n = CHILD(n, 0);
1845 goto loop;
1846 }
1847 return ast_for_factor(c, n);
1848 case power:
1849 return ast_for_power(c, n);
1850 default:
1851 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1852 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001854 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 return NULL;
1856}
1857
1858static expr_ty
1859ast_for_call(struct compiling *c, const node *n, expr_ty func)
1860{
1861 /*
1862 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001863 | '**' test)
1864 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 */
1866
1867 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001868 asdl_seq *args;
1869 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 expr_ty vararg = NULL, kwarg = NULL;
1871
1872 REQ(n, arglist);
1873
1874 nargs = 0;
1875 nkeywords = 0;
1876 ngens = 0;
1877 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001878 node *ch = CHILD(n, i);
1879 if (TYPE(ch) == argument) {
1880 if (NCH(ch) == 1)
1881 nargs++;
1882 else if (TYPE(CHILD(ch, 1)) == gen_for)
1883 ngens++;
1884 else
1885 nkeywords++;
1886 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 }
1888 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001889 ast_error(n, "Generator expression must be parenthesized "
1890 "if not sole argument");
1891 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 }
1893
1894 if (nargs + nkeywords + ngens > 255) {
1895 ast_error(n, "more than 255 arguments");
1896 return NULL;
1897 }
1898
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001899 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001901 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001902 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 if (!keywords)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001904 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 nargs = 0;
1906 nkeywords = 0;
1907 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001908 node *ch = CHILD(n, i);
1909 if (TYPE(ch) == argument) {
1910 expr_ty e;
1911 if (NCH(ch) == 1) {
1912 if (nkeywords) {
1913 ast_error(CHILD(ch, 0),
1914 "non-keyword arg after keyword arg");
1915 return NULL;
1916 }
Benjamin Peterson80f0ed52008-08-19 19:52:46 +00001917 if (vararg) {
1918 ast_error(CHILD(ch, 0),
1919 "only named arguments may follow *expression");
1920 return NULL;
1921 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001922 e = ast_for_expr(c, CHILD(ch, 0));
1923 if (!e)
1924 return NULL;
1925 asdl_seq_SET(args, nargs++, e);
1926 }
1927 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1928 e = ast_for_genexp(c, ch);
1929 if (!e)
1930 return NULL;
1931 asdl_seq_SET(args, nargs++, e);
1932 }
1933 else {
1934 keyword_ty kw;
1935 identifier key;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001936 int k;
1937 char *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001939 /* CHILD(ch, 0) is test, but must be an identifier? */
1940 e = ast_for_expr(c, CHILD(ch, 0));
1941 if (!e)
1942 return NULL;
1943 /* f(lambda x: x[0] = 3) ends up getting parsed with
1944 * LHS test = lambda x: x[0], and RHS test = 3.
1945 * SF bug 132313 points out that complaining about a keyword
1946 * then is very confusing.
1947 */
1948 if (e->kind == Lambda_kind) {
1949 ast_error(CHILD(ch, 0),
1950 "lambda cannot contain assignment");
1951 return NULL;
1952 } else if (e->kind != Name_kind) {
1953 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1954 return NULL;
1955 }
1956 key = e->v.Name.id;
Benjamin Petersond5efd202008-06-08 22:52:37 +00001957 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
Georg Brandle06cf452007-06-07 13:23:24 +00001958 return NULL;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001959 for (k = 0; k < nkeywords; k++) {
1960 tmp = PyString_AS_STRING(
1961 ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
1962 if (!strcmp(tmp, PyString_AS_STRING(key))) {
1963 ast_error(CHILD(ch, 0), "keyword argument repeated");
1964 return NULL;
1965 }
1966 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001967 e = ast_for_expr(c, CHILD(ch, 2));
1968 if (!e)
1969 return NULL;
1970 kw = keyword(key, e, c->c_arena);
1971 if (!kw)
1972 return NULL;
1973 asdl_seq_SET(keywords, nkeywords++, kw);
1974 }
1975 }
1976 else if (TYPE(ch) == STAR) {
1977 vararg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001978 if (!vararg)
1979 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001980 i++;
1981 }
1982 else if (TYPE(ch) == DOUBLESTAR) {
1983 kwarg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001984 if (!kwarg)
1985 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001986 i++;
1987 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 }
1989
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001990 return Call(func, args, keywords, vararg, kwarg, func->lineno,
1991 func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992}
1993
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001995ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001997 /* testlist_gexp: test (',' test)* [','] */
1998 /* testlist: test (',' test)* [','] */
1999 /* testlist_safe: test (',' test)+ [','] */
2000 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002002 if (TYPE(n) == testlist_gexp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002003 if (NCH(n) > 1)
2004 assert(TYPE(CHILD(n, 1)) != gen_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002005 }
2006 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002007 assert(TYPE(n) == testlist ||
2008 TYPE(n) == testlist_safe ||
2009 TYPE(n) == testlist1);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002010 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002012 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002014 asdl_seq *tmp = seq_for_testlist(c, n);
2015 if (!tmp)
2016 return NULL;
2017 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002019}
2020
2021static expr_ty
2022ast_for_testlist_gexp(struct compiling *c, const node* n)
2023{
2024 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2025 /* argument: test [ gen_for ] */
2026 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002027 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002028 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002029 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002030}
2031
2032/* like ast_for_testlist() but returns a sequence */
2033static asdl_seq*
2034ast_for_class_bases(struct compiling *c, const node* n)
2035{
2036 /* testlist: test (',' test)* [','] */
2037 assert(NCH(n) > 0);
2038 REQ(n, testlist);
2039 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002040 expr_ty base;
2041 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
2042 if (!bases)
2043 return NULL;
2044 base = ast_for_expr(c, CHILD(n, 0));
2045 if (!base)
2046 return NULL;
2047 asdl_seq_SET(bases, 0, base);
2048 return bases;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002049 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002050
2051 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052}
2053
2054static stmt_ty
2055ast_for_expr_stmt(struct compiling *c, const node *n)
2056{
2057 REQ(n, expr_stmt);
2058 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002059 | ('=' (yield_expr|testlist))*)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 testlist: test (',' test)* [',']
2061 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002062 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063 test: ... here starts the operator precendence dance
2064 */
2065
2066 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002067 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
2068 if (!e)
2069 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002071 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 }
2073 else if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002074 expr_ty expr1, expr2;
2075 operator_ty newoperator;
2076 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002078 expr1 = ast_for_testlist(c, ch);
2079 if (!expr1)
2080 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002081 if(!set_context(c, expr1, Store, ch))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002082 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002084 ch = CHILD(n, 2);
2085 if (TYPE(ch) == testlist)
2086 expr2 = ast_for_testlist(c, ch);
2087 else
2088 expr2 = ast_for_expr(c, ch);
2089 if (!expr2)
2090 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002092 newoperator = ast_for_augassign(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002093 if (!newoperator)
2094 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002096 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2097 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 }
2099 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002100 int i;
2101 asdl_seq *targets;
2102 node *value;
2103 expr_ty expression;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002105 /* a normal assignment */
2106 REQ(CHILD(n, 1), EQUAL);
2107 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2108 if (!targets)
2109 return NULL;
2110 for (i = 0; i < NCH(n) - 2; i += 2) {
2111 expr_ty e;
2112 node *ch = CHILD(n, i);
Benjamin Petersonb2664812009-06-11 17:49:38 +00002113 if (TYPE(ch) == yield_expr) {
2114 ast_error(ch, "assignment to yield expression not possible");
2115 return NULL;
2116 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002117 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002119 /* set context to assign */
2120 if (!e)
2121 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002123 if (!set_context(c, e, Store, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002124 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002126 asdl_seq_SET(targets, i / 2, e);
2127 }
2128 value = CHILD(n, NCH(n) - 1);
2129 if (TYPE(value) == testlist)
2130 expression = ast_for_testlist(c, value);
2131 else
2132 expression = ast_for_expr(c, value);
2133 if (!expression)
2134 return NULL;
2135 return Assign(targets, expression, LINENO(n), n->n_col_offset,
2136 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138}
2139
2140static stmt_ty
2141ast_for_print_stmt(struct compiling *c, const node *n)
2142{
2143 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002144 | '>>' test [ (',' test)+ [','] ] )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 */
2146 expr_ty dest = NULL, expression;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002147 asdl_seq *seq = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 bool nl;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002149 int i, j, values_count, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150
2151 REQ(n, print_stmt);
2152 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002153 dest = ast_for_expr(c, CHILD(n, 2));
2154 if (!dest)
2155 return NULL;
2156 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157 }
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002158 values_count = (NCH(n) + 1 - start) / 2;
2159 if (values_count) {
2160 seq = asdl_seq_new(values_count, c->c_arena);
2161 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002162 return NULL;
Benjamin Peterson5d1ff942009-06-13 16:19:19 +00002163 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
2164 expression = ast_for_expr(c, CHILD(n, i));
2165 if (!expression)
2166 return NULL;
2167 asdl_seq_SET(seq, j, expression);
2168 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 }
2170 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002171 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172}
2173
2174static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002175ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176{
2177 asdl_seq *seq;
2178 int i;
2179 expr_ty e;
2180
2181 REQ(n, exprlist);
2182
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002183 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002185 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002187 e = ast_for_expr(c, CHILD(n, i));
2188 if (!e)
2189 return NULL;
2190 asdl_seq_SET(seq, i / 2, e);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002191 if (context && !set_context(c, e, context, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002192 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 }
2194 return seq;
2195}
2196
2197static stmt_ty
2198ast_for_del_stmt(struct compiling *c, const node *n)
2199{
2200 asdl_seq *expr_list;
2201
2202 /* del_stmt: 'del' exprlist */
2203 REQ(n, del_stmt);
2204
2205 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2206 if (!expr_list)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002207 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002208 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209}
2210
2211static stmt_ty
2212ast_for_flow_stmt(struct compiling *c, const node *n)
2213{
2214 /*
2215 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002216 | yield_stmt
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002217 break_stmt: 'break'
2218 continue_stmt: 'continue'
2219 return_stmt: 'return' [testlist]
2220 yield_stmt: yield_expr
2221 yield_expr: 'yield' testlist
2222 raise_stmt: 'raise' [test [',' test [',' test]]]
2223 */
2224 node *ch;
2225
2226 REQ(n, flow_stmt);
2227 ch = CHILD(n, 0);
2228 switch (TYPE(ch)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002229 case break_stmt:
2230 return Break(LINENO(n), n->n_col_offset, c->c_arena);
2231 case continue_stmt:
2232 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2233 case yield_stmt: { /* will reduce to yield_expr */
2234 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2235 if (!exp)
2236 return NULL;
2237 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2238 }
2239 case return_stmt:
2240 if (NCH(ch) == 1)
2241 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2242 else {
2243 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2244 if (!expression)
2245 return NULL;
2246 return Return(expression, LINENO(n), n->n_col_offset,
2247 c->c_arena);
2248 }
2249 case raise_stmt:
2250 if (NCH(ch) == 1)
2251 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2252 c->c_arena);
2253 else if (NCH(ch) == 2) {
2254 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2255 if (!expression)
2256 return NULL;
2257 return Raise(expression, NULL, NULL, LINENO(n),
2258 n->n_col_offset, c->c_arena);
2259 }
2260 else if (NCH(ch) == 4) {
2261 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002263 expr1 = ast_for_expr(c, CHILD(ch, 1));
2264 if (!expr1)
2265 return NULL;
2266 expr2 = ast_for_expr(c, CHILD(ch, 3));
2267 if (!expr2)
2268 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002270 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2271 c->c_arena);
2272 }
2273 else if (NCH(ch) == 6) {
2274 expr_ty expr1, expr2, expr3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002276 expr1 = ast_for_expr(c, CHILD(ch, 1));
2277 if (!expr1)
2278 return NULL;
2279 expr2 = ast_for_expr(c, CHILD(ch, 3));
2280 if (!expr2)
2281 return NULL;
2282 expr3 = ast_for_expr(c, CHILD(ch, 5));
2283 if (!expr3)
2284 return NULL;
2285
2286 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2287 c->c_arena);
2288 }
2289 default:
2290 PyErr_Format(PyExc_SystemError,
2291 "unexpected flow_stmt: %d", TYPE(ch));
2292 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002294
2295 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2296 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297}
2298
2299static alias_ty
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002300alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301{
2302 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002303 import_as_name: NAME ['as' NAME]
2304 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 dotted_name: NAME ('.' NAME)*
2306 */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002307 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002308
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 loop:
2310 switch (TYPE(n)) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002311 case import_as_name: {
2312 node *name_node = CHILD(n, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002313 str = NULL;
2314 if (NCH(n) == 3) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002315 node *str_node = CHILD(n, 2);
2316 if (store && !forbidden_check(c, str_node, STR(str_node)))
2317 return NULL;
2318 str = NEW_IDENTIFIER(str_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002319 if (!str)
2320 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002321 }
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002322 else {
2323 if (!forbidden_check(c, name_node, STR(name_node)))
2324 return NULL;
2325 }
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002326 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002327 if (!name)
2328 return NULL;
2329 return alias(name, str, c->c_arena);
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002330 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002331 case dotted_as_name:
2332 if (NCH(n) == 1) {
2333 n = CHILD(n, 0);
2334 goto loop;
2335 }
2336 else {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002337 node *asname_node = CHILD(n, 2);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002338 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002339 if (!a)
2340 return NULL;
2341 assert(!a->asname);
Benjamin Petersond1f5a592009-06-13 13:06:21 +00002342 if (!forbidden_check(c, asname_node, STR(asname_node)))
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002343 return NULL;
2344 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002345 if (!a->asname)
2346 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002347 return a;
2348 }
2349 break;
2350 case dotted_name:
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002351 if (NCH(n) == 1) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002352 node *name_node = CHILD(n, 0);
2353 if (store && !forbidden_check(c, name_node, STR(name_node)))
2354 return NULL;
2355 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00002356 if (!name)
2357 return NULL;
2358 return alias(name, NULL, c->c_arena);
2359 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002360 else {
2361 /* Create a string of the form "a.b.c" */
2362 int i;
2363 size_t len;
2364 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002366 len = 0;
2367 for (i = 0; i < NCH(n); i += 2)
2368 /* length of string plus one for the dot */
2369 len += strlen(STR(CHILD(n, i))) + 1;
2370 len--; /* the last name doesn't have a dot */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002371 str = PyString_FromStringAndSize(NULL, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002372 if (!str)
2373 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002374 s = PyString_AS_STRING(str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002375 if (!s)
2376 return NULL;
2377 for (i = 0; i < NCH(n); i += 2) {
2378 char *sch = STR(CHILD(n, i));
2379 strcpy(s, STR(CHILD(n, i)));
2380 s += strlen(sch);
2381 *s++ = '.';
2382 }
2383 --s;
2384 *s = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002385 PyString_InternInPlace(&str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002386 PyArena_AddPyObject(c->c_arena, str);
2387 return alias(str, NULL, c->c_arena);
2388 }
2389 break;
2390 case STAR:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002391 str = PyString_InternFromString("*");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002392 PyArena_AddPyObject(c->c_arena, str);
2393 return alias(str, NULL, c->c_arena);
2394 default:
2395 PyErr_Format(PyExc_SystemError,
2396 "unexpected import name: %d", TYPE(n));
2397 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002399
2400 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 return NULL;
2402}
2403
2404static stmt_ty
2405ast_for_import_stmt(struct compiling *c, const node *n)
2406{
2407 /*
2408 import_stmt: import_name | import_from
2409 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002410 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002411 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002413 int lineno;
2414 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 int i;
2416 asdl_seq *aliases;
2417
2418 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002419 lineno = LINENO(n);
2420 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002422 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002423 n = CHILD(n, 1);
2424 REQ(n, dotted_as_names);
2425 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2426 if (!aliases)
2427 return NULL;
2428 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002429 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002430 if (!import_alias)
2431 return NULL;
2432 asdl_seq_SET(aliases, i / 2, import_alias);
2433 }
2434 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002436 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002437 int n_children;
2438 int idx, ndots = 0;
2439 alias_ty mod = NULL;
2440 identifier modname;
2441
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002442 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002443 optional module name */
2444 for (idx = 1; idx < NCH(n); idx++) {
2445 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002446 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2447 if (!mod)
2448 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002449 idx++;
2450 break;
2451 } else if (TYPE(CHILD(n, idx)) != DOT) {
2452 break;
2453 }
2454 ndots++;
2455 }
2456 idx++; /* skip over the 'import' keyword */
2457 switch (TYPE(CHILD(n, idx))) {
2458 case STAR:
2459 /* from ... import * */
2460 n = CHILD(n, idx);
2461 n_children = 1;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002462 break;
2463 case LPAR:
2464 /* from ... import (x, y, z) */
2465 n = CHILD(n, idx + 1);
2466 n_children = NCH(n);
2467 break;
2468 case import_as_names:
2469 /* from ... import x, y, z */
2470 n = CHILD(n, idx);
2471 n_children = NCH(n);
2472 if (n_children % 2 == 0) {
2473 ast_error(n, "trailing comma not allowed without"
2474 " surrounding parentheses");
2475 return NULL;
2476 }
2477 break;
2478 default:
2479 ast_error(n, "Unexpected node-type in from-import");
2480 return NULL;
2481 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002483 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2484 if (!aliases)
2485 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002487 /* handle "from ... import *" special b/c there's no children */
2488 if (TYPE(n) == STAR) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002489 alias_ty import_alias = alias_for_import_name(c, n, 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002490 if (!import_alias)
2491 return NULL;
2492 asdl_seq_SET(aliases, 0, import_alias);
2493 }
2494 else {
2495 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson565e1b62009-06-13 03:46:30 +00002496 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002497 if (!import_alias)
2498 return NULL;
2499 asdl_seq_SET(aliases, i / 2, import_alias);
2500 }
2501 }
2502 if (mod != NULL)
2503 modname = mod->name;
2504 else
2505 modname = new_identifier("", c->c_arena);
2506 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2507 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 }
Neal Norwitz79792652005-11-14 04:25:03 +00002509 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002510 "unknown import statement: starts with command '%s'",
2511 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 return NULL;
2513}
2514
2515static stmt_ty
2516ast_for_global_stmt(struct compiling *c, const node *n)
2517{
2518 /* global_stmt: 'global' NAME (',' NAME)* */
2519 identifier name;
2520 asdl_seq *s;
2521 int i;
2522
2523 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002524 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002526 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002528 name = NEW_IDENTIFIER(CHILD(n, i));
2529 if (!name)
2530 return NULL;
2531 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002533 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534}
2535
2536static stmt_ty
2537ast_for_exec_stmt(struct compiling *c, const node *n)
2538{
2539 expr_ty expr1, globals = NULL, locals = NULL;
2540 int n_children = NCH(n);
2541 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002542 PyErr_Format(PyExc_SystemError,
2543 "poorly formed 'exec' statement: %d parts to statement",
2544 n_children);
2545 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 }
2547
2548 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2549 REQ(n, exec_stmt);
2550 expr1 = ast_for_expr(c, CHILD(n, 1));
2551 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002552 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002554 globals = ast_for_expr(c, CHILD(n, 3));
2555 if (!globals)
2556 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 }
2558 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002559 locals = ast_for_expr(c, CHILD(n, 5));
2560 if (!locals)
2561 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 }
2563
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002564 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2565 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566}
2567
2568static stmt_ty
2569ast_for_assert_stmt(struct compiling *c, const node *n)
2570{
2571 /* assert_stmt: 'assert' test [',' test] */
2572 REQ(n, assert_stmt);
2573 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002574 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2575 if (!expression)
2576 return NULL;
2577 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2578 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 }
2580 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002581 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002583 expr1 = ast_for_expr(c, CHILD(n, 1));
2584 if (!expr1)
2585 return NULL;
2586 expr2 = ast_for_expr(c, CHILD(n, 3));
2587 if (!expr2)
2588 return NULL;
2589
2590 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 }
Neal Norwitz79792652005-11-14 04:25:03 +00002592 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002593 "improper number of parts to 'assert' statement: %d",
2594 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595 return NULL;
2596}
2597
2598static asdl_seq *
2599ast_for_suite(struct compiling *c, const node *n)
2600{
2601 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002602 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 stmt_ty s;
2604 int i, total, num, end, pos = 0;
2605 node *ch;
2606
2607 REQ(n, suite);
2608
2609 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002610 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002612 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002614 n = CHILD(n, 0);
2615 /* simple_stmt always ends with a NEWLINE,
2616 and may have a trailing SEMI
2617 */
2618 end = NCH(n) - 1;
2619 if (TYPE(CHILD(n, end - 1)) == SEMI)
2620 end--;
2621 /* loop by 2 to skip semi-colons */
2622 for (i = 0; i < end; i += 2) {
2623 ch = CHILD(n, i);
2624 s = ast_for_stmt(c, ch);
2625 if (!s)
2626 return NULL;
2627 asdl_seq_SET(seq, pos++, s);
2628 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 }
2630 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002631 for (i = 2; i < (NCH(n) - 1); i++) {
2632 ch = CHILD(n, i);
2633 REQ(ch, stmt);
2634 num = num_stmts(ch);
2635 if (num == 1) {
2636 /* small_stmt or compound_stmt with only one child */
2637 s = ast_for_stmt(c, ch);
2638 if (!s)
2639 return NULL;
2640 asdl_seq_SET(seq, pos++, s);
2641 }
2642 else {
2643 int j;
2644 ch = CHILD(ch, 0);
2645 REQ(ch, simple_stmt);
2646 for (j = 0; j < NCH(ch); j += 2) {
2647 /* statement terminates with a semi-colon ';' */
2648 if (NCH(CHILD(ch, j)) == 0) {
2649 assert((j + 1) == NCH(ch));
2650 break;
2651 }
2652 s = ast_for_stmt(c, CHILD(ch, j));
2653 if (!s)
2654 return NULL;
2655 asdl_seq_SET(seq, pos++, s);
2656 }
2657 }
2658 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 }
2660 assert(pos == seq->size);
2661 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662}
2663
2664static stmt_ty
2665ast_for_if_stmt(struct compiling *c, const node *n)
2666{
2667 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2668 ['else' ':' suite]
2669 */
2670 char *s;
2671
2672 REQ(n, if_stmt);
2673
2674 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002675 expr_ty expression;
2676 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +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
2685 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2686 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002688
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 s = STR(CHILD(n, 4));
2690 /* s[2], the third character in the string, will be
2691 's' for el_s_e, or
2692 'i' for el_i_f
2693 */
2694 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002695 expr_ty expression;
2696 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002698 expression = ast_for_expr(c, CHILD(n, 1));
2699 if (!expression)
2700 return NULL;
2701 seq1 = ast_for_suite(c, CHILD(n, 3));
2702 if (!seq1)
2703 return NULL;
2704 seq2 = ast_for_suite(c, CHILD(n, 6));
2705 if (!seq2)
2706 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002708 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2709 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 }
2711 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002712 int i, n_elif, has_else = 0;
2713 expr_ty expression;
2714 asdl_seq *suite_seq;
2715 asdl_seq *orelse = NULL;
2716 n_elif = NCH(n) - 4;
2717 /* must reference the child n_elif+1 since 'else' token is third,
2718 not fourth, child from the end. */
2719 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2720 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2721 has_else = 1;
2722 n_elif -= 3;
2723 }
2724 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002726 if (has_else) {
2727 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002729 orelse = asdl_seq_new(1, c->c_arena);
2730 if (!orelse)
2731 return NULL;
2732 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2733 if (!expression)
2734 return NULL;
2735 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2736 if (!suite_seq)
2737 return NULL;
2738 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2739 if (!suite_seq2)
2740 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002742 asdl_seq_SET(orelse, 0,
2743 If(expression, suite_seq, suite_seq2,
2744 LINENO(CHILD(n, NCH(n) - 6)),
2745 CHILD(n, NCH(n) - 6)->n_col_offset,
2746 c->c_arena));
2747 /* the just-created orelse handled the last elif */
2748 n_elif--;
2749 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002751 for (i = 0; i < n_elif; i++) {
2752 int off = 5 + (n_elif - i - 1) * 4;
2753 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2754 if (!newobj)
2755 return NULL;
2756 expression = ast_for_expr(c, CHILD(n, off));
2757 if (!expression)
2758 return NULL;
2759 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2760 if (!suite_seq)
2761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002763 asdl_seq_SET(newobj, 0,
2764 If(expression, suite_seq, orelse,
2765 LINENO(CHILD(n, off)),
2766 CHILD(n, off)->n_col_offset, c->c_arena));
2767 orelse = newobj;
2768 }
2769 expression = ast_for_expr(c, CHILD(n, 1));
2770 if (!expression)
2771 return NULL;
2772 suite_seq = ast_for_suite(c, CHILD(n, 3));
2773 if (!suite_seq)
2774 return NULL;
2775 return If(expression, suite_seq, orelse,
2776 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002778
2779 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002780 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002781 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782}
2783
2784static stmt_ty
2785ast_for_while_stmt(struct compiling *c, const node *n)
2786{
2787 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2788 REQ(n, while_stmt);
2789
2790 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002791 expr_ty expression;
2792 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002794 expression = ast_for_expr(c, CHILD(n, 1));
2795 if (!expression)
2796 return NULL;
2797 suite_seq = ast_for_suite(c, CHILD(n, 3));
2798 if (!suite_seq)
2799 return NULL;
2800 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2801 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 }
2803 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002804 expr_ty expression;
2805 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002807 expression = ast_for_expr(c, CHILD(n, 1));
2808 if (!expression)
2809 return NULL;
2810 seq1 = ast_for_suite(c, CHILD(n, 3));
2811 if (!seq1)
2812 return NULL;
2813 seq2 = ast_for_suite(c, CHILD(n, 6));
2814 if (!seq2)
2815 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002817 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2818 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002820
2821 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002822 "wrong number of tokens for 'while' statement: %d",
2823 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002824 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825}
2826
2827static stmt_ty
2828ast_for_for_stmt(struct compiling *c, const node *n)
2829{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002830 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 expr_ty expression;
2832 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002833 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2835 REQ(n, for_stmt);
2836
2837 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002838 seq = ast_for_suite(c, CHILD(n, 8));
2839 if (!seq)
2840 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 }
2842
Neal Norwitzedef2be2006-07-12 05:26:17 +00002843 node_target = CHILD(n, 1);
2844 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002845 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002846 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002847 /* Check the # of children rather than the length of _target, since
2848 for x, in ... has 1 element in _target, but still requires a Tuple. */
2849 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002850 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002852 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002854 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002855 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002856 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002858 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002861 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002862 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863}
2864
2865static excepthandler_ty
2866ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2867{
Collin Winter62903052007-05-18 23:11:24 +00002868 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 REQ(exc, except_clause);
2870 REQ(body, suite);
2871
2872 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002873 asdl_seq *suite_seq = ast_for_suite(c, body);
2874 if (!suite_seq)
2875 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876
Georg Brandla48f3ab2008-03-30 06:40:17 +00002877 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002878 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 }
2880 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002881 expr_ty expression;
2882 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002884 expression = ast_for_expr(c, CHILD(exc, 1));
2885 if (!expression)
2886 return NULL;
2887 suite_seq = ast_for_suite(c, body);
2888 if (!suite_seq)
2889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890
Georg Brandla48f3ab2008-03-30 06:40:17 +00002891 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002892 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 }
2894 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002895 asdl_seq *suite_seq;
2896 expr_ty expression;
2897 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2898 if (!e)
2899 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002900 if (!set_context(c, e, Store, CHILD(exc, 3)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002901 return NULL;
2902 expression = ast_for_expr(c, CHILD(exc, 1));
2903 if (!expression)
2904 return NULL;
2905 suite_seq = ast_for_suite(c, body);
2906 if (!suite_seq)
2907 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908
Georg Brandla48f3ab2008-03-30 06:40:17 +00002909 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002910 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002912
2913 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002914 "wrong number of children for 'except' clause: %d",
2915 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002916 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917}
2918
2919static stmt_ty
2920ast_for_try_stmt(struct compiling *c, const node *n)
2921{
Neal Norwitzf599f422005-12-17 21:33:47 +00002922 const int nch = NCH(n);
2923 int n_except = (nch - 3)/3;
2924 asdl_seq *body, *orelse = NULL, *finally = NULL;
2925
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 REQ(n, try_stmt);
2927
Neal Norwitzf599f422005-12-17 21:33:47 +00002928 body = ast_for_suite(c, CHILD(n, 2));
2929 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002930 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002931
Neal Norwitzf599f422005-12-17 21:33:47 +00002932 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002933 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2934 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2935 /* we can assume it's an "else",
2936 because nch >= 9 for try-else-finally and
2937 it would otherwise have a type of except_clause */
2938 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2939 if (orelse == NULL)
2940 return NULL;
2941 n_except--;
2942 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002943
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002944 finally = ast_for_suite(c, CHILD(n, nch - 1));
2945 if (finally == NULL)
2946 return NULL;
2947 n_except--;
2948 }
2949 else {
2950 /* we can assume it's an "else",
2951 otherwise it would have a type of except_clause */
2952 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2953 if (orelse == NULL)
2954 return NULL;
2955 n_except--;
2956 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002958 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002959 ast_error(n, "malformed 'try' statement");
2960 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002962
2963 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002964 int i;
2965 stmt_ty except_st;
2966 /* process except statements to create a try ... except */
2967 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2968 if (handlers == NULL)
2969 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002970
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002971 for (i = 0; i < n_except; i++) {
2972 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2973 CHILD(n, 5 + i * 3));
2974 if (!e)
2975 return NULL;
2976 asdl_seq_SET(handlers, i, e);
2977 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002978
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002979 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2980 n->n_col_offset, c->c_arena);
2981 if (!finally)
2982 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002983
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002984 /* if a 'finally' is present too, we nest the TryExcept within a
2985 TryFinally to emulate try ... except ... finally */
2986 body = asdl_seq_new(1, c->c_arena);
2987 if (body == NULL)
2988 return NULL;
2989 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002990 }
2991
2992 /* must be a try ... finally (except clauses are in body, if any exist) */
2993 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002994 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995}
2996
Georg Brandl944f6842009-05-25 21:02:56 +00002997/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002998static stmt_ty
Georg Brandl944f6842009-05-25 21:02:56 +00002999ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003000{
3001 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003002
Georg Brandl944f6842009-05-25 21:02:56 +00003003 REQ(n, with_item);
3004 context_expr = ast_for_expr(c, CHILD(n, 0));
Collin Winter77c67bd2007-03-16 04:11:30 +00003005 if (!context_expr)
3006 return NULL;
Georg Brandl944f6842009-05-25 21:02:56 +00003007 if (NCH(n) == 3) {
3008 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003009
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003010 if (!optional_vars) {
3011 return NULL;
3012 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003013 if (!set_context(c, optional_vars, Store, n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003014 return NULL;
3015 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003016 }
3017
Georg Brandl944f6842009-05-25 21:02:56 +00003018 return With(context_expr, optional_vars, content, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003019 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003020}
3021
Georg Brandl944f6842009-05-25 21:02:56 +00003022/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3023static stmt_ty
3024ast_for_with_stmt(struct compiling *c, const node *n)
3025{
3026 int i;
3027 stmt_ty ret;
3028 asdl_seq *inner;
3029
3030 REQ(n, with_stmt);
3031
3032 /* process the with items inside-out */
3033 i = NCH(n) - 1;
3034 /* the suite of the innermost with item is the suite of the with stmt */
3035 inner = ast_for_suite(c, CHILD(n, i));
3036 if (!inner)
3037 return NULL;
3038
3039 for (;;) {
3040 i -= 2;
3041 ret = ast_for_with_item(c, CHILD(n, i), inner);
3042 if (!ret)
3043 return NULL;
3044 /* was this the last item? */
3045 if (i == 1)
3046 break;
3047 /* if not, wrap the result so far in a new sequence */
3048 inner = asdl_seq_new(1, c->c_arena);
3049 if (!inner)
3050 return NULL;
3051 asdl_seq_SET(inner, 0, ret);
3052 }
3053
3054 return ret;
3055}
3056
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +00003058ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059{
3060 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003061 PyObject *classname;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 asdl_seq *bases, *s;
3063
3064 REQ(n, classdef);
3065
Benjamin Petersond5efd202008-06-08 22:52:37 +00003066 if (!forbidden_check(c, n, STR(CHILD(n, 1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003067 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068
3069 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003070 s = ast_for_suite(c, CHILD(n, 3));
3071 if (!s)
3072 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003073 classname = NEW_IDENTIFIER(CHILD(n, 1));
3074 if (!classname)
3075 return NULL;
3076 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3077 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 }
3079 /* check for empty base list */
3080 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003081 s = ast_for_suite(c, CHILD(n,5));
3082 if (!s)
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003083 return NULL;
3084 classname = NEW_IDENTIFIER(CHILD(n, 1));
3085 if (!classname)
3086 return NULL;
3087 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3088 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 }
3090
3091 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003092 bases = ast_for_class_bases(c, CHILD(n, 3));
3093 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003094 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095
3096 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003097 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003098 return NULL;
Benjamin Peterson9e6310d2008-11-25 03:43:14 +00003099 classname = NEW_IDENTIFIER(CHILD(n, 1));
3100 if (!classname)
3101 return NULL;
3102 return ClassDef(classname, bases, s, decorator_seq,
Christian Heimes5224d282008-02-23 15:01:05 +00003103 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104}
3105
3106static stmt_ty
3107ast_for_stmt(struct compiling *c, const node *n)
3108{
3109 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003110 assert(NCH(n) == 1);
3111 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 }
3113 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003114 assert(num_stmts(n) == 1);
3115 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003116 }
3117 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003118 n = CHILD(n, 0);
3119 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3120 | flow_stmt | import_stmt | global_stmt | exec_stmt
3121 | assert_stmt
3122 */
3123 switch (TYPE(n)) {
3124 case expr_stmt:
3125 return ast_for_expr_stmt(c, n);
3126 case print_stmt:
3127 return ast_for_print_stmt(c, n);
3128 case del_stmt:
3129 return ast_for_del_stmt(c, n);
3130 case pass_stmt:
3131 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3132 case flow_stmt:
3133 return ast_for_flow_stmt(c, n);
3134 case import_stmt:
3135 return ast_for_import_stmt(c, n);
3136 case global_stmt:
3137 return ast_for_global_stmt(c, n);
3138 case exec_stmt:
3139 return ast_for_exec_stmt(c, n);
3140 case assert_stmt:
3141 return ast_for_assert_stmt(c, n);
3142 default:
3143 PyErr_Format(PyExc_SystemError,
3144 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3145 TYPE(n), NCH(n));
3146 return NULL;
3147 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 }
3149 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003150 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Christian Heimes5224d282008-02-23 15:01:05 +00003151 | funcdef | classdef | decorated
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003152 */
3153 node *ch = CHILD(n, 0);
3154 REQ(n, compound_stmt);
3155 switch (TYPE(ch)) {
3156 case if_stmt:
3157 return ast_for_if_stmt(c, ch);
3158 case while_stmt:
3159 return ast_for_while_stmt(c, ch);
3160 case for_stmt:
3161 return ast_for_for_stmt(c, ch);
3162 case try_stmt:
3163 return ast_for_try_stmt(c, ch);
3164 case with_stmt:
3165 return ast_for_with_stmt(c, ch);
3166 case funcdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003167 return ast_for_funcdef(c, ch, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003168 case classdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003169 return ast_for_classdef(c, ch, NULL);
3170 case decorated:
3171 return ast_for_decorated(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003172 default:
3173 PyErr_Format(PyExc_SystemError,
3174 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3175 TYPE(n), NCH(n));
3176 return NULL;
3177 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178 }
3179}
3180
3181static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003182parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003184 const char *end;
3185 long x;
3186 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187#ifndef WITHOUT_COMPLEX
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003188 Py_complex complex;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003189 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190#endif
3191
Mark Dickinson422ce062008-12-05 17:59:46 +00003192 assert(s != NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003193 errno = 0;
3194 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003196 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003198 if (*end == 'l' || *end == 'L')
3199 return PyLong_FromString((char *)s, (char **)0, 0);
Mark Dickinson64b7e502008-07-16 09:40:03 +00003200 x = PyOS_strtol((char *)s, (char **)&end, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003201 if (*end == '\0') {
3202 if (errno != 0)
3203 return PyLong_FromString((char *)s, (char **)0, 0);
3204 return PyInt_FromLong(x);
3205 }
3206 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003208 if (imflag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003209 complex.real = 0.;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003210 PyFPE_START_PROTECT("atof", return 0)
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003211 complex.imag = PyOS_ascii_atof(s);
3212 PyFPE_END_PROTECT(complex)
3213 return PyComplex_FromCComplex(complex);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003214 }
3215 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003217 {
3218 PyFPE_START_PROTECT("atof", return 0)
3219 dx = PyOS_ascii_atof(s);
3220 PyFPE_END_PROTECT(dx)
3221 return PyFloat_FromDouble(dx);
3222 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223}
3224
3225static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003226decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227{
3228#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003229 Py_FatalError("decode_utf8 should not be called in this build.");
3230 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003232 PyObject *u, *v;
3233 char *s, *t;
3234 t = s = (char *)*sPtr;
3235 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3236 while (s < end && (*s & 0x80)) s++;
3237 *sPtr = s;
3238 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3239 if (u == NULL)
3240 return NULL;
3241 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3242 Py_DECREF(u);
3243 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244#endif
3245}
3246
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003247#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003249decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003251 PyObject *v, *u;
3252 char *buf;
3253 char *p;
3254 const char *end;
3255 if (encoding == NULL) {
3256 buf = (char *)s;
3257 u = NULL;
3258 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3259 buf = (char *)s;
3260 u = NULL;
3261 } else {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003262 /* check for integer overflow */
3263 if (len > PY_SIZE_MAX / 4)
3264 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003265 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003266 u = PyString_FromStringAndSize((char *)NULL, len * 4);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003267 if (u == NULL)
3268 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003269 p = buf = PyString_AsString(u);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003270 end = s + len;
3271 while (s < end) {
3272 if (*s == '\\') {
3273 *p++ = *s++;
3274 if (*s & 0x80) {
3275 strcpy(p, "u005c");
3276 p += 5;
3277 }
3278 }
3279 if (*s & 0x80) { /* XXX inefficient */
3280 PyObject *w;
3281 char *r;
3282 Py_ssize_t rn, i;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003283 w = decode_utf8(c, &s, end, "utf-16-be");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003284 if (w == NULL) {
3285 Py_DECREF(u);
3286 return NULL;
3287 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003288 r = PyString_AsString(w);
3289 rn = PyString_Size(w);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003290 assert(rn % 2 == 0);
3291 for (i = 0; i < rn; i += 2) {
3292 sprintf(p, "\\u%02x%02x",
3293 r[i + 0] & 0xFF,
3294 r[i + 1] & 0xFF);
3295 p += 6;
3296 }
3297 Py_DECREF(w);
3298 } else {
3299 *p++ = *s++;
3300 }
3301 }
3302 len = p - buf;
3303 s = buf;
3304 }
3305 if (rawmode)
3306 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3307 else
3308 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3309 Py_XDECREF(u);
3310 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003312#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313
3314/* s is a Python string literal, including the bracketing quote characters,
3315 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3316 * parsestr parses it, and returns the decoded Python string object.
3317 */
3318static PyObject *
Christian Heimes3c608332008-03-26 22:01:37 +00003319parsestr(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003321 size_t len;
3322 int quote = Py_CHARMASK(*s);
3323 int rawmode = 0;
3324 int need_encoding;
Christian Heimes3c608332008-03-26 22:01:37 +00003325 int unicode = c->c_future_unicode;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003327 if (isalpha(quote) || quote == '_') {
3328 if (quote == 'u' || quote == 'U') {
3329 quote = *++s;
3330 unicode = 1;
3331 }
Christian Heimes288e89a2008-01-18 18:24:07 +00003332 if (quote == 'b' || quote == 'B') {
3333 quote = *++s;
Christian Heimes3c608332008-03-26 22:01:37 +00003334 unicode = 0;
Christian Heimes288e89a2008-01-18 18:24:07 +00003335 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003336 if (quote == 'r' || quote == 'R') {
3337 quote = *++s;
3338 rawmode = 1;
3339 }
3340 }
3341 if (quote != '\'' && quote != '\"') {
3342 PyErr_BadInternalCall();
3343 return NULL;
3344 }
3345 s++;
3346 len = strlen(s);
3347 if (len > INT_MAX) {
3348 PyErr_SetString(PyExc_OverflowError,
3349 "string to parse is too long");
3350 return NULL;
3351 }
3352 if (s[--len] != quote) {
3353 PyErr_BadInternalCall();
3354 return NULL;
3355 }
3356 if (len >= 4 && s[0] == quote && s[1] == quote) {
3357 s += 2;
3358 len -= 2;
3359 if (s[--len] != quote || s[--len] != quote) {
3360 PyErr_BadInternalCall();
3361 return NULL;
3362 }
3363 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003365 if (unicode || Py_UnicodeFlag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003366 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003367 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368#endif
Christian Heimes3c608332008-03-26 22:01:37 +00003369 need_encoding = (c->c_encoding != NULL &&
3370 strcmp(c->c_encoding, "utf-8") != 0 &&
3371 strcmp(c->c_encoding, "iso-8859-1") != 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003372 if (rawmode || strchr(s, '\\') == NULL) {
3373 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003375 /* This should not happen - we never see any other
3376 encoding. */
3377 Py_FatalError(
3378 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003380 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3381 if (u == NULL)
3382 return NULL;
Christian Heimes3c608332008-03-26 22:01:37 +00003383 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003384 Py_DECREF(u);
3385 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003387 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003388 return PyString_FromStringAndSize(s, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003389 }
3390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003392 return PyString_DecodeEscape(s, len, NULL, unicode,
Christian Heimes3c608332008-03-26 22:01:37 +00003393 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394}
3395
3396/* Build a Python string object out of a STRING atom. This takes care of
3397 * compile-time literal catenation, calling parsestr() on each piece, and
3398 * pasting the intermediate results together.
3399 */
3400static PyObject *
3401parsestrplus(struct compiling *c, const node *n)
3402{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003403 PyObject *v;
3404 int i;
3405 REQ(CHILD(n, 0), STRING);
Christian Heimes3c608332008-03-26 22:01:37 +00003406 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003407 /* String literal concatenation */
3408 for (i = 1; i < NCH(n); i++) {
3409 PyObject *s;
Christian Heimes3c608332008-03-26 22:01:37 +00003410 s = parsestr(c, STR(CHILD(n, i)));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003411 if (s == NULL)
3412 goto onError;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003413 if (PyString_Check(v) && PyString_Check(s)) {
3414 PyString_ConcatAndDel(&v, s);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003415 if (v == NULL)
3416 goto onError;
3417 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003418#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003419 else {
3420 PyObject *temp = PyUnicode_Concat(v, s);
3421 Py_DECREF(s);
3422 Py_DECREF(v);
3423 v = temp;
3424 if (v == NULL)
3425 goto onError;
3426 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003428 }
3429 }
3430 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003431
3432 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003433 Py_XDECREF(v);
3434 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003435}