blob: 9354b59cb0d51f6125d83609727ec30f5dbaeac3 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
31static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
36static PyObject *parsenumber(const char *);
37static PyObject *parsestr(const char *s, const char *encoding);
38static PyObject *parsestrplus(struct compiling *, const node *n);
39
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040#ifndef LINENO
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000041#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#endif
43
Neal Norwitzadb69fc2005-12-17 20:54:49 +000044static identifier
45new_identifier(const char* n, PyArena *arena) {
46 PyObject* id = PyString_InternFromString(n);
47 PyArena_AddPyObject(arena, id);
48 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000049}
50
Neal Norwitzadb69fc2005-12-17 20:54:49 +000051#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000052
53/* This routine provides an invalid object for the syntax error.
54 The outermost routine must unpack this error and create the
55 proper object. We do this so that we don't have to pass
56 the filename to everything function.
57
58 XXX Maybe we should just pass the filename...
59*/
60
61static int
62ast_error(const node *n, const char *errstr)
63{
64 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
65 if (!u)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000066 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000067 PyErr_SetObject(PyExc_SyntaxError, u);
68 Py_DECREF(u);
69 return 0;
70}
71
72static void
73ast_error_finish(const char *filename)
74{
75 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000076 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077
78 assert(PyErr_Occurred());
79 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000080 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82 PyErr_Fetch(&type, &value, &tback);
83 errstr = PyTuple_GetItem(value, 0);
84 if (!errstr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000085 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086 Py_INCREF(errstr);
87 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000088 if (lineno == -1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000089 Py_DECREF(errstr);
90 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000091 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 Py_DECREF(value);
93
94 loc = PyErr_ProgramText(filename, lineno);
95 if (!loc) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000096 Py_INCREF(Py_None);
97 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +000099 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000100 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000101 if (!tmp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000102 Py_DECREF(errstr);
103 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000104 }
Georg Brandl7784f122006-05-26 20:04:44 +0000105 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106 Py_DECREF(errstr);
107 Py_DECREF(tmp);
108 if (!value)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110 PyErr_Restore(type, value, tback);
111}
112
113/* num_stmts() returns number of contained statements.
114
115 Use this routine to determine how big a sequence is needed for
116 the statements in a parse tree. Its raison d'etre is this bit of
117 grammar:
118
119 stmt: simple_stmt | compound_stmt
120 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
121
122 A simple_stmt can contain multiple small_stmt elements joined
123 by semicolons. If the arg is a simple_stmt, the number of
124 small_stmt elements is returned.
125*/
126
127static int
128num_stmts(const node *n)
129{
130 int i, l;
131 node *ch;
132
133 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000134 case single_input:
135 if (TYPE(CHILD(n, 0)) == NEWLINE)
136 return 0;
137 else
138 return num_stmts(CHILD(n, 0));
139 case file_input:
140 l = 0;
141 for (i = 0; i < NCH(n); i++) {
142 ch = CHILD(n, i);
143 if (TYPE(ch) == stmt)
144 l += num_stmts(ch);
145 }
146 return l;
147 case stmt:
148 return num_stmts(CHILD(n, 0));
149 case compound_stmt:
150 return 1;
151 case simple_stmt:
152 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
153 case suite:
154 if (NCH(n) == 1)
155 return num_stmts(CHILD(n, 0));
156 else {
157 l = 0;
158 for (i = 2; i < (NCH(n) - 1); i++)
159 l += num_stmts(CHILD(n, i));
160 return l;
161 }
162 default: {
163 char buf[128];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000164
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000165 sprintf(buf, "Non-statement found: %d %d\n",
166 TYPE(n), NCH(n));
167 Py_FatalError(buf);
168 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000169 }
170 assert(0);
171 return 0;
172}
173
174/* Transform the CST rooted at node * to the appropriate AST
175*/
176
177mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000178PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000179 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000180{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000181 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000182 asdl_seq *stmts = NULL;
183 stmt_ty s;
184 node *ch;
185 struct compiling c;
186
187 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000188 c.c_encoding = "utf-8";
189 if (TYPE(n) == encoding_decl) {
190 ast_error(n, "encoding declaration in Unicode string");
191 goto error;
192 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000193 } else if (TYPE(n) == encoding_decl) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000194 c.c_encoding = STR(n);
195 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196 } else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000197 c.c_encoding = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000199 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200
Jeremy Hyltona8293132006-02-28 17:58:27 +0000201 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000202 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000203 case file_input:
204 stmts = asdl_seq_new(num_stmts(n), arena);
205 if (!stmts)
206 return NULL;
207 for (i = 0; i < NCH(n) - 1; i++) {
208 ch = CHILD(n, i);
209 if (TYPE(ch) == NEWLINE)
210 continue;
211 REQ(ch, stmt);
212 num = num_stmts(ch);
213 if (num == 1) {
214 s = ast_for_stmt(&c, ch);
215 if (!s)
216 goto error;
217 asdl_seq_SET(stmts, k++, s);
218 }
219 else {
220 ch = CHILD(ch, 0);
221 REQ(ch, simple_stmt);
222 for (j = 0; j < num; j++) {
223 s = ast_for_stmt(&c, CHILD(ch, j * 2));
224 if (!s)
225 goto error;
226 asdl_seq_SET(stmts, k++, s);
227 }
228 }
229 }
230 return Module(stmts, arena);
231 case eval_input: {
232 expr_ty testlist_ast;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000234 /* XXX Why not gen_for here? */
235 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
236 if (!testlist_ast)
237 goto error;
238 return Expression(testlist_ast, arena);
239 }
240 case single_input:
241 if (TYPE(CHILD(n, 0)) == NEWLINE) {
242 stmts = asdl_seq_new(1, arena);
243 if (!stmts)
244 goto error;
245 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
246 arena));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000247 if (!asdl_seq_GET(stmts, 0))
248 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000249 return Interactive(stmts, arena);
250 }
251 else {
252 n = CHILD(n, 0);
253 num = num_stmts(n);
254 stmts = asdl_seq_new(num, arena);
255 if (!stmts)
256 goto error;
257 if (num == 1) {
258 s = ast_for_stmt(&c, n);
259 if (!s)
260 goto error;
261 asdl_seq_SET(stmts, 0, s);
262 }
263 else {
264 /* Only a simple_stmt can contain multiple statements. */
265 REQ(n, simple_stmt);
266 for (i = 0; i < NCH(n); i += 2) {
267 if (TYPE(CHILD(n, i)) == NEWLINE)
268 break;
269 s = ast_for_stmt(&c, CHILD(n, i));
270 if (!s)
271 goto error;
272 asdl_seq_SET(stmts, i / 2, s);
273 }
274 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000276 return Interactive(stmts, arena);
277 }
278 default:
Georg Brandlb8ae3d02007-05-02 20:02:29 +0000279 PyErr_Format(PyExc_SystemError,
280 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000281 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000282 }
283 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 ast_error_finish(filename);
285 return NULL;
286}
287
288/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
289*/
290
291static operator_ty
292get_operator(const node *n)
293{
294 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000295 case VBAR:
296 return BitOr;
297 case CIRCUMFLEX:
298 return BitXor;
299 case AMPER:
300 return BitAnd;
301 case LEFTSHIFT:
302 return LShift;
303 case RIGHTSHIFT:
304 return RShift;
305 case PLUS:
306 return Add;
307 case MINUS:
308 return Sub;
309 case STAR:
310 return Mult;
311 case SLASH:
312 return Div;
313 case DOUBLESLASH:
314 return FloorDiv;
315 case PERCENT:
316 return Mod;
317 default:
318 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319 }
320}
321
Jeremy Hyltona8293132006-02-28 17:58:27 +0000322/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323
324 Only sets context for expr kinds that "can appear in assignment context"
325 (according to ../Parser/Python.asdl). For other expr kinds, it sets
326 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327*/
328
329static int
330set_context(expr_ty e, expr_context_ty ctx, const node *n)
331{
332 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000333 /* If a particular expression type can't be used for assign / delete,
334 set expr_name to its name and an error message will be generated.
335 */
336 const char* expr_name = NULL;
337
338 /* The ast defines augmented store and load contexts, but the
339 implementation here doesn't actually use them. The code may be
340 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000341 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000342 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000343 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000344 */
345 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000346
347 switch (e->kind) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000348 case Attribute_kind:
349 if (ctx == Store &&
350 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
351 return ast_error(n, "assignment to None");
352 }
353 e->v.Attribute.ctx = ctx;
354 break;
355 case Subscript_kind:
356 e->v.Subscript.ctx = ctx;
357 break;
358 case Name_kind:
359 if (ctx == Store &&
360 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
361 return ast_error(n, "assignment to None");
362 }
363 e->v.Name.ctx = ctx;
364 break;
365 case List_kind:
366 e->v.List.ctx = ctx;
367 s = e->v.List.elts;
368 break;
369 case Tuple_kind:
370 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
371 return ast_error(n, "can't assign to ()");
372 e->v.Tuple.ctx = ctx;
373 s = e->v.Tuple.elts;
374 break;
375 case Lambda_kind:
376 expr_name = "lambda";
377 break;
378 case Call_kind:
379 expr_name = "function call";
380 break;
381 case BoolOp_kind:
382 case BinOp_kind:
383 case UnaryOp_kind:
384 expr_name = "operator";
385 break;
386 case GeneratorExp_kind:
387 expr_name = "generator expression";
388 break;
389 case Yield_kind:
390 expr_name = "yield expression";
391 break;
392 case ListComp_kind:
393 expr_name = "list comprehension";
394 break;
395 case Dict_kind:
396 case Num_kind:
397 case Str_kind:
398 expr_name = "literal";
399 break;
400 case Compare_kind:
401 expr_name = "comparison";
402 break;
403 case Repr_kind:
404 expr_name = "repr";
405 break;
406 case IfExp_kind:
407 expr_name = "conditional expression";
408 break;
409 default:
410 PyErr_Format(PyExc_SystemError,
411 "unexpected expression in assignment %d (line %d)",
412 e->kind, e->lineno);
413 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000415 /* Check for error string set by switch */
416 if (expr_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000417 char buf[300];
418 PyOS_snprintf(buf, sizeof(buf),
419 "can't %s %s",
420 ctx == Store ? "assign to" : "delete",
421 expr_name);
422 return ast_error(n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000423 }
424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000426 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427 */
428 if (s) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000429 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000430
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000431 for (i = 0; i < asdl_seq_LEN(s); i++) {
432 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
433 return 0;
434 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 }
436 return 1;
437}
438
439static operator_ty
440ast_for_augassign(const node *n)
441{
442 REQ(n, augassign);
443 n = CHILD(n, 0);
444 switch (STR(n)[0]) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000445 case '+':
446 return Add;
447 case '-':
448 return Sub;
449 case '/':
450 if (STR(n)[1] == '/')
451 return FloorDiv;
452 else
453 return Div;
454 case '%':
455 return Mod;
456 case '<':
457 return LShift;
458 case '>':
459 return RShift;
460 case '&':
461 return BitAnd;
462 case '^':
463 return BitXor;
464 case '|':
465 return BitOr;
466 case '*':
467 if (STR(n)[1] == '*')
468 return Pow;
469 else
470 return Mult;
471 default:
472 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
473 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
475}
476
477static cmpop_ty
478ast_for_comp_op(const node *n)
479{
480 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000481 |'is' 'not'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000482 */
483 REQ(n, comp_op);
484 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000485 n = CHILD(n, 0);
486 switch (TYPE(n)) {
487 case LESS:
488 return Lt;
489 case GREATER:
490 return Gt;
491 case EQEQUAL: /* == */
492 return Eq;
493 case LESSEQUAL:
494 return LtE;
495 case GREATEREQUAL:
496 return GtE;
497 case NOTEQUAL:
498 return NotEq;
499 case NAME:
500 if (strcmp(STR(n), "in") == 0)
501 return In;
502 if (strcmp(STR(n), "is") == 0)
503 return Is;
504 default:
505 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
506 STR(n));
507 return (cmpop_ty)0;
508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 else if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000511 /* handle "not in" and "is not" */
512 switch (TYPE(CHILD(n, 0))) {
513 case NAME:
514 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
515 return NotIn;
516 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
517 return IsNot;
518 default:
519 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
520 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
521 return (cmpop_ty)0;
522 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
Neal Norwitz79792652005-11-14 04:25:03 +0000524 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000525 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000526 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527}
528
529static asdl_seq *
530seq_for_testlist(struct compiling *c, const node *n)
531{
532 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000533 asdl_seq *seq;
534 expr_ty expression;
535 int i;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000536 assert(TYPE(n) == testlist ||
537 TYPE(n) == listmaker ||
538 TYPE(n) == testlist_gexp ||
539 TYPE(n) == testlist_safe ||
540 TYPE(n) == testlist1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000542 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000544 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545
546 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000547 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000549 expression = ast_for_expr(c, CHILD(n, i));
550 if (!expression)
551 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000553 assert(i / 2 < seq->size);
554 asdl_seq_SET(seq, i / 2, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 }
556 return seq;
557}
558
559static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000560compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561{
562 int i, len = (NCH(n) + 1) / 2;
563 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000564 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000565 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000566 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567
Neal Norwitz3a230172006-09-22 08:18:10 +0000568 /* fpdef: NAME | '(' fplist ')'
569 fplist: fpdef (',' fpdef)* [',']
570 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572 for (i = 0; i < len; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000573 const node *fpdef_node = CHILD(n, 2*i);
574 const node *child;
575 expr_ty arg;
Neal Norwitz3a230172006-09-22 08:18:10 +0000576set_name:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000577 /* fpdef_node is either a NAME or an fplist */
578 child = CHILD(fpdef_node, 0);
579 if (TYPE(child) == NAME) {
580 if (!strcmp(STR(child), "None")) {
581 ast_error(child, "assignment to None");
582 return NULL;
583 }
584 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
585 child->n_col_offset, c->c_arena);
586 }
587 else {
588 assert(TYPE(fpdef_node) == fpdef);
589 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
590 child = CHILD(fpdef_node, 1);
591 assert(TYPE(child) == fplist);
592 /* NCH == 1 means we have (x), we need to elide the extra parens */
593 if (NCH(child) == 1) {
594 fpdef_node = CHILD(child, 0);
595 assert(TYPE(fpdef_node) == fpdef);
596 goto set_name;
597 }
598 arg = compiler_complex_args(c, child);
599 }
600 asdl_seq_SET(args, i, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601 }
602
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000603 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000604 if (!set_context(result, Store, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000605 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 return result;
607}
608
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609
Jeremy Hyltona8293132006-02-28 17:58:27 +0000610/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
612static arguments_ty
613ast_for_arguments(struct compiling *c, const node *n)
614{
615 /* parameters: '(' [varargslist] ')'
616 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000617 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000619 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 asdl_seq *args, *defaults;
621 identifier vararg = NULL, kwarg = NULL;
622 node *ch;
623
624 if (TYPE(n) == parameters) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000625 if (NCH(n) == 2) /* () as argument list */
626 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
627 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628 }
629 REQ(n, varargslist);
630
631 /* first count the number of normal args & defaults */
632 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000633 ch = CHILD(n, i);
634 if (TYPE(ch) == fpdef)
635 n_args++;
636 if (TYPE(ch) == EQUAL)
637 n_defaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000639 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000640 if (!args && n_args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000641 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000642 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000643 if (!defaults && n_defaults)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000644 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645
646 /* fpdef: NAME | '(' fplist ')'
647 fplist: fpdef (',' fpdef)* [',']
648 */
649 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000650 j = 0; /* index for defaults */
651 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000652 while (i < NCH(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000653 ch = CHILD(n, i);
654 switch (TYPE(ch)) {
655 case fpdef:
656 handle_fpdef:
657 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
658 anything other than EQUAL or a comma? */
659 /* XXX Should NCH(n) check be made a separate check? */
660 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
661 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
662 if (!expression)
663 goto error;
664 assert(defaults != NULL);
665 asdl_seq_SET(defaults, j++, expression);
666 i += 2;
667 found_default = 1;
668 }
669 else if (found_default) {
670 ast_error(n,
671 "non-default argument follows default argument");
672 goto error;
673 }
674 if (NCH(ch) == 3) {
675 ch = CHILD(ch, 1);
676 /* def foo((x)): is not complex, special case. */
677 if (NCH(ch) != 1) {
678 /* We have complex arguments, setup for unpacking. */
679 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000680 if (!asdl_seq_GET(args, k-1))
681 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000682 } else {
683 /* def foo((x)): setup for checking NAME below. */
684 /* Loop because there can be many parens and tuple
685 unpacking mixed in. */
686 ch = CHILD(ch, 0);
687 assert(TYPE(ch) == fpdef);
688 goto handle_fpdef;
689 }
690 }
691 if (TYPE(CHILD(ch, 0)) == NAME) {
692 expr_ty name;
693 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
694 ast_error(CHILD(ch, 0), "assignment to None");
695 goto error;
696 }
697 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
698 Param, LINENO(ch), ch->n_col_offset,
699 c->c_arena);
700 if (!name)
701 goto error;
702 asdl_seq_SET(args, k++, name);
703
704 }
705 i += 2; /* the name and the comma */
706 break;
707 case STAR:
708 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
709 ast_error(CHILD(n, i+1), "assignment to None");
710 goto error;
711 }
712 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
713 i += 3;
714 break;
715 case DOUBLESTAR:
716 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
717 ast_error(CHILD(n, i+1), "assignment to None");
718 goto error;
719 }
720 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
721 i += 3;
722 break;
723 default:
724 PyErr_Format(PyExc_SystemError,
725 "unexpected node in varargslist: %d @ %d",
726 TYPE(ch), i);
727 goto error;
728 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 }
730
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000731 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732
733 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000734 Py_XDECREF(vararg);
735 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 return NULL;
737}
738
739static expr_ty
740ast_for_dotted_name(struct compiling *c, const node *n)
741{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000742 expr_ty e;
743 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000744 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745 int i;
746
747 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000748
749 lineno = LINENO(n);
750 col_offset = n->n_col_offset;
751
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 id = NEW_IDENTIFIER(CHILD(n, 0));
753 if (!id)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000754 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000755 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000757 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758
759 for (i = 2; i < NCH(n); i+=2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000760 id = NEW_IDENTIFIER(CHILD(n, i));
761 if (!id)
762 return NULL;
763 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
764 if (!e)
765 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 }
767
768 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769}
770
771static expr_ty
772ast_for_decorator(struct compiling *c, const node *n)
773{
774 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
775 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000776 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
778 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000779 REQ(CHILD(n, 0), AT);
780 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781
782 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
783 if (!name_expr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000784 return NULL;
785
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 if (NCH(n) == 3) { /* No arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000787 d = name_expr;
788 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 }
790 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000791 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
792 n->n_col_offset, c->c_arena);
793 if (!d)
794 return NULL;
795 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796 }
797 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000798 d = ast_for_call(c, CHILD(n, 3), name_expr);
799 if (!d)
800 return NULL;
801 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 }
803
804 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805}
806
807static asdl_seq*
808ast_for_decorators(struct compiling *c, const node *n)
809{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000810 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000811 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 int i;
813
814 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000815 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 if (!decorator_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000817 return NULL;
818
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000820 d = ast_for_decorator(c, CHILD(n, i));
821 if (!d)
822 return NULL;
823 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 }
825 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000826}
827
828static stmt_ty
829ast_for_funcdef(struct compiling *c, const node *n)
830{
831 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000832 identifier name;
833 arguments_ty args;
834 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 asdl_seq *decorator_seq = NULL;
836 int name_i;
837
838 REQ(n, funcdef);
839
840 if (NCH(n) == 6) { /* decorators are present */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000841 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
842 if (!decorator_seq)
843 return NULL;
844 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 }
846 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000847 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 }
849
850 name = NEW_IDENTIFIER(CHILD(n, name_i));
851 if (!name)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000852 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000854 ast_error(CHILD(n, name_i), "assignment to None");
855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 }
857 args = ast_for_arguments(c, CHILD(n, name_i + 1));
858 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 body = ast_for_suite(c, CHILD(n, name_i + 3));
861 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000862 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000864 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000865 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866}
867
868static expr_ty
869ast_for_lambdef(struct compiling *c, const node *n)
870{
871 /* lambdef: 'lambda' [varargslist] ':' test */
872 arguments_ty args;
873 expr_ty expression;
874
875 if (NCH(n) == 3) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000876 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
877 if (!args)
878 return NULL;
879 expression = ast_for_expr(c, CHILD(n, 2));
880 if (!expression)
881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 }
883 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000884 args = ast_for_arguments(c, CHILD(n, 1));
885 if (!args)
886 return NULL;
887 expression = ast_for_expr(c, CHILD(n, 3));
888 if (!expression)
889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890 }
891
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000892 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000893}
894
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000895static expr_ty
896ast_for_ifexpr(struct compiling *c, const node *n)
897{
898 /* test: or_test 'if' or_test 'else' test */
899 expr_ty expression, body, orelse;
900
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000901 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000902 body = ast_for_expr(c, CHILD(n, 0));
903 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000904 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000905 expression = ast_for_expr(c, CHILD(n, 2));
906 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000907 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000908 orelse = ast_for_expr(c, CHILD(n, 4));
909 if (!orelse)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000910 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000911 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000912 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000913}
914
Neal Norwitze4d4f002006-09-05 03:58:26 +0000915/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
916 so there is only a single version. Possibly for loops can also re-use
917 the code.
918*/
919
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920/* Count the number of 'for' loop in a list comprehension.
921
922 Helper for ast_for_listcomp().
923*/
924
925static int
926count_list_fors(const node *n)
927{
928 int n_fors = 0;
929 node *ch = CHILD(n, 1);
930
931 count_list_for:
932 n_fors++;
933 REQ(ch, list_for);
934 if (NCH(ch) == 5)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000935 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000937 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938 count_list_iter:
939 REQ(ch, list_iter);
940 ch = CHILD(ch, 0);
941 if (TYPE(ch) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000942 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 else if (TYPE(ch) == list_if) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000944 if (NCH(ch) == 3) {
945 ch = CHILD(ch, 2);
946 goto count_list_iter;
947 }
948 else
949 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000951
952 /* Should never be reached */
953 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
954 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955}
956
957/* Count the number of 'if' statements in a list comprehension.
958
959 Helper for ast_for_listcomp().
960*/
961
962static int
963count_list_ifs(const node *n)
964{
965 int n_ifs = 0;
966
967 count_list_iter:
968 REQ(n, list_iter);
969 if (TYPE(CHILD(n, 0)) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000970 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 n = CHILD(n, 0);
972 REQ(n, list_if);
973 n_ifs++;
974 if (NCH(n) == 2)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000975 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 n = CHILD(n, 2);
977 goto count_list_iter;
978}
979
980static expr_ty
981ast_for_listcomp(struct compiling *c, const node *n)
982{
983 /* listmaker: test ( list_for | (',' test)* [','] )
984 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
985 list_iter: list_for | list_if
986 list_if: 'if' test [list_iter]
987 testlist_safe: test [(',' test)+ [',']]
988 */
989 expr_ty elt;
990 asdl_seq *listcomps;
991 int i, n_fors;
992 node *ch;
993
994 REQ(n, listmaker);
995 assert(NCH(n) > 1);
996
997 elt = ast_for_expr(c, CHILD(n, 0));
998 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000999 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000
1001 n_fors = count_list_fors(n);
1002 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001005 listcomps = asdl_seq_new(n_fors, c->c_arena);
1006 if (!listcomps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001007 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001008
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009 ch = CHILD(n, 1);
1010 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001011 comprehension_ty lc;
1012 asdl_seq *t;
1013 expr_ty expression;
1014 node *for_ch;
1015
1016 REQ(ch, list_for);
1017
1018 for_ch = CHILD(ch, 1);
1019 t = ast_for_exprlist(c, for_ch, Store);
1020 if (!t)
1021 return NULL;
1022 expression = ast_for_testlist(c, CHILD(ch, 3));
1023 if (!expression)
1024 return NULL;
1025
1026 /* Check the # of children rather than the length of t, since
1027 [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1028 */
1029 if (NCH(for_ch) == 1)
1030 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
1031 c->c_arena);
1032 else
1033 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1034 c->c_arena),
1035 expression, NULL, c->c_arena);
1036 if (!lc)
1037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001039 if (NCH(ch) == 5) {
1040 int j, n_ifs;
1041 asdl_seq *ifs;
1042 expr_ty list_for_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001044 ch = CHILD(ch, 4);
1045 n_ifs = count_list_ifs(ch);
1046 if (n_ifs == -1)
1047 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001049 ifs = asdl_seq_new(n_ifs, c->c_arena);
1050 if (!ifs)
1051 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001053 for (j = 0; j < n_ifs; j++) {
1054 REQ(ch, list_iter);
1055 ch = CHILD(ch, 0);
1056 REQ(ch, list_if);
1057
1058 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1059 if (!list_for_expr)
1060 return NULL;
1061
1062 asdl_seq_SET(ifs, j, list_for_expr);
1063 if (NCH(ch) == 3)
1064 ch = CHILD(ch, 2);
1065 }
1066 /* on exit, must guarantee that ch is a list_for */
1067 if (TYPE(ch) == list_iter)
1068 ch = CHILD(ch, 0);
1069 lc->ifs = ifs;
1070 }
1071 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 }
1073
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001074 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001077/* Count the number of 'for' loops in a generator expression.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078
1079 Helper for ast_for_genexp().
1080*/
1081
1082static int
1083count_gen_fors(const node *n)
1084{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001085 int n_fors = 0;
1086 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087
1088 count_gen_for:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001089 n_fors++;
1090 REQ(ch, gen_for);
1091 if (NCH(ch) == 5)
1092 ch = CHILD(ch, 4);
1093 else
1094 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 count_gen_iter:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001096 REQ(ch, gen_iter);
1097 ch = CHILD(ch, 0);
1098 if (TYPE(ch) == gen_for)
1099 goto count_gen_for;
1100 else if (TYPE(ch) == gen_if) {
1101 if (NCH(ch) == 3) {
1102 ch = CHILD(ch, 2);
1103 goto count_gen_iter;
1104 }
1105 else
1106 return n_fors;
1107 }
1108
1109 /* Should never be reached */
1110 PyErr_SetString(PyExc_SystemError,
1111 "logic error in count_gen_fors");
1112 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113}
1114
1115/* Count the number of 'if' statements in a generator expression.
1116
1117 Helper for ast_for_genexp().
1118*/
1119
1120static int
1121count_gen_ifs(const node *n)
1122{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001123 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001125 while (1) {
1126 REQ(n, gen_iter);
1127 if (TYPE(CHILD(n, 0)) == gen_for)
1128 return n_ifs;
1129 n = CHILD(n, 0);
1130 REQ(n, gen_if);
1131 n_ifs++;
1132 if (NCH(n) == 2)
1133 return n_ifs;
1134 n = CHILD(n, 2);
1135 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136}
1137
Jeremy Hyltona8293132006-02-28 17:58:27 +00001138/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139static expr_ty
1140ast_for_genexp(struct compiling *c, const node *n)
1141{
1142 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001143 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144 expr_ty elt;
1145 asdl_seq *genexps;
1146 int i, n_fors;
1147 node *ch;
1148
1149 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1150 assert(NCH(n) > 1);
1151
1152 elt = ast_for_expr(c, CHILD(n, 0));
1153 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001154 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155
1156 n_fors = count_gen_fors(n);
1157 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001158 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001159
1160 genexps = asdl_seq_new(n_fors, c->c_arena);
1161 if (!genexps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001162 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001163
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 ch = CHILD(n, 1);
1165 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001166 comprehension_ty ge;
1167 asdl_seq *t;
1168 expr_ty expression;
1169 node *for_ch;
1170
1171 REQ(ch, gen_for);
1172
1173 for_ch = CHILD(ch, 1);
1174 t = ast_for_exprlist(c, for_ch, Store);
1175 if (!t)
1176 return NULL;
1177 expression = ast_for_expr(c, CHILD(ch, 3));
1178 if (!expression)
1179 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001181 /* Check the # of children rather than the length of t, since
1182 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1183 if (NCH(for_ch) == 1)
1184 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1185 NULL, c->c_arena);
1186 else
1187 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1188 c->c_arena),
1189 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001191 if (!ge)
1192 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001193
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001194 if (NCH(ch) == 5) {
1195 int j, n_ifs;
1196 asdl_seq *ifs;
1197
1198 ch = CHILD(ch, 4);
1199 n_ifs = count_gen_ifs(ch);
1200 if (n_ifs == -1)
1201 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001203 ifs = asdl_seq_new(n_ifs, c->c_arena);
1204 if (!ifs)
1205 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001206
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001207 for (j = 0; j < n_ifs; j++) {
1208 REQ(ch, gen_iter);
1209 ch = CHILD(ch, 0);
1210 REQ(ch, gen_if);
1211
1212 expression = ast_for_expr(c, CHILD(ch, 1));
1213 if (!expression)
1214 return NULL;
1215 asdl_seq_SET(ifs, j, expression);
1216 if (NCH(ch) == 3)
1217 ch = CHILD(ch, 2);
1218 }
1219 /* on exit, must guarantee that ch is a gen_for */
1220 if (TYPE(ch) == gen_iter)
1221 ch = CHILD(ch, 0);
1222 ge->ifs = ifs;
1223 }
1224 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 }
1226
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001227 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228}
1229
1230static expr_ty
1231ast_for_atom(struct compiling *c, const node *n)
1232{
1233 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1234 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1235 */
1236 node *ch = CHILD(n, 0);
1237
1238 switch (TYPE(ch)) {
1239 case NAME:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001240 /* All names start in Load context, but may later be
1241 changed. */
1242 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset,
1243 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 case STRING: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001245 PyObject *str = parsestrplus(c, n);
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001246 if (!str) {
1247 if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
1248 PyObject *type, *value, *tback, *errstr;
1249 PyErr_Fetch(&type, &value, &tback);
1250 errstr = ((PyUnicodeErrorObject *)value)->reason;
1251 if (errstr) {
1252 char *s = "";
1253 char buf[128];
1254 s = PyString_AsString(errstr);
1255 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1256 ast_error(n, buf);
1257 } else {
1258 ast_error(n, "(unicode error) unknown error");
1259 }
1260 Py_DECREF(type);
1261 Py_DECREF(value);
1262 Py_XDECREF(tback);
1263 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001264 return NULL;
Guido van Rossumb6ac23c2007-07-18 17:19:14 +00001265 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001266 PyArena_AddPyObject(c->c_arena, str);
1267 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268 }
1269 case NUMBER: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001270 PyObject *pynum = parsenumber(STR(ch));
1271 if (!pynum)
1272 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001273
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001274 PyArena_AddPyObject(c->c_arena, pynum);
1275 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 }
1277 case LPAR: /* some parenthesized expressions */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001278 ch = CHILD(n, 1);
1279
1280 if (TYPE(ch) == RPAR)
1281 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1282
1283 if (TYPE(ch) == yield_expr)
1284 return ast_for_expr(c, ch);
1285
1286 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1287 return ast_for_genexp(c, ch);
1288
1289 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290 case LSQB: /* list (or list comprehension) */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001291 ch = CHILD(n, 1);
1292
1293 if (TYPE(ch) == RSQB)
1294 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1295
1296 REQ(ch, listmaker);
1297 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1298 asdl_seq *elts = seq_for_testlist(c, ch);
1299 if (!elts)
1300 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001301
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001302 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1303 }
1304 else
1305 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306 case LBRACE: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001307 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1308 int i, size;
1309 asdl_seq *keys, *values;
1310
1311 ch = CHILD(n, 1);
1312 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1313 keys = asdl_seq_new(size, c->c_arena);
1314 if (!keys)
1315 return NULL;
1316
1317 values = asdl_seq_new(size, c->c_arena);
1318 if (!values)
1319 return NULL;
1320
1321 for (i = 0; i < NCH(ch); i += 4) {
1322 expr_ty expression;
1323
1324 expression = ast_for_expr(c, CHILD(ch, i));
1325 if (!expression)
1326 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001327
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001328 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001329
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001330 expression = ast_for_expr(c, CHILD(ch, i + 2));
1331 if (!expression)
1332 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001333
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001334 asdl_seq_SET(values, i / 4, expression);
1335 }
1336 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 }
1338 case BACKQUOTE: { /* repr */
Christian Heimes02c9ab52007-11-23 12:12:02 +00001339 if (Py_Py3kWarningFlag) {
1340 if (PyErr_WarnExplicit(PyExc_DeprecationWarning,
1341 "backquote not supported in 3.x",
1342 "<unknown>", LINENO(n),
1343 NULL, NULL)) {
1344 ; //return NULL;
1345 }
1346 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001347 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
1348 if (!expression)
1349 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001350
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001351 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 }
1353 default:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001354 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1355 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 }
1357}
1358
1359static slice_ty
1360ast_for_slice(struct compiling *c, const node *n)
1361{
1362 node *ch;
1363 expr_ty lower = NULL, upper = NULL, step = NULL;
1364
1365 REQ(n, subscript);
1366
1367 /*
1368 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1369 sliceop: ':' [test]
1370 */
1371 ch = CHILD(n, 0);
1372 if (TYPE(ch) == DOT)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001373 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374
1375 if (NCH(n) == 1 && TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001376 /* 'step' variable hold no significance in terms of being used over
1377 other vars */
1378 step = ast_for_expr(c, ch);
1379 if (!step)
1380 return NULL;
1381
1382 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 }
1384
1385 if (TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001386 lower = ast_for_expr(c, ch);
1387 if (!lower)
1388 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 }
1390
1391 /* If there's an upper bound it's in the second or third position. */
1392 if (TYPE(ch) == COLON) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001393 if (NCH(n) > 1) {
1394 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001396 if (TYPE(n2) == test) {
1397 upper = ast_for_expr(c, n2);
1398 if (!upper)
1399 return NULL;
1400 }
1401 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 } else if (NCH(n) > 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001403 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001405 if (TYPE(n2) == test) {
1406 upper = ast_for_expr(c, n2);
1407 if (!upper)
1408 return NULL;
1409 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410 }
1411
1412 ch = CHILD(n, NCH(n) - 1);
1413 if (TYPE(ch) == sliceop) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001414 if (NCH(ch) == 1) {
1415 /* No expression, so step is None */
1416 ch = CHILD(ch, 0);
1417 step = Name(new_identifier("None", c->c_arena), Load,
1418 LINENO(ch), ch->n_col_offset, c->c_arena);
1419 if (!step)
1420 return NULL;
1421 } else {
1422 ch = CHILD(ch, 1);
1423 if (TYPE(ch) == test) {
1424 step = ast_for_expr(c, ch);
1425 if (!step)
1426 return NULL;
1427 }
1428 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429 }
1430
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001431 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432}
1433
1434static expr_ty
1435ast_for_binop(struct compiling *c, const node *n)
1436{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001437 /* Must account for a sequence of expressions.
1438 How should A op B op C by represented?
1439 BinOp(BinOp(A, op, B), op, C).
1440 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001442 int i, nops;
1443 expr_ty expr1, expr2, result;
1444 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001446 expr1 = ast_for_expr(c, CHILD(n, 0));
1447 if (!expr1)
1448 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001450 expr2 = ast_for_expr(c, CHILD(n, 2));
1451 if (!expr2)
1452 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001454 newoperator = get_operator(CHILD(n, 1));
1455 if (!newoperator)
1456 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001458 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1459 c->c_arena);
1460 if (!result)
1461 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001463 nops = (NCH(n) - 1) / 2;
1464 for (i = 1; i < nops; i++) {
1465 expr_ty tmp_result, tmp;
1466 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001468 newoperator = get_operator(next_oper);
1469 if (!newoperator)
1470 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001472 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1473 if (!tmp)
1474 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001476 tmp_result = BinOp(result, newoperator, tmp,
1477 LINENO(next_oper), next_oper->n_col_offset,
1478 c->c_arena);
Neal Norwitz3adac212007-10-05 03:41:19 +00001479 if (!tmp_result)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001480 return NULL;
1481 result = tmp_result;
1482 }
1483 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484}
1485
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001486static expr_ty
1487ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1488{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001489 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1490 subscriptlist: subscript (',' subscript)* [',']
1491 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1492 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001493 REQ(n, trailer);
1494 if (TYPE(CHILD(n, 0)) == LPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001495 if (NCH(n) == 2)
1496 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1497 n->n_col_offset, c->c_arena);
1498 else
1499 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001500 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001501 else if (TYPE(CHILD(n, 0)) == DOT ) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001502 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
1503 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001504 }
1505 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001506 REQ(CHILD(n, 0), LSQB);
1507 REQ(CHILD(n, 2), RSQB);
1508 n = CHILD(n, 1);
1509 if (NCH(n) == 1) {
1510 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1511 if (!slc)
1512 return NULL;
1513 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1514 c->c_arena);
1515 }
1516 else {
1517 /* The grammar is ambiguous here. The ambiguity is resolved
1518 by treating the sequence as a tuple literal if there are
1519 no slice features.
1520 */
1521 int j;
1522 slice_ty slc;
1523 expr_ty e;
1524 bool simple = true;
1525 asdl_seq *slices, *elts;
1526 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1527 if (!slices)
1528 return NULL;
1529 for (j = 0; j < NCH(n); j += 2) {
1530 slc = ast_for_slice(c, CHILD(n, j));
1531 if (!slc)
1532 return NULL;
1533 if (slc->kind != Index_kind)
1534 simple = false;
1535 asdl_seq_SET(slices, j / 2, slc);
1536 }
1537 if (!simple) {
1538 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1539 Load, LINENO(n), n->n_col_offset, c->c_arena);
1540 }
1541 /* extract Index values and put them in a Tuple */
1542 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1543 if (!elts)
1544 return NULL;
1545 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1546 slc = (slice_ty)asdl_seq_GET(slices, j);
1547 assert(slc->kind == Index_kind && slc->v.Index.value);
1548 asdl_seq_SET(elts, j, slc->v.Index.value);
1549 }
1550 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1551 if (!e)
1552 return NULL;
1553 return Subscript(left_expr, Index(e, c->c_arena),
1554 Load, LINENO(n), n->n_col_offset, c->c_arena);
1555 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001556 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001557}
1558
1559static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001560ast_for_factor(struct compiling *c, const node *n)
1561{
1562 node *pfactor, *ppower, *patom, *pnum;
1563 expr_ty expression;
1564
1565 /* If the unary - operator is applied to a constant, don't generate
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001566 a UNARY_NEGATIVE opcode. Just store the approriate value as a
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001567 constant. The peephole optimizer already does something like
1568 this but it doesn't handle the case where the constant is
1569 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1570 PyLongObject.
1571 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001572 if (TYPE(CHILD(n, 0)) == MINUS &&
1573 NCH(n) == 2 &&
1574 TYPE((pfactor = CHILD(n, 1))) == factor &&
1575 NCH(pfactor) == 1 &&
1576 TYPE((ppower = CHILD(pfactor, 0))) == power &&
1577 NCH(ppower) == 1 &&
1578 TYPE((patom = CHILD(ppower, 0))) == atom &&
1579 TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1580 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1581 if (s == NULL)
1582 return NULL;
1583 s[0] = '-';
1584 strcpy(s + 1, STR(pnum));
1585 PyObject_FREE(STR(pnum));
1586 STR(pnum) = s;
1587 return ast_for_atom(c, patom);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001588 }
1589
1590 expression = ast_for_expr(c, CHILD(n, 1));
1591 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001592 return NULL;
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001593
1594 switch (TYPE(CHILD(n, 0))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001595 case PLUS:
1596 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1597 c->c_arena);
1598 case MINUS:
1599 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1600 c->c_arena);
1601 case TILDE:
1602 return UnaryOp(Invert, expression, LINENO(n),
1603 n->n_col_offset, c->c_arena);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001604 }
1605 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001606 TYPE(CHILD(n, 0)));
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001607 return NULL;
1608}
1609
1610static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611ast_for_power(struct compiling *c, const node *n)
1612{
1613 /* power: atom trailer* ('**' factor)*
1614 */
1615 int i;
1616 expr_ty e, tmp;
1617 REQ(n, power);
1618 e = ast_for_atom(c, CHILD(n, 0));
1619 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001620 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001621 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001622 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001623 for (i = 1; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001624 node *ch = CHILD(n, i);
1625 if (TYPE(ch) != trailer)
1626 break;
1627 tmp = ast_for_trailer(c, ch, e);
1628 if (!tmp)
1629 return NULL;
1630 tmp->lineno = e->lineno;
1631 tmp->col_offset = e->col_offset;
1632 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001633 }
1634 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001635 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1636 if (!f)
1637 return NULL;
1638 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1639 if (!tmp)
1640 return NULL;
1641 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001642 }
1643 return e;
1644}
1645
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646/* Do not name a variable 'expr'! Will cause a compile error.
1647*/
1648
1649static expr_ty
1650ast_for_expr(struct compiling *c, const node *n)
1651{
1652 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001653 test: or_test ['if' or_test 'else' test] | lambdef
1654 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655 and_test: not_test ('and' not_test)*
1656 not_test: 'not' not_test | comparison
1657 comparison: expr (comp_op expr)*
1658 expr: xor_expr ('|' xor_expr)*
1659 xor_expr: and_expr ('^' and_expr)*
1660 and_expr: shift_expr ('&' shift_expr)*
1661 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1662 arith_expr: term (('+'|'-') term)*
1663 term: factor (('*'|'/'|'%'|'//') factor)*
1664 factor: ('+'|'-'|'~') factor | power
1665 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001666
1667 As well as modified versions that exist for backward compatibility,
1668 to explicitly allow:
1669 [ x for x in lambda: 0, lambda: 1 ]
1670 (which would be ambiguous without these extra rules)
1671
1672 old_test: or_test | old_lambdef
1673 old_lambdef: 'lambda' [vararglist] ':' old_test
1674
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675 */
1676
1677 asdl_seq *seq;
1678 int i;
1679
1680 loop:
1681 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001682 case test:
1683 case old_test:
1684 if (TYPE(CHILD(n, 0)) == lambdef ||
1685 TYPE(CHILD(n, 0)) == old_lambdef)
1686 return ast_for_lambdef(c, CHILD(n, 0));
1687 else if (NCH(n) > 1)
1688 return ast_for_ifexpr(c, n);
1689 /* Fallthrough */
1690 case or_test:
1691 case and_test:
1692 if (NCH(n) == 1) {
1693 n = CHILD(n, 0);
1694 goto loop;
1695 }
1696 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1697 if (!seq)
1698 return NULL;
1699 for (i = 0; i < NCH(n); i += 2) {
1700 expr_ty e = ast_for_expr(c, CHILD(n, i));
1701 if (!e)
1702 return NULL;
1703 asdl_seq_SET(seq, i / 2, e);
1704 }
1705 if (!strcmp(STR(CHILD(n, 1)), "and"))
1706 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1707 c->c_arena);
1708 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1709 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1710 case not_test:
1711 if (NCH(n) == 1) {
1712 n = CHILD(n, 0);
1713 goto loop;
1714 }
1715 else {
1716 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1717 if (!expression)
1718 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001720 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1721 c->c_arena);
1722 }
1723 case comparison:
1724 if (NCH(n) == 1) {
1725 n = CHILD(n, 0);
1726 goto loop;
1727 }
1728 else {
1729 expr_ty expression;
1730 asdl_int_seq *ops;
1731 asdl_seq *cmps;
1732 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1733 if (!ops)
1734 return NULL;
1735 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1736 if (!cmps) {
1737 return NULL;
1738 }
1739 for (i = 1; i < NCH(n); i += 2) {
1740 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001742 newoperator = ast_for_comp_op(CHILD(n, i));
1743 if (!newoperator) {
1744 return NULL;
1745 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001747 expression = ast_for_expr(c, CHILD(n, i + 1));
1748 if (!expression) {
1749 return NULL;
1750 }
1751
1752 asdl_seq_SET(ops, i / 2, newoperator);
1753 asdl_seq_SET(cmps, i / 2, expression);
1754 }
1755 expression = ast_for_expr(c, CHILD(n, 0));
1756 if (!expression) {
1757 return NULL;
1758 }
1759
1760 return Compare(expression, ops, cmps, LINENO(n),
1761 n->n_col_offset, c->c_arena);
1762 }
1763 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001765 /* The next five cases all handle BinOps. The main body of code
1766 is the same in each case, but the switch turned inside out to
1767 reuse the code for each type of operator.
1768 */
1769 case expr:
1770 case xor_expr:
1771 case and_expr:
1772 case shift_expr:
1773 case arith_expr:
1774 case term:
1775 if (NCH(n) == 1) {
1776 n = CHILD(n, 0);
1777 goto loop;
1778 }
1779 return ast_for_binop(c, n);
1780 case yield_expr: {
1781 expr_ty exp = NULL;
1782 if (NCH(n) == 2) {
1783 exp = ast_for_testlist(c, CHILD(n, 1));
1784 if (!exp)
1785 return NULL;
1786 }
1787 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1788 }
1789 case factor:
1790 if (NCH(n) == 1) {
1791 n = CHILD(n, 0);
1792 goto loop;
1793 }
1794 return ast_for_factor(c, n);
1795 case power:
1796 return ast_for_power(c, n);
1797 default:
1798 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001801 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802 return NULL;
1803}
1804
1805static expr_ty
1806ast_for_call(struct compiling *c, const node *n, expr_ty func)
1807{
1808 /*
1809 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001810 | '**' test)
1811 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 */
1813
1814 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001815 asdl_seq *args;
1816 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817 expr_ty vararg = NULL, kwarg = NULL;
1818
1819 REQ(n, arglist);
1820
1821 nargs = 0;
1822 nkeywords = 0;
1823 ngens = 0;
1824 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001825 node *ch = CHILD(n, i);
1826 if (TYPE(ch) == argument) {
1827 if (NCH(ch) == 1)
1828 nargs++;
1829 else if (TYPE(CHILD(ch, 1)) == gen_for)
1830 ngens++;
1831 else
1832 nkeywords++;
1833 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 }
1835 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001836 ast_error(n, "Generator expression must be parenthesized "
1837 "if not sole argument");
1838 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 }
1840
1841 if (nargs + nkeywords + ngens > 255) {
1842 ast_error(n, "more than 255 arguments");
1843 return NULL;
1844 }
1845
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001846 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001848 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001849 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850 if (!keywords)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001851 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001852 nargs = 0;
1853 nkeywords = 0;
1854 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001855 node *ch = CHILD(n, i);
1856 if (TYPE(ch) == argument) {
1857 expr_ty e;
1858 if (NCH(ch) == 1) {
1859 if (nkeywords) {
1860 ast_error(CHILD(ch, 0),
1861 "non-keyword arg after keyword arg");
1862 return NULL;
1863 }
1864 e = ast_for_expr(c, CHILD(ch, 0));
1865 if (!e)
1866 return NULL;
1867 asdl_seq_SET(args, nargs++, e);
1868 }
1869 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1870 e = ast_for_genexp(c, ch);
1871 if (!e)
1872 return NULL;
1873 asdl_seq_SET(args, nargs++, e);
1874 }
1875 else {
1876 keyword_ty kw;
1877 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001879 /* CHILD(ch, 0) is test, but must be an identifier? */
1880 e = ast_for_expr(c, CHILD(ch, 0));
1881 if (!e)
1882 return NULL;
1883 /* f(lambda x: x[0] = 3) ends up getting parsed with
1884 * LHS test = lambda x: x[0], and RHS test = 3.
1885 * SF bug 132313 points out that complaining about a keyword
1886 * then is very confusing.
1887 */
1888 if (e->kind == Lambda_kind) {
1889 ast_error(CHILD(ch, 0),
1890 "lambda cannot contain assignment");
1891 return NULL;
1892 } else if (e->kind != Name_kind) {
1893 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1894 return NULL;
1895 }
1896 key = e->v.Name.id;
Georg Brandle06cf452007-06-07 13:23:24 +00001897 if (!strcmp(PyString_AS_STRING(key), "None")) {
1898 ast_error(CHILD(ch, 0), "assignment to None");
1899 return NULL;
1900 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001901 e = ast_for_expr(c, CHILD(ch, 2));
1902 if (!e)
1903 return NULL;
1904 kw = keyword(key, e, c->c_arena);
1905 if (!kw)
1906 return NULL;
1907 asdl_seq_SET(keywords, nkeywords++, kw);
1908 }
1909 }
1910 else if (TYPE(ch) == STAR) {
1911 vararg = ast_for_expr(c, CHILD(n, i+1));
1912 i++;
1913 }
1914 else if (TYPE(ch) == DOUBLESTAR) {
1915 kwarg = ast_for_expr(c, CHILD(n, i+1));
1916 i++;
1917 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 }
1919
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001920 return Call(func, args, keywords, vararg, kwarg, func->lineno,
1921 func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922}
1923
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001925ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001926{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001927 /* testlist_gexp: test (',' test)* [','] */
1928 /* testlist: test (',' test)* [','] */
1929 /* testlist_safe: test (',' test)+ [','] */
1930 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001932 if (TYPE(n) == testlist_gexp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001933 if (NCH(n) > 1)
1934 assert(TYPE(CHILD(n, 1)) != gen_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001935 }
1936 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001937 assert(TYPE(n) == testlist ||
1938 TYPE(n) == testlist_safe ||
1939 TYPE(n) == testlist1);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001940 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001942 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001944 asdl_seq *tmp = seq_for_testlist(c, n);
1945 if (!tmp)
1946 return NULL;
1947 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001949}
1950
1951static expr_ty
1952ast_for_testlist_gexp(struct compiling *c, const node* n)
1953{
1954 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1955 /* argument: test [ gen_for ] */
1956 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001957 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001958 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001959 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001960}
1961
1962/* like ast_for_testlist() but returns a sequence */
1963static asdl_seq*
1964ast_for_class_bases(struct compiling *c, const node* n)
1965{
1966 /* testlist: test (',' test)* [','] */
1967 assert(NCH(n) > 0);
1968 REQ(n, testlist);
1969 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001970 expr_ty base;
1971 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
1972 if (!bases)
1973 return NULL;
1974 base = ast_for_expr(c, CHILD(n, 0));
1975 if (!base)
1976 return NULL;
1977 asdl_seq_SET(bases, 0, base);
1978 return bases;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001979 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001980
1981 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982}
1983
1984static stmt_ty
1985ast_for_expr_stmt(struct compiling *c, const node *n)
1986{
1987 REQ(n, expr_stmt);
1988 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001989 | ('=' (yield_expr|testlist))*)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 testlist: test (',' test)* [',']
1991 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001992 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 test: ... here starts the operator precendence dance
1994 */
1995
1996 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001997 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
1998 if (!e)
1999 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002001 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 }
2003 else if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002004 expr_ty expr1, expr2;
2005 operator_ty newoperator;
2006 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002008 expr1 = ast_for_testlist(c, ch);
2009 if (!expr1)
2010 return NULL;
2011 /* TODO(nas): Remove duplicated error checks (set_context does it) */
2012 switch (expr1->kind) {
2013 case GeneratorExp_kind:
2014 ast_error(ch, "augmented assignment to generator "
2015 "expression not possible");
2016 return NULL;
2017 case Yield_kind:
2018 ast_error(ch, "augmented assignment to yield "
2019 "expression not possible");
2020 return NULL;
2021 case Name_kind: {
2022 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
2023 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
2024 ast_error(ch, "assignment to None");
2025 return NULL;
2026 }
2027 break;
2028 }
2029 case Attribute_kind:
2030 case Subscript_kind:
2031 break;
2032 default:
2033 ast_error(ch, "illegal expression for augmented "
2034 "assignment");
2035 return NULL;
2036 }
2037 if(!set_context(expr1, Store, ch))
2038 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002040 ch = CHILD(n, 2);
2041 if (TYPE(ch) == testlist)
2042 expr2 = ast_for_testlist(c, ch);
2043 else
2044 expr2 = ast_for_expr(c, ch);
2045 if (!expr2)
2046 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002048 newoperator = ast_for_augassign(CHILD(n, 1));
2049 if (!newoperator)
2050 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002052 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2053 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 }
2055 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002056 int i;
2057 asdl_seq *targets;
2058 node *value;
2059 expr_ty expression;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002061 /* a normal assignment */
2062 REQ(CHILD(n, 1), EQUAL);
2063 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2064 if (!targets)
2065 return NULL;
2066 for (i = 0; i < NCH(n) - 2; i += 2) {
2067 expr_ty e;
2068 node *ch = CHILD(n, i);
2069 if (TYPE(ch) == yield_expr) {
2070 ast_error(ch, "assignment to yield expression not possible");
2071 return NULL;
2072 }
2073 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002075 /* set context to assign */
2076 if (!e)
2077 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002079 if (!set_context(e, Store, CHILD(n, i)))
2080 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002082 asdl_seq_SET(targets, i / 2, e);
2083 }
2084 value = CHILD(n, NCH(n) - 1);
2085 if (TYPE(value) == testlist)
2086 expression = ast_for_testlist(c, value);
2087 else
2088 expression = ast_for_expr(c, value);
2089 if (!expression)
2090 return NULL;
2091 return Assign(targets, expression, LINENO(n), n->n_col_offset,
2092 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094}
2095
2096static stmt_ty
2097ast_for_print_stmt(struct compiling *c, const node *n)
2098{
2099 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002100 | '>>' test [ (',' test)+ [','] ] )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 */
2102 expr_ty dest = NULL, expression;
2103 asdl_seq *seq;
2104 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002105 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106
2107 REQ(n, print_stmt);
2108 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002109 dest = ast_for_expr(c, CHILD(n, 2));
2110 if (!dest)
2111 return NULL;
2112 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002114 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002116 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002117 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002118 expression = ast_for_expr(c, CHILD(n, i));
2119 if (!expression)
2120 return NULL;
2121 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122 }
2123 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002124 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125}
2126
2127static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002128ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129{
2130 asdl_seq *seq;
2131 int i;
2132 expr_ty e;
2133
2134 REQ(n, exprlist);
2135
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002136 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002138 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002140 e = ast_for_expr(c, CHILD(n, i));
2141 if (!e)
2142 return NULL;
2143 asdl_seq_SET(seq, i / 2, e);
2144 if (context && !set_context(e, context, CHILD(n, i)))
2145 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146 }
2147 return seq;
2148}
2149
2150static stmt_ty
2151ast_for_del_stmt(struct compiling *c, const node *n)
2152{
2153 asdl_seq *expr_list;
2154
2155 /* del_stmt: 'del' exprlist */
2156 REQ(n, del_stmt);
2157
2158 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2159 if (!expr_list)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002160 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162}
2163
2164static stmt_ty
2165ast_for_flow_stmt(struct compiling *c, const node *n)
2166{
2167 /*
2168 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002169 | yield_stmt
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 break_stmt: 'break'
2171 continue_stmt: 'continue'
2172 return_stmt: 'return' [testlist]
2173 yield_stmt: yield_expr
2174 yield_expr: 'yield' testlist
2175 raise_stmt: 'raise' [test [',' test [',' test]]]
2176 */
2177 node *ch;
2178
2179 REQ(n, flow_stmt);
2180 ch = CHILD(n, 0);
2181 switch (TYPE(ch)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002182 case break_stmt:
2183 return Break(LINENO(n), n->n_col_offset, c->c_arena);
2184 case continue_stmt:
2185 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2186 case yield_stmt: { /* will reduce to yield_expr */
2187 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2188 if (!exp)
2189 return NULL;
2190 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2191 }
2192 case return_stmt:
2193 if (NCH(ch) == 1)
2194 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2195 else {
2196 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2197 if (!expression)
2198 return NULL;
2199 return Return(expression, LINENO(n), n->n_col_offset,
2200 c->c_arena);
2201 }
2202 case raise_stmt:
2203 if (NCH(ch) == 1)
2204 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2205 c->c_arena);
2206 else if (NCH(ch) == 2) {
2207 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2208 if (!expression)
2209 return NULL;
2210 return Raise(expression, NULL, NULL, LINENO(n),
2211 n->n_col_offset, c->c_arena);
2212 }
2213 else if (NCH(ch) == 4) {
2214 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002216 expr1 = ast_for_expr(c, CHILD(ch, 1));
2217 if (!expr1)
2218 return NULL;
2219 expr2 = ast_for_expr(c, CHILD(ch, 3));
2220 if (!expr2)
2221 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002223 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2224 c->c_arena);
2225 }
2226 else if (NCH(ch) == 6) {
2227 expr_ty expr1, expr2, expr3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002229 expr1 = ast_for_expr(c, CHILD(ch, 1));
2230 if (!expr1)
2231 return NULL;
2232 expr2 = ast_for_expr(c, CHILD(ch, 3));
2233 if (!expr2)
2234 return NULL;
2235 expr3 = ast_for_expr(c, CHILD(ch, 5));
2236 if (!expr3)
2237 return NULL;
2238
2239 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2240 c->c_arena);
2241 }
2242 default:
2243 PyErr_Format(PyExc_SystemError,
2244 "unexpected flow_stmt: %d", TYPE(ch));
2245 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002247
2248 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2249 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250}
2251
2252static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002253alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254{
2255 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002256 import_as_name: NAME ['as' NAME]
2257 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 dotted_name: NAME ('.' NAME)*
2259 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002260 PyObject *str;
2261
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 loop:
2263 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002264 case import_as_name:
2265 str = NULL;
2266 if (NCH(n) == 3) {
2267 str = NEW_IDENTIFIER(CHILD(n, 2));
2268 }
2269 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
2270 case dotted_as_name:
2271 if (NCH(n) == 1) {
2272 n = CHILD(n, 0);
2273 goto loop;
2274 }
2275 else {
2276 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
2277 if (!a)
2278 return NULL;
2279 assert(!a->asname);
2280 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2281 return a;
2282 }
2283 break;
2284 case dotted_name:
2285 if (NCH(n) == 1)
2286 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
2287 else {
2288 /* Create a string of the form "a.b.c" */
2289 int i;
2290 size_t len;
2291 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002293 len = 0;
2294 for (i = 0; i < NCH(n); i += 2)
2295 /* length of string plus one for the dot */
2296 len += strlen(STR(CHILD(n, i))) + 1;
2297 len--; /* the last name doesn't have a dot */
2298 str = PyString_FromStringAndSize(NULL, len);
2299 if (!str)
2300 return NULL;
2301 s = PyString_AS_STRING(str);
2302 if (!s)
2303 return NULL;
2304 for (i = 0; i < NCH(n); i += 2) {
2305 char *sch = STR(CHILD(n, i));
2306 strcpy(s, STR(CHILD(n, i)));
2307 s += strlen(sch);
2308 *s++ = '.';
2309 }
2310 --s;
2311 *s = '\0';
2312 PyString_InternInPlace(&str);
2313 PyArena_AddPyObject(c->c_arena, str);
2314 return alias(str, NULL, c->c_arena);
2315 }
2316 break;
2317 case STAR:
2318 str = PyString_InternFromString("*");
2319 PyArena_AddPyObject(c->c_arena, str);
2320 return alias(str, NULL, c->c_arena);
2321 default:
2322 PyErr_Format(PyExc_SystemError,
2323 "unexpected import name: %d", TYPE(n));
2324 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002326
2327 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 return NULL;
2329}
2330
2331static stmt_ty
2332ast_for_import_stmt(struct compiling *c, const node *n)
2333{
2334 /*
2335 import_stmt: import_name | import_from
2336 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002337 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002338 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002340 int lineno;
2341 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 int i;
2343 asdl_seq *aliases;
2344
2345 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002346 lineno = LINENO(n);
2347 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002349 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002350 n = CHILD(n, 1);
2351 REQ(n, dotted_as_names);
2352 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2353 if (!aliases)
2354 return NULL;
2355 for (i = 0; i < NCH(n); i += 2) {
2356 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2357 if (!import_alias)
2358 return NULL;
2359 asdl_seq_SET(aliases, i / 2, import_alias);
2360 }
2361 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002363 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002364 int n_children;
2365 int idx, ndots = 0;
2366 alias_ty mod = NULL;
2367 identifier modname;
2368
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002369 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002370 optional module name */
2371 for (idx = 1; idx < NCH(n); idx++) {
2372 if (TYPE(CHILD(n, idx)) == dotted_name) {
2373 mod = alias_for_import_name(c, CHILD(n, idx));
2374 idx++;
2375 break;
2376 } else if (TYPE(CHILD(n, idx)) != DOT) {
2377 break;
2378 }
2379 ndots++;
2380 }
2381 idx++; /* skip over the 'import' keyword */
2382 switch (TYPE(CHILD(n, idx))) {
2383 case STAR:
2384 /* from ... import * */
2385 n = CHILD(n, idx);
2386 n_children = 1;
2387 if (ndots) {
2388 ast_error(n, "'import *' not allowed with 'from .'");
2389 return NULL;
2390 }
2391 break;
2392 case LPAR:
2393 /* from ... import (x, y, z) */
2394 n = CHILD(n, idx + 1);
2395 n_children = NCH(n);
2396 break;
2397 case import_as_names:
2398 /* from ... import x, y, z */
2399 n = CHILD(n, idx);
2400 n_children = NCH(n);
2401 if (n_children % 2 == 0) {
2402 ast_error(n, "trailing comma not allowed without"
2403 " surrounding parentheses");
2404 return NULL;
2405 }
2406 break;
2407 default:
2408 ast_error(n, "Unexpected node-type in from-import");
2409 return NULL;
2410 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002412 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2413 if (!aliases)
2414 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002416 /* handle "from ... import *" special b/c there's no children */
2417 if (TYPE(n) == STAR) {
2418 alias_ty import_alias = alias_for_import_name(c, n);
2419 if (!import_alias)
2420 return NULL;
2421 asdl_seq_SET(aliases, 0, import_alias);
2422 }
2423 else {
2424 for (i = 0; i < NCH(n); i += 2) {
2425 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2426 if (!import_alias)
2427 return NULL;
2428 asdl_seq_SET(aliases, i / 2, import_alias);
2429 }
2430 }
2431 if (mod != NULL)
2432 modname = mod->name;
2433 else
2434 modname = new_identifier("", c->c_arena);
2435 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2436 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437 }
Neal Norwitz79792652005-11-14 04:25:03 +00002438 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002439 "unknown import statement: starts with command '%s'",
2440 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 return NULL;
2442}
2443
2444static stmt_ty
2445ast_for_global_stmt(struct compiling *c, const node *n)
2446{
2447 /* global_stmt: 'global' NAME (',' NAME)* */
2448 identifier name;
2449 asdl_seq *s;
2450 int i;
2451
2452 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002453 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002455 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002457 name = NEW_IDENTIFIER(CHILD(n, i));
2458 if (!name)
2459 return NULL;
2460 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002462 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463}
2464
2465static stmt_ty
2466ast_for_exec_stmt(struct compiling *c, const node *n)
2467{
2468 expr_ty expr1, globals = NULL, locals = NULL;
2469 int n_children = NCH(n);
2470 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002471 PyErr_Format(PyExc_SystemError,
2472 "poorly formed 'exec' statement: %d parts to statement",
2473 n_children);
2474 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 }
2476
2477 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2478 REQ(n, exec_stmt);
2479 expr1 = ast_for_expr(c, CHILD(n, 1));
2480 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002481 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002483 globals = ast_for_expr(c, CHILD(n, 3));
2484 if (!globals)
2485 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 }
2487 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002488 locals = ast_for_expr(c, CHILD(n, 5));
2489 if (!locals)
2490 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 }
2492
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002493 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2494 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495}
2496
2497static stmt_ty
2498ast_for_assert_stmt(struct compiling *c, const node *n)
2499{
2500 /* assert_stmt: 'assert' test [',' test] */
2501 REQ(n, assert_stmt);
2502 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002503 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2504 if (!expression)
2505 return NULL;
2506 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2507 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 }
2509 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002510 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002512 expr1 = ast_for_expr(c, CHILD(n, 1));
2513 if (!expr1)
2514 return NULL;
2515 expr2 = ast_for_expr(c, CHILD(n, 3));
2516 if (!expr2)
2517 return NULL;
2518
2519 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002520 }
Neal Norwitz79792652005-11-14 04:25:03 +00002521 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002522 "improper number of parts to 'assert' statement: %d",
2523 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 return NULL;
2525}
2526
2527static asdl_seq *
2528ast_for_suite(struct compiling *c, const node *n)
2529{
2530 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002531 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 stmt_ty s;
2533 int i, total, num, end, pos = 0;
2534 node *ch;
2535
2536 REQ(n, suite);
2537
2538 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002539 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002541 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002543 n = CHILD(n, 0);
2544 /* simple_stmt always ends with a NEWLINE,
2545 and may have a trailing SEMI
2546 */
2547 end = NCH(n) - 1;
2548 if (TYPE(CHILD(n, end - 1)) == SEMI)
2549 end--;
2550 /* loop by 2 to skip semi-colons */
2551 for (i = 0; i < end; i += 2) {
2552 ch = CHILD(n, i);
2553 s = ast_for_stmt(c, ch);
2554 if (!s)
2555 return NULL;
2556 asdl_seq_SET(seq, pos++, s);
2557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 }
2559 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002560 for (i = 2; i < (NCH(n) - 1); i++) {
2561 ch = CHILD(n, i);
2562 REQ(ch, stmt);
2563 num = num_stmts(ch);
2564 if (num == 1) {
2565 /* small_stmt or compound_stmt with only one child */
2566 s = ast_for_stmt(c, ch);
2567 if (!s)
2568 return NULL;
2569 asdl_seq_SET(seq, pos++, s);
2570 }
2571 else {
2572 int j;
2573 ch = CHILD(ch, 0);
2574 REQ(ch, simple_stmt);
2575 for (j = 0; j < NCH(ch); j += 2) {
2576 /* statement terminates with a semi-colon ';' */
2577 if (NCH(CHILD(ch, j)) == 0) {
2578 assert((j + 1) == NCH(ch));
2579 break;
2580 }
2581 s = ast_for_stmt(c, CHILD(ch, j));
2582 if (!s)
2583 return NULL;
2584 asdl_seq_SET(seq, pos++, s);
2585 }
2586 }
2587 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 }
2589 assert(pos == seq->size);
2590 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591}
2592
2593static stmt_ty
2594ast_for_if_stmt(struct compiling *c, const node *n)
2595{
2596 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2597 ['else' ':' suite]
2598 */
2599 char *s;
2600
2601 REQ(n, if_stmt);
2602
2603 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002604 expr_ty expression;
2605 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002607 expression = ast_for_expr(c, CHILD(n, 1));
2608 if (!expression)
2609 return NULL;
2610 suite_seq = ast_for_suite(c, CHILD(n, 3));
2611 if (!suite_seq)
2612 return NULL;
2613
2614 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2615 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002617
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 s = STR(CHILD(n, 4));
2619 /* s[2], the third character in the string, will be
2620 's' for el_s_e, or
2621 'i' for el_i_f
2622 */
2623 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002624 expr_ty expression;
2625 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002627 expression = ast_for_expr(c, CHILD(n, 1));
2628 if (!expression)
2629 return NULL;
2630 seq1 = ast_for_suite(c, CHILD(n, 3));
2631 if (!seq1)
2632 return NULL;
2633 seq2 = ast_for_suite(c, CHILD(n, 6));
2634 if (!seq2)
2635 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002637 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2638 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 }
2640 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002641 int i, n_elif, has_else = 0;
2642 expr_ty expression;
2643 asdl_seq *suite_seq;
2644 asdl_seq *orelse = NULL;
2645 n_elif = NCH(n) - 4;
2646 /* must reference the child n_elif+1 since 'else' token is third,
2647 not fourth, child from the end. */
2648 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2649 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2650 has_else = 1;
2651 n_elif -= 3;
2652 }
2653 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002655 if (has_else) {
2656 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002658 orelse = asdl_seq_new(1, c->c_arena);
2659 if (!orelse)
2660 return NULL;
2661 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2662 if (!expression)
2663 return NULL;
2664 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2665 if (!suite_seq)
2666 return NULL;
2667 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2668 if (!suite_seq2)
2669 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002671 asdl_seq_SET(orelse, 0,
2672 If(expression, suite_seq, suite_seq2,
2673 LINENO(CHILD(n, NCH(n) - 6)),
2674 CHILD(n, NCH(n) - 6)->n_col_offset,
2675 c->c_arena));
2676 /* the just-created orelse handled the last elif */
2677 n_elif--;
2678 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002680 for (i = 0; i < n_elif; i++) {
2681 int off = 5 + (n_elif - i - 1) * 4;
2682 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2683 if (!newobj)
2684 return NULL;
2685 expression = ast_for_expr(c, CHILD(n, off));
2686 if (!expression)
2687 return NULL;
2688 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2689 if (!suite_seq)
2690 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002692 asdl_seq_SET(newobj, 0,
2693 If(expression, suite_seq, orelse,
2694 LINENO(CHILD(n, off)),
2695 CHILD(n, off)->n_col_offset, c->c_arena));
2696 orelse = newobj;
2697 }
2698 expression = ast_for_expr(c, CHILD(n, 1));
2699 if (!expression)
2700 return NULL;
2701 suite_seq = ast_for_suite(c, CHILD(n, 3));
2702 if (!suite_seq)
2703 return NULL;
2704 return If(expression, suite_seq, orelse,
2705 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002707
2708 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002709 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002710 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711}
2712
2713static stmt_ty
2714ast_for_while_stmt(struct compiling *c, const node *n)
2715{
2716 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2717 REQ(n, while_stmt);
2718
2719 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002720 expr_ty expression;
2721 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002723 expression = ast_for_expr(c, CHILD(n, 1));
2724 if (!expression)
2725 return NULL;
2726 suite_seq = ast_for_suite(c, CHILD(n, 3));
2727 if (!suite_seq)
2728 return NULL;
2729 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2730 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 }
2732 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002733 expr_ty expression;
2734 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002736 expression = ast_for_expr(c, CHILD(n, 1));
2737 if (!expression)
2738 return NULL;
2739 seq1 = ast_for_suite(c, CHILD(n, 3));
2740 if (!seq1)
2741 return NULL;
2742 seq2 = ast_for_suite(c, CHILD(n, 6));
2743 if (!seq2)
2744 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002746 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2747 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002749
2750 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002751 "wrong number of tokens for 'while' statement: %d",
2752 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002753 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754}
2755
2756static stmt_ty
2757ast_for_for_stmt(struct compiling *c, const node *n)
2758{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002759 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 expr_ty expression;
2761 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002762 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2764 REQ(n, for_stmt);
2765
2766 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002767 seq = ast_for_suite(c, CHILD(n, 8));
2768 if (!seq)
2769 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 }
2771
Neal Norwitzedef2be2006-07-12 05:26:17 +00002772 node_target = CHILD(n, 1);
2773 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002774 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002775 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002776 /* Check the # of children rather than the length of _target, since
2777 for x, in ... has 1 element in _target, but still requires a Tuple. */
2778 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002779 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002781 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002783 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002784 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002785 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002787 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002788 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002790 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002791 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792}
2793
2794static excepthandler_ty
2795ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2796{
Collin Winter62903052007-05-18 23:11:24 +00002797 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 REQ(exc, except_clause);
2799 REQ(body, suite);
2800
2801 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002802 asdl_seq *suite_seq = ast_for_suite(c, body);
2803 if (!suite_seq)
2804 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002806 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
2807 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 }
2809 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002810 expr_ty expression;
2811 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002813 expression = ast_for_expr(c, CHILD(exc, 1));
2814 if (!expression)
2815 return NULL;
2816 suite_seq = ast_for_suite(c, body);
2817 if (!suite_seq)
2818 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002820 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
2821 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 }
2823 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002824 asdl_seq *suite_seq;
2825 expr_ty expression;
2826 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2827 if (!e)
2828 return NULL;
2829 if (!set_context(e, Store, CHILD(exc, 3)))
2830 return NULL;
2831 expression = ast_for_expr(c, CHILD(exc, 1));
2832 if (!expression)
2833 return NULL;
2834 suite_seq = ast_for_suite(c, body);
2835 if (!suite_seq)
2836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002838 return excepthandler(expression, e, suite_seq, LINENO(exc),
2839 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002841
2842 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002843 "wrong number of children for 'except' clause: %d",
2844 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002845 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846}
2847
2848static stmt_ty
2849ast_for_try_stmt(struct compiling *c, const node *n)
2850{
Neal Norwitzf599f422005-12-17 21:33:47 +00002851 const int nch = NCH(n);
2852 int n_except = (nch - 3)/3;
2853 asdl_seq *body, *orelse = NULL, *finally = NULL;
2854
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 REQ(n, try_stmt);
2856
Neal Norwitzf599f422005-12-17 21:33:47 +00002857 body = ast_for_suite(c, CHILD(n, 2));
2858 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860
Neal Norwitzf599f422005-12-17 21:33:47 +00002861 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002862 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2863 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2864 /* we can assume it's an "else",
2865 because nch >= 9 for try-else-finally and
2866 it would otherwise have a type of except_clause */
2867 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2868 if (orelse == NULL)
2869 return NULL;
2870 n_except--;
2871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002873 finally = ast_for_suite(c, CHILD(n, nch - 1));
2874 if (finally == NULL)
2875 return NULL;
2876 n_except--;
2877 }
2878 else {
2879 /* we can assume it's an "else",
2880 otherwise it would have a type of except_clause */
2881 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2882 if (orelse == NULL)
2883 return NULL;
2884 n_except--;
2885 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002887 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002888 ast_error(n, "malformed 'try' statement");
2889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002891
2892 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002893 int i;
2894 stmt_ty except_st;
2895 /* process except statements to create a try ... except */
2896 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2897 if (handlers == NULL)
2898 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002899
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002900 for (i = 0; i < n_except; i++) {
2901 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2902 CHILD(n, 5 + i * 3));
2903 if (!e)
2904 return NULL;
2905 asdl_seq_SET(handlers, i, e);
2906 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002907
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002908 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2909 n->n_col_offset, c->c_arena);
2910 if (!finally)
2911 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002912
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002913 /* if a 'finally' is present too, we nest the TryExcept within a
2914 TryFinally to emulate try ... except ... finally */
2915 body = asdl_seq_new(1, c->c_arena);
2916 if (body == NULL)
2917 return NULL;
2918 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002919 }
2920
2921 /* must be a try ... finally (except clauses are in body, if any exist) */
2922 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002923 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924}
2925
Guido van Rossumc2e20742006-02-27 22:32:47 +00002926static expr_ty
2927ast_for_with_var(struct compiling *c, const node *n)
2928{
2929 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002930 return ast_for_expr(c, CHILD(n, 1));
2931}
2932
2933/* with_stmt: 'with' test [ with_var ] ':' suite */
2934static stmt_ty
2935ast_for_with_stmt(struct compiling *c, const node *n)
2936{
2937 expr_ty context_expr, optional_vars = NULL;
2938 int suite_index = 3; /* skip 'with', test, and ':' */
2939 asdl_seq *suite_seq;
2940
2941 assert(TYPE(n) == with_stmt);
2942 context_expr = ast_for_expr(c, CHILD(n, 1));
Collin Winter77c67bd2007-03-16 04:11:30 +00002943 if (!context_expr)
2944 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002945 if (TYPE(CHILD(n, 2)) == with_var) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002946 optional_vars = ast_for_with_var(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002947
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002948 if (!optional_vars) {
2949 return NULL;
2950 }
2951 if (!set_context(optional_vars, Store, n)) {
2952 return NULL;
2953 }
2954 suite_index = 4;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002955 }
2956
2957 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2958 if (!suite_seq) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002959 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002960 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002961 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002962 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002963}
2964
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965static stmt_ty
2966ast_for_classdef(struct compiling *c, const node *n)
2967{
2968 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 asdl_seq *bases, *s;
2970
2971 REQ(n, classdef);
2972
2973 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002974 ast_error(n, "assignment to None");
2975 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 }
2977
2978 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002979 s = ast_for_suite(c, CHILD(n, 3));
2980 if (!s)
2981 return NULL;
2982 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2983 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 }
2985 /* check for empty base list */
2986 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002987 s = ast_for_suite(c, CHILD(n,5));
2988 if (!s)
2989 return NULL;
2990 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2991 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 }
2993
2994 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002995 bases = ast_for_class_bases(c, CHILD(n, 3));
2996 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002997 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998
2999 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003000 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003001 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00003002 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003003 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004}
3005
3006static stmt_ty
3007ast_for_stmt(struct compiling *c, const node *n)
3008{
3009 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003010 assert(NCH(n) == 1);
3011 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012 }
3013 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003014 assert(num_stmts(n) == 1);
3015 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 }
3017 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003018 REQ(n, small_stmt);
3019 n = CHILD(n, 0);
3020 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3021 | flow_stmt | import_stmt | global_stmt | exec_stmt
3022 | assert_stmt
3023 */
3024 switch (TYPE(n)) {
3025 case expr_stmt:
3026 return ast_for_expr_stmt(c, n);
3027 case print_stmt:
3028 return ast_for_print_stmt(c, n);
3029 case del_stmt:
3030 return ast_for_del_stmt(c, n);
3031 case pass_stmt:
3032 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3033 case flow_stmt:
3034 return ast_for_flow_stmt(c, n);
3035 case import_stmt:
3036 return ast_for_import_stmt(c, n);
3037 case global_stmt:
3038 return ast_for_global_stmt(c, n);
3039 case exec_stmt:
3040 return ast_for_exec_stmt(c, n);
3041 case assert_stmt:
3042 return ast_for_assert_stmt(c, n);
3043 default:
3044 PyErr_Format(PyExc_SystemError,
3045 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3046 TYPE(n), NCH(n));
3047 return NULL;
3048 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 }
3050 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003051 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
3052 | funcdef | classdef
3053 */
3054 node *ch = CHILD(n, 0);
3055 REQ(n, compound_stmt);
3056 switch (TYPE(ch)) {
3057 case if_stmt:
3058 return ast_for_if_stmt(c, ch);
3059 case while_stmt:
3060 return ast_for_while_stmt(c, ch);
3061 case for_stmt:
3062 return ast_for_for_stmt(c, ch);
3063 case try_stmt:
3064 return ast_for_try_stmt(c, ch);
3065 case with_stmt:
3066 return ast_for_with_stmt(c, ch);
3067 case funcdef:
3068 return ast_for_funcdef(c, ch);
3069 case classdef:
3070 return ast_for_classdef(c, ch);
3071 default:
3072 PyErr_Format(PyExc_SystemError,
3073 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3074 TYPE(n), NCH(n));
3075 return NULL;
3076 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 }
3078}
3079
3080static PyObject *
3081parsenumber(const char *s)
3082{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003083 const char *end;
3084 long x;
3085 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003087 Py_complex c;
3088 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089#endif
3090
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003091 errno = 0;
3092 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003094 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003096 if (*end == 'l' || *end == 'L')
3097 return PyLong_FromString((char *)s, (char **)0, 0);
3098 if (s[0] == '0') {
3099 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3100 if (x < 0 && errno == 0) {
3101 return PyLong_FromString((char *)s,
3102 (char **)0,
3103 0);
3104 }
3105 }
3106 else
3107 x = PyOS_strtol((char *)s, (char **)&end, 0);
3108 if (*end == '\0') {
3109 if (errno != 0)
3110 return PyLong_FromString((char *)s, (char **)0, 0);
3111 return PyInt_FromLong(x);
3112 }
3113 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003115 if (imflag) {
3116 c.real = 0.;
3117 PyFPE_START_PROTECT("atof", return 0)
3118 c.imag = PyOS_ascii_atof(s);
3119 PyFPE_END_PROTECT(c)
3120 return PyComplex_FromCComplex(c);
3121 }
3122 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003124 {
3125 PyFPE_START_PROTECT("atof", return 0)
3126 dx = PyOS_ascii_atof(s);
3127 PyFPE_END_PROTECT(dx)
3128 return PyFloat_FromDouble(dx);
3129 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130}
3131
3132static PyObject *
3133decode_utf8(const char **sPtr, const char *end, char* encoding)
3134{
3135#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003136 Py_FatalError("decode_utf8 should not be called in this build.");
3137 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003139 PyObject *u, *v;
3140 char *s, *t;
3141 t = s = (char *)*sPtr;
3142 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3143 while (s < end && (*s & 0x80)) s++;
3144 *sPtr = s;
3145 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3146 if (u == NULL)
3147 return NULL;
3148 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3149 Py_DECREF(u);
3150 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151#endif
3152}
3153
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003154#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155static PyObject *
3156decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3157{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003158 PyObject *v, *u;
3159 char *buf;
3160 char *p;
3161 const char *end;
3162 if (encoding == NULL) {
3163 buf = (char *)s;
3164 u = NULL;
3165 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3166 buf = (char *)s;
3167 u = NULL;
3168 } else {
3169 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3170 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3171 if (u == NULL)
3172 return NULL;
3173 p = buf = PyString_AsString(u);
3174 end = s + len;
3175 while (s < end) {
3176 if (*s == '\\') {
3177 *p++ = *s++;
3178 if (*s & 0x80) {
3179 strcpy(p, "u005c");
3180 p += 5;
3181 }
3182 }
3183 if (*s & 0x80) { /* XXX inefficient */
3184 PyObject *w;
3185 char *r;
3186 Py_ssize_t rn, i;
3187 w = decode_utf8(&s, end, "utf-16-be");
3188 if (w == NULL) {
3189 Py_DECREF(u);
3190 return NULL;
3191 }
3192 r = PyString_AsString(w);
3193 rn = PyString_Size(w);
3194 assert(rn % 2 == 0);
3195 for (i = 0; i < rn; i += 2) {
3196 sprintf(p, "\\u%02x%02x",
3197 r[i + 0] & 0xFF,
3198 r[i + 1] & 0xFF);
3199 p += 6;
3200 }
3201 Py_DECREF(w);
3202 } else {
3203 *p++ = *s++;
3204 }
3205 }
3206 len = p - buf;
3207 s = buf;
3208 }
3209 if (rawmode)
3210 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3211 else
3212 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3213 Py_XDECREF(u);
3214 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215}
Georg Brandl69ff5ac2007-08-06 07:37:58 +00003216#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217
3218/* s is a Python string literal, including the bracketing quote characters,
3219 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3220 * parsestr parses it, and returns the decoded Python string object.
3221 */
3222static PyObject *
3223parsestr(const char *s, const char *encoding)
3224{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003225 size_t len;
3226 int quote = Py_CHARMASK(*s);
3227 int rawmode = 0;
3228 int need_encoding;
3229 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003231 if (isalpha(quote) || quote == '_') {
3232 if (quote == 'u' || quote == 'U') {
3233 quote = *++s;
3234 unicode = 1;
3235 }
3236 if (quote == 'r' || quote == 'R') {
3237 quote = *++s;
3238 rawmode = 1;
3239 }
3240 }
3241 if (quote != '\'' && quote != '\"') {
3242 PyErr_BadInternalCall();
3243 return NULL;
3244 }
3245 s++;
3246 len = strlen(s);
3247 if (len > INT_MAX) {
3248 PyErr_SetString(PyExc_OverflowError,
3249 "string to parse is too long");
3250 return NULL;
3251 }
3252 if (s[--len] != quote) {
3253 PyErr_BadInternalCall();
3254 return NULL;
3255 }
3256 if (len >= 4 && s[0] == quote && s[1] == quote) {
3257 s += 2;
3258 len -= 2;
3259 if (s[--len] != quote || s[--len] != quote) {
3260 PyErr_BadInternalCall();
3261 return NULL;
3262 }
3263 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003265 if (unicode || Py_UnicodeFlag) {
3266 return decode_unicode(s, len, rawmode, encoding);
3267 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003269 need_encoding = (encoding != NULL &&
3270 strcmp(encoding, "utf-8") != 0 &&
3271 strcmp(encoding, "iso-8859-1") != 0);
3272 if (rawmode || strchr(s, '\\') == NULL) {
3273 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003275 /* This should not happen - we never see any other
3276 encoding. */
3277 Py_FatalError(
3278 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003280 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3281 if (u == NULL)
3282 return NULL;
3283 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3284 Py_DECREF(u);
3285 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003287 } else {
3288 return PyString_FromStringAndSize(s, len);
3289 }
3290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003292 return PyString_DecodeEscape(s, len, NULL, unicode,
3293 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294}
3295
3296/* Build a Python string object out of a STRING atom. This takes care of
3297 * compile-time literal catenation, calling parsestr() on each piece, and
3298 * pasting the intermediate results together.
3299 */
3300static PyObject *
3301parsestrplus(struct compiling *c, const node *n)
3302{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003303 PyObject *v;
3304 int i;
3305 REQ(CHILD(n, 0), STRING);
3306 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3307 /* String literal concatenation */
3308 for (i = 1; i < NCH(n); i++) {
3309 PyObject *s;
3310 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3311 if (s == NULL)
3312 goto onError;
3313 if (PyString_Check(v) && PyString_Check(s)) {
3314 PyString_ConcatAndDel(&v, s);
3315 if (v == NULL)
3316 goto onError;
3317 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003319 else {
3320 PyObject *temp = PyUnicode_Concat(v, s);
3321 Py_DECREF(s);
3322 Py_DECREF(v);
3323 v = temp;
3324 if (v == NULL)
3325 goto onError;
3326 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003328 }
3329 }
3330 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003331
3332 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003333 Py_XDECREF(v);
3334 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335}