blob: 52c098ff3bad399d08821d5733e61fbf7e298f9c [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* XXX TO DO
19 - re-indent this file (should be done)
20 - internal error checking (freeing memory, etc.)
21 - syntax errors
22*/
23
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024/* Data structure used internally */
25struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000026 char *c_encoding; /* source encoding */
27 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028};
29
30static asdl_seq *seq_for_testlist(struct compiling *, const node *);
31static expr_ty ast_for_expr(struct compiling *, const node *);
32static stmt_ty ast_for_stmt(struct compiling *, const node *);
33static asdl_seq *ast_for_suite(struct compiling *, const node *);
Martin v. Löwis28457502006-04-11 09:17:27 +000034static asdl_seq *ast_for_exprlist(struct compiling *, const node *, expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000035static expr_ty ast_for_testlist(struct compiling *, const node *);
36static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037
38/* Note different signature for ast_for_call */
39static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
40
41static PyObject *parsenumber(const char *);
42static PyObject *parsestr(const char *s, const char *encoding);
43static PyObject *parsestrplus(struct compiling *, const node *n);
44
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#ifndef LINENO
46#define LINENO(n) ((n)->n_lineno)
47#endif
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
51 PyObject* id = PyString_InternFromString(n);
52 PyArena_AddPyObject(arena, id);
53 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000054}
55
Neal Norwitzadb69fc2005-12-17 20:54:49 +000056#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057
58/* This routine provides an invalid object for the syntax error.
59 The outermost routine must unpack this error and create the
60 proper object. We do this so that we don't have to pass
61 the filename to everything function.
62
63 XXX Maybe we should just pass the filename...
64*/
65
66static int
67ast_error(const node *n, const char *errstr)
68{
69 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
70 if (!u)
71 return 0;
72 PyErr_SetObject(PyExc_SyntaxError, u);
73 Py_DECREF(u);
74 return 0;
75}
76
77static void
78ast_error_finish(const char *filename)
79{
80 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000081 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082
83 assert(PyErr_Occurred());
84 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
85 return;
86
87 PyErr_Fetch(&type, &value, &tback);
88 errstr = PyTuple_GetItem(value, 0);
89 if (!errstr)
90 return;
91 Py_INCREF(errstr);
92 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000093 if (lineno == -1) {
94 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000096 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097 Py_DECREF(value);
98
99 loc = PyErr_ProgramText(filename, lineno);
100 if (!loc) {
101 Py_INCREF(Py_None);
102 loc = Py_None;
103 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000104 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000106 if (!tmp) {
107 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000109 }
Georg Brandl7784f122006-05-26 20:04:44 +0000110 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111 Py_DECREF(errstr);
112 Py_DECREF(tmp);
113 if (!value)
114 return;
115 PyErr_Restore(type, value, tback);
116}
117
118/* num_stmts() returns number of contained statements.
119
120 Use this routine to determine how big a sequence is needed for
121 the statements in a parse tree. Its raison d'etre is this bit of
122 grammar:
123
124 stmt: simple_stmt | compound_stmt
125 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
126
127 A simple_stmt can contain multiple small_stmt elements joined
128 by semicolons. If the arg is a simple_stmt, the number of
129 small_stmt elements is returned.
130*/
131
132static int
133num_stmts(const node *n)
134{
135 int i, l;
136 node *ch;
137
138 switch (TYPE(n)) {
139 case single_input:
140 if (TYPE(CHILD(n, 0)) == NEWLINE)
141 return 0;
142 else
143 return num_stmts(CHILD(n, 0));
144 case file_input:
145 l = 0;
146 for (i = 0; i < NCH(n); i++) {
147 ch = CHILD(n, i);
148 if (TYPE(ch) == stmt)
149 l += num_stmts(ch);
150 }
151 return l;
152 case stmt:
153 return num_stmts(CHILD(n, 0));
154 case compound_stmt:
155 return 1;
156 case simple_stmt:
157 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
158 case suite:
159 if (NCH(n) == 1)
160 return num_stmts(CHILD(n, 0));
161 else {
162 l = 0;
163 for (i = 2; i < (NCH(n) - 1); i++)
164 l += num_stmts(CHILD(n, i));
165 return l;
166 }
167 default: {
168 char buf[128];
169
170 sprintf(buf, "Non-statement found: %d %d\n",
171 TYPE(n), NCH(n));
172 Py_FatalError(buf);
173 }
174 }
175 assert(0);
176 return 0;
177}
178
179/* Transform the CST rooted at node * to the appropriate AST
180*/
181
182mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000183PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
184 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000186 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187 asdl_seq *stmts = NULL;
188 stmt_ty s;
189 node *ch;
190 struct compiling c;
191
192 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000193 c.c_encoding = "utf-8";
Neal Norwitze98ccf62006-03-23 05:39:47 +0000194 if (TYPE(n) == encoding_decl) {
195 ast_error(n, "encoding declaration in Unicode string");
196 goto error;
197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 } else if (TYPE(n) == encoding_decl) {
199 c.c_encoding = STR(n);
200 n = CHILD(n, 0);
201 } else {
202 c.c_encoding = NULL;
203 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205
Jeremy Hyltona8293132006-02-28 17:58:27 +0000206 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207 switch (TYPE(n)) {
208 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000209 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 if (!stmts)
211 return NULL;
212 for (i = 0; i < NCH(n) - 1; i++) {
213 ch = CHILD(n, i);
214 if (TYPE(ch) == NEWLINE)
215 continue;
216 REQ(ch, stmt);
217 num = num_stmts(ch);
218 if (num == 1) {
219 s = ast_for_stmt(&c, ch);
220 if (!s)
221 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000222 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223 }
224 else {
225 ch = CHILD(ch, 0);
226 REQ(ch, simple_stmt);
227 for (j = 0; j < num; j++) {
228 s = ast_for_stmt(&c, CHILD(ch, j * 2));
229 if (!s)
230 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000231 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232 }
233 }
234 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 case eval_input: {
237 expr_ty testlist_ast;
238
239 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000240 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 if (!testlist_ast)
242 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000243 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 }
245 case single_input:
246 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 if (!stmts)
249 goto error;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000250 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
251 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 }
254 else {
255 n = CHILD(n, 0);
256 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000257 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 if (!stmts)
259 goto error;
260 if (num == 1) {
Neal Norwitz406c6402006-01-07 21:23:26 +0000261 s = ast_for_stmt(&c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 if (!s)
263 goto error;
264 asdl_seq_SET(stmts, 0, s);
265 }
266 else {
267 /* Only a simple_stmt can contain multiple statements. */
268 REQ(n, simple_stmt);
269 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (TYPE(CHILD(n, i)) == NEWLINE)
271 break;
272 s = ast_for_stmt(&c, CHILD(n, i));
273 if (!s)
274 goto error;
275 asdl_seq_SET(stmts, i / 2, s);
276 }
277 }
278
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000279 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 }
281 default:
282 goto error;
283 }
284 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 ast_error_finish(filename);
286 return NULL;
287}
288
289/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
290*/
291
292static operator_ty
293get_operator(const node *n)
294{
295 switch (TYPE(n)) {
296 case VBAR:
297 return BitOr;
298 case CIRCUMFLEX:
299 return BitXor;
300 case AMPER:
301 return BitAnd;
302 case LEFTSHIFT:
303 return LShift;
304 case RIGHTSHIFT:
305 return RShift;
306 case PLUS:
307 return Add;
308 case MINUS:
309 return Sub;
310 case STAR:
311 return Mult;
312 case SLASH:
313 return Div;
314 case DOUBLESLASH:
315 return FloorDiv;
316 case PERCENT:
317 return Mod;
318 default:
Martin v. Löwis28457502006-04-11 09:17:27 +0000319 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320 }
321}
322
Jeremy Hyltona8293132006-02-28 17:58:27 +0000323/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000324
325 Only sets context for expr kinds that "can appear in assignment context"
326 (according to ../Parser/Python.asdl). For other expr kinds, it sets
327 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328*/
329
330static int
331set_context(expr_ty e, expr_context_ty ctx, const node *n)
332{
333 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000334 /* If a particular expression type can't be used for assign / delete,
335 set expr_name to its name and an error message will be generated.
336 */
337 const char* expr_name = NULL;
338
339 /* The ast defines augmented store and load contexts, but the
340 implementation here doesn't actually use them. The code may be
341 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000342 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000344 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000345 */
346 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347
348 switch (e->kind) {
349 case Attribute_kind:
350 if (ctx == Store &&
Jeremy Hyltona8293132006-02-28 17:58:27 +0000351 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352 return ast_error(n, "assignment to None");
353 }
354 e->v.Attribute.ctx = ctx;
355 break;
356 case Subscript_kind:
357 e->v.Subscript.ctx = ctx;
358 break;
359 case Name_kind:
360 if (ctx == Store &&
361 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
362 return ast_error(n, "assignment to None");
363 }
364 e->v.Name.ctx = ctx;
365 break;
366 case List_kind:
367 e->v.List.ctx = ctx;
368 s = e->v.List.elts;
369 break;
370 case Tuple_kind:
371 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
372 return ast_error(n, "can't assign to ()");
373 e->v.Tuple.ctx = ctx;
374 s = e->v.Tuple.elts;
375 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000376 case Lambda_kind:
377 expr_name = "lambda";
378 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 expr_name = "function call";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000384 case UnaryOp_kind:
385 expr_name = "operator";
386 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 expr_name = "generator expression";
389 break;
Neal Norwitz0d62a062006-07-30 06:53:31 +0000390 case Yield_kind:
391 expr_name = "yield expression";
392 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000393 case ListComp_kind:
394 expr_name = "list comprehension";
395 break;
396 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397 case Num_kind:
398 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 expr_name = "literal";
400 break;
401 case Compare_kind:
402 expr_name = "comparison";
403 break;
404 case Repr_kind:
405 expr_name = "repr";
406 break;
Neal Norwitz373f0a72006-05-15 07:04:36 +0000407 case IfExp_kind:
408 expr_name = "conditional expression";
409 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 default:
411 PyErr_Format(PyExc_SystemError,
412 "unexpected expression in assignment %d (line %d)",
413 e->kind, e->lineno);
414 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 /* Check for error string set by switch */
417 if (expr_name) {
418 char buf[300];
419 PyOS_snprintf(buf, sizeof(buf),
420 "can't %s %s",
421 ctx == Store ? "assign to" : "delete",
422 expr_name);
423 return ast_error(n, buf);
424 }
425
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000427 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 */
429 if (s) {
430 int i;
431
432 for (i = 0; i < asdl_seq_LEN(s); i++) {
Martin v. Löwis28457502006-04-11 09:17:27 +0000433 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 return 0;
435 }
436 }
437 return 1;
438}
439
440static operator_ty
441ast_for_augassign(const node *n)
442{
443 REQ(n, augassign);
444 n = CHILD(n, 0);
445 switch (STR(n)[0]) {
446 case '+':
447 return Add;
448 case '-':
449 return Sub;
450 case '/':
451 if (STR(n)[1] == '/')
452 return FloorDiv;
453 else
454 return Div;
455 case '%':
456 return Mod;
457 case '<':
458 return LShift;
459 case '>':
460 return RShift;
461 case '&':
462 return BitAnd;
463 case '^':
464 return BitXor;
465 case '|':
466 return BitOr;
467 case '*':
468 if (STR(n)[1] == '*')
469 return Pow;
470 else
471 return Mult;
472 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000473 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000474 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 }
476}
477
478static cmpop_ty
479ast_for_comp_op(const node *n)
480{
481 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
482 |'is' 'not'
483 */
484 REQ(n, comp_op);
485 if (NCH(n) == 1) {
486 n = CHILD(n, 0);
487 switch (TYPE(n)) {
488 case LESS:
489 return Lt;
490 case GREATER:
491 return Gt;
492 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493 return Eq;
494 case LESSEQUAL:
495 return LtE;
496 case GREATEREQUAL:
497 return GtE;
498 case NOTEQUAL:
499 return NotEq;
500 case NAME:
501 if (strcmp(STR(n), "in") == 0)
502 return In;
503 if (strcmp(STR(n), "is") == 0)
504 return Is;
505 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000506 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507 STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000508 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 }
511 else if (NCH(n) == 2) {
512 /* handle "not in" and "is not" */
513 switch (TYPE(CHILD(n, 0))) {
514 case NAME:
515 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
516 return NotIn;
517 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
518 return IsNot;
519 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000520 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Martin v. Löwis28457502006-04-11 09:17:27 +0000522 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
524 }
Neal Norwitz79792652005-11-14 04:25:03 +0000525 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000527 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000528}
529
530static asdl_seq *
531seq_for_testlist(struct compiling *c, const node *n)
532{
533 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000534 asdl_seq *seq;
535 expr_ty expression;
536 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537 assert(TYPE(n) == testlist
538 || TYPE(n) == listmaker
539 || TYPE(n) == testlist_gexp
540 || TYPE(n) == testlist_safe
541 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000543 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 if (!seq)
545 return NULL;
546
547 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000548 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549
550 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000551 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553
554 assert(i / 2 < seq->size);
555 asdl_seq_SET(seq, i / 2, expression);
556 }
557 return seq;
558}
559
560static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000561compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562{
563 int i, len = (NCH(n) + 1) / 2;
564 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000565 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 if (!args)
567 return NULL;
568
Georg Brandlc57221e2006-09-25 07:04:10 +0000569 /* fpdef: NAME | '(' fplist ')'
570 fplist: fpdef (',' fpdef)* [',']
571 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 for (i = 0; i < len; i++) {
Georg Brandlc57221e2006-09-25 07:04:10 +0000574 const node *fpdef_node = CHILD(n, 2*i);
575 const node *child;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 expr_ty arg;
Georg Brandlc57221e2006-09-25 07:04:10 +0000577set_name:
578 /* fpdef_node is either a NAME or an fplist */
579 child = CHILD(fpdef_node, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 if (TYPE(child) == NAME) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000581 if (!strcmp(STR(child), "None")) {
582 ast_error(child, "assignment to None");
583 return NULL;
584 }
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000585 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
586 child->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000587 }
588 else {
Georg Brandlc57221e2006-09-25 07:04:10 +0000589 assert(TYPE(fpdef_node) == fpdef);
590 /* fpdef_node[0] is not a name, so it must be a '(', get CHILD[1] */
591 child = CHILD(fpdef_node, 1);
592 assert(TYPE(child) == fplist);
593 /* NCH == 1 means we have (x), we need to elide the extra parens */
594 if (NCH(child) == 1) {
595 fpdef_node = CHILD(child, 0);
596 assert(TYPE(fpdef_node) == fpdef);
597 goto set_name;
598 }
599 arg = compiler_complex_args(c, child);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000600 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601 asdl_seq_SET(args, i, arg);
602 }
603
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000604 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000605 if (!set_context(result, Store, n))
606 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 return result;
608}
609
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610
Jeremy Hyltona8293132006-02-28 17:58:27 +0000611/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612
613static arguments_ty
614ast_for_arguments(struct compiling *c, const node *n)
615{
616 /* parameters: '(' [varargslist] ')'
617 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
618 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
619 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000620 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621 asdl_seq *args, *defaults;
622 identifier vararg = NULL, kwarg = NULL;
623 node *ch;
624
625 if (TYPE(n) == parameters) {
626 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000627 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628 n = CHILD(n, 1);
629 }
630 REQ(n, varargslist);
631
632 /* first count the number of normal args & defaults */
633 for (i = 0; i < NCH(n); i++) {
634 ch = CHILD(n, i);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000635 if (TYPE(ch) == fpdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636 n_args++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000637 if (TYPE(ch) == EQUAL)
638 n_defaults++;
639 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000640 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000641 if (!args && n_args)
Neal Norwitzc173b482006-07-30 19:18:13 +0000642 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000643 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000644 if (!defaults && n_defaults)
Neal Norwitzc173b482006-07-30 19:18:13 +0000645 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000646
647 /* fpdef: NAME | '(' fplist ')'
648 fplist: fpdef (',' fpdef)* [',']
649 */
650 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000651 j = 0; /* index for defaults */
652 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653 while (i < NCH(n)) {
654 ch = CHILD(n, i);
655 switch (TYPE(ch)) {
656 case fpdef:
Georg Brandlc57221e2006-09-25 07:04:10 +0000657 handle_fpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000658 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
659 anything other than EQUAL or a comma? */
660 /* XXX Should NCH(n) check be made a separate check? */
661 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzd12bd012006-07-21 07:59:47 +0000662 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
663 if (!expression)
664 goto error;
Neal Norwitzc173b482006-07-30 19:18:13 +0000665 assert(defaults != NULL);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000666 asdl_seq_SET(defaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000667 i += 2;
668 found_default = 1;
669 }
670 else if (found_default) {
671 ast_error(n,
672 "non-default argument follows default argument");
673 goto error;
674 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000675 if (NCH(ch) == 3) {
Neal Norwitz33b730e2006-03-27 08:58:23 +0000676 ch = CHILD(ch, 1);
677 /* def foo((x)): is not complex, special case. */
678 if (NCH(ch) != 1) {
679 /* We have complex arguments, setup for unpacking. */
680 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
681 } else {
682 /* def foo((x)): setup for checking NAME below. */
Georg Brandlc57221e2006-09-25 07:04:10 +0000683 /* Loop because there can be many parens and tuple
684 upacking mixed in. */
Neal Norwitz33b730e2006-03-27 08:58:23 +0000685 ch = CHILD(ch, 0);
Georg Brandlc57221e2006-09-25 07:04:10 +0000686 assert(TYPE(ch) == fpdef);
687 goto handle_fpdef;
Neal Norwitz33b730e2006-03-27 08:58:23 +0000688 }
689 }
690 if (TYPE(CHILD(ch, 0)) == NAME) {
Armin Rigo31441302005-10-21 12:57:31 +0000691 expr_ty name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000692 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
693 ast_error(CHILD(ch, 0), "assignment to None");
694 goto error;
695 }
Armin Rigo31441302005-10-21 12:57:31 +0000696 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000697 Param, LINENO(ch), ch->n_col_offset,
698 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000699 if (!name)
700 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000701 asdl_seq_SET(args, k++, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702
703 }
704 i += 2; /* the name and the comma */
705 break;
706 case STAR:
707 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
708 ast_error(CHILD(n, i+1), "assignment to None");
709 goto error;
710 }
711 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
712 i += 3;
713 break;
714 case DOUBLESTAR:
715 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
716 ast_error(CHILD(n, i+1), "assignment to None");
717 goto error;
718 }
719 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
720 i += 3;
721 break;
722 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000723 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000724 "unexpected node in varargslist: %d @ %d",
725 TYPE(ch), i);
726 goto error;
727 }
728 }
729
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000730 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731
732 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000733 Py_XDECREF(vararg);
734 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735 return NULL;
736}
737
738static expr_ty
739ast_for_dotted_name(struct compiling *c, const node *n)
740{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000741 expr_ty e;
742 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000743 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744 int i;
745
746 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000747
748 lineno = LINENO(n);
749 col_offset = n->n_col_offset;
750
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 id = NEW_IDENTIFIER(CHILD(n, 0));
752 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000753 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000754 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757
758 for (i = 2; i < NCH(n); i+=2) {
759 id = NEW_IDENTIFIER(CHILD(n, i));
760 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000761 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000762 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000763 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000764 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 }
766
767 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768}
769
770static expr_ty
771ast_for_decorator(struct compiling *c, const node *n)
772{
773 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
774 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000775 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776
777 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000778 REQ(CHILD(n, 0), AT);
779 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780
781 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
782 if (!name_expr)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000783 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784
785 if (NCH(n) == 3) { /* No arguments */
786 d = name_expr;
787 name_expr = NULL;
788 }
789 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000790 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
791 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000793 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000794 name_expr = NULL;
795 }
796 else {
797 d = ast_for_call(c, CHILD(n, 3), name_expr);
798 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 name_expr = NULL;
801 }
802
803 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804}
805
806static asdl_seq*
807ast_for_decorators(struct compiling *c, const node *n)
808{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000809 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000810 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 int i;
812
813 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000814 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815 if (!decorator_seq)
816 return NULL;
817
818 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000819 d = ast_for_decorator(c, CHILD(n, i));
820 if (!d)
821 return NULL;
822 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823 }
824 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825}
826
827static stmt_ty
828ast_for_funcdef(struct compiling *c, const node *n)
829{
830 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000831 identifier name;
832 arguments_ty args;
833 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 asdl_seq *decorator_seq = NULL;
835 int name_i;
836
837 REQ(n, funcdef);
838
839 if (NCH(n) == 6) { /* decorators are present */
840 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
841 if (!decorator_seq)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000842 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843 name_i = 2;
844 }
845 else {
846 name_i = 1;
847 }
848
849 name = NEW_IDENTIFIER(CHILD(n, name_i));
850 if (!name)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000851 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Neal Norwitze76adcd2005-11-15 05:04:31 +0000853 ast_error(CHILD(n, name_i), "assignment to None");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000854 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000855 }
856 args = ast_for_arguments(c, CHILD(n, name_i + 1));
857 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000858 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 body = ast_for_suite(c, CHILD(n, name_i + 3));
860 if (!body)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000861 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000863 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
864 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865}
866
867static expr_ty
868ast_for_lambdef(struct compiling *c, const node *n)
869{
870 /* lambdef: 'lambda' [varargslist] ':' test */
871 arguments_ty args;
872 expr_ty expression;
873
874 if (NCH(n) == 3) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000875 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 if (!args)
877 return NULL;
878 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000879 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881 }
882 else {
883 args = ast_for_arguments(c, CHILD(n, 1));
884 if (!args)
885 return NULL;
886 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000887 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889 }
890
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000891 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892}
893
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000894static expr_ty
895ast_for_ifexpr(struct compiling *c, const node *n)
896{
897 /* test: or_test 'if' or_test 'else' test */
898 expr_ty expression, body, orelse;
899
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000900 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000901 body = ast_for_expr(c, CHILD(n, 0));
902 if (!body)
903 return NULL;
904 expression = ast_for_expr(c, CHILD(n, 2));
905 if (!expression)
906 return NULL;
907 orelse = ast_for_expr(c, CHILD(n, 4));
908 if (!orelse)
909 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000910 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
911 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000912}
913
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914/* Count the number of 'for' loop in a list comprehension.
915
916 Helper for ast_for_listcomp().
917*/
918
919static int
920count_list_fors(const node *n)
921{
922 int n_fors = 0;
923 node *ch = CHILD(n, 1);
924
925 count_list_for:
926 n_fors++;
927 REQ(ch, list_for);
928 if (NCH(ch) == 5)
929 ch = CHILD(ch, 4);
930 else
931 return n_fors;
932 count_list_iter:
933 REQ(ch, list_iter);
934 ch = CHILD(ch, 0);
935 if (TYPE(ch) == list_for)
936 goto count_list_for;
937 else if (TYPE(ch) == list_if) {
938 if (NCH(ch) == 3) {
939 ch = CHILD(ch, 2);
940 goto count_list_iter;
941 }
942 else
943 return n_fors;
944 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000945
946 /* Should never be reached */
947 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
948 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949}
950
951/* Count the number of 'if' statements in a list comprehension.
952
953 Helper for ast_for_listcomp().
954*/
955
956static int
957count_list_ifs(const node *n)
958{
959 int n_ifs = 0;
960
961 count_list_iter:
962 REQ(n, list_iter);
963 if (TYPE(CHILD(n, 0)) == list_for)
964 return n_ifs;
965 n = CHILD(n, 0);
966 REQ(n, list_if);
967 n_ifs++;
968 if (NCH(n) == 2)
969 return n_ifs;
970 n = CHILD(n, 2);
971 goto count_list_iter;
972}
973
974static expr_ty
975ast_for_listcomp(struct compiling *c, const node *n)
976{
977 /* listmaker: test ( list_for | (',' test)* [','] )
978 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
979 list_iter: list_for | list_if
980 list_if: 'if' test [list_iter]
981 testlist_safe: test [(',' test)+ [',']]
982 */
983 expr_ty elt;
984 asdl_seq *listcomps;
985 int i, n_fors;
986 node *ch;
987
988 REQ(n, listmaker);
989 assert(NCH(n) > 1);
990
991 elt = ast_for_expr(c, CHILD(n, 0));
992 if (!elt)
993 return NULL;
994
995 n_fors = count_list_fors(n);
996 if (n_fors == -1)
997 return NULL;
998
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000999 listcomps = asdl_seq_new(n_fors, c->c_arena);
1000 if (!listcomps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001002
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 ch = CHILD(n, 1);
1004 for (i = 0; i < n_fors; i++) {
1005 comprehension_ty lc;
1006 asdl_seq *t;
1007 expr_ty expression;
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001008 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009
1010 REQ(ch, list_for);
1011
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001012 for_ch = CHILD(ch, 1);
1013 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001014 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001016 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001017 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001020 /* Check the # of children rather than the length of t, since
1021 [x for x, in ... ] has 1 element in t, but still requires a Tuple. */
1022 if (NCH(for_ch) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001023 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001024 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001026 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1027 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001028 expression, NULL, c->c_arena);
1029 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031
1032 if (NCH(ch) == 5) {
1033 int j, n_ifs;
1034 asdl_seq *ifs;
1035
1036 ch = CHILD(ch, 4);
1037 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001038 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001041 ifs = asdl_seq_new(n_ifs, c->c_arena);
1042 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044
1045 for (j = 0; j < n_ifs; j++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001046 REQ(ch, list_iter);
1047 ch = CHILD(ch, 0);
1048 REQ(ch, list_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049
Jeremy Hyltona8293132006-02-28 17:58:27 +00001050 asdl_seq_SET(ifs, j, ast_for_expr(c, CHILD(ch, 1)));
1051 if (NCH(ch) == 3)
1052 ch = CHILD(ch, 2);
1053 }
1054 /* on exit, must guarantee that ch is a list_for */
1055 if (TYPE(ch) == list_iter)
1056 ch = CHILD(ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057 lc->ifs = ifs;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001058 }
1059 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060 }
1061
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001062 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063}
1064
1065/*
1066 Count the number of 'for' loops in a generator expression.
1067
1068 Helper for ast_for_genexp().
1069*/
1070
1071static int
1072count_gen_fors(const node *n)
1073{
1074 int n_fors = 0;
1075 node *ch = CHILD(n, 1);
1076
1077 count_gen_for:
1078 n_fors++;
1079 REQ(ch, gen_for);
1080 if (NCH(ch) == 5)
1081 ch = CHILD(ch, 4);
1082 else
1083 return n_fors;
1084 count_gen_iter:
1085 REQ(ch, gen_iter);
1086 ch = CHILD(ch, 0);
1087 if (TYPE(ch) == gen_for)
1088 goto count_gen_for;
1089 else if (TYPE(ch) == gen_if) {
1090 if (NCH(ch) == 3) {
1091 ch = CHILD(ch, 2);
1092 goto count_gen_iter;
1093 }
1094 else
1095 return n_fors;
1096 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001097
1098 /* Should never be reached */
1099 PyErr_SetString(PyExc_SystemError,
1100 "logic error in count_gen_fors");
1101 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102}
1103
1104/* Count the number of 'if' statements in a generator expression.
1105
1106 Helper for ast_for_genexp().
1107*/
1108
1109static int
1110count_gen_ifs(const node *n)
1111{
1112 int n_ifs = 0;
1113
1114 while (1) {
1115 REQ(n, gen_iter);
1116 if (TYPE(CHILD(n, 0)) == gen_for)
1117 return n_ifs;
1118 n = CHILD(n, 0);
1119 REQ(n, gen_if);
1120 n_ifs++;
1121 if (NCH(n) == 2)
1122 return n_ifs;
1123 n = CHILD(n, 2);
1124 }
1125}
1126
Jeremy Hyltona8293132006-02-28 17:58:27 +00001127/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128static expr_ty
1129ast_for_genexp(struct compiling *c, const node *n)
1130{
1131 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1132 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1133 expr_ty elt;
1134 asdl_seq *genexps;
1135 int i, n_fors;
1136 node *ch;
1137
1138 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1139 assert(NCH(n) > 1);
1140
1141 elt = ast_for_expr(c, CHILD(n, 0));
1142 if (!elt)
1143 return NULL;
1144
1145 n_fors = count_gen_fors(n);
1146 if (n_fors == -1)
1147 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001148
1149 genexps = asdl_seq_new(n_fors, c->c_arena);
1150 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 ch = CHILD(n, 1);
1154 for (i = 0; i < n_fors; i++) {
1155 comprehension_ty ge;
1156 asdl_seq *t;
1157 expr_ty expression;
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001158 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159
1160 REQ(ch, gen_for);
1161
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001162 for_ch = CHILD(ch, 1);
1163 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001164 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001166 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001169
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001170 /* Check the # of children rather than the length of t, since
1171 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1172 if (NCH(for_ch) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001173 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001174 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001176 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1177 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001178 expression, NULL, c->c_arena);
1179
1180 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 if (NCH(ch) == 5) {
1184 int j, n_ifs;
1185 asdl_seq *ifs;
1186
1187 ch = CHILD(ch, 4);
1188 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001189 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001191
1192 ifs = asdl_seq_new(n_ifs, c->c_arena);
1193 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001195
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 for (j = 0; j < n_ifs; j++) {
1197 REQ(ch, gen_iter);
1198 ch = CHILD(ch, 0);
1199 REQ(ch, gen_if);
1200
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001201 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001203 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001204 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 if (NCH(ch) == 3)
1206 ch = CHILD(ch, 2);
1207 }
1208 /* on exit, must guarantee that ch is a gen_for */
1209 if (TYPE(ch) == gen_iter)
1210 ch = CHILD(ch, 0);
1211 ge->ifs = ifs;
1212 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00001213 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 }
1215
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001216 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217}
1218
1219static expr_ty
1220ast_for_atom(struct compiling *c, const node *n)
1221{
1222 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1223 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1224 */
1225 node *ch = CHILD(n, 0);
1226
1227 switch (TYPE(ch)) {
1228 case NAME:
1229 /* All names start in Load context, but may later be
1230 changed. */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001231 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232 case STRING: {
1233 PyObject *str = parsestrplus(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 if (!str)
1235 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001236
1237 PyArena_AddPyObject(c->c_arena, str);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001238 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239 }
1240 case NUMBER: {
1241 PyObject *pynum = parsenumber(STR(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001242 if (!pynum)
1243 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001244
1245 PyArena_AddPyObject(c->c_arena, pynum);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001246 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 }
1248 case LPAR: /* some parenthesized expressions */
1249 ch = CHILD(n, 1);
1250
1251 if (TYPE(ch) == RPAR)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001252 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253
1254 if (TYPE(ch) == yield_expr)
1255 return ast_for_expr(c, ch);
1256
1257 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1258 return ast_for_genexp(c, ch);
1259
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001260 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 case LSQB: /* list (or list comprehension) */
1262 ch = CHILD(n, 1);
1263
1264 if (TYPE(ch) == RSQB)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001265 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266
1267 REQ(ch, listmaker);
1268 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1269 asdl_seq *elts = seq_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001270 if (!elts)
1271 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001272
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001273 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274 }
1275 else
1276 return ast_for_listcomp(c, ch);
1277 case LBRACE: {
1278 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1279 int i, size;
1280 asdl_seq *keys, *values;
1281
1282 ch = CHILD(n, 1);
1283 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001284 keys = asdl_seq_new(size, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285 if (!keys)
1286 return NULL;
1287
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001288 values = asdl_seq_new(size, c->c_arena);
1289 if (!values)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291
1292 for (i = 0; i < NCH(ch); i += 4) {
1293 expr_ty expression;
1294
1295 expression = ast_for_expr(c, CHILD(ch, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001296 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001298
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001300
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301 expression = ast_for_expr(c, CHILD(ch, i + 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001302 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001304
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 asdl_seq_SET(values, i / 4, expression);
1306 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001307 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 }
1309 case BACKQUOTE: { /* repr */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001310 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311 if (!expression)
1312 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001313
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001314 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315 }
1316 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001317 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 return NULL;
1319 }
1320}
1321
1322static slice_ty
1323ast_for_slice(struct compiling *c, const node *n)
1324{
1325 node *ch;
1326 expr_ty lower = NULL, upper = NULL, step = NULL;
1327
1328 REQ(n, subscript);
1329
1330 /*
1331 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1332 sliceop: ':' [test]
1333 */
1334 ch = CHILD(n, 0);
1335 if (TYPE(ch) == DOT)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001336 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337
1338 if (NCH(n) == 1 && TYPE(ch) == test) {
1339 /* 'step' variable hold no significance in terms of being used over
1340 other vars */
1341 step = ast_for_expr(c, ch);
1342 if (!step)
1343 return NULL;
1344
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001345 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346 }
1347
1348 if (TYPE(ch) == test) {
1349 lower = ast_for_expr(c, ch);
1350 if (!lower)
1351 return NULL;
1352 }
1353
1354 /* If there's an upper bound it's in the second or third position. */
1355 if (TYPE(ch) == COLON) {
1356 if (NCH(n) > 1) {
1357 node *n2 = CHILD(n, 1);
1358
1359 if (TYPE(n2) == test) {
1360 upper = ast_for_expr(c, n2);
1361 if (!upper)
1362 return NULL;
1363 }
1364 }
1365 } else if (NCH(n) > 2) {
1366 node *n2 = CHILD(n, 2);
1367
1368 if (TYPE(n2) == test) {
1369 upper = ast_for_expr(c, n2);
1370 if (!upper)
1371 return NULL;
1372 }
1373 }
1374
1375 ch = CHILD(n, NCH(n) - 1);
1376 if (TYPE(ch) == sliceop) {
Nick Coghlan77858682006-03-17 17:59:10 +00001377 if (NCH(ch) == 1) {
1378 /* No expression, so step is None */
1379 ch = CHILD(ch, 0);
1380 step = Name(new_identifier("None", c->c_arena), Load,
1381 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382 if (!step)
1383 return NULL;
Nick Coghlan77858682006-03-17 17:59:10 +00001384 } else {
1385 ch = CHILD(ch, 1);
1386 if (TYPE(ch) == test) {
1387 step = ast_for_expr(c, ch);
1388 if (!step)
1389 return NULL;
1390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391 }
1392 }
1393
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001394 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395}
1396
1397static expr_ty
1398ast_for_binop(struct compiling *c, const node *n)
1399{
1400 /* Must account for a sequence of expressions.
1401 How should A op B op C by represented?
1402 BinOp(BinOp(A, op, B), op, C).
1403 */
1404
1405 int i, nops;
1406 expr_ty expr1, expr2, result;
Anthony Baxtera863d332006-04-11 07:43:46 +00001407 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408
1409 expr1 = ast_for_expr(c, CHILD(n, 0));
1410 if (!expr1)
1411 return NULL;
1412
1413 expr2 = ast_for_expr(c, CHILD(n, 2));
1414 if (!expr2)
1415 return NULL;
1416
Anthony Baxtera863d332006-04-11 07:43:46 +00001417 newoperator = get_operator(CHILD(n, 1));
1418 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 return NULL;
1420
Anthony Baxtera863d332006-04-11 07:43:46 +00001421 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001422 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423 if (!result)
1424 return NULL;
1425
1426 nops = (NCH(n) - 1) / 2;
1427 for (i = 1; i < nops; i++) {
1428 expr_ty tmp_result, tmp;
1429 const node* next_oper = CHILD(n, i * 2 + 1);
1430
Anthony Baxtera863d332006-04-11 07:43:46 +00001431 newoperator = get_operator(next_oper);
1432 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433 return NULL;
1434
1435 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1436 if (!tmp)
1437 return NULL;
1438
Anthony Baxtera863d332006-04-11 07:43:46 +00001439 tmp_result = BinOp(result, newoperator, tmp,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001440 LINENO(next_oper), next_oper->n_col_offset,
1441 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442 if (!tmp)
1443 return NULL;
1444 result = tmp_result;
1445 }
1446 return result;
1447}
1448
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001449static expr_ty
1450ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1451{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001452 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1453 subscriptlist: subscript (',' subscript)* [',']
1454 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1455 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001456 REQ(n, trailer);
1457 if (TYPE(CHILD(n, 0)) == LPAR) {
1458 if (NCH(n) == 2)
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001459 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1460 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001461 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001462 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001463 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001464 else if (TYPE(CHILD(n, 0)) == DOT ) {
1465 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001466 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001467 }
1468 else {
1469 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001470 REQ(CHILD(n, 2), RSQB);
1471 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001472 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001473 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1474 if (!slc)
1475 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001476 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1477 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001478 }
1479 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001480 /* The grammar is ambiguous here. The ambiguity is resolved
1481 by treating the sequence as a tuple literal if there are
1482 no slice features.
1483 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001484 int j;
1485 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001486 expr_ty e;
Thomas Wouters65b3dab2006-03-01 22:06:23 +00001487 bool simple = true;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001488 asdl_seq *slices, *elts;
1489 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001490 if (!slices)
1491 return NULL;
1492 for (j = 0; j < NCH(n); j += 2) {
1493 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001494 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001495 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001496 if (slc->kind != Index_kind)
1497 simple = false;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001498 asdl_seq_SET(slices, j / 2, slc);
1499 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001500 if (!simple) {
1501 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001502 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001503 }
1504 /* extract Index values and put them in a Tuple */
1505 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001506 if (!elts)
1507 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001508 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1509 slc = (slice_ty)asdl_seq_GET(slices, j);
1510 assert(slc->kind == Index_kind && slc->v.Index.value);
1511 asdl_seq_SET(elts, j, slc->v.Index.value);
1512 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001513 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001514 if (!e)
1515 return NULL;
1516 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001517 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001518 }
1519 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001520}
1521
1522static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001523ast_for_factor(struct compiling *c, const node *n)
1524{
1525 node *pfactor, *ppower, *patom, *pnum;
1526 expr_ty expression;
1527
1528 /* If the unary - operator is applied to a constant, don't generate
1529 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1530 constant. The peephole optimizer already does something like
1531 this but it doesn't handle the case where the constant is
1532 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1533 PyLongObject.
1534 */
1535 if (TYPE(CHILD(n, 0)) == MINUS
1536 && NCH(n) == 2
1537 && TYPE((pfactor = CHILD(n, 1))) == factor
1538 && NCH(pfactor) == 1
1539 && TYPE((ppower = CHILD(pfactor, 0))) == power
1540 && NCH(ppower) == 1
1541 && TYPE((patom = CHILD(ppower, 0))) == atom
1542 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1543 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1544 if (s == NULL)
1545 return NULL;
1546 s[0] = '-';
1547 strcpy(s + 1, STR(pnum));
1548 PyObject_FREE(STR(pnum));
1549 STR(pnum) = s;
1550 return ast_for_atom(c, patom);
1551 }
1552
1553 expression = ast_for_expr(c, CHILD(n, 1));
1554 if (!expression)
1555 return NULL;
1556
1557 switch (TYPE(CHILD(n, 0))) {
1558 case PLUS:
1559 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1560 c->c_arena);
1561 case MINUS:
1562 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1563 c->c_arena);
1564 case TILDE:
1565 return UnaryOp(Invert, expression, LINENO(n),
1566 n->n_col_offset, c->c_arena);
1567 }
1568 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1569 TYPE(CHILD(n, 0)));
1570 return NULL;
1571}
1572
1573static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001574ast_for_power(struct compiling *c, const node *n)
1575{
1576 /* power: atom trailer* ('**' factor)*
1577 */
1578 int i;
1579 expr_ty e, tmp;
1580 REQ(n, power);
1581 e = ast_for_atom(c, CHILD(n, 0));
1582 if (!e)
1583 return NULL;
1584 if (NCH(n) == 1)
1585 return e;
1586 for (i = 1; i < NCH(n); i++) {
1587 node *ch = CHILD(n, i);
1588 if (TYPE(ch) != trailer)
1589 break;
1590 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001591 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001592 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001593 tmp->lineno = e->lineno;
1594 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001595 e = tmp;
1596 }
1597 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1598 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001599 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001601 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001602 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001603 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001604 e = tmp;
1605 }
1606 return e;
1607}
1608
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609/* Do not name a variable 'expr'! Will cause a compile error.
1610*/
1611
1612static expr_ty
1613ast_for_expr(struct compiling *c, const node *n)
1614{
1615 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001616 test: or_test ['if' or_test 'else' test] | lambdef
1617 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618 and_test: not_test ('and' not_test)*
1619 not_test: 'not' not_test | comparison
1620 comparison: expr (comp_op expr)*
1621 expr: xor_expr ('|' xor_expr)*
1622 xor_expr: and_expr ('^' and_expr)*
1623 and_expr: shift_expr ('&' shift_expr)*
1624 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1625 arith_expr: term (('+'|'-') term)*
1626 term: factor (('*'|'/'|'%'|'//') factor)*
1627 factor: ('+'|'-'|'~') factor | power
1628 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001629
1630 As well as modified versions that exist for backward compatibility,
1631 to explicitly allow:
1632 [ x for x in lambda: 0, lambda: 1 ]
1633 (which would be ambiguous without these extra rules)
1634
1635 old_test: or_test | old_lambdef
1636 old_lambdef: 'lambda' [vararglist] ':' old_test
1637
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638 */
1639
1640 asdl_seq *seq;
1641 int i;
1642
1643 loop:
1644 switch (TYPE(n)) {
1645 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001646 case old_test:
1647 if (TYPE(CHILD(n, 0)) == lambdef ||
1648 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001650 else if (NCH(n) > 1)
1651 return ast_for_ifexpr(c, n);
1652 /* Fallthrough */
1653 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654 case and_test:
1655 if (NCH(n) == 1) {
1656 n = CHILD(n, 0);
1657 goto loop;
1658 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001659 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 if (!seq)
1661 return NULL;
1662 for (i = 0; i < NCH(n); i += 2) {
1663 expr_ty e = ast_for_expr(c, CHILD(n, i));
1664 if (!e)
1665 return NULL;
1666 asdl_seq_SET(seq, i / 2, e);
1667 }
1668 if (!strcmp(STR(CHILD(n, 1)), "and"))
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001669 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1670 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001671 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001672 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673 case not_test:
1674 if (NCH(n) == 1) {
1675 n = CHILD(n, 0);
1676 goto loop;
1677 }
1678 else {
1679 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1680 if (!expression)
1681 return NULL;
1682
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001683 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1684 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685 }
1686 case comparison:
1687 if (NCH(n) == 1) {
1688 n = CHILD(n, 0);
1689 goto loop;
1690 }
1691 else {
1692 expr_ty expression;
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001693 asdl_int_seq *ops;
1694 asdl_seq *cmps;
1695 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001696 if (!ops)
1697 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001698 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 return NULL;
1701 }
1702 for (i = 1; i < NCH(n); i += 2) {
Anthony Baxtera863d332006-04-11 07:43:46 +00001703 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704
Anthony Baxtera863d332006-04-11 07:43:46 +00001705 newoperator = ast_for_comp_op(CHILD(n, i));
1706 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001707 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001708 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709
1710 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001711 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001713 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001715 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716 asdl_seq_SET(cmps, i / 2, expression);
1717 }
1718 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001719 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001721 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001723 return Compare(expression, ops, cmps, LINENO(n),
1724 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725 }
1726 break;
1727
1728 /* The next five cases all handle BinOps. The main body of code
1729 is the same in each case, but the switch turned inside out to
1730 reuse the code for each type of operator.
1731 */
1732 case expr:
1733 case xor_expr:
1734 case and_expr:
1735 case shift_expr:
1736 case arith_expr:
1737 case term:
1738 if (NCH(n) == 1) {
1739 n = CHILD(n, 0);
1740 goto loop;
1741 }
1742 return ast_for_binop(c, n);
1743 case yield_expr: {
1744 expr_ty exp = NULL;
1745 if (NCH(n) == 2) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001746 exp = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 if (!exp)
1748 return NULL;
1749 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001750 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001751 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001752 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 if (NCH(n) == 1) {
1754 n = CHILD(n, 0);
1755 goto loop;
1756 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001757 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001758 case power:
1759 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001761 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762 return NULL;
1763 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001764 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001765 return NULL;
1766}
1767
1768static expr_ty
1769ast_for_call(struct compiling *c, const node *n, expr_ty func)
1770{
1771 /*
1772 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1773 | '**' test)
1774 argument: [test '='] test [gen_for] # Really [keyword '='] test
1775 */
1776
1777 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001778 asdl_seq *args;
1779 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 expr_ty vararg = NULL, kwarg = NULL;
1781
1782 REQ(n, arglist);
1783
1784 nargs = 0;
1785 nkeywords = 0;
1786 ngens = 0;
1787 for (i = 0; i < NCH(n); i++) {
1788 node *ch = CHILD(n, i);
1789 if (TYPE(ch) == argument) {
1790 if (NCH(ch) == 1)
1791 nargs++;
1792 else if (TYPE(CHILD(ch, 1)) == gen_for)
1793 ngens++;
1794 else
1795 nkeywords++;
1796 }
1797 }
1798 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001799 ast_error(n, "Generator expression must be parenthesized "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 "if not sole argument");
1801 return NULL;
1802 }
1803
1804 if (nargs + nkeywords + ngens > 255) {
1805 ast_error(n, "more than 255 arguments");
1806 return NULL;
1807 }
1808
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001809 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001811 return NULL;
1812 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001814 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001815 nargs = 0;
1816 nkeywords = 0;
1817 for (i = 0; i < NCH(n); i++) {
1818 node *ch = CHILD(n, i);
1819 if (TYPE(ch) == argument) {
1820 expr_ty e;
1821 if (NCH(ch) == 1) {
Neal Norwitz5ef92242006-05-19 06:43:50 +00001822 if (nkeywords) {
1823 ast_error(CHILD(ch, 0),
1824 "non-keyword arg after keyword arg");
1825 return NULL;
1826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 e = ast_for_expr(c, CHILD(ch, 0));
1828 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001829 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 asdl_seq_SET(args, nargs++, e);
1831 }
1832 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1833 e = ast_for_genexp(c, ch);
1834 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001835 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 asdl_seq_SET(args, nargs++, e);
1837 }
1838 else {
1839 keyword_ty kw;
1840 identifier key;
1841
1842 /* CHILD(ch, 0) is test, but must be an identifier? */
1843 e = ast_for_expr(c, CHILD(ch, 0));
1844 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001845 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 /* f(lambda x: x[0] = 3) ends up getting parsed with
1847 * LHS test = lambda x: x[0], and RHS test = 3.
1848 * SF bug 132313 points out that complaining about a keyword
1849 * then is very confusing.
1850 */
1851 if (e->kind == Lambda_kind) {
1852 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001853 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 } else if (e->kind != Name_kind) {
1855 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001856 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857 }
1858 key = e->v.Name.id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 e = ast_for_expr(c, CHILD(ch, 2));
1860 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001861 return NULL;
1862 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001864 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 asdl_seq_SET(keywords, nkeywords++, kw);
1866 }
1867 }
1868 else if (TYPE(ch) == STAR) {
1869 vararg = ast_for_expr(c, CHILD(n, i+1));
1870 i++;
1871 }
1872 else if (TYPE(ch) == DOUBLESTAR) {
1873 kwarg = ast_for_expr(c, CHILD(n, i+1));
1874 i++;
1875 }
1876 }
1877
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001878 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879}
1880
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001882ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001884 /* testlist_gexp: test (',' test)* [','] */
1885 /* testlist: test (',' test)* [','] */
1886 /* testlist_safe: test (',' test)+ [','] */
1887 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001889 if (TYPE(n) == testlist_gexp) {
1890 if (NCH(n) > 1)
1891 assert(TYPE(CHILD(n, 1)) != gen_for);
1892 }
1893 else {
1894 assert(TYPE(n) == testlist ||
1895 TYPE(n) == testlist_safe ||
1896 TYPE(n) == testlist1);
1897 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 if (NCH(n) == 1)
1899 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 else {
1901 asdl_seq *tmp = seq_for_testlist(c, n);
1902 if (!tmp)
1903 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001904 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001906}
1907
1908static expr_ty
1909ast_for_testlist_gexp(struct compiling *c, const node* n)
1910{
1911 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1912 /* argument: test [ gen_for ] */
1913 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001914 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001915 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001916 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001917}
1918
1919/* like ast_for_testlist() but returns a sequence */
1920static asdl_seq*
1921ast_for_class_bases(struct compiling *c, const node* n)
1922{
1923 /* testlist: test (',' test)* [','] */
1924 assert(NCH(n) > 0);
1925 REQ(n, testlist);
1926 if (NCH(n) == 1) {
1927 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001928 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001929 if (!bases)
1930 return NULL;
1931 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001932 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001933 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001934 asdl_seq_SET(bases, 0, base);
1935 return bases;
1936 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001937
1938 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939}
1940
1941static stmt_ty
1942ast_for_expr_stmt(struct compiling *c, const node *n)
1943{
1944 REQ(n, expr_stmt);
1945 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1946 | ('=' (yield_expr|testlist))*)
1947 testlist: test (',' test)* [',']
1948 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
1949 | '<<=' | '>>=' | '**=' | '//='
1950 test: ... here starts the operator precendence dance
1951 */
1952
1953 if (NCH(n) == 1) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001954 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955 if (!e)
1956 return NULL;
1957
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001958 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 }
1960 else if (TYPE(CHILD(n, 1)) == augassign) {
1961 expr_ty expr1, expr2;
Anthony Baxtera863d332006-04-11 07:43:46 +00001962 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 node *ch = CHILD(n, 0);
1964
Neal Norwitz0d62a062006-07-30 06:53:31 +00001965 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 if (!expr1)
1967 return NULL;
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001968 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001969 switch (expr1->kind) {
1970 case GeneratorExp_kind:
1971 ast_error(ch, "augmented assignment to generator "
1972 "expression not possible");
1973 return NULL;
Neal Norwitz0d62a062006-07-30 06:53:31 +00001974 case Yield_kind:
1975 ast_error(ch, "augmented assignment to yield "
1976 "expression not possible");
1977 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001978 case Name_kind: {
1979 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1980 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1981 ast_error(ch, "assignment to None");
1982 return NULL;
1983 }
1984 break;
1985 }
1986 case Attribute_kind:
1987 case Subscript_kind:
1988 break;
1989 default:
1990 ast_error(ch, "illegal expression for augmented "
1991 "assignment");
1992 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 }
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001994 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995
1996 ch = CHILD(n, 2);
1997 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001998 expr2 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 else
Neal Norwitz0d62a062006-07-30 06:53:31 +00002000 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002001 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 return NULL;
2003
Anthony Baxtera863d332006-04-11 07:43:46 +00002004 newoperator = ast_for_augassign(CHILD(n, 1));
2005 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 return NULL;
2007
Anthony Baxtera863d332006-04-11 07:43:46 +00002008 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 }
2010 else {
2011 int i;
2012 asdl_seq *targets;
2013 node *value;
2014 expr_ty expression;
2015
2016 /* a normal assignment */
2017 REQ(CHILD(n, 1), EQUAL);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002018 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 if (!targets)
2020 return NULL;
2021 for (i = 0; i < NCH(n) - 2; i += 2) {
Armin Rigo31441302005-10-21 12:57:31 +00002022 expr_ty e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 node *ch = CHILD(n, i);
2024 if (TYPE(ch) == yield_expr) {
2025 ast_error(ch, "assignment to yield expression not possible");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002026 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002028 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029
2030 /* set context to assign */
2031 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033
Neal Norwitz84456bd2005-12-18 03:16:20 +00002034 if (!set_context(e, Store, CHILD(n, i)))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002035 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036
2037 asdl_seq_SET(targets, i / 2, e);
2038 }
2039 value = CHILD(n, NCH(n) - 1);
2040 if (TYPE(value) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002041 expression = ast_for_testlist(c, value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 else
2043 expression = ast_for_expr(c, value);
2044 if (!expression)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002045 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002046 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048}
2049
2050static stmt_ty
2051ast_for_print_stmt(struct compiling *c, const node *n)
2052{
2053 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2054 | '>>' test [ (',' test)+ [','] ] )
2055 */
2056 expr_ty dest = NULL, expression;
2057 asdl_seq *seq;
2058 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002059 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060
2061 REQ(n, print_stmt);
2062 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2063 dest = ast_for_expr(c, CHILD(n, 2));
2064 if (!dest)
2065 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002066 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002068 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 if (!seq)
Jeremy Hyltona8293132006-02-28 17:58:27 +00002070 return NULL;
2071 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002073 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002075 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 }
2077 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002078 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079}
2080
2081static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002082ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083{
2084 asdl_seq *seq;
2085 int i;
2086 expr_ty e;
2087
2088 REQ(n, exprlist);
2089
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002090 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 if (!seq)
2092 return NULL;
2093 for (i = 0; i < NCH(n); i += 2) {
2094 e = ast_for_expr(c, CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002095 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002096 return NULL;
Neal Norwitz6b347892005-11-15 07:17:53 +00002097 asdl_seq_SET(seq, i / 2, e);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002098 if (context && !set_context(e, context, CHILD(n, i)))
2099 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 }
2101 return seq;
2102}
2103
2104static stmt_ty
2105ast_for_del_stmt(struct compiling *c, const node *n)
2106{
2107 asdl_seq *expr_list;
2108
2109 /* del_stmt: 'del' exprlist */
2110 REQ(n, del_stmt);
2111
2112 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2113 if (!expr_list)
2114 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002115 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116}
2117
2118static stmt_ty
2119ast_for_flow_stmt(struct compiling *c, const node *n)
2120{
2121 /*
2122 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2123 | yield_stmt
2124 break_stmt: 'break'
2125 continue_stmt: 'continue'
2126 return_stmt: 'return' [testlist]
2127 yield_stmt: yield_expr
2128 yield_expr: 'yield' testlist
2129 raise_stmt: 'raise' [test [',' test [',' test]]]
2130 */
2131 node *ch;
2132
2133 REQ(n, flow_stmt);
2134 ch = CHILD(n, 0);
2135 switch (TYPE(ch)) {
2136 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002137 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002139 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 case yield_stmt: { /* will reduce to yield_expr */
2141 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2142 if (!exp)
2143 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002144 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 }
2146 case return_stmt:
2147 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002148 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002150 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 if (!expression)
2152 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002153 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 }
2155 case raise_stmt:
2156 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002157 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 else if (NCH(ch) == 2) {
2159 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2160 if (!expression)
2161 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002162 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 }
2164 else if (NCH(ch) == 4) {
2165 expr_ty expr1, expr2;
2166
2167 expr1 = ast_for_expr(c, CHILD(ch, 1));
2168 if (!expr1)
2169 return NULL;
2170 expr2 = ast_for_expr(c, CHILD(ch, 3));
2171 if (!expr2)
2172 return NULL;
2173
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002174 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002175 }
2176 else if (NCH(ch) == 6) {
2177 expr_ty expr1, expr2, expr3;
2178
2179 expr1 = ast_for_expr(c, CHILD(ch, 1));
2180 if (!expr1)
2181 return NULL;
2182 expr2 = ast_for_expr(c, CHILD(ch, 3));
2183 if (!expr2)
2184 return NULL;
2185 expr3 = ast_for_expr(c, CHILD(ch, 5));
2186 if (!expr3)
2187 return NULL;
2188
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002189 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 }
2191 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002192 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 "unexpected flow_stmt: %d", TYPE(ch));
2194 return NULL;
2195 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002196
2197 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2198 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199}
2200
2201static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002202alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203{
2204 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002205 import_as_name: NAME ['as' NAME]
2206 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 dotted_name: NAME ('.' NAME)*
2208 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002209 PyObject *str;
2210
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211 loop:
2212 switch (TYPE(n)) {
2213 case import_as_name:
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002214 str = NULL;
2215 if (NCH(n) == 3) {
2216 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2217 ast_error(n, "must use 'as' in import");
2218 return NULL;
2219 }
2220 str = NEW_IDENTIFIER(CHILD(n, 2));
2221 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002222 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 case dotted_as_name:
2224 if (NCH(n) == 1) {
2225 n = CHILD(n, 0);
2226 goto loop;
2227 }
2228 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002229 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +00002230 if (!a)
2231 return NULL;
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002232 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2233 ast_error(n, "must use 'as' in import");
2234 return NULL;
2235 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 assert(!a->asname);
2237 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2238 return a;
2239 }
2240 break;
2241 case dotted_name:
2242 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002243 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 else {
2245 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002246 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002247 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 char *s;
2249
2250 len = 0;
2251 for (i = 0; i < NCH(n); i += 2)
2252 /* length of string plus one for the dot */
2253 len += strlen(STR(CHILD(n, i))) + 1;
2254 len--; /* the last name doesn't have a dot */
2255 str = PyString_FromStringAndSize(NULL, len);
2256 if (!str)
2257 return NULL;
2258 s = PyString_AS_STRING(str);
2259 if (!s)
2260 return NULL;
2261 for (i = 0; i < NCH(n); i += 2) {
2262 char *sch = STR(CHILD(n, i));
2263 strcpy(s, STR(CHILD(n, i)));
2264 s += strlen(sch);
2265 *s++ = '.';
2266 }
2267 --s;
2268 *s = '\0';
2269 PyString_InternInPlace(&str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002270 PyArena_AddPyObject(c->c_arena, str);
2271 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 }
2273 break;
2274 case STAR:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002275 str = PyString_InternFromString("*");
2276 PyArena_AddPyObject(c->c_arena, str);
2277 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002279 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 "unexpected import name: %d", TYPE(n));
2281 return NULL;
2282 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002283
2284 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 return NULL;
2286}
2287
2288static stmt_ty
2289ast_for_import_stmt(struct compiling *c, const node *n)
2290{
2291 /*
2292 import_stmt: import_name | import_from
2293 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002294 import_from: 'from' ('.'* dotted_name | '.') 'import'
2295 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002297 int lineno;
2298 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 int i;
2300 asdl_seq *aliases;
2301
2302 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002303 lineno = LINENO(n);
2304 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002306 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 n = CHILD(n, 1);
Neil Schemenauer147b7592005-10-23 03:38:19 +00002308 REQ(n, dotted_as_names);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002309 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 if (!aliases)
2311 return NULL;
2312 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002313 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002314 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 asdl_seq_SET(aliases, i / 2, import_alias);
2317 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002318 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002320 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 int n_children;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002322 int idx, ndots = 0;
2323 alias_ty mod = NULL;
2324 identifier modname;
2325
2326 /* Count the number of dots (for relative imports) and check for the
2327 optional module name */
2328 for (idx = 1; idx < NCH(n); idx++) {
2329 if (TYPE(CHILD(n, idx)) == dotted_name) {
2330 mod = alias_for_import_name(c, CHILD(n, idx));
2331 idx++;
2332 break;
2333 } else if (TYPE(CHILD(n, idx)) != DOT) {
2334 break;
2335 }
2336 ndots++;
2337 }
2338 idx++; /* skip over the 'import' keyword */
2339 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002340 case STAR:
2341 /* from ... import * */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002342 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002343 n_children = 1;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002344 if (ndots) {
2345 ast_error(n, "'import *' not allowed with 'from .'");
2346 return NULL;
2347 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002348 break;
2349 case LPAR:
2350 /* from ... import (x, y, z) */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002351 n = CHILD(n, idx + 1);
Thomas Wouters106203c2006-02-27 17:05:19 +00002352 n_children = NCH(n);
2353 break;
2354 case import_as_names:
2355 /* from ... import x, y, z */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002356 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002357 n_children = NCH(n);
2358 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 ast_error(n, "trailing comma not allowed without"
2360 " surrounding parentheses");
2361 return NULL;
2362 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002363 break;
2364 default:
2365 ast_error(n, "Unexpected node-type in from-import");
2366 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00002367 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002369 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002370 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372
2373 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002374 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002375 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002376 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002378 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002380 else {
2381 for (i = 0; i < NCH(n); i += 2) {
2382 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2383 if (!import_alias)
2384 return NULL;
2385 asdl_seq_SET(aliases, i / 2, import_alias);
2386 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002388 if (mod != NULL)
2389 modname = mod->name;
2390 else
2391 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002392 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002393 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 }
Neal Norwitz79792652005-11-14 04:25:03 +00002395 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 "unknown import statement: starts with command '%s'",
2397 STR(CHILD(n, 0)));
2398 return NULL;
2399}
2400
2401static stmt_ty
2402ast_for_global_stmt(struct compiling *c, const node *n)
2403{
2404 /* global_stmt: 'global' NAME (',' NAME)* */
2405 identifier name;
2406 asdl_seq *s;
2407 int i;
2408
2409 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002410 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 if (!s)
2412 return NULL;
2413 for (i = 1; i < NCH(n); i += 2) {
2414 name = NEW_IDENTIFIER(CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002415 if (!name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 asdl_seq_SET(s, i / 2, name);
2418 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002419 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420}
2421
2422static stmt_ty
2423ast_for_exec_stmt(struct compiling *c, const node *n)
2424{
2425 expr_ty expr1, globals = NULL, locals = NULL;
2426 int n_children = NCH(n);
2427 if (n_children != 2 && n_children != 4 && n_children != 6) {
Neal Norwitz79792652005-11-14 04:25:03 +00002428 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 "poorly formed 'exec' statement: %d parts to statement",
2430 n_children);
2431 return NULL;
2432 }
2433
2434 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2435 REQ(n, exec_stmt);
2436 expr1 = ast_for_expr(c, CHILD(n, 1));
2437 if (!expr1)
2438 return NULL;
2439 if (n_children >= 4) {
2440 globals = ast_for_expr(c, CHILD(n, 3));
2441 if (!globals)
2442 return NULL;
2443 }
2444 if (n_children == 6) {
2445 locals = ast_for_expr(c, CHILD(n, 5));
2446 if (!locals)
2447 return NULL;
2448 }
2449
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002450 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451}
2452
2453static stmt_ty
2454ast_for_assert_stmt(struct compiling *c, const node *n)
2455{
2456 /* assert_stmt: 'assert' test [',' test] */
2457 REQ(n, assert_stmt);
2458 if (NCH(n) == 2) {
2459 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2460 if (!expression)
2461 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002462 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 }
2464 else if (NCH(n) == 4) {
2465 expr_ty expr1, expr2;
2466
2467 expr1 = ast_for_expr(c, CHILD(n, 1));
2468 if (!expr1)
2469 return NULL;
2470 expr2 = ast_for_expr(c, CHILD(n, 3));
2471 if (!expr2)
2472 return NULL;
2473
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002474 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 }
Neal Norwitz79792652005-11-14 04:25:03 +00002476 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 "improper number of parts to 'assert' statement: %d",
2478 NCH(n));
2479 return NULL;
2480}
2481
2482static asdl_seq *
2483ast_for_suite(struct compiling *c, const node *n)
2484{
2485 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002486 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 stmt_ty s;
2488 int i, total, num, end, pos = 0;
2489 node *ch;
2490
2491 REQ(n, suite);
2492
2493 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002494 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 if (!seq)
2496 return NULL;
2497 if (TYPE(CHILD(n, 0)) == simple_stmt) {
2498 n = CHILD(n, 0);
2499 /* simple_stmt always ends with a NEWLINE,
2500 and may have a trailing SEMI
2501 */
2502 end = NCH(n) - 1;
2503 if (TYPE(CHILD(n, end - 1)) == SEMI)
2504 end--;
2505 /* loop by 2 to skip semi-colons */
2506 for (i = 0; i < end; i += 2) {
2507 ch = CHILD(n, i);
2508 s = ast_for_stmt(c, ch);
2509 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002510 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 asdl_seq_SET(seq, pos++, s);
2512 }
2513 }
2514 else {
2515 for (i = 2; i < (NCH(n) - 1); i++) {
2516 ch = CHILD(n, i);
2517 REQ(ch, stmt);
2518 num = num_stmts(ch);
2519 if (num == 1) {
2520 /* small_stmt or compound_stmt with only one child */
2521 s = ast_for_stmt(c, ch);
2522 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002523 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 asdl_seq_SET(seq, pos++, s);
2525 }
2526 else {
2527 int j;
2528 ch = CHILD(ch, 0);
2529 REQ(ch, simple_stmt);
2530 for (j = 0; j < NCH(ch); j += 2) {
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002531 /* statement terminates with a semi-colon ';' */
2532 if (NCH(CHILD(ch, j)) == 0) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002533 assert((j + 1) == NCH(ch));
2534 break;
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002535 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 s = ast_for_stmt(c, CHILD(ch, j));
2537 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002538 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539 asdl_seq_SET(seq, pos++, s);
2540 }
2541 }
2542 }
2543 }
2544 assert(pos == seq->size);
2545 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546}
2547
2548static stmt_ty
2549ast_for_if_stmt(struct compiling *c, const node *n)
2550{
2551 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2552 ['else' ':' suite]
2553 */
2554 char *s;
2555
2556 REQ(n, if_stmt);
2557
2558 if (NCH(n) == 4) {
2559 expr_ty expression;
2560 asdl_seq *suite_seq;
2561
2562 expression = ast_for_expr(c, CHILD(n, 1));
2563 if (!expression)
2564 return NULL;
2565 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002566 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567 return NULL;
2568
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002569 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002571
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 s = STR(CHILD(n, 4));
2573 /* s[2], the third character in the string, will be
2574 's' for el_s_e, or
2575 'i' for el_i_f
2576 */
2577 if (s[2] == 's') {
2578 expr_ty expression;
2579 asdl_seq *seq1, *seq2;
2580
2581 expression = ast_for_expr(c, CHILD(n, 1));
2582 if (!expression)
2583 return NULL;
2584 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002585 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 return NULL;
2587 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002588 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 return NULL;
2590
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002591 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 }
2593 else if (s[2] == 'i') {
2594 int i, n_elif, has_else = 0;
2595 asdl_seq *orelse = NULL;
2596 n_elif = NCH(n) - 4;
2597 /* must reference the child n_elif+1 since 'else' token is third,
2598 not fourth, child from the end. */
2599 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2600 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2601 has_else = 1;
2602 n_elif -= 3;
2603 }
2604 n_elif /= 4;
2605
2606 if (has_else) {
2607 expr_ty expression;
2608 asdl_seq *seq1, *seq2;
2609
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002610 orelse = asdl_seq_new(1, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 if (!orelse)
2612 return NULL;
2613 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002614 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002617 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002620 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622
2623 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002624 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002625 c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 /* the just-created orelse handled the last elif */
2627 n_elif--;
2628 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
2630 for (i = 0; i < n_elif; i++) {
2631 int off = 5 + (n_elif - i - 1) * 4;
2632 expr_ty expression;
2633 asdl_seq *suite_seq;
Anthony Baxtera863d332006-04-11 07:43:46 +00002634 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2635 if (!newobj)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 return NULL;
2637 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002638 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002641 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643
Anthony Baxtera863d332006-04-11 07:43:46 +00002644 asdl_seq_SET(newobj, 0,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 If(expression, suite_seq, orelse,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002646 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
Anthony Baxtera863d332006-04-11 07:43:46 +00002647 orelse = newobj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 }
2649 return If(ast_for_expr(c, CHILD(n, 1)),
2650 ast_for_suite(c, CHILD(n, 3)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002651 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002653
2654 PyErr_Format(PyExc_SystemError,
2655 "unexpected token in 'if' statement: %s", s);
2656 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657}
2658
2659static stmt_ty
2660ast_for_while_stmt(struct compiling *c, const node *n)
2661{
2662 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2663 REQ(n, while_stmt);
2664
2665 if (NCH(n) == 4) {
2666 expr_ty expression;
2667 asdl_seq *suite_seq;
2668
2669 expression = ast_for_expr(c, CHILD(n, 1));
2670 if (!expression)
2671 return NULL;
2672 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002673 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002675 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 }
2677 else if (NCH(n) == 7) {
2678 expr_ty expression;
2679 asdl_seq *seq1, *seq2;
2680
2681 expression = ast_for_expr(c, CHILD(n, 1));
2682 if (!expression)
2683 return NULL;
2684 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002685 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 return NULL;
2687 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002688 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 return NULL;
2690
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002691 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693
2694 PyErr_Format(PyExc_SystemError,
2695 "wrong number of tokens for 'while' statement: %d",
2696 NCH(n));
2697 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698}
2699
2700static stmt_ty
2701ast_for_for_stmt(struct compiling *c, const node *n)
2702{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002703 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 expr_ty expression;
2705 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002706 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2708 REQ(n, for_stmt);
2709
2710 if (NCH(n) == 9) {
2711 seq = ast_for_suite(c, CHILD(n, 8));
2712 if (!seq)
2713 return NULL;
2714 }
2715
Neal Norwitzedef2be2006-07-12 05:26:17 +00002716 node_target = CHILD(n, 1);
2717 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002718 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002720 /* Check the # of children rather than the length of _target, since
2721 for x, in ... has 1 element in _target, but still requires a Tuple. */
2722 if (NCH(node_target) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00002723 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 else
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002725 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002727 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002728 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 return NULL;
2730 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002731 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 return NULL;
2733
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002734 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2735 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736}
2737
2738static excepthandler_ty
2739ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2740{
2741 /* except_clause: 'except' [test [',' test]] */
2742 REQ(exc, except_clause);
2743 REQ(body, suite);
2744
2745 if (NCH(exc) == 1) {
2746 asdl_seq *suite_seq = ast_for_suite(c, body);
2747 if (!suite_seq)
2748 return NULL;
2749
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002750 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
2751 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 }
2753 else if (NCH(exc) == 2) {
2754 expr_ty expression;
2755 asdl_seq *suite_seq;
2756
2757 expression = ast_for_expr(c, CHILD(exc, 1));
2758 if (!expression)
2759 return NULL;
2760 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002761 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 return NULL;
2763
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002764 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
2765 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 }
2767 else if (NCH(exc) == 4) {
2768 asdl_seq *suite_seq;
2769 expr_ty expression;
2770 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2771 if (!e)
2772 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002773 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return NULL;
2775 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 return NULL;
2778 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002779 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 return NULL;
2781
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002782 return excepthandler(expression, e, suite_seq, LINENO(exc),
2783 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785
2786 PyErr_Format(PyExc_SystemError,
2787 "wrong number of children for 'except' clause: %d",
2788 NCH(exc));
2789 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790}
2791
2792static stmt_ty
2793ast_for_try_stmt(struct compiling *c, const node *n)
2794{
Neal Norwitzf599f422005-12-17 21:33:47 +00002795 const int nch = NCH(n);
2796 int n_except = (nch - 3)/3;
2797 asdl_seq *body, *orelse = NULL, *finally = NULL;
2798
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 REQ(n, try_stmt);
2800
Neal Norwitzf599f422005-12-17 21:33:47 +00002801 body = ast_for_suite(c, CHILD(n, 2));
2802 if (body == NULL)
2803 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804
Neal Norwitzf599f422005-12-17 21:33:47 +00002805 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2806 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2807 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2808 /* we can assume it's an "else",
2809 because nch >= 9 for try-else-finally and
2810 it would otherwise have a type of except_clause */
2811 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2812 if (orelse == NULL)
2813 return NULL;
2814 n_except--;
2815 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816
Neal Norwitzf599f422005-12-17 21:33:47 +00002817 finally = ast_for_suite(c, CHILD(n, nch - 1));
2818 if (finally == NULL)
2819 return NULL;
2820 n_except--;
2821 }
2822 else {
2823 /* we can assume it's an "else",
2824 otherwise it would have a type of except_clause */
2825 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2826 if (orelse == NULL)
2827 return NULL;
2828 n_except--;
2829 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002831 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002832 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 return NULL;
2834 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002835
2836 if (n_except > 0) {
2837 int i;
2838 stmt_ty except_st;
2839 /* process except statements to create a try ... except */
2840 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2841 if (handlers == NULL)
2842 return NULL;
2843
2844 for (i = 0; i < n_except; i++) {
2845 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2846 CHILD(n, 5 + i * 3));
2847 if (!e)
2848 return NULL;
2849 asdl_seq_SET(handlers, i, e);
2850 }
2851
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002852 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2853 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002854 if (!finally)
2855 return except_st;
2856
2857 /* if a 'finally' is present too, we nest the TryExcept within a
2858 TryFinally to emulate try ... except ... finally */
2859 body = asdl_seq_new(1, c->c_arena);
2860 if (body == NULL)
2861 return NULL;
2862 asdl_seq_SET(body, 0, except_st);
2863 }
2864
2865 /* must be a try ... finally (except clauses are in body, if any exist) */
2866 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002867 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868}
2869
Guido van Rossumc2e20742006-02-27 22:32:47 +00002870static expr_ty
2871ast_for_with_var(struct compiling *c, const node *n)
2872{
2873 REQ(n, with_var);
2874 if (strcmp(STR(CHILD(n, 0)), "as") != 0) {
2875 ast_error(n, "expected \"with [expr] as [var]\"");
2876 return NULL;
2877 }
2878 return ast_for_expr(c, CHILD(n, 1));
2879}
2880
2881/* with_stmt: 'with' test [ with_var ] ':' suite */
2882static stmt_ty
2883ast_for_with_stmt(struct compiling *c, const node *n)
2884{
2885 expr_ty context_expr, optional_vars = NULL;
2886 int suite_index = 3; /* skip 'with', test, and ':' */
2887 asdl_seq *suite_seq;
2888
2889 assert(TYPE(n) == with_stmt);
2890 context_expr = ast_for_expr(c, CHILD(n, 1));
2891 if (TYPE(CHILD(n, 2)) == with_var) {
2892 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2893
2894 if (!optional_vars) {
2895 return NULL;
2896 }
2897 if (!set_context(optional_vars, Store, n)) {
2898 return NULL;
2899 }
2900 suite_index = 4;
2901 }
2902
2903 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2904 if (!suite_seq) {
2905 return NULL;
2906 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002907 return With(context_expr, optional_vars, suite_seq, LINENO(n),
2908 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002909}
2910
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911static stmt_ty
2912ast_for_classdef(struct compiling *c, const node *n)
2913{
2914 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 asdl_seq *bases, *s;
2916
2917 REQ(n, classdef);
2918
2919 if (!strcmp(STR(CHILD(n, 1)), "None")) {
2920 ast_error(n, "assignment to None");
2921 return NULL;
2922 }
2923
2924 if (NCH(n) == 4) {
2925 s = ast_for_suite(c, CHILD(n, 3));
2926 if (!s)
2927 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002928 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2929 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 }
2931 /* check for empty base list */
2932 if (TYPE(CHILD(n,3)) == RPAR) {
2933 s = ast_for_suite(c, CHILD(n,5));
2934 if (!s)
2935 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002936 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2937 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 }
2939
2940 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002941 bases = ast_for_class_bases(c, CHILD(n, 3));
2942 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002943 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944
2945 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002946 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002948 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
2949 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950}
2951
2952static stmt_ty
2953ast_for_stmt(struct compiling *c, const node *n)
2954{
2955 if (TYPE(n) == stmt) {
2956 assert(NCH(n) == 1);
2957 n = CHILD(n, 0);
2958 }
2959 if (TYPE(n) == simple_stmt) {
2960 assert(num_stmts(n) == 1);
2961 n = CHILD(n, 0);
2962 }
2963 if (TYPE(n) == small_stmt) {
2964 REQ(n, small_stmt);
2965 n = CHILD(n, 0);
2966 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2967 | flow_stmt | import_stmt | global_stmt | exec_stmt
2968 | assert_stmt
2969 */
2970 switch (TYPE(n)) {
2971 case expr_stmt:
2972 return ast_for_expr_stmt(c, n);
2973 case print_stmt:
2974 return ast_for_print_stmt(c, n);
2975 case del_stmt:
2976 return ast_for_del_stmt(c, n);
2977 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002978 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 case flow_stmt:
2980 return ast_for_flow_stmt(c, n);
2981 case import_stmt:
2982 return ast_for_import_stmt(c, n);
2983 case global_stmt:
2984 return ast_for_global_stmt(c, n);
2985 case exec_stmt:
2986 return ast_for_exec_stmt(c, n);
2987 case assert_stmt:
2988 return ast_for_assert_stmt(c, n);
2989 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002990 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2992 TYPE(n), NCH(n));
2993 return NULL;
2994 }
2995 }
2996 else {
2997 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
2998 | funcdef | classdef
2999 */
3000 node *ch = CHILD(n, 0);
3001 REQ(n, compound_stmt);
3002 switch (TYPE(ch)) {
3003 case if_stmt:
3004 return ast_for_if_stmt(c, ch);
3005 case while_stmt:
3006 return ast_for_while_stmt(c, ch);
3007 case for_stmt:
3008 return ast_for_for_stmt(c, ch);
3009 case try_stmt:
3010 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003011 case with_stmt:
3012 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 case funcdef:
3014 return ast_for_funcdef(c, ch);
3015 case classdef:
3016 return ast_for_classdef(c, ch);
3017 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003018 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3020 TYPE(n), NCH(n));
3021 return NULL;
3022 }
3023 }
3024}
3025
3026static PyObject *
3027parsenumber(const char *s)
3028{
3029 const char *end;
3030 long x;
3031 double dx;
3032#ifndef WITHOUT_COMPLEX
3033 Py_complex c;
3034 int imflag;
3035#endif
3036
3037 errno = 0;
3038 end = s + strlen(s) - 1;
3039#ifndef WITHOUT_COMPLEX
3040 imflag = *end == 'j' || *end == 'J';
3041#endif
3042 if (*end == 'l' || *end == 'L')
3043 return PyLong_FromString((char *)s, (char **)0, 0);
3044 if (s[0] == '0') {
3045 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3046 if (x < 0 && errno == 0) {
3047 return PyLong_FromString((char *)s,
3048 (char **)0,
3049 0);
3050 }
3051 }
3052 else
3053 x = PyOS_strtol((char *)s, (char **)&end, 0);
3054 if (*end == '\0') {
3055 if (errno != 0)
3056 return PyLong_FromString((char *)s, (char **)0, 0);
3057 return PyInt_FromLong(x);
3058 }
3059 /* XXX Huge floats may silently fail */
3060#ifndef WITHOUT_COMPLEX
3061 if (imflag) {
3062 c.real = 0.;
3063 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003064 c.imag = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 PyFPE_END_PROTECT(c)
3066 return PyComplex_FromCComplex(c);
3067 }
3068 else
3069#endif
3070 {
3071 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003072 dx = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 PyFPE_END_PROTECT(dx)
3074 return PyFloat_FromDouble(dx);
3075 }
3076}
3077
3078static PyObject *
3079decode_utf8(const char **sPtr, const char *end, char* encoding)
3080{
3081#ifndef Py_USING_UNICODE
3082 Py_FatalError("decode_utf8 should not be called in this build.");
3083 return NULL;
3084#else
3085 PyObject *u, *v;
3086 char *s, *t;
3087 t = s = (char *)*sPtr;
3088 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3089 while (s < end && (*s & 0x80)) s++;
3090 *sPtr = s;
3091 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3092 if (u == NULL)
3093 return NULL;
3094 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3095 Py_DECREF(u);
3096 return v;
3097#endif
3098}
3099
3100static PyObject *
3101decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3102{
3103 PyObject *v, *u;
3104 char *buf;
3105 char *p;
3106 const char *end;
3107 if (encoding == NULL) {
3108 buf = (char *)s;
3109 u = NULL;
3110 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3111 buf = (char *)s;
3112 u = NULL;
3113 } else {
3114 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3115 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3116 if (u == NULL)
3117 return NULL;
3118 p = buf = PyString_AsString(u);
3119 end = s + len;
3120 while (s < end) {
3121 if (*s == '\\') {
3122 *p++ = *s++;
3123 if (*s & 0x80) {
3124 strcpy(p, "u005c");
3125 p += 5;
3126 }
3127 }
3128 if (*s & 0x80) { /* XXX inefficient */
3129 PyObject *w;
3130 char *r;
Martin v. Löwis66851282006-04-22 11:40:03 +00003131 Py_ssize_t rn, i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132 w = decode_utf8(&s, end, "utf-16-be");
3133 if (w == NULL) {
3134 Py_DECREF(u);
3135 return NULL;
3136 }
3137 r = PyString_AsString(w);
3138 rn = PyString_Size(w);
3139 assert(rn % 2 == 0);
3140 for (i = 0; i < rn; i += 2) {
3141 sprintf(p, "\\u%02x%02x",
3142 r[i + 0] & 0xFF,
3143 r[i + 1] & 0xFF);
3144 p += 6;
3145 }
3146 Py_DECREF(w);
3147 } else {
3148 *p++ = *s++;
3149 }
3150 }
3151 len = p - buf;
3152 s = buf;
3153 }
3154 if (rawmode)
3155 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3156 else
3157 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3158 Py_XDECREF(u);
3159 return v;
3160}
3161
3162/* s is a Python string literal, including the bracketing quote characters,
3163 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3164 * parsestr parses it, and returns the decoded Python string object.
3165 */
3166static PyObject *
3167parsestr(const char *s, const char *encoding)
3168{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169 size_t len;
Neal Norwitz30b5c5d2005-12-19 06:05:18 +00003170 int quote = Py_CHARMASK(*s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171 int rawmode = 0;
3172 int need_encoding;
3173 int unicode = 0;
3174
3175 if (isalpha(quote) || quote == '_') {
3176 if (quote == 'u' || quote == 'U') {
3177 quote = *++s;
3178 unicode = 1;
3179 }
3180 if (quote == 'r' || quote == 'R') {
3181 quote = *++s;
3182 rawmode = 1;
3183 }
3184 }
3185 if (quote != '\'' && quote != '\"') {
3186 PyErr_BadInternalCall();
3187 return NULL;
3188 }
3189 s++;
3190 len = strlen(s);
3191 if (len > INT_MAX) {
3192 PyErr_SetString(PyExc_OverflowError,
3193 "string to parse is too long");
3194 return NULL;
3195 }
3196 if (s[--len] != quote) {
3197 PyErr_BadInternalCall();
3198 return NULL;
3199 }
3200 if (len >= 4 && s[0] == quote && s[1] == quote) {
3201 s += 2;
3202 len -= 2;
3203 if (s[--len] != quote || s[--len] != quote) {
3204 PyErr_BadInternalCall();
3205 return NULL;
3206 }
3207 }
3208#ifdef Py_USING_UNICODE
3209 if (unicode || Py_UnicodeFlag) {
3210 return decode_unicode(s, len, rawmode, encoding);
3211 }
3212#endif
3213 need_encoding = (encoding != NULL &&
3214 strcmp(encoding, "utf-8") != 0 &&
3215 strcmp(encoding, "iso-8859-1") != 0);
3216 if (rawmode || strchr(s, '\\') == NULL) {
3217 if (need_encoding) {
3218#ifndef Py_USING_UNICODE
3219 /* This should not happen - we never see any other
3220 encoding. */
Jeremy Hylton2f327c12006-04-04 04:00:23 +00003221 Py_FatalError(
3222 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223#else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003224 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 if (u == NULL)
3226 return NULL;
3227 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3228 Py_DECREF(u);
3229 return v;
3230#endif
3231 } else {
3232 return PyString_FromStringAndSize(s, len);
3233 }
3234 }
3235
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003236 return PyString_DecodeEscape(s, len, NULL, unicode,
3237 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238}
3239
3240/* Build a Python string object out of a STRING atom. This takes care of
3241 * compile-time literal catenation, calling parsestr() on each piece, and
3242 * pasting the intermediate results together.
3243 */
3244static PyObject *
3245parsestrplus(struct compiling *c, const node *n)
3246{
3247 PyObject *v;
3248 int i;
3249 REQ(CHILD(n, 0), STRING);
3250 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3251 /* String literal concatenation */
3252 for (i = 1; i < NCH(n); i++) {
3253 PyObject *s;
3254 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3255 if (s == NULL)
3256 goto onError;
3257 if (PyString_Check(v) && PyString_Check(s)) {
3258 PyString_ConcatAndDel(&v, s);
3259 if (v == NULL)
3260 goto onError;
3261 }
3262#ifdef Py_USING_UNICODE
3263 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003264 PyObject *temp = PyUnicode_Concat(v, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 Py_DECREF(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 Py_DECREF(v);
3267 v = temp;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003268 if (v == NULL)
3269 goto onError;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 }
3271#endif
3272 }
3273 }
3274 return v;
3275
3276 onError:
3277 Py_XDECREF(v);
3278 return NULL;
3279}