blob: ca832aa5e1567ac6eff3c4377e341985d9da7ad2 [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/* XXX TO DO
19 - re-indent this file (should be done)
20 - internal error checking (freeing memory, etc.)
21 - syntax errors
22*/
23
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024/* Data structure used internally */
25struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000026 char *c_encoding; /* source encoding */
27 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028};
29
30static asdl_seq *seq_for_testlist(struct compiling *, const node *);
31static expr_ty ast_for_expr(struct compiling *, const node *);
32static stmt_ty ast_for_stmt(struct compiling *, const node *);
33static asdl_seq *ast_for_suite(struct compiling *, const node *);
Martin v. Löwis28457502006-04-11 09:17:27 +000034static asdl_seq *ast_for_exprlist(struct compiling *, const node *, expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000035static expr_ty ast_for_testlist(struct compiling *, const node *);
36static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037
38/* Note different signature for ast_for_call */
39static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
40
41static PyObject *parsenumber(const char *);
42static PyObject *parsestr(const char *s, const char *encoding);
43static PyObject *parsestrplus(struct compiling *, const node *n);
44
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#ifndef LINENO
46#define LINENO(n) ((n)->n_lineno)
47#endif
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
51 PyObject* id = PyString_InternFromString(n);
52 PyArena_AddPyObject(arena, id);
53 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000054}
55
Neal Norwitzadb69fc2005-12-17 20:54:49 +000056#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057
58/* This routine provides an invalid object for the syntax error.
59 The outermost routine must unpack this error and create the
60 proper object. We do this so that we don't have to pass
61 the filename to everything function.
62
63 XXX Maybe we should just pass the filename...
64*/
65
66static int
67ast_error(const node *n, const char *errstr)
68{
69 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
70 if (!u)
71 return 0;
72 PyErr_SetObject(PyExc_SyntaxError, u);
73 Py_DECREF(u);
74 return 0;
75}
76
77static void
78ast_error_finish(const char *filename)
79{
80 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000081 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082
83 assert(PyErr_Occurred());
84 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
85 return;
86
87 PyErr_Fetch(&type, &value, &tback);
88 errstr = PyTuple_GetItem(value, 0);
89 if (!errstr)
90 return;
91 Py_INCREF(errstr);
92 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000093 if (lineno == -1) {
94 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000096 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097 Py_DECREF(value);
98
99 loc = PyErr_ProgramText(filename, lineno);
100 if (!loc) {
101 Py_INCREF(Py_None);
102 loc = Py_None;
103 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000104 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000106 if (!tmp) {
107 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000109 }
Georg Brandl7784f122006-05-26 20:04:44 +0000110 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111 Py_DECREF(errstr);
112 Py_DECREF(tmp);
113 if (!value)
114 return;
115 PyErr_Restore(type, value, tback);
116}
117
118/* num_stmts() returns number of contained statements.
119
120 Use this routine to determine how big a sequence is needed for
121 the statements in a parse tree. Its raison d'etre is this bit of
122 grammar:
123
124 stmt: simple_stmt | compound_stmt
125 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
126
127 A simple_stmt can contain multiple small_stmt elements joined
128 by semicolons. If the arg is a simple_stmt, the number of
129 small_stmt elements is returned.
130*/
131
132static int
133num_stmts(const node *n)
134{
135 int i, l;
136 node *ch;
137
138 switch (TYPE(n)) {
139 case single_input:
140 if (TYPE(CHILD(n, 0)) == NEWLINE)
141 return 0;
142 else
143 return num_stmts(CHILD(n, 0));
144 case file_input:
145 l = 0;
146 for (i = 0; i < NCH(n); i++) {
147 ch = CHILD(n, i);
148 if (TYPE(ch) == stmt)
149 l += num_stmts(ch);
150 }
151 return l;
152 case stmt:
153 return num_stmts(CHILD(n, 0));
154 case compound_stmt:
155 return 1;
156 case simple_stmt:
157 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
158 case suite:
159 if (NCH(n) == 1)
160 return num_stmts(CHILD(n, 0));
161 else {
162 l = 0;
163 for (i = 2; i < (NCH(n) - 1); i++)
164 l += num_stmts(CHILD(n, i));
165 return l;
166 }
167 default: {
168 char buf[128];
169
170 sprintf(buf, "Non-statement found: %d %d\n",
171 TYPE(n), NCH(n));
172 Py_FatalError(buf);
173 }
174 }
175 assert(0);
176 return 0;
177}
178
179/* Transform the CST rooted at node * to the appropriate AST
180*/
181
182mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000183PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
184 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000186 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187 asdl_seq *stmts = NULL;
188 stmt_ty s;
189 node *ch;
190 struct compiling c;
191
192 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000193 c.c_encoding = "utf-8";
Neal Norwitze98ccf62006-03-23 05:39:47 +0000194 if (TYPE(n) == encoding_decl) {
195 ast_error(n, "encoding declaration in Unicode string");
196 goto error;
197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 } else if (TYPE(n) == encoding_decl) {
199 c.c_encoding = STR(n);
200 n = CHILD(n, 0);
201 } else {
202 c.c_encoding = NULL;
203 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205
Jeremy Hyltona8293132006-02-28 17:58:27 +0000206 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207 switch (TYPE(n)) {
208 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000209 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 if (!stmts)
211 return NULL;
212 for (i = 0; i < NCH(n) - 1; i++) {
213 ch = CHILD(n, i);
214 if (TYPE(ch) == NEWLINE)
215 continue;
216 REQ(ch, stmt);
217 num = num_stmts(ch);
218 if (num == 1) {
219 s = ast_for_stmt(&c, ch);
220 if (!s)
221 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000222 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223 }
224 else {
225 ch = CHILD(ch, 0);
226 REQ(ch, simple_stmt);
227 for (j = 0; j < num; j++) {
228 s = ast_for_stmt(&c, CHILD(ch, j * 2));
229 if (!s)
230 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000231 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232 }
233 }
234 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 case eval_input: {
237 expr_ty testlist_ast;
238
239 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000240 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 if (!testlist_ast)
242 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000243 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 }
245 case single_input:
246 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 if (!stmts)
249 goto error;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000250 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
251 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 }
254 else {
255 n = CHILD(n, 0);
256 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000257 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 if (!stmts)
259 goto error;
260 if (num == 1) {
Neal Norwitz406c6402006-01-07 21:23:26 +0000261 s = ast_for_stmt(&c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 if (!s)
263 goto error;
264 asdl_seq_SET(stmts, 0, s);
265 }
266 else {
267 /* Only a simple_stmt can contain multiple statements. */
268 REQ(n, simple_stmt);
269 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (TYPE(CHILD(n, i)) == NEWLINE)
271 break;
272 s = ast_for_stmt(&c, CHILD(n, i));
273 if (!s)
274 goto error;
275 asdl_seq_SET(stmts, i / 2, s);
276 }
277 }
278
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000279 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 }
281 default:
282 goto error;
283 }
284 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 ast_error_finish(filename);
286 return NULL;
287}
288
289/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
290*/
291
292static operator_ty
293get_operator(const node *n)
294{
295 switch (TYPE(n)) {
296 case VBAR:
297 return BitOr;
298 case CIRCUMFLEX:
299 return BitXor;
300 case AMPER:
301 return BitAnd;
302 case LEFTSHIFT:
303 return LShift;
304 case RIGHTSHIFT:
305 return RShift;
306 case PLUS:
307 return Add;
308 case MINUS:
309 return Sub;
310 case STAR:
311 return Mult;
312 case SLASH:
313 return Div;
314 case DOUBLESLASH:
315 return FloorDiv;
316 case PERCENT:
317 return Mod;
318 default:
Martin v. Löwis28457502006-04-11 09:17:27 +0000319 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320 }
321}
322
Jeremy Hyltona8293132006-02-28 17:58:27 +0000323/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000324
325 Only sets context for expr kinds that "can appear in assignment context"
326 (according to ../Parser/Python.asdl). For other expr kinds, it sets
327 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328*/
329
330static int
331set_context(expr_ty e, expr_context_ty ctx, const node *n)
332{
333 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000334 /* If a particular expression type can't be used for assign / delete,
335 set expr_name to its name and an error message will be generated.
336 */
337 const char* expr_name = NULL;
338
339 /* The ast defines augmented store and load contexts, but the
340 implementation here doesn't actually use them. The code may be
341 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000342 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000344 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000345 */
346 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347
348 switch (e->kind) {
349 case Attribute_kind:
350 if (ctx == Store &&
Jeremy Hyltona8293132006-02-28 17:58:27 +0000351 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352 return ast_error(n, "assignment to None");
353 }
354 e->v.Attribute.ctx = ctx;
355 break;
356 case Subscript_kind:
357 e->v.Subscript.ctx = ctx;
358 break;
359 case Name_kind:
360 if (ctx == Store &&
361 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
362 return ast_error(n, "assignment to None");
363 }
364 e->v.Name.ctx = ctx;
365 break;
366 case List_kind:
367 e->v.List.ctx = ctx;
368 s = e->v.List.elts;
369 break;
370 case Tuple_kind:
371 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
372 return ast_error(n, "can't assign to ()");
373 e->v.Tuple.ctx = ctx;
374 s = e->v.Tuple.elts;
375 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000376 case Lambda_kind:
377 expr_name = "lambda";
378 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 expr_name = "function call";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000384 case UnaryOp_kind:
385 expr_name = "operator";
386 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 expr_name = "generator expression";
389 break;
Neal Norwitz0d62a062006-07-30 06:53:31 +0000390 case Yield_kind:
391 expr_name = "yield expression";
392 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000393 case ListComp_kind:
394 expr_name = "list comprehension";
395 break;
396 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397 case Num_kind:
398 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 expr_name = "literal";
400 break;
401 case Compare_kind:
402 expr_name = "comparison";
403 break;
404 case Repr_kind:
405 expr_name = "repr";
406 break;
Neal Norwitz373f0a72006-05-15 07:04:36 +0000407 case IfExp_kind:
408 expr_name = "conditional expression";
409 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 default:
411 PyErr_Format(PyExc_SystemError,
412 "unexpected expression in assignment %d (line %d)",
413 e->kind, e->lineno);
414 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 /* Check for error string set by switch */
417 if (expr_name) {
418 char buf[300];
419 PyOS_snprintf(buf, sizeof(buf),
420 "can't %s %s",
421 ctx == Store ? "assign to" : "delete",
422 expr_name);
423 return ast_error(n, buf);
424 }
425
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000427 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 */
429 if (s) {
430 int i;
431
432 for (i = 0; i < asdl_seq_LEN(s); i++) {
Martin v. Löwis28457502006-04-11 09:17:27 +0000433 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 return 0;
435 }
436 }
437 return 1;
438}
439
440static operator_ty
441ast_for_augassign(const node *n)
442{
443 REQ(n, augassign);
444 n = CHILD(n, 0);
445 switch (STR(n)[0]) {
446 case '+':
447 return Add;
448 case '-':
449 return Sub;
450 case '/':
451 if (STR(n)[1] == '/')
452 return FloorDiv;
453 else
454 return Div;
455 case '%':
456 return Mod;
457 case '<':
458 return LShift;
459 case '>':
460 return RShift;
461 case '&':
462 return BitAnd;
463 case '^':
464 return BitXor;
465 case '|':
466 return BitOr;
467 case '*':
468 if (STR(n)[1] == '*')
469 return Pow;
470 else
471 return Mult;
472 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000473 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000474 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 }
476}
477
478static cmpop_ty
479ast_for_comp_op(const node *n)
480{
481 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
482 |'is' 'not'
483 */
484 REQ(n, comp_op);
485 if (NCH(n) == 1) {
486 n = CHILD(n, 0);
487 switch (TYPE(n)) {
488 case LESS:
489 return Lt;
490 case GREATER:
491 return Gt;
492 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493 return Eq;
494 case LESSEQUAL:
495 return LtE;
496 case GREATEREQUAL:
497 return GtE;
498 case NOTEQUAL:
499 return NotEq;
500 case NAME:
501 if (strcmp(STR(n), "in") == 0)
502 return In;
503 if (strcmp(STR(n), "is") == 0)
504 return Is;
505 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000506 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507 STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000508 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 }
511 else if (NCH(n) == 2) {
512 /* handle "not in" and "is not" */
513 switch (TYPE(CHILD(n, 0))) {
514 case NAME:
515 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
516 return NotIn;
517 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
518 return IsNot;
519 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000520 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Martin v. Löwis28457502006-04-11 09:17:27 +0000522 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
524 }
Neal Norwitz79792652005-11-14 04:25:03 +0000525 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000527 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000528}
529
530static asdl_seq *
531seq_for_testlist(struct compiling *c, const node *n)
532{
533 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000534 asdl_seq *seq;
535 expr_ty expression;
536 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537 assert(TYPE(n) == testlist
538 || TYPE(n) == listmaker
539 || TYPE(n) == testlist_gexp
540 || TYPE(n) == testlist_safe
541 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000543 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 if (!seq)
545 return NULL;
546
547 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000548 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549
550 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000551 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553
554 assert(i / 2 < seq->size);
555 asdl_seq_SET(seq, i / 2, expression);
556 }
557 return seq;
558}
559
560static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000561compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562{
563 int i, len = (NCH(n) + 1) / 2;
564 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000565 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 if (!args)
567 return NULL;
568
569 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 for (i = 0; i < len; i++) {
571 const node *child = CHILD(CHILD(n, 2*i), 0);
572 expr_ty arg;
573 if (TYPE(child) == NAME) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000574 if (!strcmp(STR(child), "None")) {
575 ast_error(child, "assignment to None");
576 return NULL;
577 }
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000578 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
579 child->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000580 }
581 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000582 arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1));
Jeremy Hyltona8293132006-02-28 17:58:27 +0000583 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 asdl_seq_SET(args, i, arg);
585 }
586
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000587 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000588 if (!set_context(result, Store, n))
589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590 return result;
591}
592
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593
Jeremy Hyltona8293132006-02-28 17:58:27 +0000594/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595
596static arguments_ty
597ast_for_arguments(struct compiling *c, const node *n)
598{
599 /* parameters: '(' [varargslist] ')'
600 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
601 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
602 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000603 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 asdl_seq *args, *defaults;
605 identifier vararg = NULL, kwarg = NULL;
606 node *ch;
607
608 if (TYPE(n) == parameters) {
609 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000610 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 n = CHILD(n, 1);
612 }
613 REQ(n, varargslist);
614
615 /* first count the number of normal args & defaults */
616 for (i = 0; i < NCH(n); i++) {
617 ch = CHILD(n, i);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000618 if (TYPE(ch) == fpdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619 n_args++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 if (TYPE(ch) == EQUAL)
621 n_defaults++;
622 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000623 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624 if (!args && n_args)
Neal Norwitzc173b482006-07-30 19:18:13 +0000625 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000626 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 if (!defaults && n_defaults)
Neal Norwitzc173b482006-07-30 19:18:13 +0000628 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629
630 /* fpdef: NAME | '(' fplist ')'
631 fplist: fpdef (',' fpdef)* [',']
632 */
633 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000634 j = 0; /* index for defaults */
635 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636 while (i < NCH(n)) {
637 ch = CHILD(n, i);
638 switch (TYPE(ch)) {
639 case fpdef:
640 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
641 anything other than EQUAL or a comma? */
642 /* XXX Should NCH(n) check be made a separate check? */
643 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzd12bd012006-07-21 07:59:47 +0000644 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
645 if (!expression)
646 goto error;
Neal Norwitzc173b482006-07-30 19:18:13 +0000647 assert(defaults != NULL);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000648 asdl_seq_SET(defaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649 i += 2;
650 found_default = 1;
651 }
652 else if (found_default) {
653 ast_error(n,
654 "non-default argument follows default argument");
655 goto error;
656 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657 if (NCH(ch) == 3) {
Neal Norwitz33b730e2006-03-27 08:58:23 +0000658 ch = CHILD(ch, 1);
659 /* def foo((x)): is not complex, special case. */
660 if (NCH(ch) != 1) {
661 /* We have complex arguments, setup for unpacking. */
662 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
663 } else {
664 /* def foo((x)): setup for checking NAME below. */
665 ch = CHILD(ch, 0);
666 }
667 }
668 if (TYPE(CHILD(ch, 0)) == NAME) {
Armin Rigo31441302005-10-21 12:57:31 +0000669 expr_ty name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
671 ast_error(CHILD(ch, 0), "assignment to None");
672 goto error;
673 }
Armin Rigo31441302005-10-21 12:57:31 +0000674 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000675 Param, LINENO(ch), ch->n_col_offset,
676 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 if (!name)
678 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000679 asdl_seq_SET(args, k++, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680
681 }
682 i += 2; /* the name and the comma */
683 break;
684 case STAR:
685 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
686 ast_error(CHILD(n, i+1), "assignment to None");
687 goto error;
688 }
689 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
690 i += 3;
691 break;
692 case DOUBLESTAR:
693 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
694 ast_error(CHILD(n, i+1), "assignment to None");
695 goto error;
696 }
697 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
698 i += 3;
699 break;
700 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000701 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702 "unexpected node in varargslist: %d @ %d",
703 TYPE(ch), i);
704 goto error;
705 }
706 }
707
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000708 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709
710 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000711 Py_XDECREF(vararg);
712 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 return NULL;
714}
715
716static expr_ty
717ast_for_dotted_name(struct compiling *c, const node *n)
718{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000719 expr_ty e;
720 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000721 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 int i;
723
724 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000725
726 lineno = LINENO(n);
727 col_offset = n->n_col_offset;
728
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 id = NEW_IDENTIFIER(CHILD(n, 0));
730 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000731 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000732 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000734 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735
736 for (i = 2; i < NCH(n); i+=2) {
737 id = NEW_IDENTIFIER(CHILD(n, i));
738 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000739 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000740 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000741 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000742 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000743 }
744
745 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746}
747
748static expr_ty
749ast_for_decorator(struct compiling *c, const node *n)
750{
751 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
752 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000753 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754
755 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000756 REQ(CHILD(n, 0), AT);
757 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758
759 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
760 if (!name_expr)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762
763 if (NCH(n) == 3) { /* No arguments */
764 d = name_expr;
765 name_expr = NULL;
766 }
767 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000768 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
769 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000771 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 name_expr = NULL;
773 }
774 else {
775 d = ast_for_call(c, CHILD(n, 3), name_expr);
776 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000777 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 name_expr = NULL;
779 }
780
781 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782}
783
784static asdl_seq*
785ast_for_decorators(struct compiling *c, const node *n)
786{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000787 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000788 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 int i;
790
791 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000792 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 if (!decorator_seq)
794 return NULL;
795
796 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000797 d = ast_for_decorator(c, CHILD(n, i));
798 if (!d)
799 return NULL;
800 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801 }
802 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803}
804
805static stmt_ty
806ast_for_funcdef(struct compiling *c, const node *n)
807{
808 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000809 identifier name;
810 arguments_ty args;
811 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 asdl_seq *decorator_seq = NULL;
813 int name_i;
814
815 REQ(n, funcdef);
816
817 if (NCH(n) == 6) { /* decorators are present */
818 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
819 if (!decorator_seq)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821 name_i = 2;
822 }
823 else {
824 name_i = 1;
825 }
826
827 name = NEW_IDENTIFIER(CHILD(n, name_i));
828 if (!name)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000829 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Neal Norwitze76adcd2005-11-15 05:04:31 +0000831 ast_error(CHILD(n, name_i), "assignment to None");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000832 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833 }
834 args = ast_for_arguments(c, CHILD(n, name_i + 1));
835 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 body = ast_for_suite(c, CHILD(n, name_i + 3));
838 if (!body)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000839 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000841 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
842 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843}
844
845static expr_ty
846ast_for_lambdef(struct compiling *c, const node *n)
847{
848 /* lambdef: 'lambda' [varargslist] ':' test */
849 arguments_ty args;
850 expr_ty expression;
851
852 if (NCH(n) == 3) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000853 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 if (!args)
855 return NULL;
856 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000857 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 }
860 else {
861 args = ast_for_arguments(c, CHILD(n, 1));
862 if (!args)
863 return NULL;
864 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000865 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 }
868
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000869 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870}
871
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000872static expr_ty
873ast_for_ifexpr(struct compiling *c, const node *n)
874{
875 /* test: or_test 'if' or_test 'else' test */
876 expr_ty expression, body, orelse;
877
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000878 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000879 body = ast_for_expr(c, CHILD(n, 0));
880 if (!body)
881 return NULL;
882 expression = ast_for_expr(c, CHILD(n, 2));
883 if (!expression)
884 return NULL;
885 orelse = ast_for_expr(c, CHILD(n, 4));
886 if (!orelse)
887 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000888 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
889 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000890}
891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892/* Count the number of 'for' loop in a list comprehension.
893
894 Helper for ast_for_listcomp().
895*/
896
897static int
898count_list_fors(const node *n)
899{
900 int n_fors = 0;
901 node *ch = CHILD(n, 1);
902
903 count_list_for:
904 n_fors++;
905 REQ(ch, list_for);
906 if (NCH(ch) == 5)
907 ch = CHILD(ch, 4);
908 else
909 return n_fors;
910 count_list_iter:
911 REQ(ch, list_iter);
912 ch = CHILD(ch, 0);
913 if (TYPE(ch) == list_for)
914 goto count_list_for;
915 else if (TYPE(ch) == list_if) {
916 if (NCH(ch) == 3) {
917 ch = CHILD(ch, 2);
918 goto count_list_iter;
919 }
920 else
921 return n_fors;
922 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000923
924 /* Should never be reached */
925 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
926 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927}
928
929/* Count the number of 'if' statements in a list comprehension.
930
931 Helper for ast_for_listcomp().
932*/
933
934static int
935count_list_ifs(const node *n)
936{
937 int n_ifs = 0;
938
939 count_list_iter:
940 REQ(n, list_iter);
941 if (TYPE(CHILD(n, 0)) == list_for)
942 return n_ifs;
943 n = CHILD(n, 0);
944 REQ(n, list_if);
945 n_ifs++;
946 if (NCH(n) == 2)
947 return n_ifs;
948 n = CHILD(n, 2);
949 goto count_list_iter;
950}
951
952static expr_ty
953ast_for_listcomp(struct compiling *c, const node *n)
954{
955 /* listmaker: test ( list_for | (',' test)* [','] )
956 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
957 list_iter: list_for | list_if
958 list_if: 'if' test [list_iter]
959 testlist_safe: test [(',' test)+ [',']]
960 */
961 expr_ty elt;
962 asdl_seq *listcomps;
963 int i, n_fors;
964 node *ch;
965
966 REQ(n, listmaker);
967 assert(NCH(n) > 1);
968
969 elt = ast_for_expr(c, CHILD(n, 0));
970 if (!elt)
971 return NULL;
972
973 n_fors = count_list_fors(n);
974 if (n_fors == -1)
975 return NULL;
976
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000977 listcomps = asdl_seq_new(n_fors, c->c_arena);
978 if (!listcomps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000979 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000980
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 ch = CHILD(n, 1);
982 for (i = 0; i < n_fors; i++) {
983 comprehension_ty lc;
984 asdl_seq *t;
985 expr_ty expression;
986
987 REQ(ch, list_for);
988
989 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000990 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000992 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000993 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000996 if (asdl_seq_LEN(t) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +0000997 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000998 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001000 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1001 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001002 expression, NULL, c->c_arena);
1003 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005
1006 if (NCH(ch) == 5) {
1007 int j, n_ifs;
1008 asdl_seq *ifs;
1009
1010 ch = CHILD(ch, 4);
1011 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001012 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001015 ifs = asdl_seq_new(n_ifs, c->c_arena);
1016 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018
1019 for (j = 0; j < n_ifs; j++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001020 REQ(ch, list_iter);
1021 ch = CHILD(ch, 0);
1022 REQ(ch, list_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023
Jeremy Hyltona8293132006-02-28 17:58:27 +00001024 asdl_seq_SET(ifs, j, ast_for_expr(c, CHILD(ch, 1)));
1025 if (NCH(ch) == 3)
1026 ch = CHILD(ch, 2);
1027 }
1028 /* on exit, must guarantee that ch is a list_for */
1029 if (TYPE(ch) == list_iter)
1030 ch = CHILD(ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031 lc->ifs = ifs;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001032 }
1033 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 }
1035
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001036 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037}
1038
1039/*
1040 Count the number of 'for' loops in a generator expression.
1041
1042 Helper for ast_for_genexp().
1043*/
1044
1045static int
1046count_gen_fors(const node *n)
1047{
1048 int n_fors = 0;
1049 node *ch = CHILD(n, 1);
1050
1051 count_gen_for:
1052 n_fors++;
1053 REQ(ch, gen_for);
1054 if (NCH(ch) == 5)
1055 ch = CHILD(ch, 4);
1056 else
1057 return n_fors;
1058 count_gen_iter:
1059 REQ(ch, gen_iter);
1060 ch = CHILD(ch, 0);
1061 if (TYPE(ch) == gen_for)
1062 goto count_gen_for;
1063 else if (TYPE(ch) == gen_if) {
1064 if (NCH(ch) == 3) {
1065 ch = CHILD(ch, 2);
1066 goto count_gen_iter;
1067 }
1068 else
1069 return n_fors;
1070 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001071
1072 /* Should never be reached */
1073 PyErr_SetString(PyExc_SystemError,
1074 "logic error in count_gen_fors");
1075 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076}
1077
1078/* Count the number of 'if' statements in a generator expression.
1079
1080 Helper for ast_for_genexp().
1081*/
1082
1083static int
1084count_gen_ifs(const node *n)
1085{
1086 int n_ifs = 0;
1087
1088 while (1) {
1089 REQ(n, gen_iter);
1090 if (TYPE(CHILD(n, 0)) == gen_for)
1091 return n_ifs;
1092 n = CHILD(n, 0);
1093 REQ(n, gen_if);
1094 n_ifs++;
1095 if (NCH(n) == 2)
1096 return n_ifs;
1097 n = CHILD(n, 2);
1098 }
1099}
1100
Jeremy Hyltona8293132006-02-28 17:58:27 +00001101/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102static expr_ty
1103ast_for_genexp(struct compiling *c, const node *n)
1104{
1105 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1106 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1107 expr_ty elt;
1108 asdl_seq *genexps;
1109 int i, n_fors;
1110 node *ch;
1111
1112 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1113 assert(NCH(n) > 1);
1114
1115 elt = ast_for_expr(c, CHILD(n, 0));
1116 if (!elt)
1117 return NULL;
1118
1119 n_fors = count_gen_fors(n);
1120 if (n_fors == -1)
1121 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001122
1123 genexps = asdl_seq_new(n_fors, c->c_arena);
1124 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001126
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127 ch = CHILD(n, 1);
1128 for (i = 0; i < n_fors; i++) {
1129 comprehension_ty ge;
1130 asdl_seq *t;
1131 expr_ty expression;
1132
1133 REQ(ch, gen_for);
1134
1135 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001136 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001138 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001139 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001141
1142 if (asdl_seq_LEN(t) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001143 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001144 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001146 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1147 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001148 expression, NULL, c->c_arena);
1149
1150 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 if (NCH(ch) == 5) {
1154 int j, n_ifs;
1155 asdl_seq *ifs;
1156
1157 ch = CHILD(ch, 4);
1158 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001159 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001161
1162 ifs = asdl_seq_new(n_ifs, c->c_arena);
1163 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001165
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 for (j = 0; j < n_ifs; j++) {
1167 REQ(ch, gen_iter);
1168 ch = CHILD(ch, 0);
1169 REQ(ch, gen_if);
1170
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001171 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001172 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001173 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001174 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175 if (NCH(ch) == 3)
1176 ch = CHILD(ch, 2);
1177 }
1178 /* on exit, must guarantee that ch is a gen_for */
1179 if (TYPE(ch) == gen_iter)
1180 ch = CHILD(ch, 0);
1181 ge->ifs = ifs;
1182 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00001183 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 }
1185
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001186 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187}
1188
1189static expr_ty
1190ast_for_atom(struct compiling *c, const node *n)
1191{
1192 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1193 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1194 */
1195 node *ch = CHILD(n, 0);
1196
1197 switch (TYPE(ch)) {
1198 case NAME:
1199 /* All names start in Load context, but may later be
1200 changed. */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001201 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 case STRING: {
1203 PyObject *str = parsestrplus(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 if (!str)
1205 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001206
1207 PyArena_AddPyObject(c->c_arena, str);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001208 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 }
1210 case NUMBER: {
1211 PyObject *pynum = parsenumber(STR(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 if (!pynum)
1213 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001214
1215 PyArena_AddPyObject(c->c_arena, pynum);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001216 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 }
1218 case LPAR: /* some parenthesized expressions */
1219 ch = CHILD(n, 1);
1220
1221 if (TYPE(ch) == RPAR)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001222 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223
1224 if (TYPE(ch) == yield_expr)
1225 return ast_for_expr(c, ch);
1226
1227 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1228 return ast_for_genexp(c, ch);
1229
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001230 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 case LSQB: /* list (or list comprehension) */
1232 ch = CHILD(n, 1);
1233
1234 if (TYPE(ch) == RSQB)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001235 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236
1237 REQ(ch, listmaker);
1238 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1239 asdl_seq *elts = seq_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 if (!elts)
1241 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001242
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001243 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 }
1245 else
1246 return ast_for_listcomp(c, ch);
1247 case LBRACE: {
1248 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1249 int i, size;
1250 asdl_seq *keys, *values;
1251
1252 ch = CHILD(n, 1);
1253 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001254 keys = asdl_seq_new(size, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255 if (!keys)
1256 return NULL;
1257
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001258 values = asdl_seq_new(size, c->c_arena);
1259 if (!values)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261
1262 for (i = 0; i < NCH(ch); i += 4) {
1263 expr_ty expression;
1264
1265 expression = ast_for_expr(c, CHILD(ch, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001266 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001268
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001270
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271 expression = ast_for_expr(c, CHILD(ch, i + 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001272 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001274
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 asdl_seq_SET(values, i / 4, expression);
1276 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001277 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278 }
1279 case BACKQUOTE: { /* repr */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001280 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 if (!expression)
1282 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001283
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001284 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285 }
1286 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001287 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288 return NULL;
1289 }
1290}
1291
1292static slice_ty
1293ast_for_slice(struct compiling *c, const node *n)
1294{
1295 node *ch;
1296 expr_ty lower = NULL, upper = NULL, step = NULL;
1297
1298 REQ(n, subscript);
1299
1300 /*
1301 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1302 sliceop: ':' [test]
1303 */
1304 ch = CHILD(n, 0);
1305 if (TYPE(ch) == DOT)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001306 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307
1308 if (NCH(n) == 1 && TYPE(ch) == test) {
1309 /* 'step' variable hold no significance in terms of being used over
1310 other vars */
1311 step = ast_for_expr(c, ch);
1312 if (!step)
1313 return NULL;
1314
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001315 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316 }
1317
1318 if (TYPE(ch) == test) {
1319 lower = ast_for_expr(c, ch);
1320 if (!lower)
1321 return NULL;
1322 }
1323
1324 /* If there's an upper bound it's in the second or third position. */
1325 if (TYPE(ch) == COLON) {
1326 if (NCH(n) > 1) {
1327 node *n2 = CHILD(n, 1);
1328
1329 if (TYPE(n2) == test) {
1330 upper = ast_for_expr(c, n2);
1331 if (!upper)
1332 return NULL;
1333 }
1334 }
1335 } else if (NCH(n) > 2) {
1336 node *n2 = CHILD(n, 2);
1337
1338 if (TYPE(n2) == test) {
1339 upper = ast_for_expr(c, n2);
1340 if (!upper)
1341 return NULL;
1342 }
1343 }
1344
1345 ch = CHILD(n, NCH(n) - 1);
1346 if (TYPE(ch) == sliceop) {
Nick Coghlan77858682006-03-17 17:59:10 +00001347 if (NCH(ch) == 1) {
1348 /* No expression, so step is None */
1349 ch = CHILD(ch, 0);
1350 step = Name(new_identifier("None", c->c_arena), Load,
1351 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 if (!step)
1353 return NULL;
Nick Coghlan77858682006-03-17 17:59:10 +00001354 } else {
1355 ch = CHILD(ch, 1);
1356 if (TYPE(ch) == test) {
1357 step = ast_for_expr(c, ch);
1358 if (!step)
1359 return NULL;
1360 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 }
1362 }
1363
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001364 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365}
1366
1367static expr_ty
1368ast_for_binop(struct compiling *c, const node *n)
1369{
1370 /* Must account for a sequence of expressions.
1371 How should A op B op C by represented?
1372 BinOp(BinOp(A, op, B), op, C).
1373 */
1374
1375 int i, nops;
1376 expr_ty expr1, expr2, result;
Anthony Baxtera863d332006-04-11 07:43:46 +00001377 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001378
1379 expr1 = ast_for_expr(c, CHILD(n, 0));
1380 if (!expr1)
1381 return NULL;
1382
1383 expr2 = ast_for_expr(c, CHILD(n, 2));
1384 if (!expr2)
1385 return NULL;
1386
Anthony Baxtera863d332006-04-11 07:43:46 +00001387 newoperator = get_operator(CHILD(n, 1));
1388 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 return NULL;
1390
Anthony Baxtera863d332006-04-11 07:43:46 +00001391 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001392 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393 if (!result)
1394 return NULL;
1395
1396 nops = (NCH(n) - 1) / 2;
1397 for (i = 1; i < nops; i++) {
1398 expr_ty tmp_result, tmp;
1399 const node* next_oper = CHILD(n, i * 2 + 1);
1400
Anthony Baxtera863d332006-04-11 07:43:46 +00001401 newoperator = get_operator(next_oper);
1402 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403 return NULL;
1404
1405 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1406 if (!tmp)
1407 return NULL;
1408
Anthony Baxtera863d332006-04-11 07:43:46 +00001409 tmp_result = BinOp(result, newoperator, tmp,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001410 LINENO(next_oper), next_oper->n_col_offset,
1411 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 if (!tmp)
1413 return NULL;
1414 result = tmp_result;
1415 }
1416 return result;
1417}
1418
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001419static expr_ty
1420ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1421{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001422 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1423 subscriptlist: subscript (',' subscript)* [',']
1424 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1425 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001426 REQ(n, trailer);
1427 if (TYPE(CHILD(n, 0)) == LPAR) {
1428 if (NCH(n) == 2)
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001429 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1430 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001431 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001432 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001433 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001434 else if (TYPE(CHILD(n, 0)) == DOT ) {
1435 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001436 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001437 }
1438 else {
1439 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001440 REQ(CHILD(n, 2), RSQB);
1441 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001442 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001443 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1444 if (!slc)
1445 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001446 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1447 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001448 }
1449 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001450 /* The grammar is ambiguous here. The ambiguity is resolved
1451 by treating the sequence as a tuple literal if there are
1452 no slice features.
1453 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001454 int j;
1455 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001456 expr_ty e;
Thomas Wouters65b3dab2006-03-01 22:06:23 +00001457 bool simple = true;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001458 asdl_seq *slices, *elts;
1459 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001460 if (!slices)
1461 return NULL;
1462 for (j = 0; j < NCH(n); j += 2) {
1463 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001464 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001465 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001466 if (slc->kind != Index_kind)
1467 simple = false;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001468 asdl_seq_SET(slices, j / 2, slc);
1469 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001470 if (!simple) {
1471 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001472 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001473 }
1474 /* extract Index values and put them in a Tuple */
1475 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001476 if (!elts)
1477 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001478 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1479 slc = (slice_ty)asdl_seq_GET(slices, j);
1480 assert(slc->kind == Index_kind && slc->v.Index.value);
1481 asdl_seq_SET(elts, j, slc->v.Index.value);
1482 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001483 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001484 if (!e)
1485 return NULL;
1486 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001487 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001488 }
1489 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001490}
1491
1492static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001493ast_for_factor(struct compiling *c, const node *n)
1494{
1495 node *pfactor, *ppower, *patom, *pnum;
1496 expr_ty expression;
1497
1498 /* If the unary - operator is applied to a constant, don't generate
1499 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1500 constant. The peephole optimizer already does something like
1501 this but it doesn't handle the case where the constant is
1502 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1503 PyLongObject.
1504 */
1505 if (TYPE(CHILD(n, 0)) == MINUS
1506 && NCH(n) == 2
1507 && TYPE((pfactor = CHILD(n, 1))) == factor
1508 && NCH(pfactor) == 1
1509 && TYPE((ppower = CHILD(pfactor, 0))) == power
1510 && NCH(ppower) == 1
1511 && TYPE((patom = CHILD(ppower, 0))) == atom
1512 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1513 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1514 if (s == NULL)
1515 return NULL;
1516 s[0] = '-';
1517 strcpy(s + 1, STR(pnum));
1518 PyObject_FREE(STR(pnum));
1519 STR(pnum) = s;
1520 return ast_for_atom(c, patom);
1521 }
1522
1523 expression = ast_for_expr(c, CHILD(n, 1));
1524 if (!expression)
1525 return NULL;
1526
1527 switch (TYPE(CHILD(n, 0))) {
1528 case PLUS:
1529 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1530 c->c_arena);
1531 case MINUS:
1532 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1533 c->c_arena);
1534 case TILDE:
1535 return UnaryOp(Invert, expression, LINENO(n),
1536 n->n_col_offset, c->c_arena);
1537 }
1538 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1539 TYPE(CHILD(n, 0)));
1540 return NULL;
1541}
1542
1543static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001544ast_for_power(struct compiling *c, const node *n)
1545{
1546 /* power: atom trailer* ('**' factor)*
1547 */
1548 int i;
1549 expr_ty e, tmp;
1550 REQ(n, power);
1551 e = ast_for_atom(c, CHILD(n, 0));
1552 if (!e)
1553 return NULL;
1554 if (NCH(n) == 1)
1555 return e;
1556 for (i = 1; i < NCH(n); i++) {
1557 node *ch = CHILD(n, i);
1558 if (TYPE(ch) != trailer)
1559 break;
1560 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001561 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001562 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001563 tmp->lineno = e->lineno;
1564 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001565 e = tmp;
1566 }
1567 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1568 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001569 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001570 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001571 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001572 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001573 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001574 e = tmp;
1575 }
1576 return e;
1577}
1578
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579/* Do not name a variable 'expr'! Will cause a compile error.
1580*/
1581
1582static expr_ty
1583ast_for_expr(struct compiling *c, const node *n)
1584{
1585 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001586 test: or_test ['if' or_test 'else' test] | lambdef
1587 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588 and_test: not_test ('and' not_test)*
1589 not_test: 'not' not_test | comparison
1590 comparison: expr (comp_op expr)*
1591 expr: xor_expr ('|' xor_expr)*
1592 xor_expr: and_expr ('^' and_expr)*
1593 and_expr: shift_expr ('&' shift_expr)*
1594 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1595 arith_expr: term (('+'|'-') term)*
1596 term: factor (('*'|'/'|'%'|'//') factor)*
1597 factor: ('+'|'-'|'~') factor | power
1598 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001599
1600 As well as modified versions that exist for backward compatibility,
1601 to explicitly allow:
1602 [ x for x in lambda: 0, lambda: 1 ]
1603 (which would be ambiguous without these extra rules)
1604
1605 old_test: or_test | old_lambdef
1606 old_lambdef: 'lambda' [vararglist] ':' old_test
1607
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608 */
1609
1610 asdl_seq *seq;
1611 int i;
1612
1613 loop:
1614 switch (TYPE(n)) {
1615 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001616 case old_test:
1617 if (TYPE(CHILD(n, 0)) == lambdef ||
1618 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001620 else if (NCH(n) > 1)
1621 return ast_for_ifexpr(c, n);
1622 /* Fallthrough */
1623 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624 case and_test:
1625 if (NCH(n) == 1) {
1626 n = CHILD(n, 0);
1627 goto loop;
1628 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001629 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630 if (!seq)
1631 return NULL;
1632 for (i = 0; i < NCH(n); i += 2) {
1633 expr_ty e = ast_for_expr(c, CHILD(n, i));
1634 if (!e)
1635 return NULL;
1636 asdl_seq_SET(seq, i / 2, e);
1637 }
1638 if (!strcmp(STR(CHILD(n, 1)), "and"))
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001639 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1640 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001641 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001642 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001643 case not_test:
1644 if (NCH(n) == 1) {
1645 n = CHILD(n, 0);
1646 goto loop;
1647 }
1648 else {
1649 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1650 if (!expression)
1651 return NULL;
1652
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001653 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1654 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655 }
1656 case comparison:
1657 if (NCH(n) == 1) {
1658 n = CHILD(n, 0);
1659 goto loop;
1660 }
1661 else {
1662 expr_ty expression;
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001663 asdl_int_seq *ops;
1664 asdl_seq *cmps;
1665 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001666 if (!ops)
1667 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001668 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670 return NULL;
1671 }
1672 for (i = 1; i < NCH(n); i += 2) {
Anthony Baxtera863d332006-04-11 07:43:46 +00001673 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674
Anthony Baxtera863d332006-04-11 07:43:46 +00001675 newoperator = ast_for_comp_op(CHILD(n, i));
1676 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001678 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679
1680 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001681 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001683 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001685 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 asdl_seq_SET(cmps, i / 2, expression);
1687 }
1688 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001689 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001691 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001693 return Compare(expression, ops, cmps, LINENO(n),
1694 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 }
1696 break;
1697
1698 /* The next five cases all handle BinOps. The main body of code
1699 is the same in each case, but the switch turned inside out to
1700 reuse the code for each type of operator.
1701 */
1702 case expr:
1703 case xor_expr:
1704 case and_expr:
1705 case shift_expr:
1706 case arith_expr:
1707 case term:
1708 if (NCH(n) == 1) {
1709 n = CHILD(n, 0);
1710 goto loop;
1711 }
1712 return ast_for_binop(c, n);
1713 case yield_expr: {
1714 expr_ty exp = NULL;
1715 if (NCH(n) == 2) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001716 exp = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 if (!exp)
1718 return NULL;
1719 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001720 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001722 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 if (NCH(n) == 1) {
1724 n = CHILD(n, 0);
1725 goto loop;
1726 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001727 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001728 case power:
1729 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001731 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732 return NULL;
1733 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001734 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735 return NULL;
1736}
1737
1738static expr_ty
1739ast_for_call(struct compiling *c, const node *n, expr_ty func)
1740{
1741 /*
1742 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1743 | '**' test)
1744 argument: [test '='] test [gen_for] # Really [keyword '='] test
1745 */
1746
1747 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001748 asdl_seq *args;
1749 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750 expr_ty vararg = NULL, kwarg = NULL;
1751
1752 REQ(n, arglist);
1753
1754 nargs = 0;
1755 nkeywords = 0;
1756 ngens = 0;
1757 for (i = 0; i < NCH(n); i++) {
1758 node *ch = CHILD(n, i);
1759 if (TYPE(ch) == argument) {
1760 if (NCH(ch) == 1)
1761 nargs++;
1762 else if (TYPE(CHILD(ch, 1)) == gen_for)
1763 ngens++;
1764 else
1765 nkeywords++;
1766 }
1767 }
1768 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001769 ast_error(n, "Generator expression must be parenthesized "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770 "if not sole argument");
1771 return NULL;
1772 }
1773
1774 if (nargs + nkeywords + ngens > 255) {
1775 ast_error(n, "more than 255 arguments");
1776 return NULL;
1777 }
1778
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001779 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001781 return NULL;
1782 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001784 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 nargs = 0;
1786 nkeywords = 0;
1787 for (i = 0; i < NCH(n); i++) {
1788 node *ch = CHILD(n, i);
1789 if (TYPE(ch) == argument) {
1790 expr_ty e;
1791 if (NCH(ch) == 1) {
Neal Norwitz5ef92242006-05-19 06:43:50 +00001792 if (nkeywords) {
1793 ast_error(CHILD(ch, 0),
1794 "non-keyword arg after keyword arg");
1795 return NULL;
1796 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797 e = ast_for_expr(c, CHILD(ch, 0));
1798 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 asdl_seq_SET(args, nargs++, e);
1801 }
1802 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1803 e = ast_for_genexp(c, ch);
1804 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001805 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 asdl_seq_SET(args, nargs++, e);
1807 }
1808 else {
1809 keyword_ty kw;
1810 identifier key;
1811
1812 /* CHILD(ch, 0) is test, but must be an identifier? */
1813 e = ast_for_expr(c, CHILD(ch, 0));
1814 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001815 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 /* f(lambda x: x[0] = 3) ends up getting parsed with
1817 * LHS test = lambda x: x[0], and RHS test = 3.
1818 * SF bug 132313 points out that complaining about a keyword
1819 * then is very confusing.
1820 */
1821 if (e->kind == Lambda_kind) {
1822 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001823 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 } else if (e->kind != Name_kind) {
1825 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001826 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 }
1828 key = e->v.Name.id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 e = ast_for_expr(c, CHILD(ch, 2));
1830 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001831 return NULL;
1832 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001834 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 asdl_seq_SET(keywords, nkeywords++, kw);
1836 }
1837 }
1838 else if (TYPE(ch) == STAR) {
1839 vararg = ast_for_expr(c, CHILD(n, i+1));
1840 i++;
1841 }
1842 else if (TYPE(ch) == DOUBLESTAR) {
1843 kwarg = ast_for_expr(c, CHILD(n, i+1));
1844 i++;
1845 }
1846 }
1847
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001848 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849}
1850
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001852ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001854 /* testlist_gexp: test (',' test)* [','] */
1855 /* testlist: test (',' test)* [','] */
1856 /* testlist_safe: test (',' test)+ [','] */
1857 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001859 if (TYPE(n) == testlist_gexp) {
1860 if (NCH(n) > 1)
1861 assert(TYPE(CHILD(n, 1)) != gen_for);
1862 }
1863 else {
1864 assert(TYPE(n) == testlist ||
1865 TYPE(n) == testlist_safe ||
1866 TYPE(n) == testlist1);
1867 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 if (NCH(n) == 1)
1869 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 else {
1871 asdl_seq *tmp = seq_for_testlist(c, n);
1872 if (!tmp)
1873 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001874 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001876}
1877
1878static expr_ty
1879ast_for_testlist_gexp(struct compiling *c, const node* n)
1880{
1881 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1882 /* argument: test [ gen_for ] */
1883 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001884 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001885 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001886 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001887}
1888
1889/* like ast_for_testlist() but returns a sequence */
1890static asdl_seq*
1891ast_for_class_bases(struct compiling *c, const node* n)
1892{
1893 /* testlist: test (',' test)* [','] */
1894 assert(NCH(n) > 0);
1895 REQ(n, testlist);
1896 if (NCH(n) == 1) {
1897 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001898 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001899 if (!bases)
1900 return NULL;
1901 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001902 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001903 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001904 asdl_seq_SET(bases, 0, base);
1905 return bases;
1906 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001907
1908 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909}
1910
1911static stmt_ty
1912ast_for_expr_stmt(struct compiling *c, const node *n)
1913{
1914 REQ(n, expr_stmt);
1915 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1916 | ('=' (yield_expr|testlist))*)
1917 testlist: test (',' test)* [',']
1918 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
1919 | '<<=' | '>>=' | '**=' | '//='
1920 test: ... here starts the operator precendence dance
1921 */
1922
1923 if (NCH(n) == 1) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001924 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 if (!e)
1926 return NULL;
1927
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001928 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 }
1930 else if (TYPE(CHILD(n, 1)) == augassign) {
1931 expr_ty expr1, expr2;
Anthony Baxtera863d332006-04-11 07:43:46 +00001932 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 node *ch = CHILD(n, 0);
1934
Neal Norwitz0d62a062006-07-30 06:53:31 +00001935 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 if (!expr1)
1937 return NULL;
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001938 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001939 switch (expr1->kind) {
1940 case GeneratorExp_kind:
1941 ast_error(ch, "augmented assignment to generator "
1942 "expression not possible");
1943 return NULL;
Neal Norwitz0d62a062006-07-30 06:53:31 +00001944 case Yield_kind:
1945 ast_error(ch, "augmented assignment to yield "
1946 "expression not possible");
1947 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001948 case Name_kind: {
1949 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1950 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1951 ast_error(ch, "assignment to None");
1952 return NULL;
1953 }
1954 break;
1955 }
1956 case Attribute_kind:
1957 case Subscript_kind:
1958 break;
1959 default:
1960 ast_error(ch, "illegal expression for augmented "
1961 "assignment");
1962 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 }
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001964 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965
1966 ch = CHILD(n, 2);
1967 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001968 expr2 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 else
Neal Norwitz0d62a062006-07-30 06:53:31 +00001970 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001971 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 return NULL;
1973
Anthony Baxtera863d332006-04-11 07:43:46 +00001974 newoperator = ast_for_augassign(CHILD(n, 1));
1975 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976 return NULL;
1977
Anthony Baxtera863d332006-04-11 07:43:46 +00001978 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979 }
1980 else {
1981 int i;
1982 asdl_seq *targets;
1983 node *value;
1984 expr_ty expression;
1985
1986 /* a normal assignment */
1987 REQ(CHILD(n, 1), EQUAL);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!targets)
1990 return NULL;
1991 for (i = 0; i < NCH(n) - 2; i += 2) {
Armin Rigo31441302005-10-21 12:57:31 +00001992 expr_ty e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 node *ch = CHILD(n, i);
1994 if (TYPE(ch) == yield_expr) {
1995 ast_error(ch, "assignment to yield expression not possible");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001996 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001998 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999
2000 /* set context to assign */
2001 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002002 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
Neal Norwitz84456bd2005-12-18 03:16:20 +00002004 if (!set_context(e, Store, CHILD(n, i)))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006
2007 asdl_seq_SET(targets, i / 2, e);
2008 }
2009 value = CHILD(n, NCH(n) - 1);
2010 if (TYPE(value) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002011 expression = ast_for_testlist(c, value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 else
2013 expression = ast_for_expr(c, value);
2014 if (!expression)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002015 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002016 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018}
2019
2020static stmt_ty
2021ast_for_print_stmt(struct compiling *c, const node *n)
2022{
2023 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2024 | '>>' test [ (',' test)+ [','] ] )
2025 */
2026 expr_ty dest = NULL, expression;
2027 asdl_seq *seq;
2028 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002029 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030
2031 REQ(n, print_stmt);
2032 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2033 dest = ast_for_expr(c, CHILD(n, 2));
2034 if (!dest)
2035 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002036 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002038 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 if (!seq)
Jeremy Hyltona8293132006-02-28 17:58:27 +00002040 return NULL;
2041 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002043 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002045 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 }
2047 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002048 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049}
2050
2051static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002052ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053{
2054 asdl_seq *seq;
2055 int i;
2056 expr_ty e;
2057
2058 REQ(n, exprlist);
2059
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002060 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 if (!seq)
2062 return NULL;
2063 for (i = 0; i < NCH(n); i += 2) {
2064 e = ast_for_expr(c, CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002065 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002066 return NULL;
Neal Norwitz6b347892005-11-15 07:17:53 +00002067 asdl_seq_SET(seq, i / 2, e);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002068 if (context && !set_context(e, context, CHILD(n, i)))
2069 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 }
2071 return seq;
2072}
2073
2074static stmt_ty
2075ast_for_del_stmt(struct compiling *c, const node *n)
2076{
2077 asdl_seq *expr_list;
2078
2079 /* del_stmt: 'del' exprlist */
2080 REQ(n, del_stmt);
2081
2082 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2083 if (!expr_list)
2084 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002085 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086}
2087
2088static stmt_ty
2089ast_for_flow_stmt(struct compiling *c, const node *n)
2090{
2091 /*
2092 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2093 | yield_stmt
2094 break_stmt: 'break'
2095 continue_stmt: 'continue'
2096 return_stmt: 'return' [testlist]
2097 yield_stmt: yield_expr
2098 yield_expr: 'yield' testlist
2099 raise_stmt: 'raise' [test [',' test [',' test]]]
2100 */
2101 node *ch;
2102
2103 REQ(n, flow_stmt);
2104 ch = CHILD(n, 0);
2105 switch (TYPE(ch)) {
2106 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002107 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002109 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110 case yield_stmt: { /* will reduce to yield_expr */
2111 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2112 if (!exp)
2113 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002114 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 }
2116 case return_stmt:
2117 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002118 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002120 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121 if (!expression)
2122 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002123 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124 }
2125 case raise_stmt:
2126 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002127 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128 else if (NCH(ch) == 2) {
2129 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2130 if (!expression)
2131 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002132 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 }
2134 else if (NCH(ch) == 4) {
2135 expr_ty expr1, expr2;
2136
2137 expr1 = ast_for_expr(c, CHILD(ch, 1));
2138 if (!expr1)
2139 return NULL;
2140 expr2 = ast_for_expr(c, CHILD(ch, 3));
2141 if (!expr2)
2142 return NULL;
2143
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002144 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 }
2146 else if (NCH(ch) == 6) {
2147 expr_ty expr1, expr2, expr3;
2148
2149 expr1 = ast_for_expr(c, CHILD(ch, 1));
2150 if (!expr1)
2151 return NULL;
2152 expr2 = ast_for_expr(c, CHILD(ch, 3));
2153 if (!expr2)
2154 return NULL;
2155 expr3 = ast_for_expr(c, CHILD(ch, 5));
2156 if (!expr3)
2157 return NULL;
2158
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002159 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 }
2161 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002162 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 "unexpected flow_stmt: %d", TYPE(ch));
2164 return NULL;
2165 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002166
2167 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2168 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169}
2170
2171static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002172alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173{
2174 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002175 import_as_name: NAME ['as' NAME]
2176 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177 dotted_name: NAME ('.' NAME)*
2178 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002179 PyObject *str;
2180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 loop:
2182 switch (TYPE(n)) {
2183 case import_as_name:
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002184 str = NULL;
2185 if (NCH(n) == 3) {
2186 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2187 ast_error(n, "must use 'as' in import");
2188 return NULL;
2189 }
2190 str = NEW_IDENTIFIER(CHILD(n, 2));
2191 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002192 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 case dotted_as_name:
2194 if (NCH(n) == 1) {
2195 n = CHILD(n, 0);
2196 goto loop;
2197 }
2198 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002199 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002200 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2201 ast_error(n, "must use 'as' in import");
2202 return NULL;
2203 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204 assert(!a->asname);
2205 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2206 return a;
2207 }
2208 break;
2209 case dotted_name:
2210 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002211 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212 else {
2213 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002214 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002215 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 char *s;
2217
2218 len = 0;
2219 for (i = 0; i < NCH(n); i += 2)
2220 /* length of string plus one for the dot */
2221 len += strlen(STR(CHILD(n, i))) + 1;
2222 len--; /* the last name doesn't have a dot */
2223 str = PyString_FromStringAndSize(NULL, len);
2224 if (!str)
2225 return NULL;
2226 s = PyString_AS_STRING(str);
2227 if (!s)
2228 return NULL;
2229 for (i = 0; i < NCH(n); i += 2) {
2230 char *sch = STR(CHILD(n, i));
2231 strcpy(s, STR(CHILD(n, i)));
2232 s += strlen(sch);
2233 *s++ = '.';
2234 }
2235 --s;
2236 *s = '\0';
2237 PyString_InternInPlace(&str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002238 PyArena_AddPyObject(c->c_arena, str);
2239 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240 }
2241 break;
2242 case STAR:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002243 str = PyString_InternFromString("*");
2244 PyArena_AddPyObject(c->c_arena, str);
2245 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002247 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 "unexpected import name: %d", TYPE(n));
2249 return NULL;
2250 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002251
2252 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 return NULL;
2254}
2255
2256static stmt_ty
2257ast_for_import_stmt(struct compiling *c, const node *n)
2258{
2259 /*
2260 import_stmt: import_name | import_from
2261 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002262 import_from: 'from' ('.'* dotted_name | '.') 'import'
2263 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002265 int lineno;
2266 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 int i;
2268 asdl_seq *aliases;
2269
2270 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002271 lineno = LINENO(n);
2272 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002274 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 n = CHILD(n, 1);
Neil Schemenauer147b7592005-10-23 03:38:19 +00002276 REQ(n, dotted_as_names);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002277 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 if (!aliases)
2279 return NULL;
2280 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002281 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002282 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 asdl_seq_SET(aliases, i / 2, import_alias);
2285 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002286 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002288 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 int n_children;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002290 int idx, ndots = 0;
2291 alias_ty mod = NULL;
2292 identifier modname;
2293
2294 /* Count the number of dots (for relative imports) and check for the
2295 optional module name */
2296 for (idx = 1; idx < NCH(n); idx++) {
2297 if (TYPE(CHILD(n, idx)) == dotted_name) {
2298 mod = alias_for_import_name(c, CHILD(n, idx));
2299 idx++;
2300 break;
2301 } else if (TYPE(CHILD(n, idx)) != DOT) {
2302 break;
2303 }
2304 ndots++;
2305 }
2306 idx++; /* skip over the 'import' keyword */
2307 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002308 case STAR:
2309 /* from ... import * */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002310 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002311 n_children = 1;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002312 if (ndots) {
2313 ast_error(n, "'import *' not allowed with 'from .'");
2314 return NULL;
2315 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002316 break;
2317 case LPAR:
2318 /* from ... import (x, y, z) */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002319 n = CHILD(n, idx + 1);
Thomas Wouters106203c2006-02-27 17:05:19 +00002320 n_children = NCH(n);
2321 break;
2322 case import_as_names:
2323 /* from ... import x, y, z */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002324 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002325 n_children = NCH(n);
2326 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 ast_error(n, "trailing comma not allowed without"
2328 " surrounding parentheses");
2329 return NULL;
2330 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002331 break;
2332 default:
2333 ast_error(n, "Unexpected node-type in from-import");
2334 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00002335 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002337 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002338 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340
2341 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002342 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002343 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002344 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002346 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002348 else {
2349 for (i = 0; i < NCH(n); i += 2) {
2350 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2351 if (!import_alias)
2352 return NULL;
2353 asdl_seq_SET(aliases, i / 2, import_alias);
2354 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002356 if (mod != NULL)
2357 modname = mod->name;
2358 else
2359 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002360 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002361 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 }
Neal Norwitz79792652005-11-14 04:25:03 +00002363 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 "unknown import statement: starts with command '%s'",
2365 STR(CHILD(n, 0)));
2366 return NULL;
2367}
2368
2369static stmt_ty
2370ast_for_global_stmt(struct compiling *c, const node *n)
2371{
2372 /* global_stmt: 'global' NAME (',' NAME)* */
2373 identifier name;
2374 asdl_seq *s;
2375 int i;
2376
2377 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002378 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 if (!s)
2380 return NULL;
2381 for (i = 1; i < NCH(n); i += 2) {
2382 name = NEW_IDENTIFIER(CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002383 if (!name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 asdl_seq_SET(s, i / 2, name);
2386 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002387 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388}
2389
2390static stmt_ty
2391ast_for_exec_stmt(struct compiling *c, const node *n)
2392{
2393 expr_ty expr1, globals = NULL, locals = NULL;
2394 int n_children = NCH(n);
2395 if (n_children != 2 && n_children != 4 && n_children != 6) {
Neal Norwitz79792652005-11-14 04:25:03 +00002396 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 "poorly formed 'exec' statement: %d parts to statement",
2398 n_children);
2399 return NULL;
2400 }
2401
2402 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2403 REQ(n, exec_stmt);
2404 expr1 = ast_for_expr(c, CHILD(n, 1));
2405 if (!expr1)
2406 return NULL;
2407 if (n_children >= 4) {
2408 globals = ast_for_expr(c, CHILD(n, 3));
2409 if (!globals)
2410 return NULL;
2411 }
2412 if (n_children == 6) {
2413 locals = ast_for_expr(c, CHILD(n, 5));
2414 if (!locals)
2415 return NULL;
2416 }
2417
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002418 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419}
2420
2421static stmt_ty
2422ast_for_assert_stmt(struct compiling *c, const node *n)
2423{
2424 /* assert_stmt: 'assert' test [',' test] */
2425 REQ(n, assert_stmt);
2426 if (NCH(n) == 2) {
2427 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2428 if (!expression)
2429 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002430 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431 }
2432 else if (NCH(n) == 4) {
2433 expr_ty expr1, expr2;
2434
2435 expr1 = ast_for_expr(c, CHILD(n, 1));
2436 if (!expr1)
2437 return NULL;
2438 expr2 = ast_for_expr(c, CHILD(n, 3));
2439 if (!expr2)
2440 return NULL;
2441
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002442 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 }
Neal Norwitz79792652005-11-14 04:25:03 +00002444 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 "improper number of parts to 'assert' statement: %d",
2446 NCH(n));
2447 return NULL;
2448}
2449
2450static asdl_seq *
2451ast_for_suite(struct compiling *c, const node *n)
2452{
2453 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002454 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 stmt_ty s;
2456 int i, total, num, end, pos = 0;
2457 node *ch;
2458
2459 REQ(n, suite);
2460
2461 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002462 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 if (!seq)
2464 return NULL;
2465 if (TYPE(CHILD(n, 0)) == simple_stmt) {
2466 n = CHILD(n, 0);
2467 /* simple_stmt always ends with a NEWLINE,
2468 and may have a trailing SEMI
2469 */
2470 end = NCH(n) - 1;
2471 if (TYPE(CHILD(n, end - 1)) == SEMI)
2472 end--;
2473 /* loop by 2 to skip semi-colons */
2474 for (i = 0; i < end; i += 2) {
2475 ch = CHILD(n, i);
2476 s = ast_for_stmt(c, ch);
2477 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 asdl_seq_SET(seq, pos++, s);
2480 }
2481 }
2482 else {
2483 for (i = 2; i < (NCH(n) - 1); i++) {
2484 ch = CHILD(n, i);
2485 REQ(ch, stmt);
2486 num = num_stmts(ch);
2487 if (num == 1) {
2488 /* small_stmt or compound_stmt with only one child */
2489 s = ast_for_stmt(c, ch);
2490 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002491 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 asdl_seq_SET(seq, pos++, s);
2493 }
2494 else {
2495 int j;
2496 ch = CHILD(ch, 0);
2497 REQ(ch, simple_stmt);
2498 for (j = 0; j < NCH(ch); j += 2) {
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002499 /* statement terminates with a semi-colon ';' */
2500 if (NCH(CHILD(ch, j)) == 0) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002501 assert((j + 1) == NCH(ch));
2502 break;
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002503 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 s = ast_for_stmt(c, CHILD(ch, j));
2505 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 asdl_seq_SET(seq, pos++, s);
2508 }
2509 }
2510 }
2511 }
2512 assert(pos == seq->size);
2513 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514}
2515
2516static stmt_ty
2517ast_for_if_stmt(struct compiling *c, const node *n)
2518{
2519 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2520 ['else' ':' suite]
2521 */
2522 char *s;
2523
2524 REQ(n, if_stmt);
2525
2526 if (NCH(n) == 4) {
2527 expr_ty expression;
2528 asdl_seq *suite_seq;
2529
2530 expression = ast_for_expr(c, CHILD(n, 1));
2531 if (!expression)
2532 return NULL;
2533 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002534 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535 return NULL;
2536
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002537 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002539
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 s = STR(CHILD(n, 4));
2541 /* s[2], the third character in the string, will be
2542 's' for el_s_e, or
2543 'i' for el_i_f
2544 */
2545 if (s[2] == 's') {
2546 expr_ty expression;
2547 asdl_seq *seq1, *seq2;
2548
2549 expression = ast_for_expr(c, CHILD(n, 1));
2550 if (!expression)
2551 return NULL;
2552 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002553 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 return NULL;
2555 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002556 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 return NULL;
2558
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002559 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 }
2561 else if (s[2] == 'i') {
2562 int i, n_elif, has_else = 0;
2563 asdl_seq *orelse = NULL;
2564 n_elif = NCH(n) - 4;
2565 /* must reference the child n_elif+1 since 'else' token is third,
2566 not fourth, child from the end. */
2567 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2568 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2569 has_else = 1;
2570 n_elif -= 3;
2571 }
2572 n_elif /= 4;
2573
2574 if (has_else) {
2575 expr_ty expression;
2576 asdl_seq *seq1, *seq2;
2577
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002578 orelse = asdl_seq_new(1, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 if (!orelse)
2580 return NULL;
2581 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002582 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002585 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002588 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590
2591 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002592 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002593 c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 /* the just-created orelse handled the last elif */
2595 n_elif--;
2596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597
2598 for (i = 0; i < n_elif; i++) {
2599 int off = 5 + (n_elif - i - 1) * 4;
2600 expr_ty expression;
2601 asdl_seq *suite_seq;
Anthony Baxtera863d332006-04-11 07:43:46 +00002602 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2603 if (!newobj)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 return NULL;
2605 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002606 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002609 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Anthony Baxtera863d332006-04-11 07:43:46 +00002612 asdl_seq_SET(newobj, 0,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 If(expression, suite_seq, orelse,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002614 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
Anthony Baxtera863d332006-04-11 07:43:46 +00002615 orelse = newobj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 }
2617 return If(ast_for_expr(c, CHILD(n, 1)),
2618 ast_for_suite(c, CHILD(n, 3)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002619 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002621
2622 PyErr_Format(PyExc_SystemError,
2623 "unexpected token in 'if' statement: %s", s);
2624 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625}
2626
2627static stmt_ty
2628ast_for_while_stmt(struct compiling *c, const node *n)
2629{
2630 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2631 REQ(n, while_stmt);
2632
2633 if (NCH(n) == 4) {
2634 expr_ty expression;
2635 asdl_seq *suite_seq;
2636
2637 expression = ast_for_expr(c, CHILD(n, 1));
2638 if (!expression)
2639 return NULL;
2640 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002641 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002643 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 }
2645 else if (NCH(n) == 7) {
2646 expr_ty expression;
2647 asdl_seq *seq1, *seq2;
2648
2649 expression = ast_for_expr(c, CHILD(n, 1));
2650 if (!expression)
2651 return NULL;
2652 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002653 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 return NULL;
2655 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002656 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 return NULL;
2658
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002659 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002661
2662 PyErr_Format(PyExc_SystemError,
2663 "wrong number of tokens for 'while' statement: %d",
2664 NCH(n));
2665 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666}
2667
2668static stmt_ty
2669ast_for_for_stmt(struct compiling *c, const node *n)
2670{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002671 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 expr_ty expression;
2673 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002674 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2676 REQ(n, for_stmt);
2677
2678 if (NCH(n) == 9) {
2679 seq = ast_for_suite(c, CHILD(n, 8));
2680 if (!seq)
2681 return NULL;
2682 }
2683
Neal Norwitzedef2be2006-07-12 05:26:17 +00002684 node_target = CHILD(n, 1);
2685 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002686 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002688 /* Check the # of children rather than the length of _target, since
2689 for x, in ... has 1 element in _target, but still requires a Tuple. */
2690 if (NCH(node_target) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00002691 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 else
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002693 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002695 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002696 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return NULL;
2698 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002699 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return NULL;
2701
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002702 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2703 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704}
2705
2706static excepthandler_ty
2707ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2708{
2709 /* except_clause: 'except' [test [',' test]] */
2710 REQ(exc, except_clause);
2711 REQ(body, suite);
2712
2713 if (NCH(exc) == 1) {
2714 asdl_seq *suite_seq = ast_for_suite(c, body);
2715 if (!suite_seq)
2716 return NULL;
2717
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002718 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
2719 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 }
2721 else if (NCH(exc) == 2) {
2722 expr_ty expression;
2723 asdl_seq *suite_seq;
2724
2725 expression = ast_for_expr(c, CHILD(exc, 1));
2726 if (!expression)
2727 return NULL;
2728 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002729 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return NULL;
2731
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002732 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
2733 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 }
2735 else if (NCH(exc) == 4) {
2736 asdl_seq *suite_seq;
2737 expr_ty expression;
2738 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2739 if (!e)
2740 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002741 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 return NULL;
2743 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002744 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 return NULL;
2746 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 return NULL;
2749
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002750 return excepthandler(expression, e, suite_seq, LINENO(exc),
2751 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002753
2754 PyErr_Format(PyExc_SystemError,
2755 "wrong number of children for 'except' clause: %d",
2756 NCH(exc));
2757 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758}
2759
2760static stmt_ty
2761ast_for_try_stmt(struct compiling *c, const node *n)
2762{
Neal Norwitzf599f422005-12-17 21:33:47 +00002763 const int nch = NCH(n);
2764 int n_except = (nch - 3)/3;
2765 asdl_seq *body, *orelse = NULL, *finally = NULL;
2766
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 REQ(n, try_stmt);
2768
Neal Norwitzf599f422005-12-17 21:33:47 +00002769 body = ast_for_suite(c, CHILD(n, 2));
2770 if (body == NULL)
2771 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772
Neal Norwitzf599f422005-12-17 21:33:47 +00002773 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2774 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2775 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2776 /* we can assume it's an "else",
2777 because nch >= 9 for try-else-finally and
2778 it would otherwise have a type of except_clause */
2779 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2780 if (orelse == NULL)
2781 return NULL;
2782 n_except--;
2783 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784
Neal Norwitzf599f422005-12-17 21:33:47 +00002785 finally = ast_for_suite(c, CHILD(n, nch - 1));
2786 if (finally == NULL)
2787 return NULL;
2788 n_except--;
2789 }
2790 else {
2791 /* we can assume it's an "else",
2792 otherwise it would have a type of except_clause */
2793 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2794 if (orelse == NULL)
2795 return NULL;
2796 n_except--;
2797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002799 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002800 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 return NULL;
2802 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002803
2804 if (n_except > 0) {
2805 int i;
2806 stmt_ty except_st;
2807 /* process except statements to create a try ... except */
2808 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2809 if (handlers == NULL)
2810 return NULL;
2811
2812 for (i = 0; i < n_except; i++) {
2813 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2814 CHILD(n, 5 + i * 3));
2815 if (!e)
2816 return NULL;
2817 asdl_seq_SET(handlers, i, e);
2818 }
2819
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002820 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2821 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002822 if (!finally)
2823 return except_st;
2824
2825 /* if a 'finally' is present too, we nest the TryExcept within a
2826 TryFinally to emulate try ... except ... finally */
2827 body = asdl_seq_new(1, c->c_arena);
2828 if (body == NULL)
2829 return NULL;
2830 asdl_seq_SET(body, 0, except_st);
2831 }
2832
2833 /* must be a try ... finally (except clauses are in body, if any exist) */
2834 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002835 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836}
2837
Guido van Rossumc2e20742006-02-27 22:32:47 +00002838static expr_ty
2839ast_for_with_var(struct compiling *c, const node *n)
2840{
2841 REQ(n, with_var);
2842 if (strcmp(STR(CHILD(n, 0)), "as") != 0) {
2843 ast_error(n, "expected \"with [expr] as [var]\"");
2844 return NULL;
2845 }
2846 return ast_for_expr(c, CHILD(n, 1));
2847}
2848
2849/* with_stmt: 'with' test [ with_var ] ':' suite */
2850static stmt_ty
2851ast_for_with_stmt(struct compiling *c, const node *n)
2852{
2853 expr_ty context_expr, optional_vars = NULL;
2854 int suite_index = 3; /* skip 'with', test, and ':' */
2855 asdl_seq *suite_seq;
2856
2857 assert(TYPE(n) == with_stmt);
2858 context_expr = ast_for_expr(c, CHILD(n, 1));
2859 if (TYPE(CHILD(n, 2)) == with_var) {
2860 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2861
2862 if (!optional_vars) {
2863 return NULL;
2864 }
2865 if (!set_context(optional_vars, Store, n)) {
2866 return NULL;
2867 }
2868 suite_index = 4;
2869 }
2870
2871 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2872 if (!suite_seq) {
2873 return NULL;
2874 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002875 return With(context_expr, optional_vars, suite_seq, LINENO(n),
2876 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002877}
2878
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879static stmt_ty
2880ast_for_classdef(struct compiling *c, const node *n)
2881{
2882 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 asdl_seq *bases, *s;
2884
2885 REQ(n, classdef);
2886
2887 if (!strcmp(STR(CHILD(n, 1)), "None")) {
2888 ast_error(n, "assignment to None");
2889 return NULL;
2890 }
2891
2892 if (NCH(n) == 4) {
2893 s = ast_for_suite(c, CHILD(n, 3));
2894 if (!s)
2895 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002896 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2897 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 }
2899 /* check for empty base list */
2900 if (TYPE(CHILD(n,3)) == RPAR) {
2901 s = ast_for_suite(c, CHILD(n,5));
2902 if (!s)
2903 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002904 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2905 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 }
2907
2908 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002909 bases = ast_for_class_bases(c, CHILD(n, 3));
2910 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912
2913 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002914 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002916 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
2917 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002918}
2919
2920static stmt_ty
2921ast_for_stmt(struct compiling *c, const node *n)
2922{
2923 if (TYPE(n) == stmt) {
2924 assert(NCH(n) == 1);
2925 n = CHILD(n, 0);
2926 }
2927 if (TYPE(n) == simple_stmt) {
2928 assert(num_stmts(n) == 1);
2929 n = CHILD(n, 0);
2930 }
2931 if (TYPE(n) == small_stmt) {
2932 REQ(n, small_stmt);
2933 n = CHILD(n, 0);
2934 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2935 | flow_stmt | import_stmt | global_stmt | exec_stmt
2936 | assert_stmt
2937 */
2938 switch (TYPE(n)) {
2939 case expr_stmt:
2940 return ast_for_expr_stmt(c, n);
2941 case print_stmt:
2942 return ast_for_print_stmt(c, n);
2943 case del_stmt:
2944 return ast_for_del_stmt(c, n);
2945 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002946 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947 case flow_stmt:
2948 return ast_for_flow_stmt(c, n);
2949 case import_stmt:
2950 return ast_for_import_stmt(c, n);
2951 case global_stmt:
2952 return ast_for_global_stmt(c, n);
2953 case exec_stmt:
2954 return ast_for_exec_stmt(c, n);
2955 case assert_stmt:
2956 return ast_for_assert_stmt(c, n);
2957 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002958 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2960 TYPE(n), NCH(n));
2961 return NULL;
2962 }
2963 }
2964 else {
2965 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
2966 | funcdef | classdef
2967 */
2968 node *ch = CHILD(n, 0);
2969 REQ(n, compound_stmt);
2970 switch (TYPE(ch)) {
2971 case if_stmt:
2972 return ast_for_if_stmt(c, ch);
2973 case while_stmt:
2974 return ast_for_while_stmt(c, ch);
2975 case for_stmt:
2976 return ast_for_for_stmt(c, ch);
2977 case try_stmt:
2978 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002979 case with_stmt:
2980 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 case funcdef:
2982 return ast_for_funcdef(c, ch);
2983 case classdef:
2984 return ast_for_classdef(c, ch);
2985 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002986 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2988 TYPE(n), NCH(n));
2989 return NULL;
2990 }
2991 }
2992}
2993
2994static PyObject *
2995parsenumber(const char *s)
2996{
2997 const char *end;
2998 long x;
2999 double dx;
3000#ifndef WITHOUT_COMPLEX
3001 Py_complex c;
3002 int imflag;
3003#endif
3004
3005 errno = 0;
3006 end = s + strlen(s) - 1;
3007#ifndef WITHOUT_COMPLEX
3008 imflag = *end == 'j' || *end == 'J';
3009#endif
3010 if (*end == 'l' || *end == 'L')
3011 return PyLong_FromString((char *)s, (char **)0, 0);
3012 if (s[0] == '0') {
3013 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3014 if (x < 0 && errno == 0) {
3015 return PyLong_FromString((char *)s,
3016 (char **)0,
3017 0);
3018 }
3019 }
3020 else
3021 x = PyOS_strtol((char *)s, (char **)&end, 0);
3022 if (*end == '\0') {
3023 if (errno != 0)
3024 return PyLong_FromString((char *)s, (char **)0, 0);
3025 return PyInt_FromLong(x);
3026 }
3027 /* XXX Huge floats may silently fail */
3028#ifndef WITHOUT_COMPLEX
3029 if (imflag) {
3030 c.real = 0.;
3031 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003032 c.imag = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 PyFPE_END_PROTECT(c)
3034 return PyComplex_FromCComplex(c);
3035 }
3036 else
3037#endif
3038 {
3039 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003040 dx = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 PyFPE_END_PROTECT(dx)
3042 return PyFloat_FromDouble(dx);
3043 }
3044}
3045
3046static PyObject *
3047decode_utf8(const char **sPtr, const char *end, char* encoding)
3048{
3049#ifndef Py_USING_UNICODE
3050 Py_FatalError("decode_utf8 should not be called in this build.");
3051 return NULL;
3052#else
3053 PyObject *u, *v;
3054 char *s, *t;
3055 t = s = (char *)*sPtr;
3056 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3057 while (s < end && (*s & 0x80)) s++;
3058 *sPtr = s;
3059 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3060 if (u == NULL)
3061 return NULL;
3062 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3063 Py_DECREF(u);
3064 return v;
3065#endif
3066}
3067
3068static PyObject *
3069decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3070{
3071 PyObject *v, *u;
3072 char *buf;
3073 char *p;
3074 const char *end;
3075 if (encoding == NULL) {
3076 buf = (char *)s;
3077 u = NULL;
3078 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3079 buf = (char *)s;
3080 u = NULL;
3081 } else {
3082 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3083 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3084 if (u == NULL)
3085 return NULL;
3086 p = buf = PyString_AsString(u);
3087 end = s + len;
3088 while (s < end) {
3089 if (*s == '\\') {
3090 *p++ = *s++;
3091 if (*s & 0x80) {
3092 strcpy(p, "u005c");
3093 p += 5;
3094 }
3095 }
3096 if (*s & 0x80) { /* XXX inefficient */
3097 PyObject *w;
3098 char *r;
Martin v. Löwis66851282006-04-22 11:40:03 +00003099 Py_ssize_t rn, i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 w = decode_utf8(&s, end, "utf-16-be");
3101 if (w == NULL) {
3102 Py_DECREF(u);
3103 return NULL;
3104 }
3105 r = PyString_AsString(w);
3106 rn = PyString_Size(w);
3107 assert(rn % 2 == 0);
3108 for (i = 0; i < rn; i += 2) {
3109 sprintf(p, "\\u%02x%02x",
3110 r[i + 0] & 0xFF,
3111 r[i + 1] & 0xFF);
3112 p += 6;
3113 }
3114 Py_DECREF(w);
3115 } else {
3116 *p++ = *s++;
3117 }
3118 }
3119 len = p - buf;
3120 s = buf;
3121 }
3122 if (rawmode)
3123 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3124 else
3125 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3126 Py_XDECREF(u);
3127 return v;
3128}
3129
3130/* s is a Python string literal, including the bracketing quote characters,
3131 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3132 * parsestr parses it, and returns the decoded Python string object.
3133 */
3134static PyObject *
3135parsestr(const char *s, const char *encoding)
3136{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137 size_t len;
Neal Norwitz30b5c5d2005-12-19 06:05:18 +00003138 int quote = Py_CHARMASK(*s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139 int rawmode = 0;
3140 int need_encoding;
3141 int unicode = 0;
3142
3143 if (isalpha(quote) || quote == '_') {
3144 if (quote == 'u' || quote == 'U') {
3145 quote = *++s;
3146 unicode = 1;
3147 }
3148 if (quote == 'r' || quote == 'R') {
3149 quote = *++s;
3150 rawmode = 1;
3151 }
3152 }
3153 if (quote != '\'' && quote != '\"') {
3154 PyErr_BadInternalCall();
3155 return NULL;
3156 }
3157 s++;
3158 len = strlen(s);
3159 if (len > INT_MAX) {
3160 PyErr_SetString(PyExc_OverflowError,
3161 "string to parse is too long");
3162 return NULL;
3163 }
3164 if (s[--len] != quote) {
3165 PyErr_BadInternalCall();
3166 return NULL;
3167 }
3168 if (len >= 4 && s[0] == quote && s[1] == quote) {
3169 s += 2;
3170 len -= 2;
3171 if (s[--len] != quote || s[--len] != quote) {
3172 PyErr_BadInternalCall();
3173 return NULL;
3174 }
3175 }
3176#ifdef Py_USING_UNICODE
3177 if (unicode || Py_UnicodeFlag) {
3178 return decode_unicode(s, len, rawmode, encoding);
3179 }
3180#endif
3181 need_encoding = (encoding != NULL &&
3182 strcmp(encoding, "utf-8") != 0 &&
3183 strcmp(encoding, "iso-8859-1") != 0);
3184 if (rawmode || strchr(s, '\\') == NULL) {
3185 if (need_encoding) {
3186#ifndef Py_USING_UNICODE
3187 /* This should not happen - we never see any other
3188 encoding. */
Jeremy Hylton2f327c12006-04-04 04:00:23 +00003189 Py_FatalError(
3190 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191#else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003192 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193 if (u == NULL)
3194 return NULL;
3195 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3196 Py_DECREF(u);
3197 return v;
3198#endif
3199 } else {
3200 return PyString_FromStringAndSize(s, len);
3201 }
3202 }
3203
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003204 return PyString_DecodeEscape(s, len, NULL, unicode,
3205 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206}
3207
3208/* Build a Python string object out of a STRING atom. This takes care of
3209 * compile-time literal catenation, calling parsestr() on each piece, and
3210 * pasting the intermediate results together.
3211 */
3212static PyObject *
3213parsestrplus(struct compiling *c, const node *n)
3214{
3215 PyObject *v;
3216 int i;
3217 REQ(CHILD(n, 0), STRING);
3218 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3219 /* String literal concatenation */
3220 for (i = 1; i < NCH(n); i++) {
3221 PyObject *s;
3222 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3223 if (s == NULL)
3224 goto onError;
3225 if (PyString_Check(v) && PyString_Check(s)) {
3226 PyString_ConcatAndDel(&v, s);
3227 if (v == NULL)
3228 goto onError;
3229 }
3230#ifdef Py_USING_UNICODE
3231 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003232 PyObject *temp = PyUnicode_Concat(v, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 Py_DECREF(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 Py_DECREF(v);
3235 v = temp;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003236 if (v == NULL)
3237 goto onError;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238 }
3239#endif
3240 }
3241 }
3242 return v;
3243
3244 onError:
3245 Py_XDECREF(v);
3246 return NULL;
3247}