blob: 5d91344ed0e86736b6f8ea1162e0501ccd3aea57 [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 *);
34static asdl_seq *ast_for_exprlist(struct compiling *, const node *, int);
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 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110 value = Py_BuildValue("(OO)", errstr, tmp);
111 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{
186 int i, j, num;
187 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";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000194 } else if (TYPE(n) == encoding_decl) {
195 c.c_encoding = STR(n);
196 n = CHILD(n, 0);
197 } else {
198 c.c_encoding = NULL;
199 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000200 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000201
202 switch (TYPE(n)) {
203 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205 if (!stmts)
206 return NULL;
207 for (i = 0; i < NCH(n) - 1; i++) {
208 ch = CHILD(n, i);
209 if (TYPE(ch) == NEWLINE)
210 continue;
211 REQ(ch, stmt);
212 num = num_stmts(ch);
213 if (num == 1) {
214 s = ast_for_stmt(&c, ch);
215 if (!s)
216 goto error;
217 asdl_seq_APPEND(stmts, s);
218 }
219 else {
220 ch = CHILD(ch, 0);
221 REQ(ch, simple_stmt);
222 for (j = 0; j < num; j++) {
223 s = ast_for_stmt(&c, CHILD(ch, j * 2));
224 if (!s)
225 goto error;
226 asdl_seq_APPEND(stmts, s);
227 }
228 }
229 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000230 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 case eval_input: {
232 expr_ty testlist_ast;
233
234 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000235 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 if (!testlist_ast)
237 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 }
240 case single_input:
241 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000242 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000243 if (!stmts)
244 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000245 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, arena));
246 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000247 }
248 else {
249 n = CHILD(n, 0);
250 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000251 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 if (!stmts)
253 goto error;
254 if (num == 1) {
Neal Norwitz406c6402006-01-07 21:23:26 +0000255 s = ast_for_stmt(&c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256 if (!s)
257 goto error;
258 asdl_seq_SET(stmts, 0, s);
259 }
260 else {
261 /* Only a simple_stmt can contain multiple statements. */
262 REQ(n, simple_stmt);
263 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 if (TYPE(CHILD(n, i)) == NEWLINE)
265 break;
266 s = ast_for_stmt(&c, CHILD(n, i));
267 if (!s)
268 goto error;
269 asdl_seq_SET(stmts, i / 2, s);
270 }
271 }
272
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000273 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 }
275 default:
276 goto error;
277 }
278 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 ast_error_finish(filename);
280 return NULL;
281}
282
283/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
284*/
285
286static operator_ty
287get_operator(const node *n)
288{
289 switch (TYPE(n)) {
290 case VBAR:
291 return BitOr;
292 case CIRCUMFLEX:
293 return BitXor;
294 case AMPER:
295 return BitAnd;
296 case LEFTSHIFT:
297 return LShift;
298 case RIGHTSHIFT:
299 return RShift;
300 case PLUS:
301 return Add;
302 case MINUS:
303 return Sub;
304 case STAR:
305 return Mult;
306 case SLASH:
307 return Div;
308 case DOUBLESLASH:
309 return FloorDiv;
310 case PERCENT:
311 return Mod;
312 default:
313 return 0;
314 }
315}
316
317/* Set the context ctx for expr_ty e returning 0 on success, -1 on error.
318
319 Only sets context for expr kinds that "can appear in assignment context"
320 (according to ../Parser/Python.asdl). For other expr kinds, it sets
321 an appropriate syntax error and returns false.
322
323 If e is a sequential type, items in sequence will also have their context
324 set.
325
326*/
327
328static int
329set_context(expr_ty e, expr_context_ty ctx, const node *n)
330{
331 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000332 /* If a particular expression type can't be used for assign / delete,
333 set expr_name to its name and an error message will be generated.
334 */
335 const char* expr_name = NULL;
336
337 /* The ast defines augmented store and load contexts, but the
338 implementation here doesn't actually use them. The code may be
339 a little more complex than necessary as a result. It also means
340 that expressions in an augmented assignment have no context.
341 Consider restructuring so that augmented assignment uses
342 set_context(), too
343 */
344 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345
346 switch (e->kind) {
347 case Attribute_kind:
348 if (ctx == Store &&
349 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
350 return ast_error(n, "assignment to None");
351 }
352 e->v.Attribute.ctx = ctx;
353 break;
354 case Subscript_kind:
355 e->v.Subscript.ctx = ctx;
356 break;
357 case Name_kind:
358 if (ctx == Store &&
359 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
360 return ast_error(n, "assignment to None");
361 }
362 e->v.Name.ctx = ctx;
363 break;
364 case List_kind:
365 e->v.List.ctx = ctx;
366 s = e->v.List.elts;
367 break;
368 case Tuple_kind:
369 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
370 return ast_error(n, "can't assign to ()");
371 e->v.Tuple.ctx = ctx;
372 s = e->v.Tuple.elts;
373 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000374 case Lambda_kind:
375 expr_name = "lambda";
376 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000377 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000378 expr_name = "function call";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 case UnaryOp_kind:
383 expr_name = "operator";
384 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000385 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000386 expr_name = "generator expression";
387 break;
388 case ListComp_kind:
389 expr_name = "list comprehension";
390 break;
391 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392 case Num_kind:
393 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 expr_name = "literal";
395 break;
396 case Compare_kind:
397 expr_name = "comparison";
398 break;
399 case Repr_kind:
400 expr_name = "repr";
401 break;
402 default:
403 PyErr_Format(PyExc_SystemError,
404 "unexpected expression in assignment %d (line %d)",
405 e->kind, e->lineno);
406 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 /* Check for error string set by switch */
409 if (expr_name) {
410 char buf[300];
411 PyOS_snprintf(buf, sizeof(buf),
412 "can't %s %s",
413 ctx == Store ? "assign to" : "delete",
414 expr_name);
415 return ast_error(n, buf);
416 }
417
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 /* If the LHS is a list or tuple, we need to set the assignment
419 context for all the tuple elements.
420 */
421 if (s) {
422 int i;
423
424 for (i = 0; i < asdl_seq_LEN(s); i++) {
425 if (!set_context(asdl_seq_GET(s, i), ctx, n))
426 return 0;
427 }
428 }
429 return 1;
430}
431
432static operator_ty
433ast_for_augassign(const node *n)
434{
435 REQ(n, augassign);
436 n = CHILD(n, 0);
437 switch (STR(n)[0]) {
438 case '+':
439 return Add;
440 case '-':
441 return Sub;
442 case '/':
443 if (STR(n)[1] == '/')
444 return FloorDiv;
445 else
446 return Div;
447 case '%':
448 return Mod;
449 case '<':
450 return LShift;
451 case '>':
452 return RShift;
453 case '&':
454 return BitAnd;
455 case '^':
456 return BitXor;
457 case '|':
458 return BitOr;
459 case '*':
460 if (STR(n)[1] == '*')
461 return Pow;
462 else
463 return Mult;
464 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000465 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466 return 0;
467 }
468}
469
470static cmpop_ty
471ast_for_comp_op(const node *n)
472{
473 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
474 |'is' 'not'
475 */
476 REQ(n, comp_op);
477 if (NCH(n) == 1) {
478 n = CHILD(n, 0);
479 switch (TYPE(n)) {
480 case LESS:
481 return Lt;
482 case GREATER:
483 return Gt;
484 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485 return Eq;
486 case LESSEQUAL:
487 return LtE;
488 case GREATEREQUAL:
489 return GtE;
490 case NOTEQUAL:
491 return NotEq;
492 case NAME:
493 if (strcmp(STR(n), "in") == 0)
494 return In;
495 if (strcmp(STR(n), "is") == 0)
496 return Is;
497 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000498 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 STR(n));
500 return 0;
501 }
502 }
503 else if (NCH(n) == 2) {
504 /* handle "not in" and "is not" */
505 switch (TYPE(CHILD(n, 0))) {
506 case NAME:
507 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
508 return NotIn;
509 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
510 return IsNot;
511 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000512 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
514 return 0;
515 }
516 }
Neal Norwitz79792652005-11-14 04:25:03 +0000517 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518 NCH(n));
519 return 0;
520}
521
522static asdl_seq *
523seq_for_testlist(struct compiling *c, const node *n)
524{
525 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000526 asdl_seq *seq;
527 expr_ty expression;
528 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529 assert(TYPE(n) == testlist
530 || TYPE(n) == listmaker
531 || TYPE(n) == testlist_gexp
532 || TYPE(n) == testlist_safe
533 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000535 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000536 if (!seq)
537 return NULL;
538
539 for (i = 0; i < NCH(n); i += 2) {
540 REQ(CHILD(n, i), test);
541
542 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000543 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545
546 assert(i / 2 < seq->size);
547 asdl_seq_SET(seq, i / 2, expression);
548 }
549 return seq;
550}
551
552static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000553compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554{
555 int i, len = (NCH(n) + 1) / 2;
556 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000557 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558 if (!args)
559 return NULL;
560
561 REQ(n, fplist);
562
563 for (i = 0; i < len; i++) {
564 const node *child = CHILD(CHILD(n, 2*i), 0);
565 expr_ty arg;
566 if (TYPE(child) == NAME) {
567 if (!strcmp(STR(child), "None")) {
568 ast_error(child, "assignment to None");
569 return NULL;
570 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000571 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
572 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 }
574 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000575 arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 set_context(arg, Store, n);
577 asdl_seq_SET(args, i, arg);
578 }
579
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000580 result = Tuple(args, Store, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 set_context(result, Store, n);
582 return result;
583}
584
585/* Create AST for argument list.
586
587 XXX TO DO:
588 - check for invalid argument lists like normal after default
589*/
590
591static arguments_ty
592ast_for_arguments(struct compiling *c, const node *n)
593{
594 /* parameters: '(' [varargslist] ')'
595 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
596 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
597 */
598 int i, n_args = 0, n_defaults = 0, found_default = 0;
599 asdl_seq *args, *defaults;
600 identifier vararg = NULL, kwarg = NULL;
601 node *ch;
602
603 if (TYPE(n) == parameters) {
604 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000605 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 n = CHILD(n, 1);
607 }
608 REQ(n, varargslist);
609
610 /* first count the number of normal args & defaults */
611 for (i = 0; i < NCH(n); i++) {
612 ch = CHILD(n, i);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000613 if (TYPE(ch) == fpdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 n_args++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615 if (TYPE(ch) == EQUAL)
616 n_defaults++;
617 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000618 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619 if (!args && n_args)
620 return NULL; /* Don't need to go to NULL; nothing allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000621 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 if (!defaults && n_defaults)
623 goto error;
624
625 /* fpdef: NAME | '(' fplist ')'
626 fplist: fpdef (',' fpdef)* [',']
627 */
628 i = 0;
629 while (i < NCH(n)) {
630 ch = CHILD(n, i);
631 switch (TYPE(ch)) {
632 case fpdef:
633 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
634 anything other than EQUAL or a comma? */
635 /* XXX Should NCH(n) check be made a separate check? */
636 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
637 asdl_seq_APPEND(defaults,
638 ast_for_expr(c, CHILD(n, i + 2)));
639 i += 2;
640 found_default = 1;
641 }
642 else if (found_default) {
643 ast_error(n,
644 "non-default argument follows default argument");
645 goto error;
646 }
647
648 if (NCH(ch) == 3) {
649 asdl_seq_APPEND(args,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000650 compiler_complex_args(c, CHILD(ch, 1)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000651 }
652 else if (TYPE(CHILD(ch, 0)) == NAME) {
Armin Rigo31441302005-10-21 12:57:31 +0000653 expr_ty name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000654 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
655 ast_error(CHILD(ch, 0), "assignment to None");
656 goto error;
657 }
Armin Rigo31441302005-10-21 12:57:31 +0000658 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000659 Param, LINENO(ch), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660 if (!name)
661 goto error;
662 asdl_seq_APPEND(args, name);
663
664 }
665 i += 2; /* the name and the comma */
666 break;
667 case STAR:
668 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
669 ast_error(CHILD(n, i+1), "assignment to None");
670 goto error;
671 }
672 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
673 i += 3;
674 break;
675 case DOUBLESTAR:
676 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
677 ast_error(CHILD(n, i+1), "assignment to None");
678 goto error;
679 }
680 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
681 i += 3;
682 break;
683 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000684 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685 "unexpected node in varargslist: %d @ %d",
686 TYPE(ch), i);
687 goto error;
688 }
689 }
690
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000691 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000692
693 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000694 Py_XDECREF(vararg);
695 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000696 return NULL;
697}
698
699static expr_ty
700ast_for_dotted_name(struct compiling *c, const node *n)
701{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000702 expr_ty e;
703 identifier id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704 int i;
705
706 REQ(n, dotted_name);
707
708 id = NEW_IDENTIFIER(CHILD(n, 0));
709 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000710 return NULL;
711 e = Name(id, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714
715 for (i = 2; i < NCH(n); i+=2) {
716 id = NEW_IDENTIFIER(CHILD(n, i));
717 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000718 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000719 e = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena);
720 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 }
723
724 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725}
726
727static expr_ty
728ast_for_decorator(struct compiling *c, const node *n)
729{
730 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
731 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000732 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733
734 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000735 REQ(CHILD(n, 0), AT);
736 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737
738 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
739 if (!name_expr)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000740 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741
742 if (NCH(n) == 3) { /* No arguments */
743 d = name_expr;
744 name_expr = NULL;
745 }
746 else if (NCH(n) == 5) { /* Call with no arguments */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000747 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 name_expr = NULL;
751 }
752 else {
753 d = ast_for_call(c, CHILD(n, 3), name_expr);
754 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000755 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 name_expr = NULL;
757 }
758
759 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760}
761
762static asdl_seq*
763ast_for_decorators(struct compiling *c, const node *n)
764{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000765 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000766 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 int i;
768
769 REQ(n, decorators);
770
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000771 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 if (!decorator_seq)
773 return NULL;
774
775 for (i = 0; i < NCH(n); i++) {
776 d = ast_for_decorator(c, CHILD(n, i));
777 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000778 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 asdl_seq_APPEND(decorator_seq, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 }
781 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782}
783
784static stmt_ty
785ast_for_funcdef(struct compiling *c, const node *n)
786{
787 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000788 identifier name;
789 arguments_ty args;
790 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 asdl_seq *decorator_seq = NULL;
792 int name_i;
793
794 REQ(n, funcdef);
795
796 if (NCH(n) == 6) { /* decorators are present */
797 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
798 if (!decorator_seq)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 name_i = 2;
801 }
802 else {
803 name_i = 1;
804 }
805
806 name = NEW_IDENTIFIER(CHILD(n, name_i));
807 if (!name)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000808 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Neal Norwitze76adcd2005-11-15 05:04:31 +0000810 ast_error(CHILD(n, name_i), "assignment to None");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000811 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 }
813 args = ast_for_arguments(c, CHILD(n, name_i + 1));
814 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000815 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 body = ast_for_suite(c, CHILD(n, name_i + 3));
817 if (!body)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000818 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000820 return FunctionDef(name, args, body, decorator_seq, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821}
822
823static expr_ty
824ast_for_lambdef(struct compiling *c, const node *n)
825{
826 /* lambdef: 'lambda' [varargslist] ':' test */
827 arguments_ty args;
828 expr_ty expression;
829
830 if (NCH(n) == 3) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000831 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832 if (!args)
833 return NULL;
834 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000835 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 }
838 else {
839 args = ast_for_arguments(c, CHILD(n, 1));
840 if (!args)
841 return NULL;
842 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000843 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 }
846
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000847 return Lambda(args, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848}
849
850/* Count the number of 'for' loop in a list comprehension.
851
852 Helper for ast_for_listcomp().
853*/
854
855static int
856count_list_fors(const node *n)
857{
858 int n_fors = 0;
859 node *ch = CHILD(n, 1);
860
861 count_list_for:
862 n_fors++;
863 REQ(ch, list_for);
864 if (NCH(ch) == 5)
865 ch = CHILD(ch, 4);
866 else
867 return n_fors;
868 count_list_iter:
869 REQ(ch, list_iter);
870 ch = CHILD(ch, 0);
871 if (TYPE(ch) == list_for)
872 goto count_list_for;
873 else if (TYPE(ch) == list_if) {
874 if (NCH(ch) == 3) {
875 ch = CHILD(ch, 2);
876 goto count_list_iter;
877 }
878 else
879 return n_fors;
880 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000881
882 /* Should never be reached */
883 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
884 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885}
886
887/* Count the number of 'if' statements in a list comprehension.
888
889 Helper for ast_for_listcomp().
890*/
891
892static int
893count_list_ifs(const node *n)
894{
895 int n_ifs = 0;
896
897 count_list_iter:
898 REQ(n, list_iter);
899 if (TYPE(CHILD(n, 0)) == list_for)
900 return n_ifs;
901 n = CHILD(n, 0);
902 REQ(n, list_if);
903 n_ifs++;
904 if (NCH(n) == 2)
905 return n_ifs;
906 n = CHILD(n, 2);
907 goto count_list_iter;
908}
909
910static expr_ty
911ast_for_listcomp(struct compiling *c, const node *n)
912{
913 /* listmaker: test ( list_for | (',' test)* [','] )
914 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
915 list_iter: list_for | list_if
916 list_if: 'if' test [list_iter]
917 testlist_safe: test [(',' test)+ [',']]
918 */
919 expr_ty elt;
920 asdl_seq *listcomps;
921 int i, n_fors;
922 node *ch;
923
924 REQ(n, listmaker);
925 assert(NCH(n) > 1);
926
927 elt = ast_for_expr(c, CHILD(n, 0));
928 if (!elt)
929 return NULL;
930
931 n_fors = count_list_fors(n);
932 if (n_fors == -1)
933 return NULL;
934
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000935 listcomps = asdl_seq_new(n_fors, c->c_arena);
936 if (!listcomps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000938
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 ch = CHILD(n, 1);
940 for (i = 0; i < n_fors; i++) {
941 comprehension_ty lc;
942 asdl_seq *t;
943 expr_ty expression;
944
945 REQ(ch, list_for);
946
947 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000948 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000950 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000951 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000954 if (asdl_seq_LEN(t) == 1)
955 lc = comprehension(asdl_seq_GET(t, 0), expression, NULL,
956 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000958 lc = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena),
959 expression, NULL, c->c_arena);
960 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962
963 if (NCH(ch) == 5) {
964 int j, n_ifs;
965 asdl_seq *ifs;
966
967 ch = CHILD(ch, 4);
968 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000969 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000972 ifs = asdl_seq_new(n_ifs, c->c_arena);
973 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975
976 for (j = 0; j < n_ifs; j++) {
977 REQ(ch, list_iter);
978
979 ch = CHILD(ch, 0);
980 REQ(ch, list_if);
981
982 asdl_seq_APPEND(ifs, ast_for_expr(c, CHILD(ch, 1)));
983 if (NCH(ch) == 3)
984 ch = CHILD(ch, 2);
985 }
986 /* on exit, must guarantee that ch is a list_for */
987 if (TYPE(ch) == list_iter)
988 ch = CHILD(ch, 0);
989 lc->ifs = ifs;
990 }
991 asdl_seq_APPEND(listcomps, lc);
992 }
993
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000994 return ListComp(elt, listcomps, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995}
996
997/*
998 Count the number of 'for' loops in a generator expression.
999
1000 Helper for ast_for_genexp().
1001*/
1002
1003static int
1004count_gen_fors(const node *n)
1005{
1006 int n_fors = 0;
1007 node *ch = CHILD(n, 1);
1008
1009 count_gen_for:
1010 n_fors++;
1011 REQ(ch, gen_for);
1012 if (NCH(ch) == 5)
1013 ch = CHILD(ch, 4);
1014 else
1015 return n_fors;
1016 count_gen_iter:
1017 REQ(ch, gen_iter);
1018 ch = CHILD(ch, 0);
1019 if (TYPE(ch) == gen_for)
1020 goto count_gen_for;
1021 else if (TYPE(ch) == gen_if) {
1022 if (NCH(ch) == 3) {
1023 ch = CHILD(ch, 2);
1024 goto count_gen_iter;
1025 }
1026 else
1027 return n_fors;
1028 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001029
1030 /* Should never be reached */
1031 PyErr_SetString(PyExc_SystemError,
1032 "logic error in count_gen_fors");
1033 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034}
1035
1036/* Count the number of 'if' statements in a generator expression.
1037
1038 Helper for ast_for_genexp().
1039*/
1040
1041static int
1042count_gen_ifs(const node *n)
1043{
1044 int n_ifs = 0;
1045
1046 while (1) {
1047 REQ(n, gen_iter);
1048 if (TYPE(CHILD(n, 0)) == gen_for)
1049 return n_ifs;
1050 n = CHILD(n, 0);
1051 REQ(n, gen_if);
1052 n_ifs++;
1053 if (NCH(n) == 2)
1054 return n_ifs;
1055 n = CHILD(n, 2);
1056 }
1057}
1058
1059static expr_ty
1060ast_for_genexp(struct compiling *c, const node *n)
1061{
1062 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1063 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1064 expr_ty elt;
1065 asdl_seq *genexps;
1066 int i, n_fors;
1067 node *ch;
1068
1069 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1070 assert(NCH(n) > 1);
1071
1072 elt = ast_for_expr(c, CHILD(n, 0));
1073 if (!elt)
1074 return NULL;
1075
1076 n_fors = count_gen_fors(n);
1077 if (n_fors == -1)
1078 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001079
1080 genexps = asdl_seq_new(n_fors, c->c_arena);
1081 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001083
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084 ch = CHILD(n, 1);
1085 for (i = 0; i < n_fors; i++) {
1086 comprehension_ty ge;
1087 asdl_seq *t;
1088 expr_ty expression;
1089
1090 REQ(ch, gen_for);
1091
1092 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001093 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001095 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001096 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001098
1099 if (asdl_seq_LEN(t) == 1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100 ge = comprehension(asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001101 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001103 ge = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena),
1104 expression, NULL, c->c_arena);
1105
1106 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001108
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 if (NCH(ch) == 5) {
1110 int j, n_ifs;
1111 asdl_seq *ifs;
1112
1113 ch = CHILD(ch, 4);
1114 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001115 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001117
1118 ifs = asdl_seq_new(n_ifs, c->c_arena);
1119 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001121
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122 for (j = 0; j < n_ifs; j++) {
1123 REQ(ch, gen_iter);
1124 ch = CHILD(ch, 0);
1125 REQ(ch, gen_if);
1126
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001127 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001128 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001129 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001130 asdl_seq_APPEND(ifs, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 if (NCH(ch) == 3)
1132 ch = CHILD(ch, 2);
1133 }
1134 /* on exit, must guarantee that ch is a gen_for */
1135 if (TYPE(ch) == gen_iter)
1136 ch = CHILD(ch, 0);
1137 ge->ifs = ifs;
1138 }
1139 asdl_seq_APPEND(genexps, ge);
1140 }
1141
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001142 return GeneratorExp(elt, genexps, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143}
1144
1145static expr_ty
1146ast_for_atom(struct compiling *c, const node *n)
1147{
1148 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1149 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1150 */
1151 node *ch = CHILD(n, 0);
1152
1153 switch (TYPE(ch)) {
1154 case NAME:
1155 /* All names start in Load context, but may later be
1156 changed. */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001157 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 case STRING: {
1159 PyObject *str = parsestrplus(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 if (!str)
1161 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001162
1163 PyArena_AddPyObject(c->c_arena, str);
1164 return Str(str, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 }
1166 case NUMBER: {
1167 PyObject *pynum = parsenumber(STR(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 if (!pynum)
1169 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001170
1171 PyArena_AddPyObject(c->c_arena, pynum);
1172 return Num(pynum, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173 }
1174 case LPAR: /* some parenthesized expressions */
1175 ch = CHILD(n, 1);
1176
1177 if (TYPE(ch) == RPAR)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001178 return Tuple(NULL, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179
1180 if (TYPE(ch) == yield_expr)
1181 return ast_for_expr(c, ch);
1182
1183 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1184 return ast_for_genexp(c, ch);
1185
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001186 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 case LSQB: /* list (or list comprehension) */
1188 ch = CHILD(n, 1);
1189
1190 if (TYPE(ch) == RSQB)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001191 return List(NULL, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192
1193 REQ(ch, listmaker);
1194 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1195 asdl_seq *elts = seq_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 if (!elts)
1197 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001198
1199 return List(elts, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 }
1201 else
1202 return ast_for_listcomp(c, ch);
1203 case LBRACE: {
1204 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1205 int i, size;
1206 asdl_seq *keys, *values;
1207
1208 ch = CHILD(n, 1);
1209 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210 keys = asdl_seq_new(size, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 if (!keys)
1212 return NULL;
1213
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001214 values = asdl_seq_new(size, c->c_arena);
1215 if (!values)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217
1218 for (i = 0; i < NCH(ch); i += 4) {
1219 expr_ty expression;
1220
1221 expression = ast_for_expr(c, CHILD(ch, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001222 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001224
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001226
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 expression = ast_for_expr(c, CHILD(ch, i + 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001228 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001230
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 asdl_seq_SET(values, i / 4, expression);
1232 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001233 return Dict(keys, values, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 }
1235 case BACKQUOTE: { /* repr */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001236 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237 if (!expression)
1238 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001239
1240 return Repr(expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241 }
1242 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001243 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 return NULL;
1245 }
1246}
1247
1248static slice_ty
1249ast_for_slice(struct compiling *c, const node *n)
1250{
1251 node *ch;
1252 expr_ty lower = NULL, upper = NULL, step = NULL;
1253
1254 REQ(n, subscript);
1255
1256 /*
1257 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1258 sliceop: ':' [test]
1259 */
1260 ch = CHILD(n, 0);
1261 if (TYPE(ch) == DOT)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001262 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263
1264 if (NCH(n) == 1 && TYPE(ch) == test) {
1265 /* 'step' variable hold no significance in terms of being used over
1266 other vars */
1267 step = ast_for_expr(c, ch);
1268 if (!step)
1269 return NULL;
1270
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001271 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 }
1273
1274 if (TYPE(ch) == test) {
1275 lower = ast_for_expr(c, ch);
1276 if (!lower)
1277 return NULL;
1278 }
1279
1280 /* If there's an upper bound it's in the second or third position. */
1281 if (TYPE(ch) == COLON) {
1282 if (NCH(n) > 1) {
1283 node *n2 = CHILD(n, 1);
1284
1285 if (TYPE(n2) == test) {
1286 upper = ast_for_expr(c, n2);
1287 if (!upper)
1288 return NULL;
1289 }
1290 }
1291 } else if (NCH(n) > 2) {
1292 node *n2 = CHILD(n, 2);
1293
1294 if (TYPE(n2) == test) {
1295 upper = ast_for_expr(c, n2);
1296 if (!upper)
1297 return NULL;
1298 }
1299 }
1300
1301 ch = CHILD(n, NCH(n) - 1);
1302 if (TYPE(ch) == sliceop) {
1303 if (NCH(ch) == 1)
1304 /* XXX: If only 1 child, then should just be a colon. Should we
1305 just skip assigning and just get to the return? */
1306 ch = CHILD(ch, 0);
1307 else
1308 ch = CHILD(ch, 1);
1309 if (TYPE(ch) == test) {
1310 step = ast_for_expr(c, ch);
1311 if (!step)
1312 return NULL;
1313 }
1314 }
1315
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001316 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317}
1318
1319static expr_ty
1320ast_for_binop(struct compiling *c, const node *n)
1321{
1322 /* Must account for a sequence of expressions.
1323 How should A op B op C by represented?
1324 BinOp(BinOp(A, op, B), op, C).
1325 */
1326
1327 int i, nops;
1328 expr_ty expr1, expr2, result;
1329 operator_ty operator;
1330
1331 expr1 = ast_for_expr(c, CHILD(n, 0));
1332 if (!expr1)
1333 return NULL;
1334
1335 expr2 = ast_for_expr(c, CHILD(n, 2));
1336 if (!expr2)
1337 return NULL;
1338
1339 operator = get_operator(CHILD(n, 1));
1340 if (!operator)
1341 return NULL;
1342
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001343 result = BinOp(expr1, operator, expr2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 if (!result)
1345 return NULL;
1346
1347 nops = (NCH(n) - 1) / 2;
1348 for (i = 1; i < nops; i++) {
1349 expr_ty tmp_result, tmp;
1350 const node* next_oper = CHILD(n, i * 2 + 1);
1351
1352 operator = get_operator(next_oper);
1353 if (!operator)
1354 return NULL;
1355
1356 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1357 if (!tmp)
1358 return NULL;
1359
1360 tmp_result = BinOp(result, operator, tmp,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001361 LINENO(next_oper), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362 if (!tmp)
1363 return NULL;
1364 result = tmp_result;
1365 }
1366 return result;
1367}
1368
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001369static expr_ty
1370ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1371{
1372 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME */
1373 expr_ty e;
1374 REQ(n, trailer);
1375 if (TYPE(CHILD(n, 0)) == LPAR) {
1376 if (NCH(n) == 2)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001377 e = Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001378 else
1379 e = ast_for_call(c, CHILD(n, 1), left_expr);
1380 }
1381 else if (TYPE(CHILD(n, 0)) == LSQB) {
1382 REQ(CHILD(n, 2), RSQB);
1383 n = CHILD(n, 1);
1384 if (NCH(n) <= 2) {
1385 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1386 if (!slc)
1387 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001388 e = Subscript(left_expr, slc, Load, LINENO(n), c->c_arena);
1389 if (!e)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001390 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001391 }
1392 else {
1393 int j;
1394 slice_ty slc;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001395 asdl_seq *slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001396 if (!slices)
1397 return NULL;
1398 for (j = 0; j < NCH(n); j += 2) {
1399 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001400 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001401 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001402 asdl_seq_SET(slices, j / 2, slc);
1403 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001404 e = Subscript(left_expr, ExtSlice(slices, c->c_arena),
1405 Load, LINENO(n), c->c_arena);
1406 if (!e)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001407 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001408 }
1409 }
1410 else {
1411 assert(TYPE(CHILD(n, 0)) == DOT);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001412 e = Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n),
1413 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001414 }
1415 return e;
1416}
1417
1418static expr_ty
1419ast_for_power(struct compiling *c, const node *n)
1420{
1421 /* power: atom trailer* ('**' factor)*
1422 */
1423 int i;
1424 expr_ty e, tmp;
1425 REQ(n, power);
1426 e = ast_for_atom(c, CHILD(n, 0));
1427 if (!e)
1428 return NULL;
1429 if (NCH(n) == 1)
1430 return e;
1431 for (i = 1; i < NCH(n); i++) {
1432 node *ch = CHILD(n, i);
1433 if (TYPE(ch) != trailer)
1434 break;
1435 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001436 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001437 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001438 e = tmp;
1439 }
1440 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1441 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001442 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001443 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001444 tmp = BinOp(e, Pow, f, LINENO(n), c->c_arena);
1445 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001446 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001447 e = tmp;
1448 }
1449 return e;
1450}
1451
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452/* Do not name a variable 'expr'! Will cause a compile error.
1453*/
1454
1455static expr_ty
1456ast_for_expr(struct compiling *c, const node *n)
1457{
1458 /* handle the full range of simple expressions
1459 test: and_test ('or' and_test)* | lambdef
1460 and_test: not_test ('and' not_test)*
1461 not_test: 'not' not_test | comparison
1462 comparison: expr (comp_op expr)*
1463 expr: xor_expr ('|' xor_expr)*
1464 xor_expr: and_expr ('^' and_expr)*
1465 and_expr: shift_expr ('&' shift_expr)*
1466 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1467 arith_expr: term (('+'|'-') term)*
1468 term: factor (('*'|'/'|'%'|'//') factor)*
1469 factor: ('+'|'-'|'~') factor | power
1470 power: atom trailer* ('**' factor)*
1471 */
1472
1473 asdl_seq *seq;
1474 int i;
1475
1476 loop:
1477 switch (TYPE(n)) {
1478 case test:
1479 if (TYPE(CHILD(n, 0)) == lambdef)
1480 return ast_for_lambdef(c, CHILD(n, 0));
1481 /* Fall through to and_test */
1482 case and_test:
1483 if (NCH(n) == 1) {
1484 n = CHILD(n, 0);
1485 goto loop;
1486 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001487 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 if (!seq)
1489 return NULL;
1490 for (i = 0; i < NCH(n); i += 2) {
1491 expr_ty e = ast_for_expr(c, CHILD(n, i));
1492 if (!e)
1493 return NULL;
1494 asdl_seq_SET(seq, i / 2, e);
1495 }
1496 if (!strcmp(STR(CHILD(n, 1)), "and"))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001497 return BoolOp(And, seq, LINENO(n), c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001498 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1499 return BoolOp(Or, seq, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 case not_test:
1501 if (NCH(n) == 1) {
1502 n = CHILD(n, 0);
1503 goto loop;
1504 }
1505 else {
1506 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1507 if (!expression)
1508 return NULL;
1509
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001510 return UnaryOp(Not, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 }
1512 case comparison:
1513 if (NCH(n) == 1) {
1514 n = CHILD(n, 0);
1515 goto loop;
1516 }
1517 else {
1518 expr_ty expression;
1519 asdl_seq *ops, *cmps;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001520 ops = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 if (!ops)
1522 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001523 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525 return NULL;
1526 }
1527 for (i = 1; i < NCH(n); i += 2) {
1528 /* XXX cmpop_ty is just an enum */
1529 cmpop_ty operator;
1530
1531 operator = ast_for_comp_op(CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001532 if (!operator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001534 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535
1536 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001537 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001539 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001540
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001541 asdl_seq_SET(ops, i / 2, (void *)(Py_uintptr_t)operator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542 asdl_seq_SET(cmps, i / 2, expression);
1543 }
1544 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001545 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001547 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001549 return Compare(expression, ops, cmps, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550 }
1551 break;
1552
1553 /* The next five cases all handle BinOps. The main body of code
1554 is the same in each case, but the switch turned inside out to
1555 reuse the code for each type of operator.
1556 */
1557 case expr:
1558 case xor_expr:
1559 case and_expr:
1560 case shift_expr:
1561 case arith_expr:
1562 case term:
1563 if (NCH(n) == 1) {
1564 n = CHILD(n, 0);
1565 goto loop;
1566 }
1567 return ast_for_binop(c, n);
1568 case yield_expr: {
1569 expr_ty exp = NULL;
1570 if (NCH(n) == 2) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001571 exp = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 if (!exp)
1573 return NULL;
1574 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001575 return Yield(exp, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 }
1577 case factor: {
1578 expr_ty expression;
1579
1580 if (NCH(n) == 1) {
1581 n = CHILD(n, 0);
1582 goto loop;
1583 }
1584
1585 expression = ast_for_expr(c, CHILD(n, 1));
1586 if (!expression)
1587 return NULL;
1588
1589 switch (TYPE(CHILD(n, 0))) {
1590 case PLUS:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001591 return UnaryOp(UAdd, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592 case MINUS:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001593 return UnaryOp(USub, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594 case TILDE:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001595 return UnaryOp(Invert, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596 }
Neal Norwitze76adcd2005-11-15 05:04:31 +00001597 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1598 TYPE(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599 break;
1600 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001601 case power:
1602 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001603 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001604 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605 return NULL;
1606 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001607 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608 return NULL;
1609}
1610
1611static expr_ty
1612ast_for_call(struct compiling *c, const node *n, expr_ty func)
1613{
1614 /*
1615 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1616 | '**' test)
1617 argument: [test '='] test [gen_for] # Really [keyword '='] test
1618 */
1619
1620 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001621 asdl_seq *args;
1622 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623 expr_ty vararg = NULL, kwarg = NULL;
1624
1625 REQ(n, arglist);
1626
1627 nargs = 0;
1628 nkeywords = 0;
1629 ngens = 0;
1630 for (i = 0; i < NCH(n); i++) {
1631 node *ch = CHILD(n, i);
1632 if (TYPE(ch) == argument) {
1633 if (NCH(ch) == 1)
1634 nargs++;
1635 else if (TYPE(CHILD(ch, 1)) == gen_for)
1636 ngens++;
1637 else
1638 nkeywords++;
1639 }
1640 }
1641 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001642 ast_error(n, "Generator expression must be parenthesized "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001643 "if not sole argument");
1644 return NULL;
1645 }
1646
1647 if (nargs + nkeywords + ngens > 255) {
1648 ast_error(n, "more than 255 arguments");
1649 return NULL;
1650 }
1651
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001652 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001654 return NULL;
1655 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001657 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658 nargs = 0;
1659 nkeywords = 0;
1660 for (i = 0; i < NCH(n); i++) {
1661 node *ch = CHILD(n, i);
1662 if (TYPE(ch) == argument) {
1663 expr_ty e;
1664 if (NCH(ch) == 1) {
1665 e = ast_for_expr(c, CHILD(ch, 0));
1666 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001667 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668 asdl_seq_SET(args, nargs++, e);
1669 }
1670 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1671 e = ast_for_genexp(c, ch);
1672 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001673 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674 asdl_seq_SET(args, nargs++, e);
1675 }
1676 else {
1677 keyword_ty kw;
1678 identifier key;
1679
1680 /* CHILD(ch, 0) is test, but must be an identifier? */
1681 e = ast_for_expr(c, CHILD(ch, 0));
1682 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 /* f(lambda x: x[0] = 3) ends up getting parsed with
1685 * LHS test = lambda x: x[0], and RHS test = 3.
1686 * SF bug 132313 points out that complaining about a keyword
1687 * then is very confusing.
1688 */
1689 if (e->kind == Lambda_kind) {
1690 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001691 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692 } else if (e->kind != Name_kind) {
1693 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001694 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 }
1696 key = e->v.Name.id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 e = ast_for_expr(c, CHILD(ch, 2));
1698 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001699 return NULL;
1700 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001702 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001703 asdl_seq_SET(keywords, nkeywords++, kw);
1704 }
1705 }
1706 else if (TYPE(ch) == STAR) {
1707 vararg = ast_for_expr(c, CHILD(n, i+1));
1708 i++;
1709 }
1710 else if (TYPE(ch) == DOUBLESTAR) {
1711 kwarg = ast_for_expr(c, CHILD(n, i+1));
1712 i++;
1713 }
1714 }
1715
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001716 return Call(func, args, keywords, vararg, kwarg, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717}
1718
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001720ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001722 /* testlist_gexp: test (',' test)* [','] */
1723 /* testlist: test (',' test)* [','] */
1724 /* testlist_safe: test (',' test)+ [','] */
1725 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001727 if (TYPE(n) == testlist_gexp) {
1728 if (NCH(n) > 1)
1729 assert(TYPE(CHILD(n, 1)) != gen_for);
1730 }
1731 else {
1732 assert(TYPE(n) == testlist ||
1733 TYPE(n) == testlist_safe ||
1734 TYPE(n) == testlist1);
1735 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736 if (NCH(n) == 1)
1737 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738 else {
1739 asdl_seq *tmp = seq_for_testlist(c, n);
1740 if (!tmp)
1741 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001742 return Tuple(tmp, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001744}
1745
1746static expr_ty
1747ast_for_testlist_gexp(struct compiling *c, const node* n)
1748{
1749 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1750 /* argument: test [ gen_for ] */
1751 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001752 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001753 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001754 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001755}
1756
1757/* like ast_for_testlist() but returns a sequence */
1758static asdl_seq*
1759ast_for_class_bases(struct compiling *c, const node* n)
1760{
1761 /* testlist: test (',' test)* [','] */
1762 assert(NCH(n) > 0);
1763 REQ(n, testlist);
1764 if (NCH(n) == 1) {
1765 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001766 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001767 if (!bases)
1768 return NULL;
1769 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001770 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001771 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001772 asdl_seq_SET(bases, 0, base);
1773 return bases;
1774 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001775
1776 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777}
1778
1779static stmt_ty
1780ast_for_expr_stmt(struct compiling *c, const node *n)
1781{
1782 REQ(n, expr_stmt);
1783 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1784 | ('=' (yield_expr|testlist))*)
1785 testlist: test (',' test)* [',']
1786 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
1787 | '<<=' | '>>=' | '**=' | '//='
1788 test: ... here starts the operator precendence dance
1789 */
1790
1791 if (NCH(n) == 1) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001792 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001793 if (!e)
1794 return NULL;
1795
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001796 return Expr(e, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797 }
1798 else if (TYPE(CHILD(n, 1)) == augassign) {
1799 expr_ty expr1, expr2;
1800 operator_ty operator;
1801 node *ch = CHILD(n, 0);
1802
1803 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001804 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001806 expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch),
1807 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808
1809 if (!expr1)
1810 return NULL;
Neal Norwitz96e48d42006-02-05 02:07:19 +00001811 /* TODO(jhylton): Figure out why set_context() can't be used here. */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001812 switch (expr1->kind) {
1813 case GeneratorExp_kind:
1814 ast_error(ch, "augmented assignment to generator "
1815 "expression not possible");
1816 return NULL;
1817 case Name_kind: {
1818 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1819 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1820 ast_error(ch, "assignment to None");
1821 return NULL;
1822 }
1823 break;
1824 }
1825 case Attribute_kind:
1826 case Subscript_kind:
1827 break;
1828 default:
1829 ast_error(ch, "illegal expression for augmented "
1830 "assignment");
1831 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833
1834 ch = CHILD(n, 2);
1835 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001836 expr2 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001838 expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001839 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 return NULL;
1841
1842 operator = ast_for_augassign(CHILD(n, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001843 if (!operator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 return NULL;
1845
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001846 return AugAssign(expr1, operator, expr2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 }
1848 else {
1849 int i;
1850 asdl_seq *targets;
1851 node *value;
1852 expr_ty expression;
1853
1854 /* a normal assignment */
1855 REQ(CHILD(n, 1), EQUAL);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001856 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857 if (!targets)
1858 return NULL;
1859 for (i = 0; i < NCH(n) - 2; i += 2) {
Armin Rigo31441302005-10-21 12:57:31 +00001860 expr_ty e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 node *ch = CHILD(n, i);
1862 if (TYPE(ch) == yield_expr) {
1863 ast_error(ch, "assignment to yield expression not possible");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001864 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001866 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867
1868 /* set context to assign */
1869 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001870 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871
Neal Norwitz84456bd2005-12-18 03:16:20 +00001872 if (!set_context(e, Store, CHILD(n, i)))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001873 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874
1875 asdl_seq_SET(targets, i / 2, e);
1876 }
1877 value = CHILD(n, NCH(n) - 1);
1878 if (TYPE(value) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001879 expression = ast_for_testlist(c, value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 else
1881 expression = ast_for_expr(c, value);
1882 if (!expression)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001883 return NULL;
1884 return Assign(targets, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886}
1887
1888static stmt_ty
1889ast_for_print_stmt(struct compiling *c, const node *n)
1890{
1891 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
1892 | '>>' test [ (',' test)+ [','] ] )
1893 */
1894 expr_ty dest = NULL, expression;
1895 asdl_seq *seq;
1896 bool nl;
1897 int i, start = 1;
1898
1899 REQ(n, print_stmt);
1900 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
1901 dest = ast_for_expr(c, CHILD(n, 2));
1902 if (!dest)
1903 return NULL;
1904 start = 4;
1905 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001906 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 if (!seq)
1908 return NULL;
1909 for (i = start; i < NCH(n); i += 2) {
1910 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001911 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913
1914 asdl_seq_APPEND(seq, expression);
1915 }
1916 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001917 return Print(dest, seq, nl, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918}
1919
1920static asdl_seq *
1921ast_for_exprlist(struct compiling *c, const node *n, int context)
1922{
1923 asdl_seq *seq;
1924 int i;
1925 expr_ty e;
1926
1927 REQ(n, exprlist);
1928
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001929 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 if (!seq)
1931 return NULL;
1932 for (i = 0; i < NCH(n); i += 2) {
1933 e = ast_for_expr(c, CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001934 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001935 return NULL;
Neal Norwitz6b347892005-11-15 07:17:53 +00001936 asdl_seq_SET(seq, i / 2, e);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001937 if (context && !set_context(e, context, CHILD(n, i)))
1938 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939 }
1940 return seq;
1941}
1942
1943static stmt_ty
1944ast_for_del_stmt(struct compiling *c, const node *n)
1945{
1946 asdl_seq *expr_list;
1947
1948 /* del_stmt: 'del' exprlist */
1949 REQ(n, del_stmt);
1950
1951 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
1952 if (!expr_list)
1953 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001954 return Delete(expr_list, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955}
1956
1957static stmt_ty
1958ast_for_flow_stmt(struct compiling *c, const node *n)
1959{
1960 /*
1961 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
1962 | yield_stmt
1963 break_stmt: 'break'
1964 continue_stmt: 'continue'
1965 return_stmt: 'return' [testlist]
1966 yield_stmt: yield_expr
1967 yield_expr: 'yield' testlist
1968 raise_stmt: 'raise' [test [',' test [',' test]]]
1969 */
1970 node *ch;
1971
1972 REQ(n, flow_stmt);
1973 ch = CHILD(n, 0);
1974 switch (TYPE(ch)) {
1975 case break_stmt:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001976 return Break(LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 case continue_stmt:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return Continue(LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979 case yield_stmt: { /* will reduce to yield_expr */
1980 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
1981 if (!exp)
1982 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001983 return Expr(exp, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 }
1985 case return_stmt:
1986 if (NCH(ch) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001987 return Return(NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001989 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 if (!expression)
1991 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001992 return Return(expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 }
1994 case raise_stmt:
1995 if (NCH(ch) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001996 return Raise(NULL, NULL, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 else if (NCH(ch) == 2) {
1998 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
1999 if (!expression)
2000 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002001 return Raise(expression, NULL, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 }
2003 else if (NCH(ch) == 4) {
2004 expr_ty expr1, expr2;
2005
2006 expr1 = ast_for_expr(c, CHILD(ch, 1));
2007 if (!expr1)
2008 return NULL;
2009 expr2 = ast_for_expr(c, CHILD(ch, 3));
2010 if (!expr2)
2011 return NULL;
2012
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002013 return Raise(expr1, expr2, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 }
2015 else if (NCH(ch) == 6) {
2016 expr_ty expr1, expr2, expr3;
2017
2018 expr1 = ast_for_expr(c, CHILD(ch, 1));
2019 if (!expr1)
2020 return NULL;
2021 expr2 = ast_for_expr(c, CHILD(ch, 3));
2022 if (!expr2)
2023 return NULL;
2024 expr3 = ast_for_expr(c, CHILD(ch, 5));
2025 if (!expr3)
2026 return NULL;
2027
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002028 return Raise(expr1, expr2, expr3, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 }
2030 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002031 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 "unexpected flow_stmt: %d", TYPE(ch));
2033 return NULL;
2034 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002035
2036 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038}
2039
2040static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042{
2043 /*
2044 import_as_name: NAME [NAME NAME]
2045 dotted_as_name: dotted_name [NAME NAME]
2046 dotted_name: NAME ('.' NAME)*
2047 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002048 PyObject *str;
2049
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 loop:
2051 switch (TYPE(n)) {
2052 case import_as_name:
Neal Norwitz84456bd2005-12-18 03:16:20 +00002053 str = (NCH(n) == 3) ? NEW_IDENTIFIER(CHILD(n, 2)) : NULL;
2054 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055 case dotted_as_name:
2056 if (NCH(n) == 1) {
2057 n = CHILD(n, 0);
2058 goto loop;
2059 }
2060 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002061 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 assert(!a->asname);
2063 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2064 return a;
2065 }
2066 break;
2067 case dotted_name:
2068 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002069 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 else {
2071 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002072 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002073 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 char *s;
2075
2076 len = 0;
2077 for (i = 0; i < NCH(n); i += 2)
2078 /* length of string plus one for the dot */
2079 len += strlen(STR(CHILD(n, i))) + 1;
2080 len--; /* the last name doesn't have a dot */
2081 str = PyString_FromStringAndSize(NULL, len);
2082 if (!str)
2083 return NULL;
2084 s = PyString_AS_STRING(str);
2085 if (!s)
2086 return NULL;
2087 for (i = 0; i < NCH(n); i += 2) {
2088 char *sch = STR(CHILD(n, i));
2089 strcpy(s, STR(CHILD(n, i)));
2090 s += strlen(sch);
2091 *s++ = '.';
2092 }
2093 --s;
2094 *s = '\0';
2095 PyString_InternInPlace(&str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002096 PyArena_AddPyObject(c->c_arena, str);
2097 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 }
2099 break;
2100 case STAR:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002101 str = PyString_InternFromString("*");
2102 PyArena_AddPyObject(c->c_arena, str);
2103 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002105 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106 "unexpected import name: %d", TYPE(n));
2107 return NULL;
2108 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002109
2110 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 return NULL;
2112}
2113
2114static stmt_ty
2115ast_for_import_stmt(struct compiling *c, const node *n)
2116{
2117 /*
2118 import_stmt: import_name | import_from
2119 import_name: 'import' dotted_as_names
2120 import_from: 'from' dotted_name 'import' ('*' |
2121 '(' import_as_names ')' |
2122 import_as_names)
2123 */
2124 int i;
2125 asdl_seq *aliases;
2126
2127 REQ(n, import_stmt);
2128 n = CHILD(n, 0);
2129 if (STR(CHILD(n, 0))[0] == 'i') { /* import */
2130 n = CHILD(n, 1);
Neil Schemenauer147b7592005-10-23 03:38:19 +00002131 REQ(n, dotted_as_names);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002132 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 if (!aliases)
2134 return NULL;
2135 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002136 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002137 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 asdl_seq_SET(aliases, i / 2, import_alias);
2140 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002141 return Import(aliases, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 }
2143 else if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002144 int n_children;
2145 const char *from_modules;
2146 int lineno = LINENO(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002147 alias_ty mod = alias_for_import_name(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 if (!mod)
2149 return NULL;
2150
2151 /* XXX this needs to be cleaned up */
2152
2153 from_modules = STR(CHILD(n, 3));
2154 if (!from_modules) {
2155 n = CHILD(n, 3); /* from ... import x, y, z */
2156 if (NCH(n) % 2 == 0) {
2157 /* it ends with a comma, not valid but the parser allows it */
2158 ast_error(n, "trailing comma not allowed without"
2159 " surrounding parentheses");
2160 return NULL;
2161 }
2162 }
2163 else if (from_modules[0] == '*') {
2164 n = CHILD(n, 3); /* from ... import * */
2165 }
2166 else if (from_modules[0] == '(')
2167 n = CHILD(n, 4); /* from ... import (x, y, z) */
Neal Norwitze76adcd2005-11-15 05:04:31 +00002168 else {
2169 /* XXX: don't we need to call ast_error(n, "..."); */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00002171 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172
2173 n_children = NCH(n);
2174 if (from_modules && from_modules[0] == '*')
2175 n_children = 1;
2176
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002177 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002178 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180
2181 /* handle "from ... import *" special b/c there's no children */
2182 if (from_modules && from_modules[0] == '*') {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002183 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002184 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 asdl_seq_APPEND(aliases, import_alias);
2187 }
2188
2189 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002190 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002191 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002192 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 asdl_seq_APPEND(aliases, import_alias);
2194 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002195 return ImportFrom(mod->name, aliases, lineno, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 }
Neal Norwitz79792652005-11-14 04:25:03 +00002197 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 "unknown import statement: starts with command '%s'",
2199 STR(CHILD(n, 0)));
2200 return NULL;
2201}
2202
2203static stmt_ty
2204ast_for_global_stmt(struct compiling *c, const node *n)
2205{
2206 /* global_stmt: 'global' NAME (',' NAME)* */
2207 identifier name;
2208 asdl_seq *s;
2209 int i;
2210
2211 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002212 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002213 if (!s)
2214 return NULL;
2215 for (i = 1; i < NCH(n); i += 2) {
2216 name = NEW_IDENTIFIER(CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002217 if (!name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 asdl_seq_SET(s, i / 2, name);
2220 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002221 return Global(s, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222}
2223
2224static stmt_ty
2225ast_for_exec_stmt(struct compiling *c, const node *n)
2226{
2227 expr_ty expr1, globals = NULL, locals = NULL;
2228 int n_children = NCH(n);
2229 if (n_children != 2 && n_children != 4 && n_children != 6) {
Neal Norwitz79792652005-11-14 04:25:03 +00002230 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 "poorly formed 'exec' statement: %d parts to statement",
2232 n_children);
2233 return NULL;
2234 }
2235
2236 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2237 REQ(n, exec_stmt);
2238 expr1 = ast_for_expr(c, CHILD(n, 1));
2239 if (!expr1)
2240 return NULL;
2241 if (n_children >= 4) {
2242 globals = ast_for_expr(c, CHILD(n, 3));
2243 if (!globals)
2244 return NULL;
2245 }
2246 if (n_children == 6) {
2247 locals = ast_for_expr(c, CHILD(n, 5));
2248 if (!locals)
2249 return NULL;
2250 }
2251
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002252 return Exec(expr1, globals, locals, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253}
2254
2255static stmt_ty
2256ast_for_assert_stmt(struct compiling *c, const node *n)
2257{
2258 /* assert_stmt: 'assert' test [',' test] */
2259 REQ(n, assert_stmt);
2260 if (NCH(n) == 2) {
2261 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2262 if (!expression)
2263 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002264 return Assert(expression, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 }
2266 else if (NCH(n) == 4) {
2267 expr_ty expr1, expr2;
2268
2269 expr1 = ast_for_expr(c, CHILD(n, 1));
2270 if (!expr1)
2271 return NULL;
2272 expr2 = ast_for_expr(c, CHILD(n, 3));
2273 if (!expr2)
2274 return NULL;
2275
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002276 return Assert(expr1, expr2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 }
Neal Norwitz79792652005-11-14 04:25:03 +00002278 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 "improper number of parts to 'assert' statement: %d",
2280 NCH(n));
2281 return NULL;
2282}
2283
2284static asdl_seq *
2285ast_for_suite(struct compiling *c, const node *n)
2286{
2287 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002288 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 stmt_ty s;
2290 int i, total, num, end, pos = 0;
2291 node *ch;
2292
2293 REQ(n, suite);
2294
2295 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002296 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297 if (!seq)
2298 return NULL;
2299 if (TYPE(CHILD(n, 0)) == simple_stmt) {
2300 n = CHILD(n, 0);
2301 /* simple_stmt always ends with a NEWLINE,
2302 and may have a trailing SEMI
2303 */
2304 end = NCH(n) - 1;
2305 if (TYPE(CHILD(n, end - 1)) == SEMI)
2306 end--;
2307 /* loop by 2 to skip semi-colons */
2308 for (i = 0; i < end; i += 2) {
2309 ch = CHILD(n, i);
2310 s = ast_for_stmt(c, ch);
2311 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002312 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 asdl_seq_SET(seq, pos++, s);
2314 }
2315 }
2316 else {
2317 for (i = 2; i < (NCH(n) - 1); i++) {
2318 ch = CHILD(n, i);
2319 REQ(ch, stmt);
2320 num = num_stmts(ch);
2321 if (num == 1) {
2322 /* small_stmt or compound_stmt with only one child */
2323 s = ast_for_stmt(c, ch);
2324 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002325 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 asdl_seq_SET(seq, pos++, s);
2327 }
2328 else {
2329 int j;
2330 ch = CHILD(ch, 0);
2331 REQ(ch, simple_stmt);
2332 for (j = 0; j < NCH(ch); j += 2) {
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002333 /* statement terminates with a semi-colon ';' */
2334 if (NCH(CHILD(ch, j)) == 0) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002335 assert((j + 1) == NCH(ch));
2336 break;
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002337 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 s = ast_for_stmt(c, CHILD(ch, j));
2339 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002340 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 asdl_seq_SET(seq, pos++, s);
2342 }
2343 }
2344 }
2345 }
2346 assert(pos == seq->size);
2347 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348}
2349
2350static stmt_ty
2351ast_for_if_stmt(struct compiling *c, const node *n)
2352{
2353 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2354 ['else' ':' suite]
2355 */
2356 char *s;
2357
2358 REQ(n, if_stmt);
2359
2360 if (NCH(n) == 4) {
2361 expr_ty expression;
2362 asdl_seq *suite_seq;
2363
2364 expression = ast_for_expr(c, CHILD(n, 1));
2365 if (!expression)
2366 return NULL;
2367 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002368 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 return NULL;
2370
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002371 return If(expression, suite_seq, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002373
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 s = STR(CHILD(n, 4));
2375 /* s[2], the third character in the string, will be
2376 's' for el_s_e, or
2377 'i' for el_i_f
2378 */
2379 if (s[2] == 's') {
2380 expr_ty expression;
2381 asdl_seq *seq1, *seq2;
2382
2383 expression = ast_for_expr(c, CHILD(n, 1));
2384 if (!expression)
2385 return NULL;
2386 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002387 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 return NULL;
2389 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002390 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 return NULL;
2392
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002393 return If(expression, seq1, seq2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 }
2395 else if (s[2] == 'i') {
2396 int i, n_elif, has_else = 0;
2397 asdl_seq *orelse = NULL;
2398 n_elif = NCH(n) - 4;
2399 /* must reference the child n_elif+1 since 'else' token is third,
2400 not fourth, child from the end. */
2401 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2402 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2403 has_else = 1;
2404 n_elif -= 3;
2405 }
2406 n_elif /= 4;
2407
2408 if (has_else) {
2409 expr_ty expression;
2410 asdl_seq *seq1, *seq2;
2411
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002412 orelse = asdl_seq_new(1, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 if (!orelse)
2414 return NULL;
2415 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002416 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002419 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002422 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424
2425 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002426 LINENO(CHILD(n, NCH(n) - 6)),
2427 c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 /* the just-created orelse handled the last elif */
2429 n_elif--;
2430 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431
2432 for (i = 0; i < n_elif; i++) {
2433 int off = 5 + (n_elif - i - 1) * 4;
2434 expr_ty expression;
2435 asdl_seq *suite_seq;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002436 asdl_seq *new = asdl_seq_new(1, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002437 if (!new)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 return NULL;
2439 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002440 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002443 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445
2446 asdl_seq_SET(new, 0,
2447 If(expression, suite_seq, orelse,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002448 LINENO(CHILD(n, off)), c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449 orelse = new;
2450 }
2451 return If(ast_for_expr(c, CHILD(n, 1)),
2452 ast_for_suite(c, CHILD(n, 3)),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002453 orelse, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002455
2456 PyErr_Format(PyExc_SystemError,
2457 "unexpected token in 'if' statement: %s", s);
2458 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459}
2460
2461static stmt_ty
2462ast_for_while_stmt(struct compiling *c, const node *n)
2463{
2464 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2465 REQ(n, while_stmt);
2466
2467 if (NCH(n) == 4) {
2468 expr_ty expression;
2469 asdl_seq *suite_seq;
2470
2471 expression = ast_for_expr(c, CHILD(n, 1));
2472 if (!expression)
2473 return NULL;
2474 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002475 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002476 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002477 return While(expression, suite_seq, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 }
2479 else if (NCH(n) == 7) {
2480 expr_ty expression;
2481 asdl_seq *seq1, *seq2;
2482
2483 expression = ast_for_expr(c, CHILD(n, 1));
2484 if (!expression)
2485 return NULL;
2486 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002487 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 return NULL;
2489 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002490 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 return NULL;
2492
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002493 return While(expression, seq1, seq2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002495
2496 PyErr_Format(PyExc_SystemError,
2497 "wrong number of tokens for 'while' statement: %d",
2498 NCH(n));
2499 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500}
2501
2502static stmt_ty
2503ast_for_for_stmt(struct compiling *c, const node *n)
2504{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002505 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 expr_ty expression;
2507 expr_ty target;
2508 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2509 REQ(n, for_stmt);
2510
2511 if (NCH(n) == 9) {
2512 seq = ast_for_suite(c, CHILD(n, 8));
2513 if (!seq)
2514 return NULL;
2515 }
2516
2517 _target = ast_for_exprlist(c, CHILD(n, 1), Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002518 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002520 if (asdl_seq_LEN(_target) == 1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521 target = asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002523 target = Tuple(_target, Store, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002525 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002526 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 return NULL;
2528 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002529 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530 return NULL;
2531
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002532 return For(target, expression, suite_seq, seq, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533}
2534
2535static excepthandler_ty
2536ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2537{
2538 /* except_clause: 'except' [test [',' test]] */
2539 REQ(exc, except_clause);
2540 REQ(body, suite);
2541
2542 if (NCH(exc) == 1) {
2543 asdl_seq *suite_seq = ast_for_suite(c, body);
2544 if (!suite_seq)
2545 return NULL;
2546
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002547 return excepthandler(NULL, NULL, suite_seq, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 }
2549 else if (NCH(exc) == 2) {
2550 expr_ty expression;
2551 asdl_seq *suite_seq;
2552
2553 expression = ast_for_expr(c, CHILD(exc, 1));
2554 if (!expression)
2555 return NULL;
2556 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002557 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 return NULL;
2559
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002560 return excepthandler(expression, NULL, suite_seq, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 }
2562 else if (NCH(exc) == 4) {
2563 asdl_seq *suite_seq;
2564 expr_ty expression;
2565 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2566 if (!e)
2567 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002568 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 return NULL;
2570 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002571 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 return NULL;
2573 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002574 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 return NULL;
2576
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002577 return excepthandler(expression, e, suite_seq, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002579
2580 PyErr_Format(PyExc_SystemError,
2581 "wrong number of children for 'except' clause: %d",
2582 NCH(exc));
2583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584}
2585
2586static stmt_ty
2587ast_for_try_stmt(struct compiling *c, const node *n)
2588{
Neal Norwitzf599f422005-12-17 21:33:47 +00002589 const int nch = NCH(n);
2590 int n_except = (nch - 3)/3;
2591 asdl_seq *body, *orelse = NULL, *finally = NULL;
2592
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 REQ(n, try_stmt);
2594
Neal Norwitzf599f422005-12-17 21:33:47 +00002595 body = ast_for_suite(c, CHILD(n, 2));
2596 if (body == NULL)
2597 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598
Neal Norwitzf599f422005-12-17 21:33:47 +00002599 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2600 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2601 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2602 /* we can assume it's an "else",
2603 because nch >= 9 for try-else-finally and
2604 it would otherwise have a type of except_clause */
2605 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2606 if (orelse == NULL)
2607 return NULL;
2608 n_except--;
2609 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610
Neal Norwitzf599f422005-12-17 21:33:47 +00002611 finally = ast_for_suite(c, CHILD(n, nch - 1));
2612 if (finally == NULL)
2613 return NULL;
2614 n_except--;
2615 }
2616 else {
2617 /* we can assume it's an "else",
2618 otherwise it would have a type of except_clause */
2619 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2620 if (orelse == NULL)
2621 return NULL;
2622 n_except--;
2623 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002625 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002626 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 return NULL;
2628 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002629
2630 if (n_except > 0) {
2631 int i;
2632 stmt_ty except_st;
2633 /* process except statements to create a try ... except */
2634 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2635 if (handlers == NULL)
2636 return NULL;
2637
2638 for (i = 0; i < n_except; i++) {
2639 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2640 CHILD(n, 5 + i * 3));
2641 if (!e)
2642 return NULL;
2643 asdl_seq_SET(handlers, i, e);
2644 }
2645
2646 except_st = TryExcept(body, handlers, orelse, LINENO(n), c->c_arena);
2647 if (!finally)
2648 return except_st;
2649
2650 /* if a 'finally' is present too, we nest the TryExcept within a
2651 TryFinally to emulate try ... except ... finally */
2652 body = asdl_seq_new(1, c->c_arena);
2653 if (body == NULL)
2654 return NULL;
2655 asdl_seq_SET(body, 0, except_st);
2656 }
2657
2658 /* must be a try ... finally (except clauses are in body, if any exist) */
2659 assert(finally != NULL);
2660 return TryFinally(body, finally, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661}
2662
2663static stmt_ty
2664ast_for_classdef(struct compiling *c, const node *n)
2665{
2666 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 asdl_seq *bases, *s;
2668
2669 REQ(n, classdef);
2670
2671 if (!strcmp(STR(CHILD(n, 1)), "None")) {
2672 ast_error(n, "assignment to None");
2673 return NULL;
2674 }
2675
2676 if (NCH(n) == 4) {
2677 s = ast_for_suite(c, CHILD(n, 3));
2678 if (!s)
2679 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002680 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2681 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 }
2683 /* check for empty base list */
2684 if (TYPE(CHILD(n,3)) == RPAR) {
2685 s = ast_for_suite(c, CHILD(n,5));
2686 if (!s)
2687 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002688 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2689 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 }
2691
2692 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002693 bases = ast_for_class_bases(c, CHILD(n, 3));
2694 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696
2697 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002698 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002700 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
2701 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702}
2703
2704static stmt_ty
2705ast_for_stmt(struct compiling *c, const node *n)
2706{
2707 if (TYPE(n) == stmt) {
2708 assert(NCH(n) == 1);
2709 n = CHILD(n, 0);
2710 }
2711 if (TYPE(n) == simple_stmt) {
2712 assert(num_stmts(n) == 1);
2713 n = CHILD(n, 0);
2714 }
2715 if (TYPE(n) == small_stmt) {
2716 REQ(n, small_stmt);
2717 n = CHILD(n, 0);
2718 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2719 | flow_stmt | import_stmt | global_stmt | exec_stmt
2720 | assert_stmt
2721 */
2722 switch (TYPE(n)) {
2723 case expr_stmt:
2724 return ast_for_expr_stmt(c, n);
2725 case print_stmt:
2726 return ast_for_print_stmt(c, n);
2727 case del_stmt:
2728 return ast_for_del_stmt(c, n);
2729 case pass_stmt:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002730 return Pass(LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 case flow_stmt:
2732 return ast_for_flow_stmt(c, n);
2733 case import_stmt:
2734 return ast_for_import_stmt(c, n);
2735 case global_stmt:
2736 return ast_for_global_stmt(c, n);
2737 case exec_stmt:
2738 return ast_for_exec_stmt(c, n);
2739 case assert_stmt:
2740 return ast_for_assert_stmt(c, n);
2741 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002742 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2744 TYPE(n), NCH(n));
2745 return NULL;
2746 }
2747 }
2748 else {
2749 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
2750 | funcdef | classdef
2751 */
2752 node *ch = CHILD(n, 0);
2753 REQ(n, compound_stmt);
2754 switch (TYPE(ch)) {
2755 case if_stmt:
2756 return ast_for_if_stmt(c, ch);
2757 case while_stmt:
2758 return ast_for_while_stmt(c, ch);
2759 case for_stmt:
2760 return ast_for_for_stmt(c, ch);
2761 case try_stmt:
2762 return ast_for_try_stmt(c, ch);
2763 case funcdef:
2764 return ast_for_funcdef(c, ch);
2765 case classdef:
2766 return ast_for_classdef(c, ch);
2767 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002768 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2770 TYPE(n), NCH(n));
2771 return NULL;
2772 }
2773 }
2774}
2775
2776static PyObject *
2777parsenumber(const char *s)
2778{
2779 const char *end;
2780 long x;
2781 double dx;
2782#ifndef WITHOUT_COMPLEX
2783 Py_complex c;
2784 int imflag;
2785#endif
2786
2787 errno = 0;
2788 end = s + strlen(s) - 1;
2789#ifndef WITHOUT_COMPLEX
2790 imflag = *end == 'j' || *end == 'J';
2791#endif
2792 if (*end == 'l' || *end == 'L')
2793 return PyLong_FromString((char *)s, (char **)0, 0);
2794 if (s[0] == '0') {
2795 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
2796 if (x < 0 && errno == 0) {
2797 return PyLong_FromString((char *)s,
2798 (char **)0,
2799 0);
2800 }
2801 }
2802 else
2803 x = PyOS_strtol((char *)s, (char **)&end, 0);
2804 if (*end == '\0') {
2805 if (errno != 0)
2806 return PyLong_FromString((char *)s, (char **)0, 0);
2807 return PyInt_FromLong(x);
2808 }
2809 /* XXX Huge floats may silently fail */
2810#ifndef WITHOUT_COMPLEX
2811 if (imflag) {
2812 c.real = 0.;
2813 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00002814 c.imag = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 PyFPE_END_PROTECT(c)
2816 return PyComplex_FromCComplex(c);
2817 }
2818 else
2819#endif
2820 {
2821 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00002822 dx = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 PyFPE_END_PROTECT(dx)
2824 return PyFloat_FromDouble(dx);
2825 }
2826}
2827
2828static PyObject *
2829decode_utf8(const char **sPtr, const char *end, char* encoding)
2830{
2831#ifndef Py_USING_UNICODE
2832 Py_FatalError("decode_utf8 should not be called in this build.");
2833 return NULL;
2834#else
2835 PyObject *u, *v;
2836 char *s, *t;
2837 t = s = (char *)*sPtr;
2838 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
2839 while (s < end && (*s & 0x80)) s++;
2840 *sPtr = s;
2841 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
2842 if (u == NULL)
2843 return NULL;
2844 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2845 Py_DECREF(u);
2846 return v;
2847#endif
2848}
2849
2850static PyObject *
2851decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
2852{
2853 PyObject *v, *u;
2854 char *buf;
2855 char *p;
2856 const char *end;
2857 if (encoding == NULL) {
2858 buf = (char *)s;
2859 u = NULL;
2860 } else if (strcmp(encoding, "iso-8859-1") == 0) {
2861 buf = (char *)s;
2862 u = NULL;
2863 } else {
2864 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
2865 u = PyString_FromStringAndSize((char *)NULL, len * 4);
2866 if (u == NULL)
2867 return NULL;
2868 p = buf = PyString_AsString(u);
2869 end = s + len;
2870 while (s < end) {
2871 if (*s == '\\') {
2872 *p++ = *s++;
2873 if (*s & 0x80) {
2874 strcpy(p, "u005c");
2875 p += 5;
2876 }
2877 }
2878 if (*s & 0x80) { /* XXX inefficient */
2879 PyObject *w;
2880 char *r;
2881 int rn, i;
2882 w = decode_utf8(&s, end, "utf-16-be");
2883 if (w == NULL) {
2884 Py_DECREF(u);
2885 return NULL;
2886 }
2887 r = PyString_AsString(w);
2888 rn = PyString_Size(w);
2889 assert(rn % 2 == 0);
2890 for (i = 0; i < rn; i += 2) {
2891 sprintf(p, "\\u%02x%02x",
2892 r[i + 0] & 0xFF,
2893 r[i + 1] & 0xFF);
2894 p += 6;
2895 }
2896 Py_DECREF(w);
2897 } else {
2898 *p++ = *s++;
2899 }
2900 }
2901 len = p - buf;
2902 s = buf;
2903 }
2904 if (rawmode)
2905 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
2906 else
2907 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
2908 Py_XDECREF(u);
2909 return v;
2910}
2911
2912/* s is a Python string literal, including the bracketing quote characters,
2913 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
2914 * parsestr parses it, and returns the decoded Python string object.
2915 */
2916static PyObject *
2917parsestr(const char *s, const char *encoding)
2918{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 size_t len;
Neal Norwitz30b5c5d2005-12-19 06:05:18 +00002920 int quote = Py_CHARMASK(*s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 int rawmode = 0;
2922 int need_encoding;
2923 int unicode = 0;
2924
2925 if (isalpha(quote) || quote == '_') {
2926 if (quote == 'u' || quote == 'U') {
2927 quote = *++s;
2928 unicode = 1;
2929 }
2930 if (quote == 'r' || quote == 'R') {
2931 quote = *++s;
2932 rawmode = 1;
2933 }
2934 }
2935 if (quote != '\'' && quote != '\"') {
2936 PyErr_BadInternalCall();
2937 return NULL;
2938 }
2939 s++;
2940 len = strlen(s);
2941 if (len > INT_MAX) {
2942 PyErr_SetString(PyExc_OverflowError,
2943 "string to parse is too long");
2944 return NULL;
2945 }
2946 if (s[--len] != quote) {
2947 PyErr_BadInternalCall();
2948 return NULL;
2949 }
2950 if (len >= 4 && s[0] == quote && s[1] == quote) {
2951 s += 2;
2952 len -= 2;
2953 if (s[--len] != quote || s[--len] != quote) {
2954 PyErr_BadInternalCall();
2955 return NULL;
2956 }
2957 }
2958#ifdef Py_USING_UNICODE
2959 if (unicode || Py_UnicodeFlag) {
2960 return decode_unicode(s, len, rawmode, encoding);
2961 }
2962#endif
2963 need_encoding = (encoding != NULL &&
2964 strcmp(encoding, "utf-8") != 0 &&
2965 strcmp(encoding, "iso-8859-1") != 0);
2966 if (rawmode || strchr(s, '\\') == NULL) {
2967 if (need_encoding) {
2968#ifndef Py_USING_UNICODE
2969 /* This should not happen - we never see any other
2970 encoding. */
2971 Py_FatalError("cannot deal with encodings in this build.");
2972#else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002973 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 if (u == NULL)
2975 return NULL;
2976 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2977 Py_DECREF(u);
2978 return v;
2979#endif
2980 } else {
2981 return PyString_FromStringAndSize(s, len);
2982 }
2983 }
2984
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002985 return PyString_DecodeEscape(s, len, NULL, unicode,
2986 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987}
2988
2989/* Build a Python string object out of a STRING atom. This takes care of
2990 * compile-time literal catenation, calling parsestr() on each piece, and
2991 * pasting the intermediate results together.
2992 */
2993static PyObject *
2994parsestrplus(struct compiling *c, const node *n)
2995{
2996 PyObject *v;
2997 int i;
2998 REQ(CHILD(n, 0), STRING);
2999 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3000 /* String literal concatenation */
3001 for (i = 1; i < NCH(n); i++) {
3002 PyObject *s;
3003 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3004 if (s == NULL)
3005 goto onError;
3006 if (PyString_Check(v) && PyString_Check(s)) {
3007 PyString_ConcatAndDel(&v, s);
3008 if (v == NULL)
3009 goto onError;
3010 }
3011#ifdef Py_USING_UNICODE
3012 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003013 PyObject *temp = PyUnicode_Concat(v, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 Py_DECREF(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 Py_DECREF(v);
3016 v = temp;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003017 if (v == NULL)
3018 goto onError;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 }
3020#endif
3021 }
3022 }
3023 return v;
3024
3025 onError:
3026 Py_XDECREF(v);
3027 return NULL;
3028}