blob: 9673cec2dbbc732beafd50151e0e31cd45094169 [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);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050 PyArena_AddPyObject(arena, id);
51 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000052}
53
Neal Norwitzadb69fc2005-12-17 20:54:49 +000054#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055
56/* This routine provides an invalid object for the syntax error.
57 The outermost routine must unpack this error and create the
58 proper object. We do this so that we don't have to pass
59 the filename to everything function.
60
61 XXX Maybe we should just pass the filename...
62*/
63
64static int
65ast_error(const node *n, const char *errstr)
66{
67 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
68 if (!u)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000069 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000070 PyErr_SetObject(PyExc_SyntaxError, u);
71 Py_DECREF(u);
72 return 0;
73}
74
75static void
76ast_error_finish(const char *filename)
77{
78 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000079 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000080
81 assert(PyErr_Occurred());
82 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000083 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000084
85 PyErr_Fetch(&type, &value, &tback);
86 errstr = PyTuple_GetItem(value, 0);
87 if (!errstr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000088 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000089 Py_INCREF(errstr);
90 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000091 if (lineno == -1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000092 Py_DECREF(errstr);
93 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000094 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 Py_DECREF(value);
96
97 loc = PyErr_ProgramText(filename, lineno);
98 if (!loc) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000099 Py_INCREF(Py_None);
100 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000101 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000102 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000104 if (!tmp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000105 Py_DECREF(errstr);
106 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000107 }
Georg Brandl7784f122006-05-26 20:04:44 +0000108 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000109 Py_DECREF(errstr);
110 Py_DECREF(tmp);
111 if (!value)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000112 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000113 PyErr_Restore(type, value, tback);
114}
115
Benjamin Petersoncbd78132008-06-08 15:45:23 +0000116static int
117ast_warn(struct compiling *c, const node *n, char *msg)
118{
119 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, LINENO(n),
120 NULL, NULL) < 0) {
121 /* if -Werr, change it to a SyntaxError */
122 if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning))
123 ast_error(n, msg);
124 return 0;
125 }
126 return 1;
127}
128
Benjamin Petersond5efd202008-06-08 22:52:37 +0000129static int
130forbidden_check(struct compiling *c, const node *n, const char *x)
131{
132 if (!strcmp(x, "None"))
133 return ast_error(n, "assignment to None");
134 if (Py_Py3kWarningFlag && !(strcmp(x, "True") && strcmp(x, "False")) &&
135 !ast_warn(c, n, "assignment to True or False is forbidden in 3.x"))
136 return 0;
137 return 1;
138}
139
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140/* num_stmts() returns number of contained statements.
141
142 Use this routine to determine how big a sequence is needed for
143 the statements in a parse tree. Its raison d'etre is this bit of
144 grammar:
145
146 stmt: simple_stmt | compound_stmt
147 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
148
149 A simple_stmt can contain multiple small_stmt elements joined
150 by semicolons. If the arg is a simple_stmt, the number of
151 small_stmt elements is returned.
152*/
153
154static int
155num_stmts(const node *n)
156{
157 int i, l;
158 node *ch;
159
160 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000161 case single_input:
162 if (TYPE(CHILD(n, 0)) == NEWLINE)
163 return 0;
164 else
165 return num_stmts(CHILD(n, 0));
166 case file_input:
167 l = 0;
168 for (i = 0; i < NCH(n); i++) {
169 ch = CHILD(n, i);
170 if (TYPE(ch) == stmt)
171 l += num_stmts(ch);
172 }
173 return l;
174 case stmt:
175 return num_stmts(CHILD(n, 0));
176 case compound_stmt:
177 return 1;
178 case simple_stmt:
179 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
180 case suite:
181 if (NCH(n) == 1)
182 return num_stmts(CHILD(n, 0));
183 else {
184 l = 0;
185 for (i = 2; i < (NCH(n) - 1); i++)
186 l += num_stmts(CHILD(n, i));
187 return l;
188 }
189 default: {
190 char buf[128];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000191
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000192 sprintf(buf, "Non-statement found: %d %d\n",
193 TYPE(n), NCH(n));
194 Py_FatalError(buf);
195 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196 }
197 assert(0);
198 return 0;
199}
200
201/* Transform the CST rooted at node * to the appropriate AST
202*/
203
204mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000205PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000206 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000208 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209 asdl_seq *stmts = NULL;
210 stmt_ty s;
211 node *ch;
212 struct compiling c;
213
214 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000215 c.c_encoding = "utf-8";
216 if (TYPE(n) == encoding_decl) {
217 ast_error(n, "encoding declaration in Unicode string");
218 goto error;
219 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000220 } else if (TYPE(n) == encoding_decl) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000221 c.c_encoding = STR(n);
222 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223 } else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000224 c.c_encoding = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 }
Christian Heimes3c608332008-03-26 22:01:37 +0000226 c.c_future_unicode = flags && flags->cf_flags & CO_FUTURE_UNICODE_LITERALS;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000227 c.c_arena = arena;
Christian Heimesffcd1e12007-11-24 01:36:02 +0000228 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000229
Jeremy Hyltona8293132006-02-28 17:58:27 +0000230 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000232 case file_input:
233 stmts = asdl_seq_new(num_stmts(n), arena);
234 if (!stmts)
235 return NULL;
236 for (i = 0; i < NCH(n) - 1; i++) {
237 ch = CHILD(n, i);
238 if (TYPE(ch) == NEWLINE)
239 continue;
240 REQ(ch, stmt);
241 num = num_stmts(ch);
242 if (num == 1) {
243 s = ast_for_stmt(&c, ch);
244 if (!s)
245 goto error;
246 asdl_seq_SET(stmts, k++, s);
247 }
248 else {
249 ch = CHILD(ch, 0);
250 REQ(ch, simple_stmt);
251 for (j = 0; j < num; j++) {
252 s = ast_for_stmt(&c, CHILD(ch, j * 2));
253 if (!s)
254 goto error;
255 asdl_seq_SET(stmts, k++, s);
256 }
257 }
258 }
259 return Module(stmts, arena);
260 case eval_input: {
261 expr_ty testlist_ast;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000263 /* XXX Why not gen_for here? */
264 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
265 if (!testlist_ast)
266 goto error;
267 return Expression(testlist_ast, arena);
268 }
269 case single_input:
270 if (TYPE(CHILD(n, 0)) == NEWLINE) {
271 stmts = asdl_seq_new(1, arena);
272 if (!stmts)
273 goto error;
274 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
275 arena));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000276 if (!asdl_seq_GET(stmts, 0))
277 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000278 return Interactive(stmts, arena);
279 }
280 else {
281 n = CHILD(n, 0);
282 num = num_stmts(n);
283 stmts = asdl_seq_new(num, arena);
284 if (!stmts)
285 goto error;
286 if (num == 1) {
287 s = ast_for_stmt(&c, n);
288 if (!s)
289 goto error;
290 asdl_seq_SET(stmts, 0, s);
291 }
292 else {
293 /* Only a simple_stmt can contain multiple statements. */
294 REQ(n, simple_stmt);
295 for (i = 0; i < NCH(n); i += 2) {
296 if (TYPE(CHILD(n, i)) == NEWLINE)
297 break;
298 s = ast_for_stmt(&c, CHILD(n, i));
299 if (!s)
300 goto error;
301 asdl_seq_SET(stmts, i / 2, s);
302 }
303 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000304
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000305 return Interactive(stmts, arena);
306 }
307 default:
Georg Brandlb8ae3d02007-05-02 20:02:29 +0000308 PyErr_Format(PyExc_SystemError,
309 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000310 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000313 ast_error_finish(filename);
314 return NULL;
315}
316
317/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
318*/
319
320static operator_ty
321get_operator(const node *n)
322{
323 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000324 case VBAR:
325 return BitOr;
326 case CIRCUMFLEX:
327 return BitXor;
328 case AMPER:
329 return BitAnd;
330 case LEFTSHIFT:
331 return LShift;
332 case RIGHTSHIFT:
333 return RShift;
334 case PLUS:
335 return Add;
336 case MINUS:
337 return Sub;
338 case STAR:
339 return Mult;
340 case SLASH:
341 return Div;
342 case DOUBLESLASH:
343 return FloorDiv;
344 case PERCENT:
345 return Mod;
346 default:
347 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000348 }
349}
350
Jeremy Hyltona8293132006-02-28 17:58:27 +0000351/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352
353 Only sets context for expr kinds that "can appear in assignment context"
354 (according to ../Parser/Python.asdl). For other expr kinds, it sets
355 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356*/
357
358static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000359set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000360{
361 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000362 /* If a particular expression type can't be used for assign / delete,
363 set expr_name to its name and an error message will be generated.
364 */
365 const char* expr_name = NULL;
366
367 /* The ast defines augmented store and load contexts, but the
368 implementation here doesn't actually use them. The code may be
369 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000370 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000371 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000372 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000373 */
374 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375
376 switch (e->kind) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000377 case Attribute_kind:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000378 if (ctx == Store && !forbidden_check(c, n,
379 PyBytes_AS_STRING(e->v.Attribute.attr)))
380 return 0;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000381 e->v.Attribute.ctx = ctx;
382 break;
383 case Subscript_kind:
384 e->v.Subscript.ctx = ctx;
385 break;
386 case Name_kind:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000387 if (ctx == Store && !forbidden_check(c, n,
388 PyBytes_AS_STRING(e->v.Name.id)))
389 return 0;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000390 e->v.Name.ctx = ctx;
391 break;
392 case List_kind:
393 e->v.List.ctx = ctx;
394 s = e->v.List.elts;
395 break;
396 case Tuple_kind:
397 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
398 return ast_error(n, "can't assign to ()");
399 e->v.Tuple.ctx = ctx;
400 s = e->v.Tuple.elts;
401 break;
402 case Lambda_kind:
403 expr_name = "lambda";
404 break;
405 case Call_kind:
406 expr_name = "function call";
407 break;
408 case BoolOp_kind:
409 case BinOp_kind:
410 case UnaryOp_kind:
411 expr_name = "operator";
412 break;
413 case GeneratorExp_kind:
414 expr_name = "generator expression";
415 break;
416 case Yield_kind:
417 expr_name = "yield expression";
418 break;
419 case ListComp_kind:
420 expr_name = "list comprehension";
421 break;
422 case Dict_kind:
423 case Num_kind:
424 case Str_kind:
425 expr_name = "literal";
426 break;
427 case Compare_kind:
428 expr_name = "comparison";
429 break;
430 case Repr_kind:
431 expr_name = "repr";
432 break;
433 case IfExp_kind:
434 expr_name = "conditional expression";
435 break;
436 default:
437 PyErr_Format(PyExc_SystemError,
438 "unexpected expression in assignment %d (line %d)",
439 e->kind, e->lineno);
440 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000441 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 /* Check for error string set by switch */
443 if (expr_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000444 char buf[300];
445 PyOS_snprintf(buf, sizeof(buf),
446 "can't %s %s",
447 ctx == Store ? "assign to" : "delete",
448 expr_name);
449 return ast_error(n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 }
451
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000452 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000453 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000454 */
455 if (s) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000456 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000457
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000458 for (i = 0; i < asdl_seq_LEN(s); i++) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000459 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000460 return 0;
461 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000462 }
463 return 1;
464}
465
466static operator_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000467ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000468{
469 REQ(n, augassign);
470 n = CHILD(n, 0);
471 switch (STR(n)[0]) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000472 case '+':
473 return Add;
474 case '-':
475 return Sub;
476 case '/':
477 if (STR(n)[1] == '/')
478 return FloorDiv;
479 else
480 return Div;
481 case '%':
482 return Mod;
483 case '<':
484 return LShift;
485 case '>':
486 return RShift;
487 case '&':
488 return BitAnd;
489 case '^':
490 return BitXor;
491 case '|':
492 return BitOr;
493 case '*':
494 if (STR(n)[1] == '*')
495 return Pow;
496 else
497 return Mult;
498 default:
499 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
500 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501 }
502}
503
504static cmpop_ty
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000505ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506{
507 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000508 |'is' 'not'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 */
510 REQ(n, comp_op);
511 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000512 n = CHILD(n, 0);
513 switch (TYPE(n)) {
514 case LESS:
515 return Lt;
516 case GREATER:
517 return Gt;
518 case EQEQUAL: /* == */
519 return Eq;
520 case LESSEQUAL:
521 return LtE;
522 case GREATEREQUAL:
523 return GtE;
524 case NOTEQUAL:
525 return NotEq;
526 case NAME:
527 if (strcmp(STR(n), "in") == 0)
528 return In;
529 if (strcmp(STR(n), "is") == 0)
530 return Is;
531 default:
532 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
533 STR(n));
534 return (cmpop_ty)0;
535 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000536 }
537 else if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000538 /* handle "not in" and "is not" */
539 switch (TYPE(CHILD(n, 0))) {
540 case NAME:
541 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
542 return NotIn;
543 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
544 return IsNot;
545 default:
546 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
547 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
548 return (cmpop_ty)0;
549 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550 }
Neal Norwitz79792652005-11-14 04:25:03 +0000551 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000552 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000553 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554}
555
556static asdl_seq *
557seq_for_testlist(struct compiling *c, const node *n)
558{
559 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000560 asdl_seq *seq;
561 expr_ty expression;
562 int i;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000563 assert(TYPE(n) == testlist ||
564 TYPE(n) == listmaker ||
565 TYPE(n) == testlist_gexp ||
566 TYPE(n) == testlist_safe ||
567 TYPE(n) == testlist1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000569 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000571 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572
573 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000574 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000576 expression = ast_for_expr(c, CHILD(n, i));
577 if (!expression)
578 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000580 assert(i / 2 < seq->size);
581 asdl_seq_SET(seq, i / 2, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582 }
583 return seq;
584}
585
586static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000587compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588{
589 int i, len = (NCH(n) + 1) / 2;
590 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000591 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000593 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594
Neal Norwitz3a230172006-09-22 08:18:10 +0000595 /* fpdef: NAME | '(' fplist ')'
596 fplist: fpdef (',' fpdef)* [',']
597 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 for (i = 0; i < len; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000600 const node *fpdef_node = CHILD(n, 2*i);
601 const node *child;
602 expr_ty arg;
Neal Norwitz3a230172006-09-22 08:18:10 +0000603set_name:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000604 /* fpdef_node is either a NAME or an fplist */
605 child = CHILD(fpdef_node, 0);
606 if (TYPE(child) == NAME) {
Benjamin Petersond5efd202008-06-08 22:52:37 +0000607 if (!forbidden_check(c, n, STR(child)))
608 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000609 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
610 child->n_col_offset, c->c_arena);
611 }
612 else {
613 assert(TYPE(fpdef_node) == fpdef);
614 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
615 child = CHILD(fpdef_node, 1);
616 assert(TYPE(child) == fplist);
617 /* NCH == 1 means we have (x), we need to elide the extra parens */
618 if (NCH(child) == 1) {
619 fpdef_node = CHILD(child, 0);
620 assert(TYPE(fpdef_node) == fpdef);
621 goto set_name;
622 }
623 arg = compiler_complex_args(c, child);
624 }
625 asdl_seq_SET(args, i, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000626 }
627
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000628 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000629 if (!set_context(c, result, Store, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000630 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631 return result;
632}
633
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000634
Jeremy Hyltona8293132006-02-28 17:58:27 +0000635/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636
637static arguments_ty
638ast_for_arguments(struct compiling *c, const node *n)
639{
640 /* parameters: '(' [varargslist] ')'
641 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000642 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000643 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000644 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645 asdl_seq *args, *defaults;
646 identifier vararg = NULL, kwarg = NULL;
647 node *ch;
648
649 if (TYPE(n) == parameters) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000650 if (NCH(n) == 2) /* () as argument list */
651 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
652 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653 }
654 REQ(n, varargslist);
655
656 /* first count the number of normal args & defaults */
657 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000658 ch = CHILD(n, i);
659 if (TYPE(ch) == fpdef)
660 n_args++;
661 if (TYPE(ch) == EQUAL)
662 n_defaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000663 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000664 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665 if (!args && n_args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000666 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000667 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000668 if (!defaults && n_defaults)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000669 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670
671 /* fpdef: NAME | '(' fplist ')'
672 fplist: fpdef (',' fpdef)* [',']
673 */
674 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000675 j = 0; /* index for defaults */
676 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 while (i < NCH(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000678 ch = CHILD(n, i);
679 switch (TYPE(ch)) {
680 case fpdef:
681 handle_fpdef:
682 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
683 anything other than EQUAL or a comma? */
684 /* XXX Should NCH(n) check be made a separate check? */
685 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
686 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
687 if (!expression)
688 goto error;
689 assert(defaults != NULL);
690 asdl_seq_SET(defaults, j++, expression);
691 i += 2;
692 found_default = 1;
693 }
694 else if (found_default) {
695 ast_error(n,
696 "non-default argument follows default argument");
697 goto error;
698 }
699 if (NCH(ch) == 3) {
700 ch = CHILD(ch, 1);
701 /* def foo((x)): is not complex, special case. */
702 if (NCH(ch) != 1) {
703 /* We have complex arguments, setup for unpacking. */
Benjamin Petersonf4fcdb62008-06-08 23:00:00 +0000704 if (Py_Py3kWarningFlag && !ast_warn(c, ch,
705 "tuple parameter unpacking has been removed in 3.x"))
706 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000707 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000708 if (!asdl_seq_GET(args, k-1))
709 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000710 } else {
711 /* def foo((x)): setup for checking NAME below. */
712 /* Loop because there can be many parens and tuple
713 unpacking mixed in. */
714 ch = CHILD(ch, 0);
715 assert(TYPE(ch) == fpdef);
716 goto handle_fpdef;
717 }
718 }
719 if (TYPE(CHILD(ch, 0)) == NAME) {
720 expr_ty name;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000721 if (!forbidden_check(c, n, STR(CHILD(ch, 0))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000722 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000723 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
724 Param, LINENO(ch), ch->n_col_offset,
725 c->c_arena);
726 if (!name)
727 goto error;
728 asdl_seq_SET(args, k++, name);
729
730 }
731 i += 2; /* the name and the comma */
732 break;
733 case STAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000734 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000735 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000736 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
737 i += 3;
738 break;
739 case DOUBLESTAR:
Benjamin Petersond5efd202008-06-08 22:52:37 +0000740 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000741 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000742 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
743 i += 3;
744 break;
745 default:
746 PyErr_Format(PyExc_SystemError,
747 "unexpected node in varargslist: %d @ %d",
748 TYPE(ch), i);
749 goto error;
750 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 }
752
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000753 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754
755 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000756 Py_XDECREF(vararg);
757 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 return NULL;
759}
760
761static expr_ty
762ast_for_dotted_name(struct compiling *c, const node *n)
763{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000764 expr_ty e;
765 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000766 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 int i;
768
769 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000770
771 lineno = LINENO(n);
772 col_offset = n->n_col_offset;
773
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 id = NEW_IDENTIFIER(CHILD(n, 0));
775 if (!id)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000776 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000777 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000779 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780
781 for (i = 2; i < NCH(n); i+=2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000782 id = NEW_IDENTIFIER(CHILD(n, i));
783 if (!id)
784 return NULL;
785 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
786 if (!e)
787 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788 }
789
790 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791}
792
793static expr_ty
794ast_for_decorator(struct compiling *c, const node *n)
795{
796 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
797 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000798 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799
800 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000801 REQ(CHILD(n, 0), AT);
802 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803
804 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
805 if (!name_expr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000806 return NULL;
807
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000808 if (NCH(n) == 3) { /* No arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000809 d = name_expr;
810 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 }
812 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000813 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
814 n->n_col_offset, c->c_arena);
815 if (!d)
816 return NULL;
817 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818 }
819 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000820 d = ast_for_call(c, CHILD(n, 3), name_expr);
821 if (!d)
822 return NULL;
823 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 }
825
826 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827}
828
829static asdl_seq*
830ast_for_decorators(struct compiling *c, const node *n)
831{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000832 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000833 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 int i;
835
836 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000837 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 if (!decorator_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000839 return NULL;
840
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000842 d = ast_for_decorator(c, CHILD(n, i));
843 if (!d)
844 return NULL;
845 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846 }
847 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848}
849
850static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +0000851ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852{
Christian Heimes5224d282008-02-23 15:01:05 +0000853 /* funcdef: 'def' NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000854 identifier name;
855 arguments_ty args;
856 asdl_seq *body;
Christian Heimes5224d282008-02-23 15:01:05 +0000857 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858
859 REQ(n, funcdef);
860
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861 name = NEW_IDENTIFIER(CHILD(n, name_i));
862 if (!name)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000863 return NULL;
Benjamin Petersond5efd202008-06-08 22:52:37 +0000864 else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000865 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 args = ast_for_arguments(c, CHILD(n, name_i + 1));
867 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000868 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869 body = ast_for_suite(c, CHILD(n, name_i + 3));
870 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000871 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000873 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000874 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875}
876
Christian Heimes5224d282008-02-23 15:01:05 +0000877static stmt_ty
878ast_for_decorated(struct compiling *c, const node *n)
879{
880 /* decorated: decorators (classdef | funcdef) */
881 stmt_ty thing = NULL;
882 asdl_seq *decorator_seq = NULL;
883
884 REQ(n, decorated);
885
886 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
887 if (!decorator_seq)
888 return NULL;
889
890 assert(TYPE(CHILD(n, 1)) == funcdef ||
891 TYPE(CHILD(n, 1)) == classdef);
892
893 if (TYPE(CHILD(n, 1)) == funcdef) {
894 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
895 } else if (TYPE(CHILD(n, 1)) == classdef) {
896 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
897 }
898 /* we count the decorators in when talking about the class' or
899 function's line number */
900 if (thing) {
901 thing->lineno = LINENO(n);
902 thing->col_offset = n->n_col_offset;
903 }
904 return thing;
905}
906
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907static expr_ty
908ast_for_lambdef(struct compiling *c, const node *n)
909{
910 /* lambdef: 'lambda' [varargslist] ':' test */
911 arguments_ty args;
912 expr_ty expression;
913
914 if (NCH(n) == 3) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000915 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
916 if (!args)
917 return NULL;
918 expression = ast_for_expr(c, CHILD(n, 2));
919 if (!expression)
920 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 }
922 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000923 args = ast_for_arguments(c, CHILD(n, 1));
924 if (!args)
925 return NULL;
926 expression = ast_for_expr(c, CHILD(n, 3));
927 if (!expression)
928 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929 }
930
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000931 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932}
933
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000934static expr_ty
935ast_for_ifexpr(struct compiling *c, const node *n)
936{
937 /* test: or_test 'if' or_test 'else' test */
938 expr_ty expression, body, orelse;
939
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000940 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000941 body = ast_for_expr(c, CHILD(n, 0));
942 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000943 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000944 expression = ast_for_expr(c, CHILD(n, 2));
945 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000946 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000947 orelse = ast_for_expr(c, CHILD(n, 4));
948 if (!orelse)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000949 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000950 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000951 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000952}
953
Neal Norwitze4d4f002006-09-05 03:58:26 +0000954/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
955 so there is only a single version. Possibly for loops can also re-use
956 the code.
957*/
958
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959/* Count the number of 'for' loop in a list comprehension.
960
961 Helper for ast_for_listcomp().
962*/
963
964static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +0000965count_list_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966{
967 int n_fors = 0;
968 node *ch = CHILD(n, 1);
969
970 count_list_for:
971 n_fors++;
972 REQ(ch, list_for);
973 if (NCH(ch) == 5)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000974 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000976 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 count_list_iter:
978 REQ(ch, list_iter);
979 ch = CHILD(ch, 0);
980 if (TYPE(ch) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000981 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 else if (TYPE(ch) == list_if) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000983 if (NCH(ch) == 3) {
984 ch = CHILD(ch, 2);
985 goto count_list_iter;
986 }
987 else
988 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000990
991 /* Should never be reached */
992 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
993 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994}
995
996/* Count the number of 'if' statements in a list comprehension.
997
998 Helper for ast_for_listcomp().
999*/
1000
1001static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001002count_list_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003{
1004 int n_ifs = 0;
1005
1006 count_list_iter:
1007 REQ(n, list_iter);
1008 if (TYPE(CHILD(n, 0)) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001009 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 n = CHILD(n, 0);
1011 REQ(n, list_if);
1012 n_ifs++;
1013 if (NCH(n) == 2)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001014 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015 n = CHILD(n, 2);
1016 goto count_list_iter;
1017}
1018
1019static expr_ty
1020ast_for_listcomp(struct compiling *c, const node *n)
1021{
1022 /* listmaker: test ( list_for | (',' test)* [','] )
1023 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1024 list_iter: list_for | list_if
1025 list_if: 'if' test [list_iter]
1026 testlist_safe: test [(',' test)+ [',']]
1027 */
1028 expr_ty elt;
1029 asdl_seq *listcomps;
1030 int i, n_fors;
1031 node *ch;
1032
1033 REQ(n, listmaker);
1034 assert(NCH(n) > 1);
1035
1036 elt = ast_for_expr(c, CHILD(n, 0));
1037 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001038 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001040 n_fors = count_list_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001044 listcomps = asdl_seq_new(n_fors, c->c_arena);
1045 if (!listcomps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001046 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001047
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048 ch = CHILD(n, 1);
1049 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001050 comprehension_ty lc;
1051 asdl_seq *t;
1052 expr_ty expression;
1053 node *for_ch;
1054
1055 REQ(ch, list_for);
1056
1057 for_ch = CHILD(ch, 1);
1058 t = ast_for_exprlist(c, for_ch, Store);
1059 if (!t)
1060 return NULL;
1061 expression = ast_for_testlist(c, CHILD(ch, 3));
1062 if (!expression)
1063 return NULL;
1064
1065 /* Check the # of children rather than the length of t, since
1066 [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1067 */
1068 if (NCH(for_ch) == 1)
1069 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
1070 c->c_arena);
1071 else
1072 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1073 c->c_arena),
1074 expression, NULL, c->c_arena);
1075 if (!lc)
1076 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001078 if (NCH(ch) == 5) {
1079 int j, n_ifs;
1080 asdl_seq *ifs;
1081 expr_ty list_for_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001083 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001084 n_ifs = count_list_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001085 if (n_ifs == -1)
1086 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001088 ifs = asdl_seq_new(n_ifs, c->c_arena);
1089 if (!ifs)
1090 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001092 for (j = 0; j < n_ifs; j++) {
1093 REQ(ch, list_iter);
1094 ch = CHILD(ch, 0);
1095 REQ(ch, list_if);
1096
1097 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1098 if (!list_for_expr)
1099 return NULL;
1100
1101 asdl_seq_SET(ifs, j, list_for_expr);
1102 if (NCH(ch) == 3)
1103 ch = CHILD(ch, 2);
1104 }
1105 /* on exit, must guarantee that ch is a list_for */
1106 if (TYPE(ch) == list_iter)
1107 ch = CHILD(ch, 0);
1108 lc->ifs = ifs;
1109 }
1110 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111 }
1112
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001113 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114}
1115
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001116/* Count the number of 'for' loops in a generator expression.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117
1118 Helper for ast_for_genexp().
1119*/
1120
1121static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001122count_gen_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001124 int n_fors = 0;
1125 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126
1127 count_gen_for:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001128 n_fors++;
1129 REQ(ch, gen_for);
1130 if (NCH(ch) == 5)
1131 ch = CHILD(ch, 4);
1132 else
1133 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 count_gen_iter:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001135 REQ(ch, gen_iter);
1136 ch = CHILD(ch, 0);
1137 if (TYPE(ch) == gen_for)
1138 goto count_gen_for;
1139 else if (TYPE(ch) == gen_if) {
1140 if (NCH(ch) == 3) {
1141 ch = CHILD(ch, 2);
1142 goto count_gen_iter;
1143 }
1144 else
1145 return n_fors;
1146 }
1147
1148 /* Should never be reached */
1149 PyErr_SetString(PyExc_SystemError,
1150 "logic error in count_gen_fors");
1151 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152}
1153
1154/* Count the number of 'if' statements in a generator expression.
1155
1156 Helper for ast_for_genexp().
1157*/
1158
1159static int
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001160count_gen_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001162 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001164 while (1) {
1165 REQ(n, gen_iter);
1166 if (TYPE(CHILD(n, 0)) == gen_for)
1167 return n_ifs;
1168 n = CHILD(n, 0);
1169 REQ(n, gen_if);
1170 n_ifs++;
1171 if (NCH(n) == 2)
1172 return n_ifs;
1173 n = CHILD(n, 2);
1174 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175}
1176
Jeremy Hyltona8293132006-02-28 17:58:27 +00001177/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178static expr_ty
1179ast_for_genexp(struct compiling *c, const node *n)
1180{
1181 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001182 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 expr_ty elt;
1184 asdl_seq *genexps;
1185 int i, n_fors;
1186 node *ch;
1187
1188 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1189 assert(NCH(n) > 1);
1190
1191 elt = ast_for_expr(c, CHILD(n, 0));
1192 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001193 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001195 n_fors = count_gen_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001197 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001198
1199 genexps = asdl_seq_new(n_fors, c->c_arena);
1200 if (!genexps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001201 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 ch = CHILD(n, 1);
1204 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001205 comprehension_ty ge;
1206 asdl_seq *t;
1207 expr_ty expression;
1208 node *for_ch;
1209
1210 REQ(ch, gen_for);
1211
1212 for_ch = CHILD(ch, 1);
1213 t = ast_for_exprlist(c, for_ch, Store);
1214 if (!t)
1215 return NULL;
1216 expression = ast_for_expr(c, CHILD(ch, 3));
1217 if (!expression)
1218 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001219
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001220 /* Check the # of children rather than the length of t, since
1221 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1222 if (NCH(for_ch) == 1)
1223 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1224 NULL, c->c_arena);
1225 else
1226 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1227 c->c_arena),
1228 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001229
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001230 if (!ge)
1231 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001232
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001233 if (NCH(ch) == 5) {
1234 int j, n_ifs;
1235 asdl_seq *ifs;
1236
1237 ch = CHILD(ch, 4);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001238 n_ifs = count_gen_ifs(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001239 if (n_ifs == -1)
1240 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001241
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001242 ifs = asdl_seq_new(n_ifs, c->c_arena);
1243 if (!ifs)
1244 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001245
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001246 for (j = 0; j < n_ifs; j++) {
1247 REQ(ch, gen_iter);
1248 ch = CHILD(ch, 0);
1249 REQ(ch, gen_if);
1250
1251 expression = ast_for_expr(c, CHILD(ch, 1));
1252 if (!expression)
1253 return NULL;
1254 asdl_seq_SET(ifs, j, expression);
1255 if (NCH(ch) == 3)
1256 ch = CHILD(ch, 2);
1257 }
1258 /* on exit, must guarantee that ch is a gen_for */
1259 if (TYPE(ch) == gen_iter)
1260 ch = CHILD(ch, 0);
1261 ge->ifs = ifs;
1262 }
1263 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264 }
1265
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001266 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267}
1268
1269static expr_ty
1270ast_for_atom(struct compiling *c, const node *n)
1271{
1272 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1273 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1274 */
1275 node *ch = CHILD(n, 0);
1276
1277 switch (TYPE(ch)) {
1278 case NAME:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001279 /* All names start in Load context, but may later be
1280 changed. */
1281 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset,
1282 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 case STRING: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001284 PyObject *str = parsestrplus(c, n);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001285 if (!str) {
Georg Brandldfe5dc82008-01-07 18:16:36 +00001286#ifdef Py_USING_UNICODE
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001287 if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
1288 PyObject *type, *value, *tback, *errstr;
1289 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson71ce9e72008-11-21 22:52:21 +00001290 errstr = PyObject_Str(value);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001291 if (errstr) {
1292 char *s = "";
1293 char buf[128];
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001294 s = PyString_AsString(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001295 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1296 ast_error(n, buf);
Benjamin Peterson71ce9e72008-11-21 22:52:21 +00001297 Py_DECREF(errstr);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001298 } else {
1299 ast_error(n, "(unicode error) unknown error");
1300 }
1301 Py_DECREF(type);
1302 Py_DECREF(value);
1303 Py_XDECREF(tback);
1304 }
Georg Brandldfe5dc82008-01-07 18:16:36 +00001305#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001306 return NULL;
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001307 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001308 PyArena_AddPyObject(c->c_arena, str);
1309 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 }
1311 case NUMBER: {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001312 PyObject *pynum = parsenumber(c, STR(ch));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001313 if (!pynum)
1314 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001315
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001316 PyArena_AddPyObject(c->c_arena, pynum);
1317 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 }
1319 case LPAR: /* some parenthesized expressions */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001320 ch = CHILD(n, 1);
1321
1322 if (TYPE(ch) == RPAR)
1323 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1324
1325 if (TYPE(ch) == yield_expr)
1326 return ast_for_expr(c, ch);
1327
1328 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1329 return ast_for_genexp(c, ch);
1330
1331 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 case LSQB: /* list (or list comprehension) */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001333 ch = CHILD(n, 1);
1334
1335 if (TYPE(ch) == RSQB)
1336 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1337
1338 REQ(ch, listmaker);
1339 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1340 asdl_seq *elts = seq_for_testlist(c, ch);
1341 if (!elts)
1342 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001343
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001344 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1345 }
1346 else
1347 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 case LBRACE: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001349 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1350 int i, size;
1351 asdl_seq *keys, *values;
1352
1353 ch = CHILD(n, 1);
1354 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1355 keys = asdl_seq_new(size, c->c_arena);
1356 if (!keys)
1357 return NULL;
1358
1359 values = asdl_seq_new(size, c->c_arena);
1360 if (!values)
1361 return NULL;
1362
1363 for (i = 0; i < NCH(ch); i += 4) {
1364 expr_ty expression;
1365
1366 expression = ast_for_expr(c, CHILD(ch, i));
1367 if (!expression)
1368 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001369
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001370 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001371
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001372 expression = ast_for_expr(c, CHILD(ch, i + 2));
1373 if (!expression)
1374 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001375
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001376 asdl_seq_SET(values, i / 4, expression);
1377 }
1378 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 }
1380 case BACKQUOTE: { /* repr */
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001381 expr_ty expression;
Benjamin Petersoncbd78132008-06-08 15:45:23 +00001382 if (Py_Py3kWarningFlag &&
1383 !ast_warn(c, n, "backquote not supported in 3.x; use repr()"))
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001384 return NULL;
Christian Heimes6d8fb1a2007-11-23 13:25:31 +00001385 expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001386 if (!expression)
1387 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001388
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001389 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001390 }
1391 default:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001392 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1393 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 }
1395}
1396
1397static slice_ty
1398ast_for_slice(struct compiling *c, const node *n)
1399{
1400 node *ch;
1401 expr_ty lower = NULL, upper = NULL, step = NULL;
1402
1403 REQ(n, subscript);
1404
1405 /*
1406 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1407 sliceop: ':' [test]
1408 */
1409 ch = CHILD(n, 0);
1410 if (TYPE(ch) == DOT)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001411 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412
1413 if (NCH(n) == 1 && TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001414 /* 'step' variable hold no significance in terms of being used over
1415 other vars */
1416 step = ast_for_expr(c, ch);
1417 if (!step)
1418 return NULL;
1419
1420 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421 }
1422
1423 if (TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001424 lower = ast_for_expr(c, ch);
1425 if (!lower)
1426 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 }
1428
1429 /* If there's an upper bound it's in the second or third position. */
1430 if (TYPE(ch) == COLON) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001431 if (NCH(n) > 1) {
1432 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001434 if (TYPE(n2) == test) {
1435 upper = ast_for_expr(c, n2);
1436 if (!upper)
1437 return NULL;
1438 }
1439 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 } else if (NCH(n) > 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001441 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001443 if (TYPE(n2) == test) {
1444 upper = ast_for_expr(c, n2);
1445 if (!upper)
1446 return NULL;
1447 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 }
1449
1450 ch = CHILD(n, NCH(n) - 1);
1451 if (TYPE(ch) == sliceop) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001452 if (NCH(ch) == 1) {
1453 /* No expression, so step is None */
1454 ch = CHILD(ch, 0);
1455 step = Name(new_identifier("None", c->c_arena), Load,
1456 LINENO(ch), ch->n_col_offset, c->c_arena);
1457 if (!step)
1458 return NULL;
1459 } else {
1460 ch = CHILD(ch, 1);
1461 if (TYPE(ch) == test) {
1462 step = ast_for_expr(c, ch);
1463 if (!step)
1464 return NULL;
1465 }
1466 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 }
1468
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001469 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470}
1471
1472static expr_ty
1473ast_for_binop(struct compiling *c, const node *n)
1474{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001475 /* Must account for a sequence of expressions.
1476 How should A op B op C by represented?
1477 BinOp(BinOp(A, op, B), op, C).
1478 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001480 int i, nops;
1481 expr_ty expr1, expr2, result;
1482 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001484 expr1 = ast_for_expr(c, CHILD(n, 0));
1485 if (!expr1)
1486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001488 expr2 = ast_for_expr(c, CHILD(n, 2));
1489 if (!expr2)
1490 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001492 newoperator = get_operator(CHILD(n, 1));
1493 if (!newoperator)
1494 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001496 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1497 c->c_arena);
1498 if (!result)
1499 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001501 nops = (NCH(n) - 1) / 2;
1502 for (i = 1; i < nops; i++) {
1503 expr_ty tmp_result, tmp;
1504 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001506 newoperator = get_operator(next_oper);
1507 if (!newoperator)
1508 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001510 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1511 if (!tmp)
1512 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001514 tmp_result = BinOp(result, newoperator, tmp,
1515 LINENO(next_oper), next_oper->n_col_offset,
1516 c->c_arena);
Neal Norwitz3adac212007-10-05 03:41:19 +00001517 if (!tmp_result)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001518 return NULL;
1519 result = tmp_result;
1520 }
1521 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522}
1523
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524static expr_ty
1525ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1526{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001527 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1528 subscriptlist: subscript (',' subscript)* [',']
1529 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1530 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001531 REQ(n, trailer);
1532 if (TYPE(CHILD(n, 0)) == LPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001533 if (NCH(n) == 2)
1534 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1535 n->n_col_offset, c->c_arena);
1536 else
1537 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001538 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001539 else if (TYPE(CHILD(n, 0)) == DOT ) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001540 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
1541 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001542 }
1543 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001544 REQ(CHILD(n, 0), LSQB);
1545 REQ(CHILD(n, 2), RSQB);
1546 n = CHILD(n, 1);
1547 if (NCH(n) == 1) {
1548 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1549 if (!slc)
1550 return NULL;
1551 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1552 c->c_arena);
1553 }
1554 else {
1555 /* The grammar is ambiguous here. The ambiguity is resolved
1556 by treating the sequence as a tuple literal if there are
1557 no slice features.
1558 */
1559 int j;
1560 slice_ty slc;
1561 expr_ty e;
1562 bool simple = true;
1563 asdl_seq *slices, *elts;
1564 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1565 if (!slices)
1566 return NULL;
1567 for (j = 0; j < NCH(n); j += 2) {
1568 slc = ast_for_slice(c, CHILD(n, j));
1569 if (!slc)
1570 return NULL;
1571 if (slc->kind != Index_kind)
1572 simple = false;
1573 asdl_seq_SET(slices, j / 2, slc);
1574 }
1575 if (!simple) {
1576 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1577 Load, LINENO(n), n->n_col_offset, c->c_arena);
1578 }
1579 /* extract Index values and put them in a Tuple */
1580 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1581 if (!elts)
1582 return NULL;
1583 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1584 slc = (slice_ty)asdl_seq_GET(slices, j);
1585 assert(slc->kind == Index_kind && slc->v.Index.value);
1586 asdl_seq_SET(elts, j, slc->v.Index.value);
1587 }
1588 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1589 if (!e)
1590 return NULL;
1591 return Subscript(left_expr, Index(e, c->c_arena),
1592 Load, LINENO(n), n->n_col_offset, c->c_arena);
1593 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001594 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001595}
1596
1597static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001598ast_for_factor(struct compiling *c, const node *n)
1599{
1600 node *pfactor, *ppower, *patom, *pnum;
1601 expr_ty expression;
1602
1603 /* If the unary - operator is applied to a constant, don't generate
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001604 a UNARY_NEGATIVE opcode. Just store the approriate value as a
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001605 constant. The peephole optimizer already does something like
1606 this but it doesn't handle the case where the constant is
1607 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1608 PyLongObject.
1609 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001610 if (TYPE(CHILD(n, 0)) == MINUS &&
1611 NCH(n) == 2 &&
1612 TYPE((pfactor = CHILD(n, 1))) == factor &&
1613 NCH(pfactor) == 1 &&
1614 TYPE((ppower = CHILD(pfactor, 0))) == power &&
1615 NCH(ppower) == 1 &&
1616 TYPE((patom = CHILD(ppower, 0))) == atom &&
1617 TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1618 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1619 if (s == NULL)
1620 return NULL;
1621 s[0] = '-';
1622 strcpy(s + 1, STR(pnum));
1623 PyObject_FREE(STR(pnum));
1624 STR(pnum) = s;
1625 return ast_for_atom(c, patom);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001626 }
1627
1628 expression = ast_for_expr(c, CHILD(n, 1));
1629 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001630 return NULL;
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001631
1632 switch (TYPE(CHILD(n, 0))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001633 case PLUS:
1634 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1635 c->c_arena);
1636 case MINUS:
1637 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1638 c->c_arena);
1639 case TILDE:
1640 return UnaryOp(Invert, expression, LINENO(n),
1641 n->n_col_offset, c->c_arena);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001642 }
1643 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001644 TYPE(CHILD(n, 0)));
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001645 return NULL;
1646}
1647
1648static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001649ast_for_power(struct compiling *c, const node *n)
1650{
1651 /* power: atom trailer* ('**' factor)*
1652 */
1653 int i;
1654 expr_ty e, tmp;
1655 REQ(n, power);
1656 e = ast_for_atom(c, CHILD(n, 0));
1657 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001658 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001659 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001660 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001661 for (i = 1; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001662 node *ch = CHILD(n, i);
1663 if (TYPE(ch) != trailer)
1664 break;
1665 tmp = ast_for_trailer(c, ch, e);
1666 if (!tmp)
1667 return NULL;
1668 tmp->lineno = e->lineno;
1669 tmp->col_offset = e->col_offset;
1670 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001671 }
1672 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001673 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1674 if (!f)
1675 return NULL;
1676 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1677 if (!tmp)
1678 return NULL;
1679 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001680 }
1681 return e;
1682}
1683
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684/* Do not name a variable 'expr'! Will cause a compile error.
1685*/
1686
1687static expr_ty
1688ast_for_expr(struct compiling *c, const node *n)
1689{
1690 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001691 test: or_test ['if' or_test 'else' test] | lambdef
1692 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693 and_test: not_test ('and' not_test)*
1694 not_test: 'not' not_test | comparison
1695 comparison: expr (comp_op expr)*
1696 expr: xor_expr ('|' xor_expr)*
1697 xor_expr: and_expr ('^' and_expr)*
1698 and_expr: shift_expr ('&' shift_expr)*
1699 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1700 arith_expr: term (('+'|'-') term)*
1701 term: factor (('*'|'/'|'%'|'//') factor)*
1702 factor: ('+'|'-'|'~') factor | power
1703 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001704
1705 As well as modified versions that exist for backward compatibility,
1706 to explicitly allow:
1707 [ x for x in lambda: 0, lambda: 1 ]
1708 (which would be ambiguous without these extra rules)
1709
1710 old_test: or_test | old_lambdef
1711 old_lambdef: 'lambda' [vararglist] ':' old_test
1712
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 */
1714
1715 asdl_seq *seq;
1716 int i;
1717
1718 loop:
1719 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001720 case test:
1721 case old_test:
1722 if (TYPE(CHILD(n, 0)) == lambdef ||
1723 TYPE(CHILD(n, 0)) == old_lambdef)
1724 return ast_for_lambdef(c, CHILD(n, 0));
1725 else if (NCH(n) > 1)
1726 return ast_for_ifexpr(c, n);
1727 /* Fallthrough */
1728 case or_test:
1729 case and_test:
1730 if (NCH(n) == 1) {
1731 n = CHILD(n, 0);
1732 goto loop;
1733 }
1734 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1735 if (!seq)
1736 return NULL;
1737 for (i = 0; i < NCH(n); i += 2) {
1738 expr_ty e = ast_for_expr(c, CHILD(n, i));
1739 if (!e)
1740 return NULL;
1741 asdl_seq_SET(seq, i / 2, e);
1742 }
1743 if (!strcmp(STR(CHILD(n, 1)), "and"))
1744 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1745 c->c_arena);
1746 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1747 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1748 case not_test:
1749 if (NCH(n) == 1) {
1750 n = CHILD(n, 0);
1751 goto loop;
1752 }
1753 else {
1754 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1755 if (!expression)
1756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001758 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1759 c->c_arena);
1760 }
1761 case comparison:
1762 if (NCH(n) == 1) {
1763 n = CHILD(n, 0);
1764 goto loop;
1765 }
1766 else {
1767 expr_ty expression;
1768 asdl_int_seq *ops;
1769 asdl_seq *cmps;
1770 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1771 if (!ops)
1772 return NULL;
1773 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1774 if (!cmps) {
1775 return NULL;
1776 }
1777 for (i = 1; i < NCH(n); i += 2) {
1778 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00001780 newoperator = ast_for_comp_op(c, CHILD(n, i));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001781 if (!newoperator) {
1782 return NULL;
1783 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001785 expression = ast_for_expr(c, CHILD(n, i + 1));
1786 if (!expression) {
1787 return NULL;
1788 }
1789
1790 asdl_seq_SET(ops, i / 2, newoperator);
1791 asdl_seq_SET(cmps, i / 2, expression);
1792 }
1793 expression = ast_for_expr(c, CHILD(n, 0));
1794 if (!expression) {
1795 return NULL;
1796 }
1797
1798 return Compare(expression, ops, cmps, LINENO(n),
1799 n->n_col_offset, c->c_arena);
1800 }
1801 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001803 /* The next five cases all handle BinOps. The main body of code
1804 is the same in each case, but the switch turned inside out to
1805 reuse the code for each type of operator.
1806 */
1807 case expr:
1808 case xor_expr:
1809 case and_expr:
1810 case shift_expr:
1811 case arith_expr:
1812 case term:
1813 if (NCH(n) == 1) {
1814 n = CHILD(n, 0);
1815 goto loop;
1816 }
1817 return ast_for_binop(c, n);
1818 case yield_expr: {
1819 expr_ty exp = NULL;
1820 if (NCH(n) == 2) {
1821 exp = ast_for_testlist(c, CHILD(n, 1));
1822 if (!exp)
1823 return NULL;
1824 }
1825 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1826 }
1827 case factor:
1828 if (NCH(n) == 1) {
1829 n = CHILD(n, 0);
1830 goto loop;
1831 }
1832 return ast_for_factor(c, n);
1833 case power:
1834 return ast_for_power(c, n);
1835 default:
1836 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1837 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001839 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 return NULL;
1841}
1842
1843static expr_ty
1844ast_for_call(struct compiling *c, const node *n, expr_ty func)
1845{
1846 /*
1847 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001848 | '**' test)
1849 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850 */
1851
1852 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001853 asdl_seq *args;
1854 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 expr_ty vararg = NULL, kwarg = NULL;
1856
1857 REQ(n, arglist);
1858
1859 nargs = 0;
1860 nkeywords = 0;
1861 ngens = 0;
1862 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001863 node *ch = CHILD(n, i);
1864 if (TYPE(ch) == argument) {
1865 if (NCH(ch) == 1)
1866 nargs++;
1867 else if (TYPE(CHILD(ch, 1)) == gen_for)
1868 ngens++;
1869 else
1870 nkeywords++;
1871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001874 ast_error(n, "Generator expression must be parenthesized "
1875 "if not sole argument");
1876 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 }
1878
1879 if (nargs + nkeywords + ngens > 255) {
1880 ast_error(n, "more than 255 arguments");
1881 return NULL;
1882 }
1883
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001884 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001886 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001887 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 if (!keywords)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 nargs = 0;
1891 nkeywords = 0;
1892 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001893 node *ch = CHILD(n, i);
1894 if (TYPE(ch) == argument) {
1895 expr_ty e;
1896 if (NCH(ch) == 1) {
1897 if (nkeywords) {
1898 ast_error(CHILD(ch, 0),
1899 "non-keyword arg after keyword arg");
1900 return NULL;
1901 }
Benjamin Peterson80f0ed52008-08-19 19:52:46 +00001902 if (vararg) {
1903 ast_error(CHILD(ch, 0),
1904 "only named arguments may follow *expression");
1905 return NULL;
1906 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001907 e = ast_for_expr(c, CHILD(ch, 0));
1908 if (!e)
1909 return NULL;
1910 asdl_seq_SET(args, nargs++, e);
1911 }
1912 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1913 e = ast_for_genexp(c, ch);
1914 if (!e)
1915 return NULL;
1916 asdl_seq_SET(args, nargs++, e);
1917 }
1918 else {
1919 keyword_ty kw;
1920 identifier key;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001921 int k;
1922 char *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001924 /* CHILD(ch, 0) is test, but must be an identifier? */
1925 e = ast_for_expr(c, CHILD(ch, 0));
1926 if (!e)
1927 return NULL;
1928 /* f(lambda x: x[0] = 3) ends up getting parsed with
1929 * LHS test = lambda x: x[0], and RHS test = 3.
1930 * SF bug 132313 points out that complaining about a keyword
1931 * then is very confusing.
1932 */
1933 if (e->kind == Lambda_kind) {
1934 ast_error(CHILD(ch, 0),
1935 "lambda cannot contain assignment");
1936 return NULL;
1937 } else if (e->kind != Name_kind) {
1938 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1939 return NULL;
1940 }
1941 key = e->v.Name.id;
Benjamin Petersond5efd202008-06-08 22:52:37 +00001942 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
Georg Brandle06cf452007-06-07 13:23:24 +00001943 return NULL;
Benjamin Peterson175e4d92008-07-01 19:34:52 +00001944 for (k = 0; k < nkeywords; k++) {
1945 tmp = PyString_AS_STRING(
1946 ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
1947 if (!strcmp(tmp, PyString_AS_STRING(key))) {
1948 ast_error(CHILD(ch, 0), "keyword argument repeated");
1949 return NULL;
1950 }
1951 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001952 e = ast_for_expr(c, CHILD(ch, 2));
1953 if (!e)
1954 return NULL;
1955 kw = keyword(key, e, c->c_arena);
1956 if (!kw)
1957 return NULL;
1958 asdl_seq_SET(keywords, nkeywords++, kw);
1959 }
1960 }
1961 else if (TYPE(ch) == STAR) {
1962 vararg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001963 if (!vararg)
1964 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001965 i++;
1966 }
1967 else if (TYPE(ch) == DOUBLESTAR) {
1968 kwarg = ast_for_expr(c, CHILD(n, i+1));
Amaury Forgeot d'Arcd21fb4c2008-03-05 01:50:33 +00001969 if (!kwarg)
1970 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001971 i++;
1972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 }
1974
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001975 return Call(func, args, keywords, vararg, kwarg, func->lineno,
1976 func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977}
1978
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001980ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001982 /* testlist_gexp: test (',' test)* [','] */
1983 /* testlist: test (',' test)* [','] */
1984 /* testlist_safe: test (',' test)+ [','] */
1985 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001987 if (TYPE(n) == testlist_gexp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001988 if (NCH(n) > 1)
1989 assert(TYPE(CHILD(n, 1)) != gen_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001990 }
1991 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001992 assert(TYPE(n) == testlist ||
1993 TYPE(n) == testlist_safe ||
1994 TYPE(n) == testlist1);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001995 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001997 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001999 asdl_seq *tmp = seq_for_testlist(c, n);
2000 if (!tmp)
2001 return NULL;
2002 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002004}
2005
2006static expr_ty
2007ast_for_testlist_gexp(struct compiling *c, const node* n)
2008{
2009 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2010 /* argument: test [ gen_for ] */
2011 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002012 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002013 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002014 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002015}
2016
2017/* like ast_for_testlist() but returns a sequence */
2018static asdl_seq*
2019ast_for_class_bases(struct compiling *c, const node* n)
2020{
2021 /* testlist: test (',' test)* [','] */
2022 assert(NCH(n) > 0);
2023 REQ(n, testlist);
2024 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002025 expr_ty base;
2026 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
2027 if (!bases)
2028 return NULL;
2029 base = ast_for_expr(c, CHILD(n, 0));
2030 if (!base)
2031 return NULL;
2032 asdl_seq_SET(bases, 0, base);
2033 return bases;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002034 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002035
2036 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037}
2038
2039static stmt_ty
2040ast_for_expr_stmt(struct compiling *c, const node *n)
2041{
2042 REQ(n, expr_stmt);
2043 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002044 | ('=' (yield_expr|testlist))*)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 testlist: test (',' test)* [',']
2046 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002047 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 test: ... here starts the operator precendence dance
2049 */
2050
2051 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002052 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
2053 if (!e)
2054 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002056 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057 }
2058 else if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002059 expr_ty expr1, expr2;
2060 operator_ty newoperator;
2061 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002063 expr1 = ast_for_testlist(c, ch);
2064 if (!expr1)
2065 return NULL;
2066 /* TODO(nas): Remove duplicated error checks (set_context does it) */
2067 switch (expr1->kind) {
2068 case GeneratorExp_kind:
2069 ast_error(ch, "augmented assignment to generator "
2070 "expression not possible");
2071 return NULL;
2072 case Yield_kind:
2073 ast_error(ch, "augmented assignment to yield "
2074 "expression not possible");
2075 return NULL;
2076 case Name_kind: {
Christian Heimes593daf52008-05-26 12:51:38 +00002077 const char *var_name = PyBytes_AS_STRING(expr1->v.Name.id);
Benjamin Petersond5efd202008-06-08 22:52:37 +00002078 if ((var_name[0] == 'N' || var_name[0] == 'T' || var_name[0] == 'F') &&
2079 !forbidden_check(c, ch, var_name))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002080 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002081 break;
2082 }
2083 case Attribute_kind:
2084 case Subscript_kind:
2085 break;
2086 default:
2087 ast_error(ch, "illegal expression for augmented "
2088 "assignment");
2089 return NULL;
2090 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002091 if(!set_context(c, expr1, Store, ch))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002092 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002094 ch = CHILD(n, 2);
2095 if (TYPE(ch) == testlist)
2096 expr2 = ast_for_testlist(c, ch);
2097 else
2098 expr2 = ast_for_expr(c, ch);
2099 if (!expr2)
2100 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002102 newoperator = ast_for_augassign(c, CHILD(n, 1));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002103 if (!newoperator)
2104 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002105
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002106 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2107 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108 }
2109 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002110 int i;
2111 asdl_seq *targets;
2112 node *value;
2113 expr_ty expression;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002115 /* a normal assignment */
2116 REQ(CHILD(n, 1), EQUAL);
2117 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2118 if (!targets)
2119 return NULL;
2120 for (i = 0; i < NCH(n) - 2; i += 2) {
2121 expr_ty e;
2122 node *ch = CHILD(n, i);
2123 if (TYPE(ch) == yield_expr) {
2124 ast_error(ch, "assignment to yield expression not possible");
2125 return NULL;
2126 }
2127 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002129 /* set context to assign */
2130 if (!e)
2131 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002133 if (!set_context(c, e, Store, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002134 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002136 asdl_seq_SET(targets, i / 2, e);
2137 }
2138 value = CHILD(n, NCH(n) - 1);
2139 if (TYPE(value) == testlist)
2140 expression = ast_for_testlist(c, value);
2141 else
2142 expression = ast_for_expr(c, value);
2143 if (!expression)
2144 return NULL;
2145 return Assign(targets, expression, LINENO(n), n->n_col_offset,
2146 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148}
2149
2150static stmt_ty
2151ast_for_print_stmt(struct compiling *c, const node *n)
2152{
2153 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002154 | '>>' test [ (',' test)+ [','] ] )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 */
2156 expr_ty dest = NULL, expression;
2157 asdl_seq *seq;
2158 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002159 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160
2161 REQ(n, print_stmt);
2162 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002163 dest = ast_for_expr(c, CHILD(n, 2));
2164 if (!dest)
2165 return NULL;
2166 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002168 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002170 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002171 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002172 expression = ast_for_expr(c, CHILD(n, i));
2173 if (!expression)
2174 return NULL;
2175 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176 }
2177 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002178 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179}
2180
2181static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002182ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183{
2184 asdl_seq *seq;
2185 int i;
2186 expr_ty e;
2187
2188 REQ(n, exprlist);
2189
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002190 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002191 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002192 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002194 e = ast_for_expr(c, CHILD(n, i));
2195 if (!e)
2196 return NULL;
2197 asdl_seq_SET(seq, i / 2, e);
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002198 if (context && !set_context(c, e, context, CHILD(n, i)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002199 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200 }
2201 return seq;
2202}
2203
2204static stmt_ty
2205ast_for_del_stmt(struct compiling *c, const node *n)
2206{
2207 asdl_seq *expr_list;
2208
2209 /* del_stmt: 'del' exprlist */
2210 REQ(n, del_stmt);
2211
2212 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2213 if (!expr_list)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002214 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002215 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216}
2217
2218static stmt_ty
2219ast_for_flow_stmt(struct compiling *c, const node *n)
2220{
2221 /*
2222 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002223 | yield_stmt
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 break_stmt: 'break'
2225 continue_stmt: 'continue'
2226 return_stmt: 'return' [testlist]
2227 yield_stmt: yield_expr
2228 yield_expr: 'yield' testlist
2229 raise_stmt: 'raise' [test [',' test [',' test]]]
2230 */
2231 node *ch;
2232
2233 REQ(n, flow_stmt);
2234 ch = CHILD(n, 0);
2235 switch (TYPE(ch)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002236 case break_stmt:
2237 return Break(LINENO(n), n->n_col_offset, c->c_arena);
2238 case continue_stmt:
2239 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2240 case yield_stmt: { /* will reduce to yield_expr */
2241 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2242 if (!exp)
2243 return NULL;
2244 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2245 }
2246 case return_stmt:
2247 if (NCH(ch) == 1)
2248 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2249 else {
2250 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2251 if (!expression)
2252 return NULL;
2253 return Return(expression, LINENO(n), n->n_col_offset,
2254 c->c_arena);
2255 }
2256 case raise_stmt:
2257 if (NCH(ch) == 1)
2258 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2259 c->c_arena);
2260 else if (NCH(ch) == 2) {
2261 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2262 if (!expression)
2263 return NULL;
2264 return Raise(expression, NULL, NULL, LINENO(n),
2265 n->n_col_offset, c->c_arena);
2266 }
2267 else if (NCH(ch) == 4) {
2268 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002270 expr1 = ast_for_expr(c, CHILD(ch, 1));
2271 if (!expr1)
2272 return NULL;
2273 expr2 = ast_for_expr(c, CHILD(ch, 3));
2274 if (!expr2)
2275 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002277 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2278 c->c_arena);
2279 }
2280 else if (NCH(ch) == 6) {
2281 expr_ty expr1, expr2, expr3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002283 expr1 = ast_for_expr(c, CHILD(ch, 1));
2284 if (!expr1)
2285 return NULL;
2286 expr2 = ast_for_expr(c, CHILD(ch, 3));
2287 if (!expr2)
2288 return NULL;
2289 expr3 = ast_for_expr(c, CHILD(ch, 5));
2290 if (!expr3)
2291 return NULL;
2292
2293 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2294 c->c_arena);
2295 }
2296 default:
2297 PyErr_Format(PyExc_SystemError,
2298 "unexpected flow_stmt: %d", TYPE(ch));
2299 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002301
2302 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2303 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304}
2305
2306static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002307alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308{
2309 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002310 import_as_name: NAME ['as' NAME]
2311 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 dotted_name: NAME ('.' NAME)*
2313 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002314 PyObject *str;
2315
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 loop:
2317 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002318 case import_as_name:
2319 str = NULL;
2320 if (NCH(n) == 3) {
2321 str = NEW_IDENTIFIER(CHILD(n, 2));
2322 }
2323 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
2324 case dotted_as_name:
2325 if (NCH(n) == 1) {
2326 n = CHILD(n, 0);
2327 goto loop;
2328 }
2329 else {
2330 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
2331 if (!a)
2332 return NULL;
2333 assert(!a->asname);
2334 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2335 return a;
2336 }
2337 break;
2338 case dotted_name:
2339 if (NCH(n) == 1)
2340 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
2341 else {
2342 /* Create a string of the form "a.b.c" */
2343 int i;
2344 size_t len;
2345 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002347 len = 0;
2348 for (i = 0; i < NCH(n); i += 2)
2349 /* length of string plus one for the dot */
2350 len += strlen(STR(CHILD(n, i))) + 1;
2351 len--; /* the last name doesn't have a dot */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002352 str = PyString_FromStringAndSize(NULL, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002353 if (!str)
2354 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002355 s = PyString_AS_STRING(str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002356 if (!s)
2357 return NULL;
2358 for (i = 0; i < NCH(n); i += 2) {
2359 char *sch = STR(CHILD(n, i));
2360 strcpy(s, STR(CHILD(n, i)));
2361 s += strlen(sch);
2362 *s++ = '.';
2363 }
2364 --s;
2365 *s = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002366 PyString_InternInPlace(&str);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002367 PyArena_AddPyObject(c->c_arena, str);
2368 return alias(str, NULL, c->c_arena);
2369 }
2370 break;
2371 case STAR:
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002372 str = PyString_InternFromString("*");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002373 PyArena_AddPyObject(c->c_arena, str);
2374 return alias(str, NULL, c->c_arena);
2375 default:
2376 PyErr_Format(PyExc_SystemError,
2377 "unexpected import name: %d", TYPE(n));
2378 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002380
2381 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002382 return NULL;
2383}
2384
2385static stmt_ty
2386ast_for_import_stmt(struct compiling *c, const node *n)
2387{
2388 /*
2389 import_stmt: import_name | import_from
2390 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002391 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002392 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002394 int lineno;
2395 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 int i;
2397 asdl_seq *aliases;
2398
2399 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002400 lineno = LINENO(n);
2401 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002403 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002404 n = CHILD(n, 1);
2405 REQ(n, dotted_as_names);
2406 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2407 if (!aliases)
2408 return NULL;
2409 for (i = 0; i < NCH(n); i += 2) {
2410 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2411 if (!import_alias)
2412 return NULL;
2413 asdl_seq_SET(aliases, i / 2, import_alias);
2414 }
2415 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002417 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002418 int n_children;
2419 int idx, ndots = 0;
2420 alias_ty mod = NULL;
2421 identifier modname;
2422
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002423 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002424 optional module name */
2425 for (idx = 1; idx < NCH(n); idx++) {
2426 if (TYPE(CHILD(n, idx)) == dotted_name) {
2427 mod = alias_for_import_name(c, CHILD(n, idx));
2428 idx++;
2429 break;
2430 } else if (TYPE(CHILD(n, idx)) != DOT) {
2431 break;
2432 }
2433 ndots++;
2434 }
2435 idx++; /* skip over the 'import' keyword */
2436 switch (TYPE(CHILD(n, idx))) {
2437 case STAR:
2438 /* from ... import * */
2439 n = CHILD(n, idx);
2440 n_children = 1;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002441 break;
2442 case LPAR:
2443 /* from ... import (x, y, z) */
2444 n = CHILD(n, idx + 1);
2445 n_children = NCH(n);
2446 break;
2447 case import_as_names:
2448 /* from ... import x, y, z */
2449 n = CHILD(n, idx);
2450 n_children = NCH(n);
2451 if (n_children % 2 == 0) {
2452 ast_error(n, "trailing comma not allowed without"
2453 " surrounding parentheses");
2454 return NULL;
2455 }
2456 break;
2457 default:
2458 ast_error(n, "Unexpected node-type in from-import");
2459 return NULL;
2460 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002462 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2463 if (!aliases)
2464 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002466 /* handle "from ... import *" special b/c there's no children */
2467 if (TYPE(n) == STAR) {
2468 alias_ty import_alias = alias_for_import_name(c, n);
2469 if (!import_alias)
2470 return NULL;
2471 asdl_seq_SET(aliases, 0, import_alias);
2472 }
2473 else {
2474 for (i = 0; i < NCH(n); i += 2) {
2475 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2476 if (!import_alias)
2477 return NULL;
2478 asdl_seq_SET(aliases, i / 2, import_alias);
2479 }
2480 }
2481 if (mod != NULL)
2482 modname = mod->name;
2483 else
2484 modname = new_identifier("", c->c_arena);
2485 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2486 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 }
Neal Norwitz79792652005-11-14 04:25:03 +00002488 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002489 "unknown import statement: starts with command '%s'",
2490 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 return NULL;
2492}
2493
2494static stmt_ty
2495ast_for_global_stmt(struct compiling *c, const node *n)
2496{
2497 /* global_stmt: 'global' NAME (',' NAME)* */
2498 identifier name;
2499 asdl_seq *s;
2500 int i;
2501
2502 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002503 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002505 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002507 name = NEW_IDENTIFIER(CHILD(n, i));
2508 if (!name)
2509 return NULL;
2510 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002512 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513}
2514
2515static stmt_ty
2516ast_for_exec_stmt(struct compiling *c, const node *n)
2517{
2518 expr_ty expr1, globals = NULL, locals = NULL;
2519 int n_children = NCH(n);
2520 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002521 PyErr_Format(PyExc_SystemError,
2522 "poorly formed 'exec' statement: %d parts to statement",
2523 n_children);
2524 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 }
2526
2527 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2528 REQ(n, exec_stmt);
2529 expr1 = ast_for_expr(c, CHILD(n, 1));
2530 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002531 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002533 globals = ast_for_expr(c, CHILD(n, 3));
2534 if (!globals)
2535 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 }
2537 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002538 locals = ast_for_expr(c, CHILD(n, 5));
2539 if (!locals)
2540 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 }
2542
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002543 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2544 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545}
2546
2547static stmt_ty
2548ast_for_assert_stmt(struct compiling *c, const node *n)
2549{
2550 /* assert_stmt: 'assert' test [',' test] */
2551 REQ(n, assert_stmt);
2552 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002553 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2554 if (!expression)
2555 return NULL;
2556 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2557 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 }
2559 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002560 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002562 expr1 = ast_for_expr(c, CHILD(n, 1));
2563 if (!expr1)
2564 return NULL;
2565 expr2 = ast_for_expr(c, CHILD(n, 3));
2566 if (!expr2)
2567 return NULL;
2568
2569 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
Neal Norwitz79792652005-11-14 04:25:03 +00002571 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002572 "improper number of parts to 'assert' statement: %d",
2573 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 return NULL;
2575}
2576
2577static asdl_seq *
2578ast_for_suite(struct compiling *c, const node *n)
2579{
2580 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002581 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 stmt_ty s;
2583 int i, total, num, end, pos = 0;
2584 node *ch;
2585
2586 REQ(n, suite);
2587
2588 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002589 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002591 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002593 n = CHILD(n, 0);
2594 /* simple_stmt always ends with a NEWLINE,
2595 and may have a trailing SEMI
2596 */
2597 end = NCH(n) - 1;
2598 if (TYPE(CHILD(n, end - 1)) == SEMI)
2599 end--;
2600 /* loop by 2 to skip semi-colons */
2601 for (i = 0; i < end; i += 2) {
2602 ch = CHILD(n, i);
2603 s = ast_for_stmt(c, ch);
2604 if (!s)
2605 return NULL;
2606 asdl_seq_SET(seq, pos++, s);
2607 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 }
2609 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002610 for (i = 2; i < (NCH(n) - 1); i++) {
2611 ch = CHILD(n, i);
2612 REQ(ch, stmt);
2613 num = num_stmts(ch);
2614 if (num == 1) {
2615 /* small_stmt or compound_stmt with only one child */
2616 s = ast_for_stmt(c, ch);
2617 if (!s)
2618 return NULL;
2619 asdl_seq_SET(seq, pos++, s);
2620 }
2621 else {
2622 int j;
2623 ch = CHILD(ch, 0);
2624 REQ(ch, simple_stmt);
2625 for (j = 0; j < NCH(ch); j += 2) {
2626 /* statement terminates with a semi-colon ';' */
2627 if (NCH(CHILD(ch, j)) == 0) {
2628 assert((j + 1) == NCH(ch));
2629 break;
2630 }
2631 s = ast_for_stmt(c, CHILD(ch, j));
2632 if (!s)
2633 return NULL;
2634 asdl_seq_SET(seq, pos++, s);
2635 }
2636 }
2637 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638 }
2639 assert(pos == seq->size);
2640 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641}
2642
2643static stmt_ty
2644ast_for_if_stmt(struct compiling *c, const node *n)
2645{
2646 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2647 ['else' ':' suite]
2648 */
2649 char *s;
2650
2651 REQ(n, if_stmt);
2652
2653 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002654 expr_ty expression;
2655 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002657 expression = ast_for_expr(c, CHILD(n, 1));
2658 if (!expression)
2659 return NULL;
2660 suite_seq = ast_for_suite(c, CHILD(n, 3));
2661 if (!suite_seq)
2662 return NULL;
2663
2664 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2665 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002667
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 s = STR(CHILD(n, 4));
2669 /* s[2], the third character in the string, will be
2670 's' for el_s_e, or
2671 'i' for el_i_f
2672 */
2673 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002674 expr_ty expression;
2675 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002677 expression = ast_for_expr(c, CHILD(n, 1));
2678 if (!expression)
2679 return NULL;
2680 seq1 = ast_for_suite(c, CHILD(n, 3));
2681 if (!seq1)
2682 return NULL;
2683 seq2 = ast_for_suite(c, CHILD(n, 6));
2684 if (!seq2)
2685 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002687 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2688 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 }
2690 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002691 int i, n_elif, has_else = 0;
2692 expr_ty expression;
2693 asdl_seq *suite_seq;
2694 asdl_seq *orelse = NULL;
2695 n_elif = NCH(n) - 4;
2696 /* must reference the child n_elif+1 since 'else' token is third,
2697 not fourth, child from the end. */
2698 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2699 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2700 has_else = 1;
2701 n_elif -= 3;
2702 }
2703 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002705 if (has_else) {
2706 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002708 orelse = asdl_seq_new(1, c->c_arena);
2709 if (!orelse)
2710 return NULL;
2711 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2712 if (!expression)
2713 return NULL;
2714 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2715 if (!suite_seq)
2716 return NULL;
2717 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2718 if (!suite_seq2)
2719 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002721 asdl_seq_SET(orelse, 0,
2722 If(expression, suite_seq, suite_seq2,
2723 LINENO(CHILD(n, NCH(n) - 6)),
2724 CHILD(n, NCH(n) - 6)->n_col_offset,
2725 c->c_arena));
2726 /* the just-created orelse handled the last elif */
2727 n_elif--;
2728 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002730 for (i = 0; i < n_elif; i++) {
2731 int off = 5 + (n_elif - i - 1) * 4;
2732 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2733 if (!newobj)
2734 return NULL;
2735 expression = ast_for_expr(c, CHILD(n, off));
2736 if (!expression)
2737 return NULL;
2738 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2739 if (!suite_seq)
2740 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002742 asdl_seq_SET(newobj, 0,
2743 If(expression, suite_seq, orelse,
2744 LINENO(CHILD(n, off)),
2745 CHILD(n, off)->n_col_offset, c->c_arena));
2746 orelse = newobj;
2747 }
2748 expression = ast_for_expr(c, CHILD(n, 1));
2749 if (!expression)
2750 return NULL;
2751 suite_seq = ast_for_suite(c, CHILD(n, 3));
2752 if (!suite_seq)
2753 return NULL;
2754 return If(expression, suite_seq, orelse,
2755 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002757
2758 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002759 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002760 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761}
2762
2763static stmt_ty
2764ast_for_while_stmt(struct compiling *c, const node *n)
2765{
2766 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2767 REQ(n, while_stmt);
2768
2769 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002770 expr_ty expression;
2771 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002773 expression = ast_for_expr(c, CHILD(n, 1));
2774 if (!expression)
2775 return NULL;
2776 suite_seq = ast_for_suite(c, CHILD(n, 3));
2777 if (!suite_seq)
2778 return NULL;
2779 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2780 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 }
2782 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002783 expr_ty expression;
2784 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002786 expression = ast_for_expr(c, CHILD(n, 1));
2787 if (!expression)
2788 return NULL;
2789 seq1 = ast_for_suite(c, CHILD(n, 3));
2790 if (!seq1)
2791 return NULL;
2792 seq2 = ast_for_suite(c, CHILD(n, 6));
2793 if (!seq2)
2794 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002796 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2797 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002799
2800 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002801 "wrong number of tokens for 'while' statement: %d",
2802 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002803 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804}
2805
2806static stmt_ty
2807ast_for_for_stmt(struct compiling *c, const node *n)
2808{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002809 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 expr_ty expression;
2811 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002812 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2814 REQ(n, for_stmt);
2815
2816 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002817 seq = ast_for_suite(c, CHILD(n, 8));
2818 if (!seq)
2819 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 }
2821
Neal Norwitzedef2be2006-07-12 05:26:17 +00002822 node_target = CHILD(n, 1);
2823 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002824 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002825 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002826 /* Check the # of children rather than the length of _target, since
2827 for x, in ... has 1 element in _target, but still requires a Tuple. */
2828 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002829 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002831 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002833 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002834 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002835 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002837 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002838 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002840 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002841 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842}
2843
2844static excepthandler_ty
2845ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2846{
Collin Winter62903052007-05-18 23:11:24 +00002847 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848 REQ(exc, except_clause);
2849 REQ(body, suite);
2850
2851 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002852 asdl_seq *suite_seq = ast_for_suite(c, body);
2853 if (!suite_seq)
2854 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855
Georg Brandla48f3ab2008-03-30 06:40:17 +00002856 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002857 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 }
2859 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002860 expr_ty expression;
2861 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002863 expression = ast_for_expr(c, CHILD(exc, 1));
2864 if (!expression)
2865 return NULL;
2866 suite_seq = ast_for_suite(c, body);
2867 if (!suite_seq)
2868 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869
Georg Brandla48f3ab2008-03-30 06:40:17 +00002870 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002871 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 }
2873 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002874 asdl_seq *suite_seq;
2875 expr_ty expression;
2876 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2877 if (!e)
2878 return NULL;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00002879 if (!set_context(c, e, Store, CHILD(exc, 3)))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002880 return NULL;
2881 expression = ast_for_expr(c, CHILD(exc, 1));
2882 if (!expression)
2883 return NULL;
2884 suite_seq = ast_for_suite(c, body);
2885 if (!suite_seq)
2886 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887
Georg Brandla48f3ab2008-03-30 06:40:17 +00002888 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002889 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002891
2892 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002893 "wrong number of children for 'except' clause: %d",
2894 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002895 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896}
2897
2898static stmt_ty
2899ast_for_try_stmt(struct compiling *c, const node *n)
2900{
Neal Norwitzf599f422005-12-17 21:33:47 +00002901 const int nch = NCH(n);
2902 int n_except = (nch - 3)/3;
2903 asdl_seq *body, *orelse = NULL, *finally = NULL;
2904
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 REQ(n, try_stmt);
2906
Neal Norwitzf599f422005-12-17 21:33:47 +00002907 body = ast_for_suite(c, CHILD(n, 2));
2908 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002909 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910
Neal Norwitzf599f422005-12-17 21:33:47 +00002911 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002912 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2913 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2914 /* we can assume it's an "else",
2915 because nch >= 9 for try-else-finally and
2916 it would otherwise have a type of except_clause */
2917 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2918 if (orelse == NULL)
2919 return NULL;
2920 n_except--;
2921 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002923 finally = ast_for_suite(c, CHILD(n, nch - 1));
2924 if (finally == NULL)
2925 return NULL;
2926 n_except--;
2927 }
2928 else {
2929 /* we can assume it's an "else",
2930 otherwise it would have a type of except_clause */
2931 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2932 if (orelse == NULL)
2933 return NULL;
2934 n_except--;
2935 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002937 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002938 ast_error(n, "malformed 'try' statement");
2939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002941
2942 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002943 int i;
2944 stmt_ty except_st;
2945 /* process except statements to create a try ... except */
2946 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2947 if (handlers == NULL)
2948 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002949
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002950 for (i = 0; i < n_except; i++) {
2951 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2952 CHILD(n, 5 + i * 3));
2953 if (!e)
2954 return NULL;
2955 asdl_seq_SET(handlers, i, e);
2956 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002957
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002958 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2959 n->n_col_offset, c->c_arena);
2960 if (!finally)
2961 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002962
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002963 /* if a 'finally' is present too, we nest the TryExcept within a
2964 TryFinally to emulate try ... except ... finally */
2965 body = asdl_seq_new(1, c->c_arena);
2966 if (body == NULL)
2967 return NULL;
2968 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002969 }
2970
2971 /* must be a try ... finally (except clauses are in body, if any exist) */
2972 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002973 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974}
2975
Guido van Rossumc2e20742006-02-27 22:32:47 +00002976static expr_ty
2977ast_for_with_var(struct compiling *c, const node *n)
2978{
2979 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002980 return ast_for_expr(c, CHILD(n, 1));
2981}
2982
2983/* with_stmt: 'with' test [ with_var ] ':' suite */
2984static stmt_ty
2985ast_for_with_stmt(struct compiling *c, const node *n)
2986{
2987 expr_ty context_expr, optional_vars = NULL;
2988 int suite_index = 3; /* skip 'with', test, and ':' */
2989 asdl_seq *suite_seq;
2990
2991 assert(TYPE(n) == with_stmt);
2992 context_expr = ast_for_expr(c, CHILD(n, 1));
Collin Winter77c67bd2007-03-16 04:11:30 +00002993 if (!context_expr)
2994 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002995 if (TYPE(CHILD(n, 2)) == with_var) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002996 optional_vars = ast_for_with_var(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002997
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002998 if (!optional_vars) {
2999 return NULL;
3000 }
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003001 if (!set_context(c, optional_vars, Store, n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003002 return NULL;
3003 }
3004 suite_index = 4;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003005 }
3006
3007 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
3008 if (!suite_seq) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003009 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003010 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003011 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003012 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003013}
3014
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015static stmt_ty
Christian Heimes5224d282008-02-23 15:01:05 +00003016ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017{
3018 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 asdl_seq *bases, *s;
3020
3021 REQ(n, classdef);
3022
Benjamin Petersond5efd202008-06-08 22:52:37 +00003023 if (!forbidden_check(c, n, STR(CHILD(n, 1))))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003024 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025
3026 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003027 s = ast_for_suite(c, CHILD(n, 3));
3028 if (!s)
3029 return NULL;
Christian Heimes5224d282008-02-23 15:01:05 +00003030 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, decorator_seq,
3031 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 }
3033 /* check for empty base list */
3034 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003035 s = ast_for_suite(c, CHILD(n,5));
3036 if (!s)
3037 return NULL;
Christian Heimes5224d282008-02-23 15:01:05 +00003038 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, decorator_seq,
3039 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 }
3041
3042 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003043 bases = ast_for_class_bases(c, CHILD(n, 3));
3044 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003045 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046
3047 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003048 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003049 return NULL;
Christian Heimes5224d282008-02-23 15:01:05 +00003050 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, decorator_seq,
3051 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052}
3053
3054static stmt_ty
3055ast_for_stmt(struct compiling *c, const node *n)
3056{
3057 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003058 assert(NCH(n) == 1);
3059 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 }
3061 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003062 assert(num_stmts(n) == 1);
3063 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 }
3065 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003066 REQ(n, small_stmt);
3067 n = CHILD(n, 0);
3068 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3069 | flow_stmt | import_stmt | global_stmt | exec_stmt
3070 | assert_stmt
3071 */
3072 switch (TYPE(n)) {
3073 case expr_stmt:
3074 return ast_for_expr_stmt(c, n);
3075 case print_stmt:
3076 return ast_for_print_stmt(c, n);
3077 case del_stmt:
3078 return ast_for_del_stmt(c, n);
3079 case pass_stmt:
3080 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3081 case flow_stmt:
3082 return ast_for_flow_stmt(c, n);
3083 case import_stmt:
3084 return ast_for_import_stmt(c, n);
3085 case global_stmt:
3086 return ast_for_global_stmt(c, n);
3087 case exec_stmt:
3088 return ast_for_exec_stmt(c, n);
3089 case assert_stmt:
3090 return ast_for_assert_stmt(c, n);
3091 default:
3092 PyErr_Format(PyExc_SystemError,
3093 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3094 TYPE(n), NCH(n));
3095 return NULL;
3096 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 }
3098 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003099 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Christian Heimes5224d282008-02-23 15:01:05 +00003100 | funcdef | classdef | decorated
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003101 */
3102 node *ch = CHILD(n, 0);
3103 REQ(n, compound_stmt);
3104 switch (TYPE(ch)) {
3105 case if_stmt:
3106 return ast_for_if_stmt(c, ch);
3107 case while_stmt:
3108 return ast_for_while_stmt(c, ch);
3109 case for_stmt:
3110 return ast_for_for_stmt(c, ch);
3111 case try_stmt:
3112 return ast_for_try_stmt(c, ch);
3113 case with_stmt:
3114 return ast_for_with_stmt(c, ch);
3115 case funcdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003116 return ast_for_funcdef(c, ch, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003117 case classdef:
Christian Heimes5224d282008-02-23 15:01:05 +00003118 return ast_for_classdef(c, ch, NULL);
3119 case decorated:
3120 return ast_for_decorated(c, ch);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003121 default:
3122 PyErr_Format(PyExc_SystemError,
3123 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3124 TYPE(n), NCH(n));
3125 return NULL;
3126 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127 }
3128}
3129
3130static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003131parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003133 const char *end;
3134 long x;
3135 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136#ifndef WITHOUT_COMPLEX
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003137 Py_complex complex;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003138 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139#endif
3140
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003141 errno = 0;
3142 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003143#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003144 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003146 if (*end == 'l' || *end == 'L')
3147 return PyLong_FromString((char *)s, (char **)0, 0);
Mark Dickinson64b7e502008-07-16 09:40:03 +00003148 x = PyOS_strtol((char *)s, (char **)&end, 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003149 if (*end == '\0') {
3150 if (errno != 0)
3151 return PyLong_FromString((char *)s, (char **)0, 0);
3152 return PyInt_FromLong(x);
3153 }
3154 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003156 if (imflag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003157 complex.real = 0.;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003158 PyFPE_START_PROTECT("atof", return 0)
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003159 complex.imag = PyOS_ascii_atof(s);
3160 PyFPE_END_PROTECT(complex)
3161 return PyComplex_FromCComplex(complex);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003162 }
3163 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003165 {
3166 PyFPE_START_PROTECT("atof", return 0)
3167 dx = PyOS_ascii_atof(s);
3168 PyFPE_END_PROTECT(dx)
3169 return PyFloat_FromDouble(dx);
3170 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171}
3172
3173static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003174decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175{
3176#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003177 Py_FatalError("decode_utf8 should not be called in this build.");
3178 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003180 PyObject *u, *v;
3181 char *s, *t;
3182 t = s = (char *)*sPtr;
3183 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3184 while (s < end && (*s & 0x80)) s++;
3185 *sPtr = s;
3186 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3187 if (u == NULL)
3188 return NULL;
3189 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3190 Py_DECREF(u);
3191 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192#endif
3193}
3194
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003195#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196static PyObject *
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003197decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003199 PyObject *v, *u;
3200 char *buf;
3201 char *p;
3202 const char *end;
3203 if (encoding == NULL) {
3204 buf = (char *)s;
3205 u = NULL;
3206 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3207 buf = (char *)s;
3208 u = NULL;
3209 } else {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003210 /* check for integer overflow */
3211 if (len > PY_SIZE_MAX / 4)
3212 return NULL;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003213 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003214 u = PyString_FromStringAndSize((char *)NULL, len * 4);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003215 if (u == NULL)
3216 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003217 p = buf = PyString_AsString(u);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003218 end = s + len;
3219 while (s < end) {
3220 if (*s == '\\') {
3221 *p++ = *s++;
3222 if (*s & 0x80) {
3223 strcpy(p, "u005c");
3224 p += 5;
3225 }
3226 }
3227 if (*s & 0x80) { /* XXX inefficient */
3228 PyObject *w;
3229 char *r;
3230 Py_ssize_t rn, i;
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003231 w = decode_utf8(c, &s, end, "utf-16-be");
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003232 if (w == NULL) {
3233 Py_DECREF(u);
3234 return NULL;
3235 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003236 r = PyString_AsString(w);
3237 rn = PyString_Size(w);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003238 assert(rn % 2 == 0);
3239 for (i = 0; i < rn; i += 2) {
3240 sprintf(p, "\\u%02x%02x",
3241 r[i + 0] & 0xFF,
3242 r[i + 1] & 0xFF);
3243 p += 6;
3244 }
3245 Py_DECREF(w);
3246 } else {
3247 *p++ = *s++;
3248 }
3249 }
3250 len = p - buf;
3251 s = buf;
3252 }
3253 if (rawmode)
3254 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3255 else
3256 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3257 Py_XDECREF(u);
3258 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003259}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003260#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261
3262/* s is a Python string literal, including the bracketing quote characters,
3263 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3264 * parsestr parses it, and returns the decoded Python string object.
3265 */
3266static PyObject *
Christian Heimes3c608332008-03-26 22:01:37 +00003267parsestr(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003269 size_t len;
3270 int quote = Py_CHARMASK(*s);
3271 int rawmode = 0;
3272 int need_encoding;
Christian Heimes3c608332008-03-26 22:01:37 +00003273 int unicode = c->c_future_unicode;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003275 if (isalpha(quote) || quote == '_') {
3276 if (quote == 'u' || quote == 'U') {
3277 quote = *++s;
3278 unicode = 1;
3279 }
Christian Heimes288e89a2008-01-18 18:24:07 +00003280 if (quote == 'b' || quote == 'B') {
3281 quote = *++s;
Christian Heimes3c608332008-03-26 22:01:37 +00003282 unicode = 0;
Christian Heimes288e89a2008-01-18 18:24:07 +00003283 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003284 if (quote == 'r' || quote == 'R') {
3285 quote = *++s;
3286 rawmode = 1;
3287 }
3288 }
3289 if (quote != '\'' && quote != '\"') {
3290 PyErr_BadInternalCall();
3291 return NULL;
3292 }
3293 s++;
3294 len = strlen(s);
3295 if (len > INT_MAX) {
3296 PyErr_SetString(PyExc_OverflowError,
3297 "string to parse is too long");
3298 return NULL;
3299 }
3300 if (s[--len] != quote) {
3301 PyErr_BadInternalCall();
3302 return NULL;
3303 }
3304 if (len >= 4 && s[0] == quote && s[1] == quote) {
3305 s += 2;
3306 len -= 2;
3307 if (s[--len] != quote || s[--len] != quote) {
3308 PyErr_BadInternalCall();
3309 return NULL;
3310 }
3311 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003313 if (unicode || Py_UnicodeFlag) {
Benjamin Peterson2b30ea02008-05-03 15:56:42 +00003314 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003315 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316#endif
Christian Heimes3c608332008-03-26 22:01:37 +00003317 need_encoding = (c->c_encoding != NULL &&
3318 strcmp(c->c_encoding, "utf-8") != 0 &&
3319 strcmp(c->c_encoding, "iso-8859-1") != 0);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003320 if (rawmode || strchr(s, '\\') == NULL) {
3321 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003323 /* This should not happen - we never see any other
3324 encoding. */
3325 Py_FatalError(
3326 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003328 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3329 if (u == NULL)
3330 return NULL;
Christian Heimes3c608332008-03-26 22:01:37 +00003331 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003332 Py_DECREF(u);
3333 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003334#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003335 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003336 return PyString_FromStringAndSize(s, len);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003337 }
3338 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003340 return PyString_DecodeEscape(s, len, NULL, unicode,
Christian Heimes3c608332008-03-26 22:01:37 +00003341 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342}
3343
3344/* Build a Python string object out of a STRING atom. This takes care of
3345 * compile-time literal catenation, calling parsestr() on each piece, and
3346 * pasting the intermediate results together.
3347 */
3348static PyObject *
3349parsestrplus(struct compiling *c, const node *n)
3350{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003351 PyObject *v;
3352 int i;
3353 REQ(CHILD(n, 0), STRING);
Christian Heimes3c608332008-03-26 22:01:37 +00003354 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003355 /* String literal concatenation */
3356 for (i = 1; i < NCH(n); i++) {
3357 PyObject *s;
Christian Heimes3c608332008-03-26 22:01:37 +00003358 s = parsestr(c, STR(CHILD(n, i)));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003359 if (s == NULL)
3360 goto onError;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003361 if (PyString_Check(v) && PyString_Check(s)) {
3362 PyString_ConcatAndDel(&v, s);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003363 if (v == NULL)
3364 goto onError;
3365 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003367 else {
3368 PyObject *temp = PyUnicode_Concat(v, s);
3369 Py_DECREF(s);
3370 Py_DECREF(v);
3371 v = temp;
3372 if (v == NULL)
3373 goto onError;
3374 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003376 }
3377 }
3378 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379
3380 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003381 Py_XDECREF(v);
3382 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383}