blob: d00fcc8bdd0f681902502a4542dcb4c194faaabb [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;
390 case ListComp_kind:
391 expr_name = "list comprehension";
392 break;
393 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000394 case Num_kind:
395 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000396 expr_name = "literal";
397 break;
398 case Compare_kind:
399 expr_name = "comparison";
400 break;
401 case Repr_kind:
402 expr_name = "repr";
403 break;
Neal Norwitz373f0a72006-05-15 07:04:36 +0000404 case IfExp_kind:
405 expr_name = "conditional expression";
406 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000407 default:
408 PyErr_Format(PyExc_SystemError,
409 "unexpected expression in assignment %d (line %d)",
410 e->kind, e->lineno);
411 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000413 /* Check for error string set by switch */
414 if (expr_name) {
415 char buf[300];
416 PyOS_snprintf(buf, sizeof(buf),
417 "can't %s %s",
418 ctx == Store ? "assign to" : "delete",
419 expr_name);
420 return ast_error(n, buf);
421 }
422
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000424 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425 */
426 if (s) {
427 int i;
428
429 for (i = 0; i < asdl_seq_LEN(s); i++) {
Martin v. Löwis28457502006-04-11 09:17:27 +0000430 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 return 0;
432 }
433 }
434 return 1;
435}
436
437static operator_ty
438ast_for_augassign(const node *n)
439{
440 REQ(n, augassign);
441 n = CHILD(n, 0);
442 switch (STR(n)[0]) {
443 case '+':
444 return Add;
445 case '-':
446 return Sub;
447 case '/':
448 if (STR(n)[1] == '/')
449 return FloorDiv;
450 else
451 return Div;
452 case '%':
453 return Mod;
454 case '<':
455 return LShift;
456 case '>':
457 return RShift;
458 case '&':
459 return BitAnd;
460 case '^':
461 return BitXor;
462 case '|':
463 return BitOr;
464 case '*':
465 if (STR(n)[1] == '*')
466 return Pow;
467 else
468 return Mult;
469 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000470 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000471 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000472 }
473}
474
475static cmpop_ty
476ast_for_comp_op(const node *n)
477{
478 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
479 |'is' 'not'
480 */
481 REQ(n, comp_op);
482 if (NCH(n) == 1) {
483 n = CHILD(n, 0);
484 switch (TYPE(n)) {
485 case LESS:
486 return Lt;
487 case GREATER:
488 return Gt;
489 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490 return Eq;
491 case LESSEQUAL:
492 return LtE;
493 case GREATEREQUAL:
494 return GtE;
495 case NOTEQUAL:
496 return NotEq;
497 case NAME:
498 if (strcmp(STR(n), "in") == 0)
499 return In;
500 if (strcmp(STR(n), "is") == 0)
501 return Is;
502 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000503 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504 STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000505 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506 }
507 }
508 else if (NCH(n) == 2) {
509 /* handle "not in" and "is not" */
510 switch (TYPE(CHILD(n, 0))) {
511 case NAME:
512 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
513 return NotIn;
514 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
515 return IsNot;
516 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000517 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Martin v. Löwis28457502006-04-11 09:17:27 +0000519 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520 }
521 }
Neal Norwitz79792652005-11-14 04:25:03 +0000522 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000524 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525}
526
527static asdl_seq *
528seq_for_testlist(struct compiling *c, const node *n)
529{
530 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000531 asdl_seq *seq;
532 expr_ty expression;
533 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534 assert(TYPE(n) == testlist
535 || TYPE(n) == listmaker
536 || TYPE(n) == testlist_gexp
537 || TYPE(n) == testlist_safe
538 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000540 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 if (!seq)
542 return NULL;
543
544 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000545 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546
547 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000548 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550
551 assert(i / 2 < seq->size);
552 asdl_seq_SET(seq, i / 2, expression);
553 }
554 return seq;
555}
556
557static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000558compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559{
560 int i, len = (NCH(n) + 1) / 2;
561 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000562 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563 if (!args)
564 return NULL;
565
566 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 for (i = 0; i < len; i++) {
568 const node *child = CHILD(CHILD(n, 2*i), 0);
569 expr_ty arg;
570 if (TYPE(child) == NAME) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000571 if (!strcmp(STR(child), "None")) {
572 ast_error(child, "assignment to None");
573 return NULL;
574 }
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000575 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
576 child->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000577 }
578 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000579 arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1));
Jeremy Hyltona8293132006-02-28 17:58:27 +0000580 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 asdl_seq_SET(args, i, arg);
582 }
583
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000584 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000585 if (!set_context(result, Store, n))
586 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 return result;
588}
589
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590
Jeremy Hyltona8293132006-02-28 17:58:27 +0000591/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592
593static arguments_ty
594ast_for_arguments(struct compiling *c, const node *n)
595{
596 /* parameters: '(' [varargslist] ')'
597 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
598 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
599 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000600 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601 asdl_seq *args, *defaults;
602 identifier vararg = NULL, kwarg = NULL;
603 node *ch;
604
605 if (TYPE(n) == parameters) {
606 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000607 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608 n = CHILD(n, 1);
609 }
610 REQ(n, varargslist);
611
612 /* first count the number of normal args & defaults */
613 for (i = 0; i < NCH(n); i++) {
614 ch = CHILD(n, i);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000615 if (TYPE(ch) == fpdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616 n_args++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000617 if (TYPE(ch) == EQUAL)
618 n_defaults++;
619 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000620 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621 if (!args && n_args)
622 return NULL; /* Don't need to go to NULL; nothing allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000623 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624 if (!defaults && n_defaults)
625 goto error;
626
627 /* fpdef: NAME | '(' fplist ')'
628 fplist: fpdef (',' fpdef)* [',']
629 */
630 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000631 j = 0; /* index for defaults */
632 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633 while (i < NCH(n)) {
634 ch = CHILD(n, i);
635 switch (TYPE(ch)) {
636 case fpdef:
637 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
638 anything other than EQUAL or a comma? */
639 /* XXX Should NCH(n) check be made a separate check? */
640 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000641 asdl_seq_SET(defaults, j++,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000642 ast_for_expr(c, CHILD(n, i + 2)));
643 i += 2;
644 found_default = 1;
645 }
646 else if (found_default) {
647 ast_error(n,
648 "non-default argument follows default argument");
649 goto error;
650 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000651 if (NCH(ch) == 3) {
Neal Norwitz33b730e2006-03-27 08:58:23 +0000652 ch = CHILD(ch, 1);
653 /* def foo((x)): is not complex, special case. */
654 if (NCH(ch) != 1) {
655 /* We have complex arguments, setup for unpacking. */
656 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
657 } else {
658 /* def foo((x)): setup for checking NAME below. */
659 ch = CHILD(ch, 0);
660 }
661 }
662 if (TYPE(CHILD(ch, 0)) == NAME) {
Armin Rigo31441302005-10-21 12:57:31 +0000663 expr_ty name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000664 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
665 ast_error(CHILD(ch, 0), "assignment to None");
666 goto error;
667 }
Armin Rigo31441302005-10-21 12:57:31 +0000668 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000669 Param, LINENO(ch), ch->n_col_offset,
670 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000671 if (!name)
672 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000673 asdl_seq_SET(args, k++, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674
675 }
676 i += 2; /* the name and the comma */
677 break;
678 case STAR:
679 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
680 ast_error(CHILD(n, i+1), "assignment to None");
681 goto error;
682 }
683 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
684 i += 3;
685 break;
686 case DOUBLESTAR:
687 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
688 ast_error(CHILD(n, i+1), "assignment to None");
689 goto error;
690 }
691 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
692 i += 3;
693 break;
694 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000695 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000696 "unexpected node in varargslist: %d @ %d",
697 TYPE(ch), i);
698 goto error;
699 }
700 }
701
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000702 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703
704 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000705 Py_XDECREF(vararg);
706 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 return NULL;
708}
709
710static expr_ty
711ast_for_dotted_name(struct compiling *c, const node *n)
712{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000713 expr_ty e;
714 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000715 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 int i;
717
718 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000719
720 lineno = LINENO(n);
721 col_offset = n->n_col_offset;
722
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 id = NEW_IDENTIFIER(CHILD(n, 0));
724 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000725 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000726 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729
730 for (i = 2; i < NCH(n); i+=2) {
731 id = NEW_IDENTIFIER(CHILD(n, i));
732 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000733 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000734 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000735 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000736 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737 }
738
739 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740}
741
742static expr_ty
743ast_for_decorator(struct compiling *c, const node *n)
744{
745 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
746 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000747 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748
749 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000750 REQ(CHILD(n, 0), AT);
751 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752
753 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
754 if (!name_expr)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000755 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756
757 if (NCH(n) == 3) { /* No arguments */
758 d = name_expr;
759 name_expr = NULL;
760 }
761 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000762 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
763 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000765 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 name_expr = NULL;
767 }
768 else {
769 d = ast_for_call(c, CHILD(n, 3), name_expr);
770 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
775 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776}
777
778static asdl_seq*
779ast_for_decorators(struct compiling *c, const node *n)
780{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000781 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000782 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 int i;
784
785 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000786 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 if (!decorator_seq)
788 return NULL;
789
790 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000791 d = ast_for_decorator(c, CHILD(n, i));
792 if (!d)
793 return NULL;
794 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 }
796 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000797}
798
799static stmt_ty
800ast_for_funcdef(struct compiling *c, const node *n)
801{
802 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000803 identifier name;
804 arguments_ty args;
805 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 asdl_seq *decorator_seq = NULL;
807 int name_i;
808
809 REQ(n, funcdef);
810
811 if (NCH(n) == 6) { /* decorators are present */
812 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
813 if (!decorator_seq)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000814 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815 name_i = 2;
816 }
817 else {
818 name_i = 1;
819 }
820
821 name = NEW_IDENTIFIER(CHILD(n, name_i));
822 if (!name)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000823 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Neal Norwitze76adcd2005-11-15 05:04:31 +0000825 ast_error(CHILD(n, name_i), "assignment to None");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000826 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 }
828 args = ast_for_arguments(c, CHILD(n, name_i + 1));
829 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000830 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 body = ast_for_suite(c, CHILD(n, name_i + 3));
832 if (!body)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000833 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000835 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
836 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837}
838
839static expr_ty
840ast_for_lambdef(struct compiling *c, const node *n)
841{
842 /* lambdef: 'lambda' [varargslist] ':' test */
843 arguments_ty args;
844 expr_ty expression;
845
846 if (NCH(n) == 3) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000847 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 if (!args)
849 return NULL;
850 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000851 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 }
854 else {
855 args = ast_for_arguments(c, CHILD(n, 1));
856 if (!args)
857 return NULL;
858 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000859 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861 }
862
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000863 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864}
865
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000866static expr_ty
867ast_for_ifexpr(struct compiling *c, const node *n)
868{
869 /* test: or_test 'if' or_test 'else' test */
870 expr_ty expression, body, orelse;
871
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000872 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000873 body = ast_for_expr(c, CHILD(n, 0));
874 if (!body)
875 return NULL;
876 expression = ast_for_expr(c, CHILD(n, 2));
877 if (!expression)
878 return NULL;
879 orelse = ast_for_expr(c, CHILD(n, 4));
880 if (!orelse)
881 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000882 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
883 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000884}
885
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886/* Count the number of 'for' loop in a list comprehension.
887
888 Helper for ast_for_listcomp().
889*/
890
891static int
892count_list_fors(const node *n)
893{
894 int n_fors = 0;
895 node *ch = CHILD(n, 1);
896
897 count_list_for:
898 n_fors++;
899 REQ(ch, list_for);
900 if (NCH(ch) == 5)
901 ch = CHILD(ch, 4);
902 else
903 return n_fors;
904 count_list_iter:
905 REQ(ch, list_iter);
906 ch = CHILD(ch, 0);
907 if (TYPE(ch) == list_for)
908 goto count_list_for;
909 else if (TYPE(ch) == list_if) {
910 if (NCH(ch) == 3) {
911 ch = CHILD(ch, 2);
912 goto count_list_iter;
913 }
914 else
915 return n_fors;
916 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000917
918 /* Should never be reached */
919 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
920 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921}
922
923/* Count the number of 'if' statements in a list comprehension.
924
925 Helper for ast_for_listcomp().
926*/
927
928static int
929count_list_ifs(const node *n)
930{
931 int n_ifs = 0;
932
933 count_list_iter:
934 REQ(n, list_iter);
935 if (TYPE(CHILD(n, 0)) == list_for)
936 return n_ifs;
937 n = CHILD(n, 0);
938 REQ(n, list_if);
939 n_ifs++;
940 if (NCH(n) == 2)
941 return n_ifs;
942 n = CHILD(n, 2);
943 goto count_list_iter;
944}
945
946static expr_ty
947ast_for_listcomp(struct compiling *c, const node *n)
948{
949 /* listmaker: test ( list_for | (',' test)* [','] )
950 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
951 list_iter: list_for | list_if
952 list_if: 'if' test [list_iter]
953 testlist_safe: test [(',' test)+ [',']]
954 */
955 expr_ty elt;
956 asdl_seq *listcomps;
957 int i, n_fors;
958 node *ch;
959
960 REQ(n, listmaker);
961 assert(NCH(n) > 1);
962
963 elt = ast_for_expr(c, CHILD(n, 0));
964 if (!elt)
965 return NULL;
966
967 n_fors = count_list_fors(n);
968 if (n_fors == -1)
969 return NULL;
970
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000971 listcomps = asdl_seq_new(n_fors, c->c_arena);
972 if (!listcomps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000974
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 ch = CHILD(n, 1);
976 for (i = 0; i < n_fors; i++) {
977 comprehension_ty lc;
978 asdl_seq *t;
979 expr_ty expression;
980
981 REQ(ch, list_for);
982
983 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000984 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000986 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000987 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000990 if (asdl_seq_LEN(t) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +0000991 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000992 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000994 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
995 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000996 expression, NULL, c->c_arena);
997 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999
1000 if (NCH(ch) == 5) {
1001 int j, n_ifs;
1002 asdl_seq *ifs;
1003
1004 ch = CHILD(ch, 4);
1005 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001006 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001009 ifs = asdl_seq_new(n_ifs, c->c_arena);
1010 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012
1013 for (j = 0; j < n_ifs; j++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001014 REQ(ch, list_iter);
1015 ch = CHILD(ch, 0);
1016 REQ(ch, list_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017
Jeremy Hyltona8293132006-02-28 17:58:27 +00001018 asdl_seq_SET(ifs, j, ast_for_expr(c, CHILD(ch, 1)));
1019 if (NCH(ch) == 3)
1020 ch = CHILD(ch, 2);
1021 }
1022 /* on exit, must guarantee that ch is a list_for */
1023 if (TYPE(ch) == list_iter)
1024 ch = CHILD(ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 lc->ifs = ifs;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001026 }
1027 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001028 }
1029
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001030 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031}
1032
1033/*
1034 Count the number of 'for' loops in a generator expression.
1035
1036 Helper for ast_for_genexp().
1037*/
1038
1039static int
1040count_gen_fors(const node *n)
1041{
1042 int n_fors = 0;
1043 node *ch = CHILD(n, 1);
1044
1045 count_gen_for:
1046 n_fors++;
1047 REQ(ch, gen_for);
1048 if (NCH(ch) == 5)
1049 ch = CHILD(ch, 4);
1050 else
1051 return n_fors;
1052 count_gen_iter:
1053 REQ(ch, gen_iter);
1054 ch = CHILD(ch, 0);
1055 if (TYPE(ch) == gen_for)
1056 goto count_gen_for;
1057 else if (TYPE(ch) == gen_if) {
1058 if (NCH(ch) == 3) {
1059 ch = CHILD(ch, 2);
1060 goto count_gen_iter;
1061 }
1062 else
1063 return n_fors;
1064 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001065
1066 /* Should never be reached */
1067 PyErr_SetString(PyExc_SystemError,
1068 "logic error in count_gen_fors");
1069 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070}
1071
1072/* Count the number of 'if' statements in a generator expression.
1073
1074 Helper for ast_for_genexp().
1075*/
1076
1077static int
1078count_gen_ifs(const node *n)
1079{
1080 int n_ifs = 0;
1081
1082 while (1) {
1083 REQ(n, gen_iter);
1084 if (TYPE(CHILD(n, 0)) == gen_for)
1085 return n_ifs;
1086 n = CHILD(n, 0);
1087 REQ(n, gen_if);
1088 n_ifs++;
1089 if (NCH(n) == 2)
1090 return n_ifs;
1091 n = CHILD(n, 2);
1092 }
1093}
1094
Jeremy Hyltona8293132006-02-28 17:58:27 +00001095/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096static expr_ty
1097ast_for_genexp(struct compiling *c, const node *n)
1098{
1099 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1100 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1101 expr_ty elt;
1102 asdl_seq *genexps;
1103 int i, n_fors;
1104 node *ch;
1105
1106 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1107 assert(NCH(n) > 1);
1108
1109 elt = ast_for_expr(c, CHILD(n, 0));
1110 if (!elt)
1111 return NULL;
1112
1113 n_fors = count_gen_fors(n);
1114 if (n_fors == -1)
1115 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001116
1117 genexps = asdl_seq_new(n_fors, c->c_arena);
1118 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001120
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121 ch = CHILD(n, 1);
1122 for (i = 0; i < n_fors; i++) {
1123 comprehension_ty ge;
1124 asdl_seq *t;
1125 expr_ty expression;
1126
1127 REQ(ch, gen_for);
1128
1129 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001130 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001132 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001133 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001135
1136 if (asdl_seq_LEN(t) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001137 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001138 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001140 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1141 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001142 expression, NULL, c->c_arena);
1143
1144 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001146
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 if (NCH(ch) == 5) {
1148 int j, n_ifs;
1149 asdl_seq *ifs;
1150
1151 ch = CHILD(ch, 4);
1152 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001153 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001155
1156 ifs = asdl_seq_new(n_ifs, c->c_arena);
1157 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 for (j = 0; j < n_ifs; j++) {
1161 REQ(ch, gen_iter);
1162 ch = CHILD(ch, 0);
1163 REQ(ch, gen_if);
1164
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001165 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001166 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001167 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001168 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 if (NCH(ch) == 3)
1170 ch = CHILD(ch, 2);
1171 }
1172 /* on exit, must guarantee that ch is a gen_for */
1173 if (TYPE(ch) == gen_iter)
1174 ch = CHILD(ch, 0);
1175 ge->ifs = ifs;
1176 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00001177 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 }
1179
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001180 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181}
1182
1183static expr_ty
1184ast_for_atom(struct compiling *c, const node *n)
1185{
1186 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1187 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1188 */
1189 node *ch = CHILD(n, 0);
1190
1191 switch (TYPE(ch)) {
1192 case NAME:
1193 /* All names start in Load context, but may later be
1194 changed. */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001195 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 case STRING: {
1197 PyObject *str = parsestrplus(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 if (!str)
1199 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200
1201 PyArena_AddPyObject(c->c_arena, str);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001202 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 }
1204 case NUMBER: {
1205 PyObject *pynum = parsenumber(STR(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 if (!pynum)
1207 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001208
1209 PyArena_AddPyObject(c->c_arena, pynum);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001210 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 }
1212 case LPAR: /* some parenthesized expressions */
1213 ch = CHILD(n, 1);
1214
1215 if (TYPE(ch) == RPAR)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001216 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217
1218 if (TYPE(ch) == yield_expr)
1219 return ast_for_expr(c, ch);
1220
1221 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1222 return ast_for_genexp(c, ch);
1223
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001224 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 case LSQB: /* list (or list comprehension) */
1226 ch = CHILD(n, 1);
1227
1228 if (TYPE(ch) == RSQB)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001229 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230
1231 REQ(ch, listmaker);
1232 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1233 asdl_seq *elts = seq_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 if (!elts)
1235 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001236
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001237 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238 }
1239 else
1240 return ast_for_listcomp(c, ch);
1241 case LBRACE: {
1242 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1243 int i, size;
1244 asdl_seq *keys, *values;
1245
1246 ch = CHILD(n, 1);
1247 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001248 keys = asdl_seq_new(size, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249 if (!keys)
1250 return NULL;
1251
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001252 values = asdl_seq_new(size, c->c_arena);
1253 if (!values)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255
1256 for (i = 0; i < NCH(ch); i += 4) {
1257 expr_ty expression;
1258
1259 expression = ast_for_expr(c, CHILD(ch, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001260 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001262
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001264
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 expression = ast_for_expr(c, CHILD(ch, i + 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001266 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001268
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 asdl_seq_SET(values, i / 4, expression);
1270 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001271 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 }
1273 case BACKQUOTE: { /* repr */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001274 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 if (!expression)
1276 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001277
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001278 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279 }
1280 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001281 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001282 return NULL;
1283 }
1284}
1285
1286static slice_ty
1287ast_for_slice(struct compiling *c, const node *n)
1288{
1289 node *ch;
1290 expr_ty lower = NULL, upper = NULL, step = NULL;
1291
1292 REQ(n, subscript);
1293
1294 /*
1295 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1296 sliceop: ':' [test]
1297 */
1298 ch = CHILD(n, 0);
1299 if (TYPE(ch) == DOT)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001300 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301
1302 if (NCH(n) == 1 && TYPE(ch) == test) {
1303 /* 'step' variable hold no significance in terms of being used over
1304 other vars */
1305 step = ast_for_expr(c, ch);
1306 if (!step)
1307 return NULL;
1308
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001309 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 }
1311
1312 if (TYPE(ch) == test) {
1313 lower = ast_for_expr(c, ch);
1314 if (!lower)
1315 return NULL;
1316 }
1317
1318 /* If there's an upper bound it's in the second or third position. */
1319 if (TYPE(ch) == COLON) {
1320 if (NCH(n) > 1) {
1321 node *n2 = CHILD(n, 1);
1322
1323 if (TYPE(n2) == test) {
1324 upper = ast_for_expr(c, n2);
1325 if (!upper)
1326 return NULL;
1327 }
1328 }
1329 } else if (NCH(n) > 2) {
1330 node *n2 = CHILD(n, 2);
1331
1332 if (TYPE(n2) == test) {
1333 upper = ast_for_expr(c, n2);
1334 if (!upper)
1335 return NULL;
1336 }
1337 }
1338
1339 ch = CHILD(n, NCH(n) - 1);
1340 if (TYPE(ch) == sliceop) {
Nick Coghlan77858682006-03-17 17:59:10 +00001341 if (NCH(ch) == 1) {
1342 /* No expression, so step is None */
1343 ch = CHILD(ch, 0);
1344 step = Name(new_identifier("None", c->c_arena), Load,
1345 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346 if (!step)
1347 return NULL;
Nick Coghlan77858682006-03-17 17:59:10 +00001348 } else {
1349 ch = CHILD(ch, 1);
1350 if (TYPE(ch) == test) {
1351 step = ast_for_expr(c, ch);
1352 if (!step)
1353 return NULL;
1354 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 }
1356 }
1357
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001358 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359}
1360
1361static expr_ty
1362ast_for_binop(struct compiling *c, const node *n)
1363{
1364 /* Must account for a sequence of expressions.
1365 How should A op B op C by represented?
1366 BinOp(BinOp(A, op, B), op, C).
1367 */
1368
1369 int i, nops;
1370 expr_ty expr1, expr2, result;
Anthony Baxtera863d332006-04-11 07:43:46 +00001371 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372
1373 expr1 = ast_for_expr(c, CHILD(n, 0));
1374 if (!expr1)
1375 return NULL;
1376
1377 expr2 = ast_for_expr(c, CHILD(n, 2));
1378 if (!expr2)
1379 return NULL;
1380
Anthony Baxtera863d332006-04-11 07:43:46 +00001381 newoperator = get_operator(CHILD(n, 1));
1382 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 return NULL;
1384
Anthony Baxtera863d332006-04-11 07:43:46 +00001385 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001386 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 if (!result)
1388 return NULL;
1389
1390 nops = (NCH(n) - 1) / 2;
1391 for (i = 1; i < nops; i++) {
1392 expr_ty tmp_result, tmp;
1393 const node* next_oper = CHILD(n, i * 2 + 1);
1394
Anthony Baxtera863d332006-04-11 07:43:46 +00001395 newoperator = get_operator(next_oper);
1396 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 return NULL;
1398
1399 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1400 if (!tmp)
1401 return NULL;
1402
Anthony Baxtera863d332006-04-11 07:43:46 +00001403 tmp_result = BinOp(result, newoperator, tmp,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001404 LINENO(next_oper), next_oper->n_col_offset,
1405 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406 if (!tmp)
1407 return NULL;
1408 result = tmp_result;
1409 }
1410 return result;
1411}
1412
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001413static expr_ty
1414ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1415{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001416 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1417 subscriptlist: subscript (',' subscript)* [',']
1418 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1419 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001420 REQ(n, trailer);
1421 if (TYPE(CHILD(n, 0)) == LPAR) {
1422 if (NCH(n) == 2)
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001423 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1424 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001425 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001426 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001427 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001428 else if (TYPE(CHILD(n, 0)) == DOT ) {
1429 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001430 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001431 }
1432 else {
1433 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001434 REQ(CHILD(n, 2), RSQB);
1435 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001436 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001437 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1438 if (!slc)
1439 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001440 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1441 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001442 }
1443 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001444 /* The grammar is ambiguous here. The ambiguity is resolved
1445 by treating the sequence as a tuple literal if there are
1446 no slice features.
1447 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001448 int j;
1449 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001450 expr_ty e;
Thomas Wouters65b3dab2006-03-01 22:06:23 +00001451 bool simple = true;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001452 asdl_seq *slices, *elts;
1453 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001454 if (!slices)
1455 return NULL;
1456 for (j = 0; j < NCH(n); j += 2) {
1457 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001458 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001459 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001460 if (slc->kind != Index_kind)
1461 simple = false;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001462 asdl_seq_SET(slices, j / 2, slc);
1463 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001464 if (!simple) {
1465 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001466 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001467 }
1468 /* extract Index values and put them in a Tuple */
1469 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001470 if (!elts)
1471 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001472 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1473 slc = (slice_ty)asdl_seq_GET(slices, j);
1474 assert(slc->kind == Index_kind && slc->v.Index.value);
1475 asdl_seq_SET(elts, j, slc->v.Index.value);
1476 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001477 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001478 if (!e)
1479 return NULL;
1480 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001481 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001482 }
1483 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001484}
1485
1486static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001487ast_for_factor(struct compiling *c, const node *n)
1488{
1489 node *pfactor, *ppower, *patom, *pnum;
1490 expr_ty expression;
1491
1492 /* If the unary - operator is applied to a constant, don't generate
1493 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1494 constant. The peephole optimizer already does something like
1495 this but it doesn't handle the case where the constant is
1496 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1497 PyLongObject.
1498 */
1499 if (TYPE(CHILD(n, 0)) == MINUS
1500 && NCH(n) == 2
1501 && TYPE((pfactor = CHILD(n, 1))) == factor
1502 && NCH(pfactor) == 1
1503 && TYPE((ppower = CHILD(pfactor, 0))) == power
1504 && NCH(ppower) == 1
1505 && TYPE((patom = CHILD(ppower, 0))) == atom
1506 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1507 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1508 if (s == NULL)
1509 return NULL;
1510 s[0] = '-';
1511 strcpy(s + 1, STR(pnum));
1512 PyObject_FREE(STR(pnum));
1513 STR(pnum) = s;
1514 return ast_for_atom(c, patom);
1515 }
1516
1517 expression = ast_for_expr(c, CHILD(n, 1));
1518 if (!expression)
1519 return NULL;
1520
1521 switch (TYPE(CHILD(n, 0))) {
1522 case PLUS:
1523 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1524 c->c_arena);
1525 case MINUS:
1526 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1527 c->c_arena);
1528 case TILDE:
1529 return UnaryOp(Invert, expression, LINENO(n),
1530 n->n_col_offset, c->c_arena);
1531 }
1532 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1533 TYPE(CHILD(n, 0)));
1534 return NULL;
1535}
1536
1537static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001538ast_for_power(struct compiling *c, const node *n)
1539{
1540 /* power: atom trailer* ('**' factor)*
1541 */
1542 int i;
1543 expr_ty e, tmp;
1544 REQ(n, power);
1545 e = ast_for_atom(c, CHILD(n, 0));
1546 if (!e)
1547 return NULL;
1548 if (NCH(n) == 1)
1549 return e;
1550 for (i = 1; i < NCH(n); i++) {
1551 node *ch = CHILD(n, i);
1552 if (TYPE(ch) != trailer)
1553 break;
1554 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001555 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001556 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001557 tmp->lineno = e->lineno;
1558 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001559 e = tmp;
1560 }
1561 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1562 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001563 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001564 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001565 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001566 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001567 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001568 e = tmp;
1569 }
1570 return e;
1571}
1572
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573/* Do not name a variable 'expr'! Will cause a compile error.
1574*/
1575
1576static expr_ty
1577ast_for_expr(struct compiling *c, const node *n)
1578{
1579 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001580 test: or_test ['if' or_test 'else' test] | lambdef
1581 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582 and_test: not_test ('and' not_test)*
1583 not_test: 'not' not_test | comparison
1584 comparison: expr (comp_op expr)*
1585 expr: xor_expr ('|' xor_expr)*
1586 xor_expr: and_expr ('^' and_expr)*
1587 and_expr: shift_expr ('&' shift_expr)*
1588 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1589 arith_expr: term (('+'|'-') term)*
1590 term: factor (('*'|'/'|'%'|'//') factor)*
1591 factor: ('+'|'-'|'~') factor | power
1592 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001593
1594 As well as modified versions that exist for backward compatibility,
1595 to explicitly allow:
1596 [ x for x in lambda: 0, lambda: 1 ]
1597 (which would be ambiguous without these extra rules)
1598
1599 old_test: or_test | old_lambdef
1600 old_lambdef: 'lambda' [vararglist] ':' old_test
1601
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602 */
1603
1604 asdl_seq *seq;
1605 int i;
1606
1607 loop:
1608 switch (TYPE(n)) {
1609 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001610 case old_test:
1611 if (TYPE(CHILD(n, 0)) == lambdef ||
1612 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001614 else if (NCH(n) > 1)
1615 return ast_for_ifexpr(c, n);
1616 /* Fallthrough */
1617 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618 case and_test:
1619 if (NCH(n) == 1) {
1620 n = CHILD(n, 0);
1621 goto loop;
1622 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001623 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624 if (!seq)
1625 return NULL;
1626 for (i = 0; i < NCH(n); i += 2) {
1627 expr_ty e = ast_for_expr(c, CHILD(n, i));
1628 if (!e)
1629 return NULL;
1630 asdl_seq_SET(seq, i / 2, e);
1631 }
1632 if (!strcmp(STR(CHILD(n, 1)), "and"))
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001633 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1634 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001635 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001636 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637 case not_test:
1638 if (NCH(n) == 1) {
1639 n = CHILD(n, 0);
1640 goto loop;
1641 }
1642 else {
1643 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1644 if (!expression)
1645 return NULL;
1646
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001647 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1648 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649 }
1650 case comparison:
1651 if (NCH(n) == 1) {
1652 n = CHILD(n, 0);
1653 goto loop;
1654 }
1655 else {
1656 expr_ty expression;
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001657 asdl_int_seq *ops;
1658 asdl_seq *cmps;
1659 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 if (!ops)
1661 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001662 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664 return NULL;
1665 }
1666 for (i = 1; i < NCH(n); i += 2) {
Anthony Baxtera863d332006-04-11 07:43:46 +00001667 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668
Anthony Baxtera863d332006-04-11 07:43:46 +00001669 newoperator = ast_for_comp_op(CHILD(n, i));
1670 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673
1674 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001675 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001677 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001679 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001680 asdl_seq_SET(cmps, i / 2, expression);
1681 }
1682 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001683 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001685 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001687 return Compare(expression, ops, cmps, LINENO(n),
1688 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689 }
1690 break;
1691
1692 /* The next five cases all handle BinOps. The main body of code
1693 is the same in each case, but the switch turned inside out to
1694 reuse the code for each type of operator.
1695 */
1696 case expr:
1697 case xor_expr:
1698 case and_expr:
1699 case shift_expr:
1700 case arith_expr:
1701 case term:
1702 if (NCH(n) == 1) {
1703 n = CHILD(n, 0);
1704 goto loop;
1705 }
1706 return ast_for_binop(c, n);
1707 case yield_expr: {
1708 expr_ty exp = NULL;
1709 if (NCH(n) == 2) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001710 exp = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711 if (!exp)
1712 return NULL;
1713 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001714 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001716 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 if (NCH(n) == 1) {
1718 n = CHILD(n, 0);
1719 goto loop;
1720 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001721 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001722 case power:
1723 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001725 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 return NULL;
1727 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001728 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 return NULL;
1730}
1731
1732static expr_ty
1733ast_for_call(struct compiling *c, const node *n, expr_ty func)
1734{
1735 /*
1736 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1737 | '**' test)
1738 argument: [test '='] test [gen_for] # Really [keyword '='] test
1739 */
1740
1741 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001742 asdl_seq *args;
1743 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001744 expr_ty vararg = NULL, kwarg = NULL;
1745
1746 REQ(n, arglist);
1747
1748 nargs = 0;
1749 nkeywords = 0;
1750 ngens = 0;
1751 for (i = 0; i < NCH(n); i++) {
1752 node *ch = CHILD(n, i);
1753 if (TYPE(ch) == argument) {
1754 if (NCH(ch) == 1)
1755 nargs++;
1756 else if (TYPE(CHILD(ch, 1)) == gen_for)
1757 ngens++;
1758 else
1759 nkeywords++;
1760 }
1761 }
1762 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001763 ast_error(n, "Generator expression must be parenthesized "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764 "if not sole argument");
1765 return NULL;
1766 }
1767
1768 if (nargs + nkeywords + ngens > 255) {
1769 ast_error(n, "more than 255 arguments");
1770 return NULL;
1771 }
1772
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001773 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001775 return NULL;
1776 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001778 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779 nargs = 0;
1780 nkeywords = 0;
1781 for (i = 0; i < NCH(n); i++) {
1782 node *ch = CHILD(n, i);
1783 if (TYPE(ch) == argument) {
1784 expr_ty e;
1785 if (NCH(ch) == 1) {
Neal Norwitz5ef92242006-05-19 06:43:50 +00001786 if (nkeywords) {
1787 ast_error(CHILD(ch, 0),
1788 "non-keyword arg after keyword arg");
1789 return NULL;
1790 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 e = ast_for_expr(c, CHILD(ch, 0));
1792 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001793 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 asdl_seq_SET(args, nargs++, e);
1795 }
1796 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1797 e = ast_for_genexp(c, ch);
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 {
1803 keyword_ty kw;
1804 identifier key;
1805
1806 /* CHILD(ch, 0) is test, but must be an identifier? */
1807 e = ast_for_expr(c, CHILD(ch, 0));
1808 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 /* f(lambda x: x[0] = 3) ends up getting parsed with
1811 * LHS test = lambda x: x[0], and RHS test = 3.
1812 * SF bug 132313 points out that complaining about a keyword
1813 * then is very confusing.
1814 */
1815 if (e->kind == Lambda_kind) {
1816 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001817 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818 } else if (e->kind != Name_kind) {
1819 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 }
1822 key = e->v.Name.id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 e = ast_for_expr(c, CHILD(ch, 2));
1824 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001825 return NULL;
1826 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001828 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 asdl_seq_SET(keywords, nkeywords++, kw);
1830 }
1831 }
1832 else if (TYPE(ch) == STAR) {
1833 vararg = ast_for_expr(c, CHILD(n, i+1));
1834 i++;
1835 }
1836 else if (TYPE(ch) == DOUBLESTAR) {
1837 kwarg = ast_for_expr(c, CHILD(n, i+1));
1838 i++;
1839 }
1840 }
1841
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001842 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843}
1844
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001846ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001848 /* testlist_gexp: test (',' test)* [','] */
1849 /* testlist: test (',' test)* [','] */
1850 /* testlist_safe: test (',' test)+ [','] */
1851 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001852 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001853 if (TYPE(n) == testlist_gexp) {
1854 if (NCH(n) > 1)
1855 assert(TYPE(CHILD(n, 1)) != gen_for);
1856 }
1857 else {
1858 assert(TYPE(n) == testlist ||
1859 TYPE(n) == testlist_safe ||
1860 TYPE(n) == testlist1);
1861 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 if (NCH(n) == 1)
1863 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864 else {
1865 asdl_seq *tmp = seq_for_testlist(c, n);
1866 if (!tmp)
1867 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001868 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001870}
1871
1872static expr_ty
1873ast_for_testlist_gexp(struct compiling *c, const node* n)
1874{
1875 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1876 /* argument: test [ gen_for ] */
1877 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001878 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001879 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001880 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001881}
1882
1883/* like ast_for_testlist() but returns a sequence */
1884static asdl_seq*
1885ast_for_class_bases(struct compiling *c, const node* n)
1886{
1887 /* testlist: test (',' test)* [','] */
1888 assert(NCH(n) > 0);
1889 REQ(n, testlist);
1890 if (NCH(n) == 1) {
1891 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001892 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001893 if (!bases)
1894 return NULL;
1895 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001896 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001897 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001898 asdl_seq_SET(bases, 0, base);
1899 return bases;
1900 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001901
1902 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903}
1904
1905static stmt_ty
1906ast_for_expr_stmt(struct compiling *c, const node *n)
1907{
1908 REQ(n, expr_stmt);
1909 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1910 | ('=' (yield_expr|testlist))*)
1911 testlist: test (',' test)* [',']
1912 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
1913 | '<<=' | '>>=' | '**=' | '//='
1914 test: ... here starts the operator precendence dance
1915 */
1916
1917 if (NCH(n) == 1) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001918 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 if (!e)
1920 return NULL;
1921
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001922 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923 }
1924 else if (TYPE(CHILD(n, 1)) == augassign) {
1925 expr_ty expr1, expr2;
Anthony Baxtera863d332006-04-11 07:43:46 +00001926 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 node *ch = CHILD(n, 0);
1928
1929 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001930 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 else
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001932 expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch), n->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001933 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934
1935 if (!expr1)
1936 return NULL;
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001937 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001938 switch (expr1->kind) {
1939 case GeneratorExp_kind:
1940 ast_error(ch, "augmented assignment to generator "
1941 "expression not possible");
1942 return NULL;
1943 case Name_kind: {
1944 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1945 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1946 ast_error(ch, "assignment to None");
1947 return NULL;
1948 }
1949 break;
1950 }
1951 case Attribute_kind:
1952 case Subscript_kind:
1953 break;
1954 default:
1955 ast_error(ch, "illegal expression for augmented "
1956 "assignment");
1957 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 }
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001959 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960
1961 ch = CHILD(n, 2);
1962 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001963 expr2 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 else
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001965 expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), ch->n_col_offset, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001966 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 return NULL;
1968
Anthony Baxtera863d332006-04-11 07:43:46 +00001969 newoperator = ast_for_augassign(CHILD(n, 1));
1970 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 return NULL;
1972
Anthony Baxtera863d332006-04-11 07:43:46 +00001973 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 }
1975 else {
1976 int i;
1977 asdl_seq *targets;
1978 node *value;
1979 expr_ty expression;
1980
1981 /* a normal assignment */
1982 REQ(CHILD(n, 1), EQUAL);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001983 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 if (!targets)
1985 return NULL;
1986 for (i = 0; i < NCH(n) - 2; i += 2) {
Armin Rigo31441302005-10-21 12:57:31 +00001987 expr_ty e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 node *ch = CHILD(n, i);
1989 if (TYPE(ch) == yield_expr) {
1990 ast_error(ch, "assignment to yield expression not possible");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001991 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001993 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994
1995 /* set context to assign */
1996 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001997 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998
Neal Norwitz84456bd2005-12-18 03:16:20 +00001999 if (!set_context(e, Store, CHILD(n, i)))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002000 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001
2002 asdl_seq_SET(targets, i / 2, e);
2003 }
2004 value = CHILD(n, NCH(n) - 1);
2005 if (TYPE(value) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002006 expression = ast_for_testlist(c, value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 else
2008 expression = ast_for_expr(c, value);
2009 if (!expression)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002010 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002011 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013}
2014
2015static stmt_ty
2016ast_for_print_stmt(struct compiling *c, const node *n)
2017{
2018 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2019 | '>>' test [ (',' test)+ [','] ] )
2020 */
2021 expr_ty dest = NULL, expression;
2022 asdl_seq *seq;
2023 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002024 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025
2026 REQ(n, print_stmt);
2027 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2028 dest = ast_for_expr(c, CHILD(n, 2));
2029 if (!dest)
2030 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002031 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002033 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 if (!seq)
Jeremy Hyltona8293132006-02-28 17:58:27 +00002035 return NULL;
2036 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002038 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002040 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041 }
2042 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002043 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044}
2045
2046static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002047ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048{
2049 asdl_seq *seq;
2050 int i;
2051 expr_ty e;
2052
2053 REQ(n, exprlist);
2054
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002055 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056 if (!seq)
2057 return NULL;
2058 for (i = 0; i < NCH(n); i += 2) {
2059 e = ast_for_expr(c, CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002060 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002061 return NULL;
Neal Norwitz6b347892005-11-15 07:17:53 +00002062 asdl_seq_SET(seq, i / 2, e);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002063 if (context && !set_context(e, context, CHILD(n, i)))
2064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 }
2066 return seq;
2067}
2068
2069static stmt_ty
2070ast_for_del_stmt(struct compiling *c, const node *n)
2071{
2072 asdl_seq *expr_list;
2073
2074 /* del_stmt: 'del' exprlist */
2075 REQ(n, del_stmt);
2076
2077 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2078 if (!expr_list)
2079 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002080 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081}
2082
2083static stmt_ty
2084ast_for_flow_stmt(struct compiling *c, const node *n)
2085{
2086 /*
2087 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2088 | yield_stmt
2089 break_stmt: 'break'
2090 continue_stmt: 'continue'
2091 return_stmt: 'return' [testlist]
2092 yield_stmt: yield_expr
2093 yield_expr: 'yield' testlist
2094 raise_stmt: 'raise' [test [',' test [',' test]]]
2095 */
2096 node *ch;
2097
2098 REQ(n, flow_stmt);
2099 ch = CHILD(n, 0);
2100 switch (TYPE(ch)) {
2101 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002102 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002104 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002105 case yield_stmt: { /* will reduce to yield_expr */
2106 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2107 if (!exp)
2108 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002109 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110 }
2111 case return_stmt:
2112 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002113 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002115 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 if (!expression)
2117 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002118 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119 }
2120 case raise_stmt:
2121 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002122 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 else if (NCH(ch) == 2) {
2124 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2125 if (!expression)
2126 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002127 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128 }
2129 else if (NCH(ch) == 4) {
2130 expr_ty expr1, expr2;
2131
2132 expr1 = ast_for_expr(c, CHILD(ch, 1));
2133 if (!expr1)
2134 return NULL;
2135 expr2 = ast_for_expr(c, CHILD(ch, 3));
2136 if (!expr2)
2137 return NULL;
2138
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002139 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 }
2141 else if (NCH(ch) == 6) {
2142 expr_ty expr1, expr2, expr3;
2143
2144 expr1 = ast_for_expr(c, CHILD(ch, 1));
2145 if (!expr1)
2146 return NULL;
2147 expr2 = ast_for_expr(c, CHILD(ch, 3));
2148 if (!expr2)
2149 return NULL;
2150 expr3 = ast_for_expr(c, CHILD(ch, 5));
2151 if (!expr3)
2152 return NULL;
2153
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002154 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 }
2156 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002157 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 "unexpected flow_stmt: %d", TYPE(ch));
2159 return NULL;
2160 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002161
2162 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2163 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002164}
2165
2166static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002167alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168{
2169 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002170 import_as_name: NAME ['as' NAME]
2171 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 dotted_name: NAME ('.' NAME)*
2173 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002174 PyObject *str;
2175
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176 loop:
2177 switch (TYPE(n)) {
2178 case import_as_name:
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002179 str = NULL;
2180 if (NCH(n) == 3) {
2181 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2182 ast_error(n, "must use 'as' in import");
2183 return NULL;
2184 }
2185 str = NEW_IDENTIFIER(CHILD(n, 2));
2186 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002187 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 case dotted_as_name:
2189 if (NCH(n) == 1) {
2190 n = CHILD(n, 0);
2191 goto loop;
2192 }
2193 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002194 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002195 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2196 ast_error(n, "must use 'as' in import");
2197 return NULL;
2198 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199 assert(!a->asname);
2200 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2201 return a;
2202 }
2203 break;
2204 case dotted_name:
2205 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002206 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 else {
2208 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002209 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002210 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211 char *s;
2212
2213 len = 0;
2214 for (i = 0; i < NCH(n); i += 2)
2215 /* length of string plus one for the dot */
2216 len += strlen(STR(CHILD(n, i))) + 1;
2217 len--; /* the last name doesn't have a dot */
2218 str = PyString_FromStringAndSize(NULL, len);
2219 if (!str)
2220 return NULL;
2221 s = PyString_AS_STRING(str);
2222 if (!s)
2223 return NULL;
2224 for (i = 0; i < NCH(n); i += 2) {
2225 char *sch = STR(CHILD(n, i));
2226 strcpy(s, STR(CHILD(n, i)));
2227 s += strlen(sch);
2228 *s++ = '.';
2229 }
2230 --s;
2231 *s = '\0';
2232 PyString_InternInPlace(&str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002233 PyArena_AddPyObject(c->c_arena, str);
2234 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 }
2236 break;
2237 case STAR:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002238 str = PyString_InternFromString("*");
2239 PyArena_AddPyObject(c->c_arena, str);
2240 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002242 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 "unexpected import name: %d", TYPE(n));
2244 return NULL;
2245 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002246
2247 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 return NULL;
2249}
2250
2251static stmt_ty
2252ast_for_import_stmt(struct compiling *c, const node *n)
2253{
2254 /*
2255 import_stmt: import_name | import_from
2256 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002257 import_from: 'from' ('.'* dotted_name | '.') 'import'
2258 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002260 int lineno;
2261 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 int i;
2263 asdl_seq *aliases;
2264
2265 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002266 lineno = LINENO(n);
2267 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002269 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 n = CHILD(n, 1);
Neil Schemenauer147b7592005-10-23 03:38:19 +00002271 REQ(n, dotted_as_names);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002272 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 if (!aliases)
2274 return NULL;
2275 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002276 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002277 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 asdl_seq_SET(aliases, i / 2, import_alias);
2280 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002281 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002283 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 int n_children;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002285 int idx, ndots = 0;
2286 alias_ty mod = NULL;
2287 identifier modname;
2288
2289 /* Count the number of dots (for relative imports) and check for the
2290 optional module name */
2291 for (idx = 1; idx < NCH(n); idx++) {
2292 if (TYPE(CHILD(n, idx)) == dotted_name) {
2293 mod = alias_for_import_name(c, CHILD(n, idx));
2294 idx++;
2295 break;
2296 } else if (TYPE(CHILD(n, idx)) != DOT) {
2297 break;
2298 }
2299 ndots++;
2300 }
2301 idx++; /* skip over the 'import' keyword */
2302 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002303 case STAR:
2304 /* from ... import * */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002305 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002306 n_children = 1;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002307 if (ndots) {
2308 ast_error(n, "'import *' not allowed with 'from .'");
2309 return NULL;
2310 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002311 break;
2312 case LPAR:
2313 /* from ... import (x, y, z) */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002314 n = CHILD(n, idx + 1);
Thomas Wouters106203c2006-02-27 17:05:19 +00002315 n_children = NCH(n);
2316 break;
2317 case import_as_names:
2318 /* from ... import x, y, z */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002319 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002320 n_children = NCH(n);
2321 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 ast_error(n, "trailing comma not allowed without"
2323 " surrounding parentheses");
2324 return NULL;
2325 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002326 break;
2327 default:
2328 ast_error(n, "Unexpected node-type in from-import");
2329 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00002330 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002332 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002333 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335
2336 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002337 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002338 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002339 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002341 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002343 else {
2344 for (i = 0; i < NCH(n); i += 2) {
2345 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2346 if (!import_alias)
2347 return NULL;
2348 asdl_seq_SET(aliases, i / 2, import_alias);
2349 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002351 if (mod != NULL)
2352 modname = mod->name;
2353 else
2354 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002355 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002356 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357 }
Neal Norwitz79792652005-11-14 04:25:03 +00002358 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 "unknown import statement: starts with command '%s'",
2360 STR(CHILD(n, 0)));
2361 return NULL;
2362}
2363
2364static stmt_ty
2365ast_for_global_stmt(struct compiling *c, const node *n)
2366{
2367 /* global_stmt: 'global' NAME (',' NAME)* */
2368 identifier name;
2369 asdl_seq *s;
2370 int i;
2371
2372 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002373 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 if (!s)
2375 return NULL;
2376 for (i = 1; i < NCH(n); i += 2) {
2377 name = NEW_IDENTIFIER(CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002378 if (!name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 asdl_seq_SET(s, i / 2, name);
2381 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002382 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383}
2384
2385static stmt_ty
2386ast_for_exec_stmt(struct compiling *c, const node *n)
2387{
2388 expr_ty expr1, globals = NULL, locals = NULL;
2389 int n_children = NCH(n);
2390 if (n_children != 2 && n_children != 4 && n_children != 6) {
Neal Norwitz79792652005-11-14 04:25:03 +00002391 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 "poorly formed 'exec' statement: %d parts to statement",
2393 n_children);
2394 return NULL;
2395 }
2396
2397 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2398 REQ(n, exec_stmt);
2399 expr1 = ast_for_expr(c, CHILD(n, 1));
2400 if (!expr1)
2401 return NULL;
2402 if (n_children >= 4) {
2403 globals = ast_for_expr(c, CHILD(n, 3));
2404 if (!globals)
2405 return NULL;
2406 }
2407 if (n_children == 6) {
2408 locals = ast_for_expr(c, CHILD(n, 5));
2409 if (!locals)
2410 return NULL;
2411 }
2412
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002413 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414}
2415
2416static stmt_ty
2417ast_for_assert_stmt(struct compiling *c, const node *n)
2418{
2419 /* assert_stmt: 'assert' test [',' test] */
2420 REQ(n, assert_stmt);
2421 if (NCH(n) == 2) {
2422 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2423 if (!expression)
2424 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002425 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 }
2427 else if (NCH(n) == 4) {
2428 expr_ty expr1, expr2;
2429
2430 expr1 = ast_for_expr(c, CHILD(n, 1));
2431 if (!expr1)
2432 return NULL;
2433 expr2 = ast_for_expr(c, CHILD(n, 3));
2434 if (!expr2)
2435 return NULL;
2436
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002437 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 }
Neal Norwitz79792652005-11-14 04:25:03 +00002439 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 "improper number of parts to 'assert' statement: %d",
2441 NCH(n));
2442 return NULL;
2443}
2444
2445static asdl_seq *
2446ast_for_suite(struct compiling *c, const node *n)
2447{
2448 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002449 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 stmt_ty s;
2451 int i, total, num, end, pos = 0;
2452 node *ch;
2453
2454 REQ(n, suite);
2455
2456 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002457 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 if (!seq)
2459 return NULL;
2460 if (TYPE(CHILD(n, 0)) == simple_stmt) {
2461 n = CHILD(n, 0);
2462 /* simple_stmt always ends with a NEWLINE,
2463 and may have a trailing SEMI
2464 */
2465 end = NCH(n) - 1;
2466 if (TYPE(CHILD(n, end - 1)) == SEMI)
2467 end--;
2468 /* loop by 2 to skip semi-colons */
2469 for (i = 0; i < end; i += 2) {
2470 ch = CHILD(n, i);
2471 s = ast_for_stmt(c, ch);
2472 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002473 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 asdl_seq_SET(seq, pos++, s);
2475 }
2476 }
2477 else {
2478 for (i = 2; i < (NCH(n) - 1); i++) {
2479 ch = CHILD(n, i);
2480 REQ(ch, stmt);
2481 num = num_stmts(ch);
2482 if (num == 1) {
2483 /* small_stmt or compound_stmt with only one child */
2484 s = ast_for_stmt(c, ch);
2485 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 asdl_seq_SET(seq, pos++, s);
2488 }
2489 else {
2490 int j;
2491 ch = CHILD(ch, 0);
2492 REQ(ch, simple_stmt);
2493 for (j = 0; j < NCH(ch); j += 2) {
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002494 /* statement terminates with a semi-colon ';' */
2495 if (NCH(CHILD(ch, j)) == 0) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002496 assert((j + 1) == NCH(ch));
2497 break;
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 s = ast_for_stmt(c, CHILD(ch, j));
2500 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002501 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 asdl_seq_SET(seq, pos++, s);
2503 }
2504 }
2505 }
2506 }
2507 assert(pos == seq->size);
2508 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509}
2510
2511static stmt_ty
2512ast_for_if_stmt(struct compiling *c, const node *n)
2513{
2514 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2515 ['else' ':' suite]
2516 */
2517 char *s;
2518
2519 REQ(n, if_stmt);
2520
2521 if (NCH(n) == 4) {
2522 expr_ty expression;
2523 asdl_seq *suite_seq;
2524
2525 expression = ast_for_expr(c, CHILD(n, 1));
2526 if (!expression)
2527 return NULL;
2528 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002529 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530 return NULL;
2531
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002532 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002534
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535 s = STR(CHILD(n, 4));
2536 /* s[2], the third character in the string, will be
2537 's' for el_s_e, or
2538 'i' for el_i_f
2539 */
2540 if (s[2] == 's') {
2541 expr_ty expression;
2542 asdl_seq *seq1, *seq2;
2543
2544 expression = ast_for_expr(c, CHILD(n, 1));
2545 if (!expression)
2546 return NULL;
2547 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002548 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 return NULL;
2550 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002551 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 return NULL;
2553
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002554 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 }
2556 else if (s[2] == 'i') {
2557 int i, n_elif, has_else = 0;
2558 asdl_seq *orelse = NULL;
2559 n_elif = NCH(n) - 4;
2560 /* must reference the child n_elif+1 since 'else' token is third,
2561 not fourth, child from the end. */
2562 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2563 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2564 has_else = 1;
2565 n_elif -= 3;
2566 }
2567 n_elif /= 4;
2568
2569 if (has_else) {
2570 expr_ty expression;
2571 asdl_seq *seq1, *seq2;
2572
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002573 orelse = asdl_seq_new(1, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 if (!orelse)
2575 return NULL;
2576 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002577 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002580 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002583 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585
2586 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002587 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002588 c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 /* the just-created orelse handled the last elif */
2590 n_elif--;
2591 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592
2593 for (i = 0; i < n_elif; i++) {
2594 int off = 5 + (n_elif - i - 1) * 4;
2595 expr_ty expression;
2596 asdl_seq *suite_seq;
Anthony Baxtera863d332006-04-11 07:43:46 +00002597 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2598 if (!newobj)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599 return NULL;
2600 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002601 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002604 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606
Anthony Baxtera863d332006-04-11 07:43:46 +00002607 asdl_seq_SET(newobj, 0,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 If(expression, suite_seq, orelse,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002609 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
Anthony Baxtera863d332006-04-11 07:43:46 +00002610 orelse = newobj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 }
2612 return If(ast_for_expr(c, CHILD(n, 1)),
2613 ast_for_suite(c, CHILD(n, 3)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002614 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002616
2617 PyErr_Format(PyExc_SystemError,
2618 "unexpected token in 'if' statement: %s", s);
2619 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620}
2621
2622static stmt_ty
2623ast_for_while_stmt(struct compiling *c, const node *n)
2624{
2625 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2626 REQ(n, while_stmt);
2627
2628 if (NCH(n) == 4) {
2629 expr_ty expression;
2630 asdl_seq *suite_seq;
2631
2632 expression = ast_for_expr(c, CHILD(n, 1));
2633 if (!expression)
2634 return NULL;
2635 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002636 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002638 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 }
2640 else if (NCH(n) == 7) {
2641 expr_ty expression;
2642 asdl_seq *seq1, *seq2;
2643
2644 expression = ast_for_expr(c, CHILD(n, 1));
2645 if (!expression)
2646 return NULL;
2647 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002648 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 return NULL;
2650 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002651 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 return NULL;
2653
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002654 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002656
2657 PyErr_Format(PyExc_SystemError,
2658 "wrong number of tokens for 'while' statement: %d",
2659 NCH(n));
2660 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661}
2662
2663static stmt_ty
2664ast_for_for_stmt(struct compiling *c, const node *n)
2665{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002666 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 expr_ty expression;
2668 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002669 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2671 REQ(n, for_stmt);
2672
2673 if (NCH(n) == 9) {
2674 seq = ast_for_suite(c, CHILD(n, 8));
2675 if (!seq)
2676 return NULL;
2677 }
2678
Neal Norwitzedef2be2006-07-12 05:26:17 +00002679 node_target = CHILD(n, 1);
2680 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002681 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002683 /* Check the # of children rather than the length of _target, since
2684 for x, in ... has 1 element in _target, but still requires a Tuple. */
2685 if (NCH(node_target) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00002686 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687 else
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002688 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002690 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002691 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return NULL;
2693 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002694 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
2696
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002697 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2698 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699}
2700
2701static excepthandler_ty
2702ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2703{
2704 /* except_clause: 'except' [test [',' test]] */
2705 REQ(exc, except_clause);
2706 REQ(body, suite);
2707
2708 if (NCH(exc) == 1) {
2709 asdl_seq *suite_seq = ast_for_suite(c, body);
2710 if (!suite_seq)
2711 return NULL;
2712
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002713 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
2714 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 }
2716 else if (NCH(exc) == 2) {
2717 expr_ty expression;
2718 asdl_seq *suite_seq;
2719
2720 expression = ast_for_expr(c, CHILD(exc, 1));
2721 if (!expression)
2722 return NULL;
2723 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002724 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 return NULL;
2726
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002727 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
2728 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 }
2730 else if (NCH(exc) == 4) {
2731 asdl_seq *suite_seq;
2732 expr_ty expression;
2733 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2734 if (!e)
2735 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002736 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 return NULL;
2738 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002739 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 return NULL;
2741 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002742 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 return NULL;
2744
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002745 return excepthandler(expression, e, suite_seq, LINENO(exc),
2746 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002748
2749 PyErr_Format(PyExc_SystemError,
2750 "wrong number of children for 'except' clause: %d",
2751 NCH(exc));
2752 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753}
2754
2755static stmt_ty
2756ast_for_try_stmt(struct compiling *c, const node *n)
2757{
Neal Norwitzf599f422005-12-17 21:33:47 +00002758 const int nch = NCH(n);
2759 int n_except = (nch - 3)/3;
2760 asdl_seq *body, *orelse = NULL, *finally = NULL;
2761
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 REQ(n, try_stmt);
2763
Neal Norwitzf599f422005-12-17 21:33:47 +00002764 body = ast_for_suite(c, CHILD(n, 2));
2765 if (body == NULL)
2766 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767
Neal Norwitzf599f422005-12-17 21:33:47 +00002768 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2769 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2770 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2771 /* we can assume it's an "else",
2772 because nch >= 9 for try-else-finally and
2773 it would otherwise have a type of except_clause */
2774 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2775 if (orelse == NULL)
2776 return NULL;
2777 n_except--;
2778 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779
Neal Norwitzf599f422005-12-17 21:33:47 +00002780 finally = ast_for_suite(c, CHILD(n, nch - 1));
2781 if (finally == NULL)
2782 return NULL;
2783 n_except--;
2784 }
2785 else {
2786 /* we can assume it's an "else",
2787 otherwise it would have a type of except_clause */
2788 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2789 if (orelse == NULL)
2790 return NULL;
2791 n_except--;
2792 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002794 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002795 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 return NULL;
2797 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002798
2799 if (n_except > 0) {
2800 int i;
2801 stmt_ty except_st;
2802 /* process except statements to create a try ... except */
2803 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2804 if (handlers == NULL)
2805 return NULL;
2806
2807 for (i = 0; i < n_except; i++) {
2808 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2809 CHILD(n, 5 + i * 3));
2810 if (!e)
2811 return NULL;
2812 asdl_seq_SET(handlers, i, e);
2813 }
2814
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002815 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2816 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002817 if (!finally)
2818 return except_st;
2819
2820 /* if a 'finally' is present too, we nest the TryExcept within a
2821 TryFinally to emulate try ... except ... finally */
2822 body = asdl_seq_new(1, c->c_arena);
2823 if (body == NULL)
2824 return NULL;
2825 asdl_seq_SET(body, 0, except_st);
2826 }
2827
2828 /* must be a try ... finally (except clauses are in body, if any exist) */
2829 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002830 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831}
2832
Guido van Rossumc2e20742006-02-27 22:32:47 +00002833static expr_ty
2834ast_for_with_var(struct compiling *c, const node *n)
2835{
2836 REQ(n, with_var);
2837 if (strcmp(STR(CHILD(n, 0)), "as") != 0) {
2838 ast_error(n, "expected \"with [expr] as [var]\"");
2839 return NULL;
2840 }
2841 return ast_for_expr(c, CHILD(n, 1));
2842}
2843
2844/* with_stmt: 'with' test [ with_var ] ':' suite */
2845static stmt_ty
2846ast_for_with_stmt(struct compiling *c, const node *n)
2847{
2848 expr_ty context_expr, optional_vars = NULL;
2849 int suite_index = 3; /* skip 'with', test, and ':' */
2850 asdl_seq *suite_seq;
2851
2852 assert(TYPE(n) == with_stmt);
2853 context_expr = ast_for_expr(c, CHILD(n, 1));
2854 if (TYPE(CHILD(n, 2)) == with_var) {
2855 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2856
2857 if (!optional_vars) {
2858 return NULL;
2859 }
2860 if (!set_context(optional_vars, Store, n)) {
2861 return NULL;
2862 }
2863 suite_index = 4;
2864 }
2865
2866 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2867 if (!suite_seq) {
2868 return NULL;
2869 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002870 return With(context_expr, optional_vars, suite_seq, LINENO(n),
2871 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002872}
2873
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874static stmt_ty
2875ast_for_classdef(struct compiling *c, const node *n)
2876{
2877 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 asdl_seq *bases, *s;
2879
2880 REQ(n, classdef);
2881
2882 if (!strcmp(STR(CHILD(n, 1)), "None")) {
2883 ast_error(n, "assignment to None");
2884 return NULL;
2885 }
2886
2887 if (NCH(n) == 4) {
2888 s = ast_for_suite(c, CHILD(n, 3));
2889 if (!s)
2890 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002891 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2892 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 }
2894 /* check for empty base list */
2895 if (TYPE(CHILD(n,3)) == RPAR) {
2896 s = ast_for_suite(c, CHILD(n,5));
2897 if (!s)
2898 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002899 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2900 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002901 }
2902
2903 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002904 bases = ast_for_class_bases(c, CHILD(n, 3));
2905 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907
2908 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002909 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002911 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
2912 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913}
2914
2915static stmt_ty
2916ast_for_stmt(struct compiling *c, const node *n)
2917{
2918 if (TYPE(n) == stmt) {
2919 assert(NCH(n) == 1);
2920 n = CHILD(n, 0);
2921 }
2922 if (TYPE(n) == simple_stmt) {
2923 assert(num_stmts(n) == 1);
2924 n = CHILD(n, 0);
2925 }
2926 if (TYPE(n) == small_stmt) {
2927 REQ(n, small_stmt);
2928 n = CHILD(n, 0);
2929 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2930 | flow_stmt | import_stmt | global_stmt | exec_stmt
2931 | assert_stmt
2932 */
2933 switch (TYPE(n)) {
2934 case expr_stmt:
2935 return ast_for_expr_stmt(c, n);
2936 case print_stmt:
2937 return ast_for_print_stmt(c, n);
2938 case del_stmt:
2939 return ast_for_del_stmt(c, n);
2940 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002941 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 case flow_stmt:
2943 return ast_for_flow_stmt(c, n);
2944 case import_stmt:
2945 return ast_for_import_stmt(c, n);
2946 case global_stmt:
2947 return ast_for_global_stmt(c, n);
2948 case exec_stmt:
2949 return ast_for_exec_stmt(c, n);
2950 case assert_stmt:
2951 return ast_for_assert_stmt(c, n);
2952 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002953 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2955 TYPE(n), NCH(n));
2956 return NULL;
2957 }
2958 }
2959 else {
2960 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
2961 | funcdef | classdef
2962 */
2963 node *ch = CHILD(n, 0);
2964 REQ(n, compound_stmt);
2965 switch (TYPE(ch)) {
2966 case if_stmt:
2967 return ast_for_if_stmt(c, ch);
2968 case while_stmt:
2969 return ast_for_while_stmt(c, ch);
2970 case for_stmt:
2971 return ast_for_for_stmt(c, ch);
2972 case try_stmt:
2973 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002974 case with_stmt:
2975 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 case funcdef:
2977 return ast_for_funcdef(c, ch);
2978 case classdef:
2979 return ast_for_classdef(c, ch);
2980 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002981 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2983 TYPE(n), NCH(n));
2984 return NULL;
2985 }
2986 }
2987}
2988
2989static PyObject *
2990parsenumber(const char *s)
2991{
2992 const char *end;
2993 long x;
2994 double dx;
2995#ifndef WITHOUT_COMPLEX
2996 Py_complex c;
2997 int imflag;
2998#endif
2999
3000 errno = 0;
3001 end = s + strlen(s) - 1;
3002#ifndef WITHOUT_COMPLEX
3003 imflag = *end == 'j' || *end == 'J';
3004#endif
3005 if (*end == 'l' || *end == 'L')
3006 return PyLong_FromString((char *)s, (char **)0, 0);
3007 if (s[0] == '0') {
3008 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3009 if (x < 0 && errno == 0) {
3010 return PyLong_FromString((char *)s,
3011 (char **)0,
3012 0);
3013 }
3014 }
3015 else
3016 x = PyOS_strtol((char *)s, (char **)&end, 0);
3017 if (*end == '\0') {
3018 if (errno != 0)
3019 return PyLong_FromString((char *)s, (char **)0, 0);
3020 return PyInt_FromLong(x);
3021 }
3022 /* XXX Huge floats may silently fail */
3023#ifndef WITHOUT_COMPLEX
3024 if (imflag) {
3025 c.real = 0.;
3026 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003027 c.imag = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028 PyFPE_END_PROTECT(c)
3029 return PyComplex_FromCComplex(c);
3030 }
3031 else
3032#endif
3033 {
3034 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003035 dx = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036 PyFPE_END_PROTECT(dx)
3037 return PyFloat_FromDouble(dx);
3038 }
3039}
3040
3041static PyObject *
3042decode_utf8(const char **sPtr, const char *end, char* encoding)
3043{
3044#ifndef Py_USING_UNICODE
3045 Py_FatalError("decode_utf8 should not be called in this build.");
3046 return NULL;
3047#else
3048 PyObject *u, *v;
3049 char *s, *t;
3050 t = s = (char *)*sPtr;
3051 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3052 while (s < end && (*s & 0x80)) s++;
3053 *sPtr = s;
3054 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3055 if (u == NULL)
3056 return NULL;
3057 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3058 Py_DECREF(u);
3059 return v;
3060#endif
3061}
3062
3063static PyObject *
3064decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3065{
3066 PyObject *v, *u;
3067 char *buf;
3068 char *p;
3069 const char *end;
3070 if (encoding == NULL) {
3071 buf = (char *)s;
3072 u = NULL;
3073 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3074 buf = (char *)s;
3075 u = NULL;
3076 } else {
3077 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3078 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3079 if (u == NULL)
3080 return NULL;
3081 p = buf = PyString_AsString(u);
3082 end = s + len;
3083 while (s < end) {
3084 if (*s == '\\') {
3085 *p++ = *s++;
3086 if (*s & 0x80) {
3087 strcpy(p, "u005c");
3088 p += 5;
3089 }
3090 }
3091 if (*s & 0x80) { /* XXX inefficient */
3092 PyObject *w;
3093 char *r;
Martin v. Löwis66851282006-04-22 11:40:03 +00003094 Py_ssize_t rn, i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 w = decode_utf8(&s, end, "utf-16-be");
3096 if (w == NULL) {
3097 Py_DECREF(u);
3098 return NULL;
3099 }
3100 r = PyString_AsString(w);
3101 rn = PyString_Size(w);
3102 assert(rn % 2 == 0);
3103 for (i = 0; i < rn; i += 2) {
3104 sprintf(p, "\\u%02x%02x",
3105 r[i + 0] & 0xFF,
3106 r[i + 1] & 0xFF);
3107 p += 6;
3108 }
3109 Py_DECREF(w);
3110 } else {
3111 *p++ = *s++;
3112 }
3113 }
3114 len = p - buf;
3115 s = buf;
3116 }
3117 if (rawmode)
3118 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3119 else
3120 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3121 Py_XDECREF(u);
3122 return v;
3123}
3124
3125/* s is a Python string literal, including the bracketing quote characters,
3126 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3127 * parsestr parses it, and returns the decoded Python string object.
3128 */
3129static PyObject *
3130parsestr(const char *s, const char *encoding)
3131{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132 size_t len;
Neal Norwitz30b5c5d2005-12-19 06:05:18 +00003133 int quote = Py_CHARMASK(*s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 int rawmode = 0;
3135 int need_encoding;
3136 int unicode = 0;
3137
3138 if (isalpha(quote) || quote == '_') {
3139 if (quote == 'u' || quote == 'U') {
3140 quote = *++s;
3141 unicode = 1;
3142 }
3143 if (quote == 'r' || quote == 'R') {
3144 quote = *++s;
3145 rawmode = 1;
3146 }
3147 }
3148 if (quote != '\'' && quote != '\"') {
3149 PyErr_BadInternalCall();
3150 return NULL;
3151 }
3152 s++;
3153 len = strlen(s);
3154 if (len > INT_MAX) {
3155 PyErr_SetString(PyExc_OverflowError,
3156 "string to parse is too long");
3157 return NULL;
3158 }
3159 if (s[--len] != quote) {
3160 PyErr_BadInternalCall();
3161 return NULL;
3162 }
3163 if (len >= 4 && s[0] == quote && s[1] == quote) {
3164 s += 2;
3165 len -= 2;
3166 if (s[--len] != quote || s[--len] != quote) {
3167 PyErr_BadInternalCall();
3168 return NULL;
3169 }
3170 }
3171#ifdef Py_USING_UNICODE
3172 if (unicode || Py_UnicodeFlag) {
3173 return decode_unicode(s, len, rawmode, encoding);
3174 }
3175#endif
3176 need_encoding = (encoding != NULL &&
3177 strcmp(encoding, "utf-8") != 0 &&
3178 strcmp(encoding, "iso-8859-1") != 0);
3179 if (rawmode || strchr(s, '\\') == NULL) {
3180 if (need_encoding) {
3181#ifndef Py_USING_UNICODE
3182 /* This should not happen - we never see any other
3183 encoding. */
Jeremy Hylton2f327c12006-04-04 04:00:23 +00003184 Py_FatalError(
3185 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186#else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003187 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188 if (u == NULL)
3189 return NULL;
3190 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3191 Py_DECREF(u);
3192 return v;
3193#endif
3194 } else {
3195 return PyString_FromStringAndSize(s, len);
3196 }
3197 }
3198
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003199 return PyString_DecodeEscape(s, len, NULL, unicode,
3200 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201}
3202
3203/* Build a Python string object out of a STRING atom. This takes care of
3204 * compile-time literal catenation, calling parsestr() on each piece, and
3205 * pasting the intermediate results together.
3206 */
3207static PyObject *
3208parsestrplus(struct compiling *c, const node *n)
3209{
3210 PyObject *v;
3211 int i;
3212 REQ(CHILD(n, 0), STRING);
3213 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3214 /* String literal concatenation */
3215 for (i = 1; i < NCH(n); i++) {
3216 PyObject *s;
3217 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3218 if (s == NULL)
3219 goto onError;
3220 if (PyString_Check(v) && PyString_Check(s)) {
3221 PyString_ConcatAndDel(&v, s);
3222 if (v == NULL)
3223 goto onError;
3224 }
3225#ifdef Py_USING_UNICODE
3226 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003227 PyObject *temp = PyUnicode_Concat(v, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 Py_DECREF(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229 Py_DECREF(v);
3230 v = temp;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003231 if (v == NULL)
3232 goto onError;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 }
3234#endif
3235 }
3236 }
3237 return v;
3238
3239 onError:
3240 Py_XDECREF(v);
3241 return NULL;
3242}