blob: c7fd8bcc9604cfecd8ead0da6bde2fbea6bed935 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* XXX TO DO
19 - re-indent this file (should be done)
20 - internal error checking (freeing memory, etc.)
21 - syntax errors
22*/
23
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024/* Data structure used internally */
25struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000026 char *c_encoding; /* source encoding */
27 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028};
29
30static asdl_seq *seq_for_testlist(struct compiling *, const node *);
31static expr_ty ast_for_expr(struct compiling *, const node *);
32static stmt_ty ast_for_stmt(struct compiling *, const node *);
33static asdl_seq *ast_for_suite(struct compiling *, const node *);
Martin v. Löwis28457502006-04-11 09:17:27 +000034static asdl_seq *ast_for_exprlist(struct compiling *, const node *, expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000035static expr_ty ast_for_testlist(struct compiling *, const node *);
36static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037
38/* Note different signature for ast_for_call */
39static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
40
41static PyObject *parsenumber(const char *);
42static PyObject *parsestr(const char *s, const char *encoding);
43static PyObject *parsestrplus(struct compiling *, const node *n);
44
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#ifndef LINENO
46#define LINENO(n) ((n)->n_lineno)
47#endif
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
51 PyObject* id = PyString_InternFromString(n);
52 PyArena_AddPyObject(arena, id);
53 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000054}
55
Neal Norwitzadb69fc2005-12-17 20:54:49 +000056#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057
58/* This routine provides an invalid object for the syntax error.
59 The outermost routine must unpack this error and create the
60 proper object. We do this so that we don't have to pass
61 the filename to everything function.
62
63 XXX Maybe we should just pass the filename...
64*/
65
66static int
67ast_error(const node *n, const char *errstr)
68{
69 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
70 if (!u)
71 return 0;
72 PyErr_SetObject(PyExc_SyntaxError, u);
73 Py_DECREF(u);
74 return 0;
75}
76
77static void
78ast_error_finish(const char *filename)
79{
80 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000081 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082
83 assert(PyErr_Occurred());
84 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
85 return;
86
87 PyErr_Fetch(&type, &value, &tback);
88 errstr = PyTuple_GetItem(value, 0);
89 if (!errstr)
90 return;
91 Py_INCREF(errstr);
92 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000093 if (lineno == -1) {
94 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000096 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097 Py_DECREF(value);
98
99 loc = PyErr_ProgramText(filename, lineno);
100 if (!loc) {
101 Py_INCREF(Py_None);
102 loc = Py_None;
103 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000104 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000106 if (!tmp) {
107 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000109 }
Georg Brandl7784f122006-05-26 20:04:44 +0000110 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111 Py_DECREF(errstr);
112 Py_DECREF(tmp);
113 if (!value)
114 return;
115 PyErr_Restore(type, value, tback);
116}
117
118/* num_stmts() returns number of contained statements.
119
120 Use this routine to determine how big a sequence is needed for
121 the statements in a parse tree. Its raison d'etre is this bit of
122 grammar:
123
124 stmt: simple_stmt | compound_stmt
125 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
126
127 A simple_stmt can contain multiple small_stmt elements joined
128 by semicolons. If the arg is a simple_stmt, the number of
129 small_stmt elements is returned.
130*/
131
132static int
133num_stmts(const node *n)
134{
135 int i, l;
136 node *ch;
137
138 switch (TYPE(n)) {
139 case single_input:
140 if (TYPE(CHILD(n, 0)) == NEWLINE)
141 return 0;
142 else
143 return num_stmts(CHILD(n, 0));
144 case file_input:
145 l = 0;
146 for (i = 0; i < NCH(n); i++) {
147 ch = CHILD(n, i);
148 if (TYPE(ch) == stmt)
149 l += num_stmts(ch);
150 }
151 return l;
152 case stmt:
153 return num_stmts(CHILD(n, 0));
154 case compound_stmt:
155 return 1;
156 case simple_stmt:
157 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
158 case suite:
159 if (NCH(n) == 1)
160 return num_stmts(CHILD(n, 0));
161 else {
162 l = 0;
163 for (i = 2; i < (NCH(n) - 1); i++)
164 l += num_stmts(CHILD(n, i));
165 return l;
166 }
167 default: {
168 char buf[128];
169
170 sprintf(buf, "Non-statement found: %d %d\n",
171 TYPE(n), NCH(n));
172 Py_FatalError(buf);
173 }
174 }
175 assert(0);
176 return 0;
177}
178
179/* Transform the CST rooted at node * to the appropriate AST
180*/
181
182mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000183PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
184 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000186 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187 asdl_seq *stmts = NULL;
188 stmt_ty s;
189 node *ch;
190 struct compiling c;
191
192 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000193 c.c_encoding = "utf-8";
Neal Norwitze98ccf62006-03-23 05:39:47 +0000194 if (TYPE(n) == encoding_decl) {
195 ast_error(n, "encoding declaration in Unicode string");
196 goto error;
197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 } else if (TYPE(n) == encoding_decl) {
199 c.c_encoding = STR(n);
200 n = CHILD(n, 0);
201 } else {
202 c.c_encoding = NULL;
203 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205
Jeremy Hyltona8293132006-02-28 17:58:27 +0000206 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207 switch (TYPE(n)) {
208 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000209 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 if (!stmts)
211 return NULL;
212 for (i = 0; i < NCH(n) - 1; i++) {
213 ch = CHILD(n, i);
214 if (TYPE(ch) == NEWLINE)
215 continue;
216 REQ(ch, stmt);
217 num = num_stmts(ch);
218 if (num == 1) {
219 s = ast_for_stmt(&c, ch);
220 if (!s)
221 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000222 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223 }
224 else {
225 ch = CHILD(ch, 0);
226 REQ(ch, simple_stmt);
227 for (j = 0; j < num; j++) {
228 s = ast_for_stmt(&c, CHILD(ch, j * 2));
229 if (!s)
230 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000231 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232 }
233 }
234 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 case eval_input: {
237 expr_ty testlist_ast;
238
239 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000240 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 if (!testlist_ast)
242 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000243 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 }
245 case single_input:
246 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 if (!stmts)
249 goto error;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000250 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
251 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 }
254 else {
255 n = CHILD(n, 0);
256 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000257 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 if (!stmts)
259 goto error;
260 if (num == 1) {
Neal Norwitz406c6402006-01-07 21:23:26 +0000261 s = ast_for_stmt(&c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 if (!s)
263 goto error;
264 asdl_seq_SET(stmts, 0, s);
265 }
266 else {
267 /* Only a simple_stmt can contain multiple statements. */
268 REQ(n, simple_stmt);
269 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (TYPE(CHILD(n, i)) == NEWLINE)
271 break;
272 s = ast_for_stmt(&c, CHILD(n, i));
273 if (!s)
274 goto error;
275 asdl_seq_SET(stmts, i / 2, s);
276 }
277 }
278
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000279 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 }
281 default:
282 goto error;
283 }
284 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 ast_error_finish(filename);
286 return NULL;
287}
288
289/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
290*/
291
292static operator_ty
293get_operator(const node *n)
294{
295 switch (TYPE(n)) {
296 case VBAR:
297 return BitOr;
298 case CIRCUMFLEX:
299 return BitXor;
300 case AMPER:
301 return BitAnd;
302 case LEFTSHIFT:
303 return LShift;
304 case RIGHTSHIFT:
305 return RShift;
306 case PLUS:
307 return Add;
308 case MINUS:
309 return Sub;
310 case STAR:
311 return Mult;
312 case SLASH:
313 return Div;
314 case DOUBLESLASH:
315 return FloorDiv;
316 case PERCENT:
317 return Mod;
318 default:
Martin v. Löwis28457502006-04-11 09:17:27 +0000319 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320 }
321}
322
Jeremy Hyltona8293132006-02-28 17:58:27 +0000323/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000324
325 Only sets context for expr kinds that "can appear in assignment context"
326 (according to ../Parser/Python.asdl). For other expr kinds, it sets
327 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328*/
329
330static int
331set_context(expr_ty e, expr_context_ty ctx, const node *n)
332{
333 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000334 /* If a particular expression type can't be used for assign / delete,
335 set expr_name to its name and an error message will be generated.
336 */
337 const char* expr_name = NULL;
338
339 /* The ast defines augmented store and load contexts, but the
340 implementation here doesn't actually use them. The code may be
341 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000342 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000344 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000345 */
346 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347
348 switch (e->kind) {
349 case Attribute_kind:
350 if (ctx == Store &&
Jeremy Hyltona8293132006-02-28 17:58:27 +0000351 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352 return ast_error(n, "assignment to None");
353 }
354 e->v.Attribute.ctx = ctx;
355 break;
356 case Subscript_kind:
357 e->v.Subscript.ctx = ctx;
358 break;
359 case Name_kind:
360 if (ctx == Store &&
361 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
362 return ast_error(n, "assignment to None");
363 }
364 e->v.Name.ctx = ctx;
365 break;
366 case List_kind:
367 e->v.List.ctx = ctx;
368 s = e->v.List.elts;
369 break;
370 case Tuple_kind:
371 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
372 return ast_error(n, "can't assign to ()");
373 e->v.Tuple.ctx = ctx;
374 s = e->v.Tuple.elts;
375 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000376 case Lambda_kind:
377 expr_name = "lambda";
378 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 expr_name = "function call";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000384 case UnaryOp_kind:
385 expr_name = "operator";
386 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 expr_name = "generator expression";
389 break;
Neal Norwitz0d62a062006-07-30 06:53:31 +0000390 case Yield_kind:
391 expr_name = "yield expression";
392 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000393 case ListComp_kind:
394 expr_name = "list comprehension";
395 break;
396 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397 case Num_kind:
398 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 expr_name = "literal";
400 break;
401 case Compare_kind:
402 expr_name = "comparison";
403 break;
404 case Repr_kind:
405 expr_name = "repr";
406 break;
Neal Norwitz373f0a72006-05-15 07:04:36 +0000407 case IfExp_kind:
408 expr_name = "conditional expression";
409 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 default:
411 PyErr_Format(PyExc_SystemError,
412 "unexpected expression in assignment %d (line %d)",
413 e->kind, e->lineno);
414 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 /* Check for error string set by switch */
417 if (expr_name) {
418 char buf[300];
419 PyOS_snprintf(buf, sizeof(buf),
420 "can't %s %s",
421 ctx == Store ? "assign to" : "delete",
422 expr_name);
423 return ast_error(n, buf);
424 }
425
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000427 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 */
429 if (s) {
430 int i;
431
432 for (i = 0; i < asdl_seq_LEN(s); i++) {
Martin v. Löwis28457502006-04-11 09:17:27 +0000433 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 return 0;
435 }
436 }
437 return 1;
438}
439
440static operator_ty
441ast_for_augassign(const node *n)
442{
443 REQ(n, augassign);
444 n = CHILD(n, 0);
445 switch (STR(n)[0]) {
446 case '+':
447 return Add;
448 case '-':
449 return Sub;
450 case '/':
451 if (STR(n)[1] == '/')
452 return FloorDiv;
453 else
454 return Div;
455 case '%':
456 return Mod;
457 case '<':
458 return LShift;
459 case '>':
460 return RShift;
461 case '&':
462 return BitAnd;
463 case '^':
464 return BitXor;
465 case '|':
466 return BitOr;
467 case '*':
468 if (STR(n)[1] == '*')
469 return Pow;
470 else
471 return Mult;
472 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000473 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000474 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 }
476}
477
478static cmpop_ty
479ast_for_comp_op(const node *n)
480{
481 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
482 |'is' 'not'
483 */
484 REQ(n, comp_op);
485 if (NCH(n) == 1) {
486 n = CHILD(n, 0);
487 switch (TYPE(n)) {
488 case LESS:
489 return Lt;
490 case GREATER:
491 return Gt;
492 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493 return Eq;
494 case LESSEQUAL:
495 return LtE;
496 case GREATEREQUAL:
497 return GtE;
498 case NOTEQUAL:
499 return NotEq;
500 case NAME:
501 if (strcmp(STR(n), "in") == 0)
502 return In;
503 if (strcmp(STR(n), "is") == 0)
504 return Is;
505 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000506 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507 STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000508 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 }
511 else if (NCH(n) == 2) {
512 /* handle "not in" and "is not" */
513 switch (TYPE(CHILD(n, 0))) {
514 case NAME:
515 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
516 return NotIn;
517 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
518 return IsNot;
519 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000520 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Martin v. Löwis28457502006-04-11 09:17:27 +0000522 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
524 }
Neal Norwitz79792652005-11-14 04:25:03 +0000525 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000527 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000528}
529
530static asdl_seq *
531seq_for_testlist(struct compiling *c, const node *n)
532{
533 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000534 asdl_seq *seq;
535 expr_ty expression;
536 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537 assert(TYPE(n) == testlist
538 || TYPE(n) == listmaker
539 || TYPE(n) == testlist_gexp
540 || TYPE(n) == testlist_safe
Neal Norwitza3ce6aa2006-11-04 19:32:54 +0000541 || TYPE(n) == testlist1
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000544 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 if (!seq)
546 return NULL;
547
548 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000549 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550
551 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000552 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554
555 assert(i / 2 < seq->size);
556 asdl_seq_SET(seq, i / 2, expression);
557 }
558 return seq;
559}
560
561static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000562compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563{
564 int i, len = (NCH(n) + 1) / 2;
565 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000566 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 if (!args)
568 return NULL;
569
Georg Brandlc57221e2006-09-25 07:04:10 +0000570 /* fpdef: NAME | '(' fplist ')'
571 fplist: fpdef (',' fpdef)* [',']
572 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574 for (i = 0; i < len; i++) {
Georg Brandlc57221e2006-09-25 07:04:10 +0000575 const node *fpdef_node = CHILD(n, 2*i);
576 const node *child;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577 expr_ty arg;
Georg Brandlc57221e2006-09-25 07:04:10 +0000578set_name:
579 /* fpdef_node is either a NAME or an fplist */
580 child = CHILD(fpdef_node, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 if (TYPE(child) == NAME) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000582 if (!strcmp(STR(child), "None")) {
583 ast_error(child, "assignment to None");
584 return NULL;
585 }
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000586 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
587 child->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000588 }
589 else {
Georg Brandlc57221e2006-09-25 07:04:10 +0000590 assert(TYPE(fpdef_node) == fpdef);
591 /* fpdef_node[0] is not a name, so it must be a '(', get CHILD[1] */
592 child = CHILD(fpdef_node, 1);
593 assert(TYPE(child) == fplist);
594 /* NCH == 1 means we have (x), we need to elide the extra parens */
595 if (NCH(child) == 1) {
596 fpdef_node = CHILD(child, 0);
597 assert(TYPE(fpdef_node) == fpdef);
598 goto set_name;
599 }
600 arg = compiler_complex_args(c, child);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602 asdl_seq_SET(args, i, arg);
603 }
604
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000605 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000606 if (!set_context(result, Store, n))
607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608 return result;
609}
610
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
Jeremy Hyltona8293132006-02-28 17:58:27 +0000612/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613
614static arguments_ty
615ast_for_arguments(struct compiling *c, const node *n)
616{
617 /* parameters: '(' [varargslist] ')'
618 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
619 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
620 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000621 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 asdl_seq *args, *defaults;
623 identifier vararg = NULL, kwarg = NULL;
624 node *ch;
625
626 if (TYPE(n) == parameters) {
627 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000628 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629 n = CHILD(n, 1);
630 }
631 REQ(n, varargslist);
632
633 /* first count the number of normal args & defaults */
634 for (i = 0; i < NCH(n); i++) {
635 ch = CHILD(n, i);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000636 if (TYPE(ch) == fpdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000637 n_args++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638 if (TYPE(ch) == EQUAL)
639 n_defaults++;
640 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000641 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000642 if (!args && n_args)
Neal Norwitzc173b482006-07-30 19:18:13 +0000643 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000644 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645 if (!defaults && n_defaults)
Neal Norwitzc173b482006-07-30 19:18:13 +0000646 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000647
648 /* fpdef: NAME | '(' fplist ')'
649 fplist: fpdef (',' fpdef)* [',']
650 */
651 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000652 j = 0; /* index for defaults */
653 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000654 while (i < NCH(n)) {
655 ch = CHILD(n, i);
656 switch (TYPE(ch)) {
657 case fpdef:
Georg Brandlc57221e2006-09-25 07:04:10 +0000658 handle_fpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000659 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
660 anything other than EQUAL or a comma? */
661 /* XXX Should NCH(n) check be made a separate check? */
662 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzd12bd012006-07-21 07:59:47 +0000663 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
664 if (!expression)
665 goto error;
Neal Norwitzc173b482006-07-30 19:18:13 +0000666 assert(defaults != NULL);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000667 asdl_seq_SET(defaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000668 i += 2;
669 found_default = 1;
670 }
671 else if (found_default) {
672 ast_error(n,
673 "non-default argument follows default argument");
674 goto error;
675 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000676 if (NCH(ch) == 3) {
Neal Norwitz33b730e2006-03-27 08:58:23 +0000677 ch = CHILD(ch, 1);
678 /* def foo((x)): is not complex, special case. */
679 if (NCH(ch) != 1) {
680 /* We have complex arguments, setup for unpacking. */
681 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
682 } else {
683 /* def foo((x)): setup for checking NAME below. */
Georg Brandlc57221e2006-09-25 07:04:10 +0000684 /* Loop because there can be many parens and tuple
685 upacking mixed in. */
Neal Norwitz33b730e2006-03-27 08:58:23 +0000686 ch = CHILD(ch, 0);
Georg Brandlc57221e2006-09-25 07:04:10 +0000687 assert(TYPE(ch) == fpdef);
688 goto handle_fpdef;
Neal Norwitz33b730e2006-03-27 08:58:23 +0000689 }
690 }
691 if (TYPE(CHILD(ch, 0)) == NAME) {
Armin Rigo31441302005-10-21 12:57:31 +0000692 expr_ty name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000693 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
694 ast_error(CHILD(ch, 0), "assignment to None");
695 goto error;
696 }
Armin Rigo31441302005-10-21 12:57:31 +0000697 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000698 Param, LINENO(ch), ch->n_col_offset,
699 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700 if (!name)
701 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000702 asdl_seq_SET(args, k++, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703
704 }
705 i += 2; /* the name and the comma */
706 break;
707 case STAR:
708 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
709 ast_error(CHILD(n, i+1), "assignment to None");
710 goto error;
711 }
712 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
713 i += 3;
714 break;
715 case DOUBLESTAR:
716 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
717 ast_error(CHILD(n, i+1), "assignment to None");
718 goto error;
719 }
720 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
721 i += 3;
722 break;
723 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000724 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 "unexpected node in varargslist: %d @ %d",
726 TYPE(ch), i);
727 goto error;
728 }
729 }
730
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000731 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732
733 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000734 Py_XDECREF(vararg);
735 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 return NULL;
737}
738
739static expr_ty
740ast_for_dotted_name(struct compiling *c, const node *n)
741{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000742 expr_ty e;
743 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000744 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745 int i;
746
747 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000748
749 lineno = LINENO(n);
750 col_offset = n->n_col_offset;
751
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 id = NEW_IDENTIFIER(CHILD(n, 0));
753 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000754 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000755 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000757 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758
759 for (i = 2; i < NCH(n); i+=2) {
760 id = NEW_IDENTIFIER(CHILD(n, i));
761 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000762 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000763 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000764 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000765 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 }
767
768 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769}
770
771static expr_ty
772ast_for_decorator(struct compiling *c, const node *n)
773{
774 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
775 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000776 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
778 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000779 REQ(CHILD(n, 0), AT);
780 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781
782 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
783 if (!name_expr)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000784 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000785
786 if (NCH(n) == 3) { /* No arguments */
787 d = name_expr;
788 name_expr = NULL;
789 }
790 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000791 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
792 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000794 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 name_expr = NULL;
796 }
797 else {
798 d = ast_for_call(c, CHILD(n, 3), name_expr);
799 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000800 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801 name_expr = NULL;
802 }
803
804 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805}
806
807static asdl_seq*
808ast_for_decorators(struct compiling *c, const node *n)
809{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000810 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000811 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 int i;
813
814 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000815 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 if (!decorator_seq)
817 return NULL;
818
819 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000820 d = ast_for_decorator(c, CHILD(n, i));
821 if (!d)
822 return NULL;
823 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 }
825 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000826}
827
828static stmt_ty
829ast_for_funcdef(struct compiling *c, const node *n)
830{
831 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000832 identifier name;
833 arguments_ty args;
834 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 asdl_seq *decorator_seq = NULL;
836 int name_i;
837
838 REQ(n, funcdef);
839
840 if (NCH(n) == 6) { /* decorators are present */
841 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
842 if (!decorator_seq)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000843 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 name_i = 2;
845 }
846 else {
847 name_i = 1;
848 }
849
850 name = NEW_IDENTIFIER(CHILD(n, name_i));
851 if (!name)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000852 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Neal Norwitze76adcd2005-11-15 05:04:31 +0000854 ast_error(CHILD(n, name_i), "assignment to None");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 }
857 args = ast_for_arguments(c, CHILD(n, name_i + 1));
858 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 body = ast_for_suite(c, CHILD(n, name_i + 3));
861 if (!body)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000862 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000864 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
865 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866}
867
868static expr_ty
869ast_for_lambdef(struct compiling *c, const node *n)
870{
871 /* lambdef: 'lambda' [varargslist] ':' test */
872 arguments_ty args;
873 expr_ty expression;
874
875 if (NCH(n) == 3) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000876 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877 if (!args)
878 return NULL;
879 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000880 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 }
883 else {
884 args = ast_for_arguments(c, CHILD(n, 1));
885 if (!args)
886 return NULL;
887 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000888 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890 }
891
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000892 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000893}
894
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000895static expr_ty
896ast_for_ifexpr(struct compiling *c, const node *n)
897{
898 /* test: or_test 'if' or_test 'else' test */
899 expr_ty expression, body, orelse;
900
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000901 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000902 body = ast_for_expr(c, CHILD(n, 0));
903 if (!body)
904 return NULL;
905 expression = ast_for_expr(c, CHILD(n, 2));
906 if (!expression)
907 return NULL;
908 orelse = ast_for_expr(c, CHILD(n, 4));
909 if (!orelse)
910 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000911 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
912 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000913}
914
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000915/* Count the number of 'for' loop in a list comprehension.
916
917 Helper for ast_for_listcomp().
918*/
919
920static int
921count_list_fors(const node *n)
922{
923 int n_fors = 0;
924 node *ch = CHILD(n, 1);
925
926 count_list_for:
927 n_fors++;
928 REQ(ch, list_for);
929 if (NCH(ch) == 5)
930 ch = CHILD(ch, 4);
931 else
932 return n_fors;
933 count_list_iter:
934 REQ(ch, list_iter);
935 ch = CHILD(ch, 0);
936 if (TYPE(ch) == list_for)
937 goto count_list_for;
938 else if (TYPE(ch) == list_if) {
939 if (NCH(ch) == 3) {
940 ch = CHILD(ch, 2);
941 goto count_list_iter;
942 }
943 else
944 return n_fors;
945 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000946
947 /* Should never be reached */
948 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
949 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950}
951
952/* Count the number of 'if' statements in a list comprehension.
953
954 Helper for ast_for_listcomp().
955*/
956
957static int
958count_list_ifs(const node *n)
959{
960 int n_ifs = 0;
961
962 count_list_iter:
963 REQ(n, list_iter);
964 if (TYPE(CHILD(n, 0)) == list_for)
965 return n_ifs;
966 n = CHILD(n, 0);
967 REQ(n, list_if);
968 n_ifs++;
969 if (NCH(n) == 2)
970 return n_ifs;
971 n = CHILD(n, 2);
972 goto count_list_iter;
973}
974
975static expr_ty
976ast_for_listcomp(struct compiling *c, const node *n)
977{
978 /* listmaker: test ( list_for | (',' test)* [','] )
979 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
980 list_iter: list_for | list_if
981 list_if: 'if' test [list_iter]
982 testlist_safe: test [(',' test)+ [',']]
983 */
984 expr_ty elt;
985 asdl_seq *listcomps;
986 int i, n_fors;
987 node *ch;
988
989 REQ(n, listmaker);
990 assert(NCH(n) > 1);
991
992 elt = ast_for_expr(c, CHILD(n, 0));
993 if (!elt)
994 return NULL;
995
996 n_fors = count_list_fors(n);
997 if (n_fors == -1)
998 return NULL;
999
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001000 listcomps = asdl_seq_new(n_fors, c->c_arena);
1001 if (!listcomps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001003
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 ch = CHILD(n, 1);
1005 for (i = 0; i < n_fors; i++) {
1006 comprehension_ty lc;
1007 asdl_seq *t;
1008 expr_ty expression;
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001009 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010
1011 REQ(ch, list_for);
1012
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001013 for_ch = CHILD(ch, 1);
1014 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001015 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001017 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001018 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001021 /* Check the # of children rather than the length of t, since
1022 [x for x, in ... ] has 1 element in t, but still requires a Tuple. */
1023 if (NCH(for_ch) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001024 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001025 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001026 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001027 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1028 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001029 expression, NULL, c->c_arena);
1030 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032
1033 if (NCH(ch) == 5) {
1034 int j, n_ifs;
1035 asdl_seq *ifs;
Collin Winter7d9ac782007-03-16 04:12:48 +00001036 expr_ty list_for_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037
1038 ch = CHILD(ch, 4);
1039 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001040 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001043 ifs = asdl_seq_new(n_ifs, c->c_arena);
1044 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046
1047 for (j = 0; j < n_ifs; j++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001048 REQ(ch, list_iter);
1049 ch = CHILD(ch, 0);
1050 REQ(ch, list_if);
Collin Winter7d9ac782007-03-16 04:12:48 +00001051
1052 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1053 if (!list_for_expr)
1054 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055
Collin Winter7d9ac782007-03-16 04:12:48 +00001056 asdl_seq_SET(ifs, j, list_for_expr);
Jeremy Hyltona8293132006-02-28 17:58:27 +00001057 if (NCH(ch) == 3)
1058 ch = CHILD(ch, 2);
1059 }
1060 /* on exit, must guarantee that ch is a list_for */
1061 if (TYPE(ch) == list_iter)
1062 ch = CHILD(ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 lc->ifs = ifs;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001064 }
1065 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001066 }
1067
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001068 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069}
1070
1071/*
1072 Count the number of 'for' loops in a generator expression.
1073
1074 Helper for ast_for_genexp().
1075*/
1076
1077static int
1078count_gen_fors(const node *n)
1079{
1080 int n_fors = 0;
1081 node *ch = CHILD(n, 1);
1082
1083 count_gen_for:
1084 n_fors++;
1085 REQ(ch, gen_for);
1086 if (NCH(ch) == 5)
1087 ch = CHILD(ch, 4);
1088 else
1089 return n_fors;
1090 count_gen_iter:
1091 REQ(ch, gen_iter);
1092 ch = CHILD(ch, 0);
1093 if (TYPE(ch) == gen_for)
1094 goto count_gen_for;
1095 else if (TYPE(ch) == gen_if) {
1096 if (NCH(ch) == 3) {
1097 ch = CHILD(ch, 2);
1098 goto count_gen_iter;
1099 }
1100 else
1101 return n_fors;
1102 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001103
1104 /* Should never be reached */
1105 PyErr_SetString(PyExc_SystemError,
1106 "logic error in count_gen_fors");
1107 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108}
1109
1110/* Count the number of 'if' statements in a generator expression.
1111
1112 Helper for ast_for_genexp().
1113*/
1114
1115static int
1116count_gen_ifs(const node *n)
1117{
1118 int n_ifs = 0;
1119
1120 while (1) {
1121 REQ(n, gen_iter);
1122 if (TYPE(CHILD(n, 0)) == gen_for)
1123 return n_ifs;
1124 n = CHILD(n, 0);
1125 REQ(n, gen_if);
1126 n_ifs++;
1127 if (NCH(n) == 2)
1128 return n_ifs;
1129 n = CHILD(n, 2);
1130 }
1131}
1132
Jeremy Hyltona8293132006-02-28 17:58:27 +00001133/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134static expr_ty
1135ast_for_genexp(struct compiling *c, const node *n)
1136{
1137 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1138 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1139 expr_ty elt;
1140 asdl_seq *genexps;
1141 int i, n_fors;
1142 node *ch;
1143
1144 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1145 assert(NCH(n) > 1);
1146
1147 elt = ast_for_expr(c, CHILD(n, 0));
1148 if (!elt)
1149 return NULL;
1150
1151 n_fors = count_gen_fors(n);
1152 if (n_fors == -1)
1153 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001154
1155 genexps = asdl_seq_new(n_fors, c->c_arena);
1156 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001158
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 ch = CHILD(n, 1);
1160 for (i = 0; i < n_fors; i++) {
1161 comprehension_ty ge;
1162 asdl_seq *t;
1163 expr_ty expression;
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001164 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165
1166 REQ(ch, gen_for);
1167
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001168 for_ch = CHILD(ch, 1);
1169 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001170 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001172 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001173 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001175
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001176 /* Check the # of children rather than the length of t, since
1177 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1178 if (NCH(for_ch) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001179 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001182 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1183 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001184 expression, NULL, c->c_arena);
1185
1186 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001188
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189 if (NCH(ch) == 5) {
1190 int j, n_ifs;
1191 asdl_seq *ifs;
1192
1193 ch = CHILD(ch, 4);
1194 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001195 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
1198 ifs = asdl_seq_new(n_ifs, c->c_arena);
1199 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001201
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 for (j = 0; j < n_ifs; j++) {
1203 REQ(ch, gen_iter);
1204 ch = CHILD(ch, 0);
1205 REQ(ch, gen_if);
1206
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001207 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001208 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001209 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001210 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 if (NCH(ch) == 3)
1212 ch = CHILD(ch, 2);
1213 }
1214 /* on exit, must guarantee that ch is a gen_for */
1215 if (TYPE(ch) == gen_iter)
1216 ch = CHILD(ch, 0);
1217 ge->ifs = ifs;
1218 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00001219 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220 }
1221
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001222 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223}
1224
1225static expr_ty
1226ast_for_atom(struct compiling *c, const node *n)
1227{
1228 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1229 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1230 */
1231 node *ch = CHILD(n, 0);
1232
1233 switch (TYPE(ch)) {
1234 case NAME:
1235 /* All names start in Load context, but may later be
1236 changed. */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001237 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238 case STRING: {
1239 PyObject *str = parsestrplus(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 if (!str)
1241 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001242
1243 PyArena_AddPyObject(c->c_arena, str);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001244 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 }
1246 case NUMBER: {
1247 PyObject *pynum = parsenumber(STR(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 if (!pynum)
1249 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001250
1251 PyArena_AddPyObject(c->c_arena, pynum);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001252 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253 }
1254 case LPAR: /* some parenthesized expressions */
1255 ch = CHILD(n, 1);
1256
1257 if (TYPE(ch) == RPAR)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001258 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259
1260 if (TYPE(ch) == yield_expr)
1261 return ast_for_expr(c, ch);
1262
1263 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1264 return ast_for_genexp(c, ch);
1265
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001266 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 case LSQB: /* list (or list comprehension) */
1268 ch = CHILD(n, 1);
1269
1270 if (TYPE(ch) == RSQB)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001271 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272
1273 REQ(ch, listmaker);
1274 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1275 asdl_seq *elts = seq_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 if (!elts)
1277 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001278
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001279 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 }
1281 else
1282 return ast_for_listcomp(c, ch);
1283 case LBRACE: {
1284 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1285 int i, size;
1286 asdl_seq *keys, *values;
1287
1288 ch = CHILD(n, 1);
1289 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001290 keys = asdl_seq_new(size, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 if (!keys)
1292 return NULL;
1293
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001294 values = asdl_seq_new(size, c->c_arena);
1295 if (!values)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297
1298 for (i = 0; i < NCH(ch); i += 4) {
1299 expr_ty expression;
1300
1301 expression = ast_for_expr(c, CHILD(ch, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001302 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001304
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001306
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307 expression = ast_for_expr(c, CHILD(ch, i + 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001308 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001310
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311 asdl_seq_SET(values, i / 4, expression);
1312 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001313 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 }
1315 case BACKQUOTE: { /* repr */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001316 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 if (!expression)
1318 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001319
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001320 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 }
1322 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001323 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001324 return NULL;
1325 }
1326}
1327
1328static slice_ty
1329ast_for_slice(struct compiling *c, const node *n)
1330{
1331 node *ch;
1332 expr_ty lower = NULL, upper = NULL, step = NULL;
1333
1334 REQ(n, subscript);
1335
1336 /*
1337 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1338 sliceop: ':' [test]
1339 */
1340 ch = CHILD(n, 0);
1341 if (TYPE(ch) == DOT)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001342 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343
1344 if (NCH(n) == 1 && TYPE(ch) == test) {
1345 /* 'step' variable hold no significance in terms of being used over
1346 other vars */
1347 step = ast_for_expr(c, ch);
1348 if (!step)
1349 return NULL;
1350
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001351 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 }
1353
1354 if (TYPE(ch) == test) {
1355 lower = ast_for_expr(c, ch);
1356 if (!lower)
1357 return NULL;
1358 }
1359
1360 /* If there's an upper bound it's in the second or third position. */
1361 if (TYPE(ch) == COLON) {
1362 if (NCH(n) > 1) {
1363 node *n2 = CHILD(n, 1);
1364
1365 if (TYPE(n2) == test) {
1366 upper = ast_for_expr(c, n2);
1367 if (!upper)
1368 return NULL;
1369 }
1370 }
1371 } else if (NCH(n) > 2) {
1372 node *n2 = CHILD(n, 2);
1373
1374 if (TYPE(n2) == test) {
1375 upper = ast_for_expr(c, n2);
1376 if (!upper)
1377 return NULL;
1378 }
1379 }
1380
1381 ch = CHILD(n, NCH(n) - 1);
1382 if (TYPE(ch) == sliceop) {
Nick Coghlan77858682006-03-17 17:59:10 +00001383 if (NCH(ch) == 1) {
1384 /* No expression, so step is None */
1385 ch = CHILD(ch, 0);
1386 step = Name(new_identifier("None", c->c_arena), Load,
1387 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388 if (!step)
1389 return NULL;
Nick Coghlan77858682006-03-17 17:59:10 +00001390 } else {
1391 ch = CHILD(ch, 1);
1392 if (TYPE(ch) == test) {
1393 step = ast_for_expr(c, ch);
1394 if (!step)
1395 return NULL;
1396 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 }
1398 }
1399
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001400 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401}
1402
1403static expr_ty
1404ast_for_binop(struct compiling *c, const node *n)
1405{
1406 /* Must account for a sequence of expressions.
1407 How should A op B op C by represented?
1408 BinOp(BinOp(A, op, B), op, C).
1409 */
1410
1411 int i, nops;
1412 expr_ty expr1, expr2, result;
Anthony Baxtera863d332006-04-11 07:43:46 +00001413 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414
1415 expr1 = ast_for_expr(c, CHILD(n, 0));
1416 if (!expr1)
1417 return NULL;
1418
1419 expr2 = ast_for_expr(c, CHILD(n, 2));
1420 if (!expr2)
1421 return NULL;
1422
Anthony Baxtera863d332006-04-11 07:43:46 +00001423 newoperator = get_operator(CHILD(n, 1));
1424 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 return NULL;
1426
Anthony Baxtera863d332006-04-11 07:43:46 +00001427 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001428 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429 if (!result)
1430 return NULL;
1431
1432 nops = (NCH(n) - 1) / 2;
1433 for (i = 1; i < nops; i++) {
1434 expr_ty tmp_result, tmp;
1435 const node* next_oper = CHILD(n, i * 2 + 1);
1436
Anthony Baxtera863d332006-04-11 07:43:46 +00001437 newoperator = get_operator(next_oper);
1438 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 return NULL;
1440
1441 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1442 if (!tmp)
1443 return NULL;
1444
Anthony Baxtera863d332006-04-11 07:43:46 +00001445 tmp_result = BinOp(result, newoperator, tmp,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001446 LINENO(next_oper), next_oper->n_col_offset,
1447 c->c_arena);
Neal Norwitz14f848b2007-10-05 03:45:42 +00001448 if (!tmp_result)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 return NULL;
1450 result = tmp_result;
1451 }
1452 return result;
1453}
1454
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001455static expr_ty
1456ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1457{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001458 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1459 subscriptlist: subscript (',' subscript)* [',']
1460 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1461 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001462 REQ(n, trailer);
1463 if (TYPE(CHILD(n, 0)) == LPAR) {
1464 if (NCH(n) == 2)
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001465 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1466 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001467 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001468 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001469 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001470 else if (TYPE(CHILD(n, 0)) == DOT ) {
1471 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001472 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001473 }
1474 else {
1475 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001476 REQ(CHILD(n, 2), RSQB);
1477 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001478 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001479 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1480 if (!slc)
1481 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001482 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1483 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001484 }
1485 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001486 /* The grammar is ambiguous here. The ambiguity is resolved
1487 by treating the sequence as a tuple literal if there are
1488 no slice features.
1489 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001490 int j;
1491 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001492 expr_ty e;
Thomas Wouters65b3dab2006-03-01 22:06:23 +00001493 bool simple = true;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001494 asdl_seq *slices, *elts;
1495 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001496 if (!slices)
1497 return NULL;
1498 for (j = 0; j < NCH(n); j += 2) {
1499 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001500 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001501 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001502 if (slc->kind != Index_kind)
1503 simple = false;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001504 asdl_seq_SET(slices, j / 2, slc);
1505 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001506 if (!simple) {
1507 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001508 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001509 }
1510 /* extract Index values and put them in a Tuple */
1511 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001512 if (!elts)
1513 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001514 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1515 slc = (slice_ty)asdl_seq_GET(slices, j);
1516 assert(slc->kind == Index_kind && slc->v.Index.value);
1517 asdl_seq_SET(elts, j, slc->v.Index.value);
1518 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001519 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001520 if (!e)
1521 return NULL;
1522 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001523 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524 }
1525 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001526}
1527
1528static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001529ast_for_factor(struct compiling *c, const node *n)
1530{
1531 node *pfactor, *ppower, *patom, *pnum;
1532 expr_ty expression;
1533
1534 /* If the unary - operator is applied to a constant, don't generate
1535 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1536 constant. The peephole optimizer already does something like
1537 this but it doesn't handle the case where the constant is
1538 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1539 PyLongObject.
1540 */
1541 if (TYPE(CHILD(n, 0)) == MINUS
1542 && NCH(n) == 2
1543 && TYPE((pfactor = CHILD(n, 1))) == factor
1544 && NCH(pfactor) == 1
1545 && TYPE((ppower = CHILD(pfactor, 0))) == power
1546 && NCH(ppower) == 1
1547 && TYPE((patom = CHILD(ppower, 0))) == atom
1548 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1549 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1550 if (s == NULL)
1551 return NULL;
1552 s[0] = '-';
1553 strcpy(s + 1, STR(pnum));
1554 PyObject_FREE(STR(pnum));
1555 STR(pnum) = s;
1556 return ast_for_atom(c, patom);
1557 }
1558
1559 expression = ast_for_expr(c, CHILD(n, 1));
1560 if (!expression)
1561 return NULL;
1562
1563 switch (TYPE(CHILD(n, 0))) {
1564 case PLUS:
1565 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1566 c->c_arena);
1567 case MINUS:
1568 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1569 c->c_arena);
1570 case TILDE:
1571 return UnaryOp(Invert, expression, LINENO(n),
1572 n->n_col_offset, c->c_arena);
1573 }
1574 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1575 TYPE(CHILD(n, 0)));
1576 return NULL;
1577}
1578
1579static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001580ast_for_power(struct compiling *c, const node *n)
1581{
1582 /* power: atom trailer* ('**' factor)*
1583 */
1584 int i;
1585 expr_ty e, tmp;
1586 REQ(n, power);
1587 e = ast_for_atom(c, CHILD(n, 0));
1588 if (!e)
1589 return NULL;
1590 if (NCH(n) == 1)
1591 return e;
1592 for (i = 1; i < NCH(n); i++) {
1593 node *ch = CHILD(n, i);
1594 if (TYPE(ch) != trailer)
1595 break;
1596 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001597 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001598 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001599 tmp->lineno = e->lineno;
1600 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001601 e = tmp;
1602 }
1603 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1604 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001605 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001606 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001607 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001608 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001610 e = tmp;
1611 }
1612 return e;
1613}
1614
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615/* Do not name a variable 'expr'! Will cause a compile error.
1616*/
1617
1618static expr_ty
1619ast_for_expr(struct compiling *c, const node *n)
1620{
1621 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001622 test: or_test ['if' or_test 'else' test] | lambdef
1623 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624 and_test: not_test ('and' not_test)*
1625 not_test: 'not' not_test | comparison
1626 comparison: expr (comp_op expr)*
1627 expr: xor_expr ('|' xor_expr)*
1628 xor_expr: and_expr ('^' and_expr)*
1629 and_expr: shift_expr ('&' shift_expr)*
1630 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1631 arith_expr: term (('+'|'-') term)*
1632 term: factor (('*'|'/'|'%'|'//') factor)*
1633 factor: ('+'|'-'|'~') factor | power
1634 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001635
1636 As well as modified versions that exist for backward compatibility,
1637 to explicitly allow:
1638 [ x for x in lambda: 0, lambda: 1 ]
1639 (which would be ambiguous without these extra rules)
1640
1641 old_test: or_test | old_lambdef
1642 old_lambdef: 'lambda' [vararglist] ':' old_test
1643
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644 */
1645
1646 asdl_seq *seq;
1647 int i;
1648
1649 loop:
1650 switch (TYPE(n)) {
1651 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001652 case old_test:
1653 if (TYPE(CHILD(n, 0)) == lambdef ||
1654 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001656 else if (NCH(n) > 1)
1657 return ast_for_ifexpr(c, n);
1658 /* Fallthrough */
1659 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 case and_test:
1661 if (NCH(n) == 1) {
1662 n = CHILD(n, 0);
1663 goto loop;
1664 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001665 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001666 if (!seq)
1667 return NULL;
1668 for (i = 0; i < NCH(n); i += 2) {
1669 expr_ty e = ast_for_expr(c, CHILD(n, i));
1670 if (!e)
1671 return NULL;
1672 asdl_seq_SET(seq, i / 2, e);
1673 }
1674 if (!strcmp(STR(CHILD(n, 1)), "and"))
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001675 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1676 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001677 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001678 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679 case not_test:
1680 if (NCH(n) == 1) {
1681 n = CHILD(n, 0);
1682 goto loop;
1683 }
1684 else {
1685 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1686 if (!expression)
1687 return NULL;
1688
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001689 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1690 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691 }
1692 case comparison:
1693 if (NCH(n) == 1) {
1694 n = CHILD(n, 0);
1695 goto loop;
1696 }
1697 else {
1698 expr_ty expression;
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001699 asdl_int_seq *ops;
1700 asdl_seq *cmps;
1701 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 if (!ops)
1703 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 return NULL;
1707 }
1708 for (i = 1; i < NCH(n); i += 2) {
Anthony Baxtera863d332006-04-11 07:43:46 +00001709 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710
Anthony Baxtera863d332006-04-11 07:43:46 +00001711 newoperator = ast_for_comp_op(CHILD(n, i));
1712 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001714 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715
1716 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001717 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001719 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001721 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 asdl_seq_SET(cmps, i / 2, expression);
1723 }
1724 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001725 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001727 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001729 return Compare(expression, ops, cmps, LINENO(n),
1730 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 }
1732 break;
1733
1734 /* The next five cases all handle BinOps. The main body of code
1735 is the same in each case, but the switch turned inside out to
1736 reuse the code for each type of operator.
1737 */
1738 case expr:
1739 case xor_expr:
1740 case and_expr:
1741 case shift_expr:
1742 case arith_expr:
1743 case term:
1744 if (NCH(n) == 1) {
1745 n = CHILD(n, 0);
1746 goto loop;
1747 }
1748 return ast_for_binop(c, n);
1749 case yield_expr: {
1750 expr_ty exp = NULL;
1751 if (NCH(n) == 2) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001752 exp = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 if (!exp)
1754 return NULL;
1755 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001756 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001758 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 if (NCH(n) == 1) {
1760 n = CHILD(n, 0);
1761 goto loop;
1762 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001763 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001764 case power:
1765 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001767 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768 return NULL;
1769 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001770 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771 return NULL;
1772}
1773
1774static expr_ty
1775ast_for_call(struct compiling *c, const node *n, expr_ty func)
1776{
1777 /*
1778 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1779 | '**' test)
1780 argument: [test '='] test [gen_for] # Really [keyword '='] test
1781 */
1782
1783 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001784 asdl_seq *args;
1785 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 expr_ty vararg = NULL, kwarg = NULL;
1787
1788 REQ(n, arglist);
1789
1790 nargs = 0;
1791 nkeywords = 0;
1792 ngens = 0;
1793 for (i = 0; i < NCH(n); i++) {
1794 node *ch = CHILD(n, i);
1795 if (TYPE(ch) == argument) {
1796 if (NCH(ch) == 1)
1797 nargs++;
1798 else if (TYPE(CHILD(ch, 1)) == gen_for)
1799 ngens++;
1800 else
1801 nkeywords++;
1802 }
1803 }
1804 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001805 ast_error(n, "Generator expression must be parenthesized "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 "if not sole argument");
1807 return NULL;
1808 }
1809
1810 if (nargs + nkeywords + ngens > 255) {
1811 ast_error(n, "more than 255 arguments");
1812 return NULL;
1813 }
1814
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001815 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001817 return NULL;
1818 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 nargs = 0;
1822 nkeywords = 0;
1823 for (i = 0; i < NCH(n); i++) {
1824 node *ch = CHILD(n, i);
1825 if (TYPE(ch) == argument) {
1826 expr_ty e;
1827 if (NCH(ch) == 1) {
Neal Norwitz5ef92242006-05-19 06:43:50 +00001828 if (nkeywords) {
1829 ast_error(CHILD(ch, 0),
1830 "non-keyword arg after keyword arg");
1831 return NULL;
1832 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 e = ast_for_expr(c, CHILD(ch, 0));
1834 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001835 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 asdl_seq_SET(args, nargs++, e);
1837 }
1838 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1839 e = ast_for_genexp(c, ch);
1840 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001841 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 asdl_seq_SET(args, nargs++, e);
1843 }
1844 else {
1845 keyword_ty kw;
1846 identifier key;
1847
1848 /* CHILD(ch, 0) is test, but must be an identifier? */
1849 e = ast_for_expr(c, CHILD(ch, 0));
1850 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001851 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001852 /* f(lambda x: x[0] = 3) ends up getting parsed with
1853 * LHS test = lambda x: x[0], and RHS test = 3.
1854 * SF bug 132313 points out that complaining about a keyword
1855 * then is very confusing.
1856 */
1857 if (e->kind == Lambda_kind) {
Georg Brandl73c958a2007-06-07 13:23:28 +00001858 ast_error(CHILD(ch, 0),
1859 "lambda cannot contain assignment");
1860 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 } else if (e->kind != Name_kind) {
Georg Brandl73c958a2007-06-07 13:23:28 +00001862 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1863 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864 }
1865 key = e->v.Name.id;
Georg Brandl73c958a2007-06-07 13:23:28 +00001866 if (!strcmp(PyString_AS_STRING(key), "None")) {
1867 ast_error(CHILD(ch, 0), "assignment to None");
1868 return NULL;
1869 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 e = ast_for_expr(c, CHILD(ch, 2));
1871 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001872 return NULL;
1873 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001875 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 asdl_seq_SET(keywords, nkeywords++, kw);
1877 }
1878 }
1879 else if (TYPE(ch) == STAR) {
1880 vararg = ast_for_expr(c, CHILD(n, i+1));
Sean Reifscheider4af861c2008-03-20 17:39:31 +00001881 if (!vararg)
1882 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 i++;
1884 }
1885 else if (TYPE(ch) == DOUBLESTAR) {
1886 kwarg = ast_for_expr(c, CHILD(n, i+1));
Sean Reifscheider4af861c2008-03-20 17:39:31 +00001887 if (!kwarg)
1888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 i++;
1890 }
1891 }
1892
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001893 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894}
1895
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001897ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001899 /* testlist_gexp: test (',' test)* [','] */
1900 /* testlist: test (',' test)* [','] */
1901 /* testlist_safe: test (',' test)+ [','] */
1902 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001904 if (TYPE(n) == testlist_gexp) {
1905 if (NCH(n) > 1)
1906 assert(TYPE(CHILD(n, 1)) != gen_for);
1907 }
1908 else {
1909 assert(TYPE(n) == testlist ||
1910 TYPE(n) == testlist_safe ||
1911 TYPE(n) == testlist1);
1912 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 if (NCH(n) == 1)
1914 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915 else {
1916 asdl_seq *tmp = seq_for_testlist(c, n);
1917 if (!tmp)
1918 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001919 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001920 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001921}
1922
1923static expr_ty
1924ast_for_testlist_gexp(struct compiling *c, const node* n)
1925{
1926 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1927 /* argument: test [ gen_for ] */
1928 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001929 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001930 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001931 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001932}
1933
1934/* like ast_for_testlist() but returns a sequence */
1935static asdl_seq*
1936ast_for_class_bases(struct compiling *c, const node* n)
1937{
1938 /* testlist: test (',' test)* [','] */
1939 assert(NCH(n) > 0);
1940 REQ(n, testlist);
1941 if (NCH(n) == 1) {
1942 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001943 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001944 if (!bases)
1945 return NULL;
1946 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001947 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001948 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001949 asdl_seq_SET(bases, 0, base);
1950 return bases;
1951 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001952
1953 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954}
1955
1956static stmt_ty
1957ast_for_expr_stmt(struct compiling *c, const node *n)
1958{
1959 REQ(n, expr_stmt);
1960 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1961 | ('=' (yield_expr|testlist))*)
1962 testlist: test (',' test)* [',']
1963 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
1964 | '<<=' | '>>=' | '**=' | '//='
1965 test: ... here starts the operator precendence dance
1966 */
1967
1968 if (NCH(n) == 1) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001969 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 if (!e)
1971 return NULL;
1972
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001973 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 }
1975 else if (TYPE(CHILD(n, 1)) == augassign) {
1976 expr_ty expr1, expr2;
Anthony Baxtera863d332006-04-11 07:43:46 +00001977 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 node *ch = CHILD(n, 0);
1979
Neal Norwitz0d62a062006-07-30 06:53:31 +00001980 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 if (!expr1)
1982 return NULL;
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001983 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001984 switch (expr1->kind) {
1985 case GeneratorExp_kind:
1986 ast_error(ch, "augmented assignment to generator "
1987 "expression not possible");
1988 return NULL;
Neal Norwitz0d62a062006-07-30 06:53:31 +00001989 case Yield_kind:
1990 ast_error(ch, "augmented assignment to yield "
1991 "expression not possible");
1992 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001993 case Name_kind: {
1994 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1995 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1996 ast_error(ch, "assignment to None");
1997 return NULL;
1998 }
1999 break;
2000 }
2001 case Attribute_kind:
2002 case Subscript_kind:
2003 break;
2004 default:
2005 ast_error(ch, "illegal expression for augmented "
2006 "assignment");
2007 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 }
Collin Winter7d9ac782007-03-16 04:12:48 +00002009 if (!set_context(expr1, Store, ch))
2010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011
2012 ch = CHILD(n, 2);
2013 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002014 expr2 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 else
Neal Norwitz0d62a062006-07-30 06:53:31 +00002016 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002017 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 return NULL;
2019
Anthony Baxtera863d332006-04-11 07:43:46 +00002020 newoperator = ast_for_augassign(CHILD(n, 1));
2021 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 return NULL;
2023
Anthony Baxtera863d332006-04-11 07:43:46 +00002024 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 }
2026 else {
2027 int i;
2028 asdl_seq *targets;
2029 node *value;
2030 expr_ty expression;
2031
2032 /* a normal assignment */
2033 REQ(CHILD(n, 1), EQUAL);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002034 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 if (!targets)
2036 return NULL;
2037 for (i = 0; i < NCH(n) - 2; i += 2) {
Armin Rigo31441302005-10-21 12:57:31 +00002038 expr_ty e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 node *ch = CHILD(n, i);
2040 if (TYPE(ch) == yield_expr) {
2041 ast_error(ch, "assignment to yield expression not possible");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002044 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045
2046 /* set context to assign */
2047 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002048 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049
Neal Norwitz84456bd2005-12-18 03:16:20 +00002050 if (!set_context(e, Store, CHILD(n, i)))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002051 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052
2053 asdl_seq_SET(targets, i / 2, e);
2054 }
2055 value = CHILD(n, NCH(n) - 1);
2056 if (TYPE(value) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002057 expression = ast_for_testlist(c, value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 else
2059 expression = ast_for_expr(c, value);
2060 if (!expression)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002061 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002062 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064}
2065
2066static stmt_ty
2067ast_for_print_stmt(struct compiling *c, const node *n)
2068{
2069 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2070 | '>>' test [ (',' test)+ [','] ] )
2071 */
2072 expr_ty dest = NULL, expression;
2073 asdl_seq *seq;
2074 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002075 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076
2077 REQ(n, print_stmt);
2078 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2079 dest = ast_for_expr(c, CHILD(n, 2));
2080 if (!dest)
2081 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002082 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002084 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 if (!seq)
Jeremy Hyltona8293132006-02-28 17:58:27 +00002086 return NULL;
2087 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002089 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002091 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 }
2093 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002094 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095}
2096
2097static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002098ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099{
2100 asdl_seq *seq;
2101 int i;
2102 expr_ty e;
2103
2104 REQ(n, exprlist);
2105
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002106 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107 if (!seq)
2108 return NULL;
2109 for (i = 0; i < NCH(n); i += 2) {
2110 e = ast_for_expr(c, CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002111 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002112 return NULL;
Neal Norwitz6b347892005-11-15 07:17:53 +00002113 asdl_seq_SET(seq, i / 2, e);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002114 if (context && !set_context(e, context, CHILD(n, i)))
2115 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 }
2117 return seq;
2118}
2119
2120static stmt_ty
2121ast_for_del_stmt(struct compiling *c, const node *n)
2122{
2123 asdl_seq *expr_list;
2124
2125 /* del_stmt: 'del' exprlist */
2126 REQ(n, del_stmt);
2127
2128 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2129 if (!expr_list)
2130 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002131 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132}
2133
2134static stmt_ty
2135ast_for_flow_stmt(struct compiling *c, const node *n)
2136{
2137 /*
2138 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2139 | yield_stmt
2140 break_stmt: 'break'
2141 continue_stmt: 'continue'
2142 return_stmt: 'return' [testlist]
2143 yield_stmt: yield_expr
2144 yield_expr: 'yield' testlist
2145 raise_stmt: 'raise' [test [',' test [',' test]]]
2146 */
2147 node *ch;
2148
2149 REQ(n, flow_stmt);
2150 ch = CHILD(n, 0);
2151 switch (TYPE(ch)) {
2152 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002153 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002155 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 case yield_stmt: { /* will reduce to yield_expr */
2157 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2158 if (!exp)
2159 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002160 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161 }
2162 case return_stmt:
2163 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002164 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002166 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 if (!expression)
2168 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002169 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 }
2171 case raise_stmt:
2172 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002173 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174 else if (NCH(ch) == 2) {
2175 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2176 if (!expression)
2177 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002178 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179 }
2180 else if (NCH(ch) == 4) {
2181 expr_ty expr1, expr2;
2182
2183 expr1 = ast_for_expr(c, CHILD(ch, 1));
2184 if (!expr1)
2185 return NULL;
2186 expr2 = ast_for_expr(c, CHILD(ch, 3));
2187 if (!expr2)
2188 return NULL;
2189
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002190 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002191 }
2192 else if (NCH(ch) == 6) {
2193 expr_ty expr1, expr2, expr3;
2194
2195 expr1 = ast_for_expr(c, CHILD(ch, 1));
2196 if (!expr1)
2197 return NULL;
2198 expr2 = ast_for_expr(c, CHILD(ch, 3));
2199 if (!expr2)
2200 return NULL;
2201 expr3 = ast_for_expr(c, CHILD(ch, 5));
2202 if (!expr3)
2203 return NULL;
2204
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002205 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206 }
2207 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002208 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209 "unexpected flow_stmt: %d", TYPE(ch));
2210 return NULL;
2211 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002212
2213 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2214 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215}
2216
2217static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002218alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219{
2220 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002221 import_as_name: NAME ['as' NAME]
2222 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 dotted_name: NAME ('.' NAME)*
2224 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002225 PyObject *str;
2226
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227 loop:
2228 switch (TYPE(n)) {
2229 case import_as_name:
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002230 str = NULL;
2231 if (NCH(n) == 3) {
2232 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2233 ast_error(n, "must use 'as' in import");
2234 return NULL;
2235 }
2236 str = NEW_IDENTIFIER(CHILD(n, 2));
2237 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002238 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 case dotted_as_name:
2240 if (NCH(n) == 1) {
2241 n = CHILD(n, 0);
2242 goto loop;
2243 }
2244 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002245 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +00002246 if (!a)
2247 return NULL;
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002248 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2249 ast_error(n, "must use 'as' in import");
2250 return NULL;
2251 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 assert(!a->asname);
2253 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2254 return a;
2255 }
2256 break;
2257 case dotted_name:
2258 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002259 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 else {
2261 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002262 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002263 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 char *s;
2265
2266 len = 0;
2267 for (i = 0; i < NCH(n); i += 2)
2268 /* length of string plus one for the dot */
2269 len += strlen(STR(CHILD(n, i))) + 1;
2270 len--; /* the last name doesn't have a dot */
2271 str = PyString_FromStringAndSize(NULL, len);
2272 if (!str)
2273 return NULL;
2274 s = PyString_AS_STRING(str);
2275 if (!s)
2276 return NULL;
2277 for (i = 0; i < NCH(n); i += 2) {
2278 char *sch = STR(CHILD(n, i));
2279 strcpy(s, STR(CHILD(n, i)));
2280 s += strlen(sch);
2281 *s++ = '.';
2282 }
2283 --s;
2284 *s = '\0';
2285 PyString_InternInPlace(&str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002286 PyArena_AddPyObject(c->c_arena, str);
2287 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 }
2289 break;
2290 case STAR:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002291 str = PyString_InternFromString("*");
2292 PyArena_AddPyObject(c->c_arena, str);
2293 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002295 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 "unexpected import name: %d", TYPE(n));
2297 return NULL;
2298 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002299
2300 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 return NULL;
2302}
2303
2304static stmt_ty
2305ast_for_import_stmt(struct compiling *c, const node *n)
2306{
2307 /*
2308 import_stmt: import_name | import_from
2309 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002310 import_from: 'from' ('.'* dotted_name | '.') 'import'
2311 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002313 int lineno;
2314 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 int i;
2316 asdl_seq *aliases;
2317
2318 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002319 lineno = LINENO(n);
2320 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002322 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 n = CHILD(n, 1);
Neil Schemenauer147b7592005-10-23 03:38:19 +00002324 REQ(n, dotted_as_names);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002325 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 if (!aliases)
2327 return NULL;
2328 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002329 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002330 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 asdl_seq_SET(aliases, i / 2, import_alias);
2333 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002334 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002336 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 int n_children;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002338 int idx, ndots = 0;
2339 alias_ty mod = NULL;
2340 identifier modname;
2341
2342 /* Count the number of dots (for relative imports) and check for the
2343 optional module name */
2344 for (idx = 1; idx < NCH(n); idx++) {
2345 if (TYPE(CHILD(n, idx)) == dotted_name) {
2346 mod = alias_for_import_name(c, CHILD(n, idx));
2347 idx++;
2348 break;
2349 } else if (TYPE(CHILD(n, idx)) != DOT) {
2350 break;
2351 }
2352 ndots++;
2353 }
2354 idx++; /* skip over the 'import' keyword */
2355 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002356 case STAR:
2357 /* from ... import * */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002358 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002359 n_children = 1;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002360 if (ndots) {
2361 ast_error(n, "'import *' not allowed with 'from .'");
2362 return NULL;
2363 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002364 break;
2365 case LPAR:
2366 /* from ... import (x, y, z) */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002367 n = CHILD(n, idx + 1);
Thomas Wouters106203c2006-02-27 17:05:19 +00002368 n_children = NCH(n);
2369 break;
2370 case import_as_names:
2371 /* from ... import x, y, z */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002372 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002373 n_children = NCH(n);
2374 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375 ast_error(n, "trailing comma not allowed without"
2376 " surrounding parentheses");
2377 return NULL;
2378 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002379 break;
2380 default:
2381 ast_error(n, "Unexpected node-type in from-import");
2382 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00002383 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002385 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002386 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388
2389 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002390 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002391 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002392 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002394 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002396 else {
2397 for (i = 0; i < NCH(n); i += 2) {
2398 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2399 if (!import_alias)
2400 return NULL;
2401 asdl_seq_SET(aliases, i / 2, import_alias);
2402 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002404 if (mod != NULL)
2405 modname = mod->name;
2406 else
2407 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002408 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002409 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 }
Neal Norwitz79792652005-11-14 04:25:03 +00002411 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 "unknown import statement: starts with command '%s'",
2413 STR(CHILD(n, 0)));
2414 return NULL;
2415}
2416
2417static stmt_ty
2418ast_for_global_stmt(struct compiling *c, const node *n)
2419{
2420 /* global_stmt: 'global' NAME (',' NAME)* */
2421 identifier name;
2422 asdl_seq *s;
2423 int i;
2424
2425 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002426 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 if (!s)
2428 return NULL;
2429 for (i = 1; i < NCH(n); i += 2) {
2430 name = NEW_IDENTIFIER(CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002431 if (!name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433 asdl_seq_SET(s, i / 2, name);
2434 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002435 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436}
2437
2438static stmt_ty
2439ast_for_exec_stmt(struct compiling *c, const node *n)
2440{
2441 expr_ty expr1, globals = NULL, locals = NULL;
2442 int n_children = NCH(n);
2443 if (n_children != 2 && n_children != 4 && n_children != 6) {
Neal Norwitz79792652005-11-14 04:25:03 +00002444 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 "poorly formed 'exec' statement: %d parts to statement",
2446 n_children);
2447 return NULL;
2448 }
2449
2450 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2451 REQ(n, exec_stmt);
2452 expr1 = ast_for_expr(c, CHILD(n, 1));
2453 if (!expr1)
2454 return NULL;
2455 if (n_children >= 4) {
2456 globals = ast_for_expr(c, CHILD(n, 3));
2457 if (!globals)
2458 return NULL;
2459 }
2460 if (n_children == 6) {
2461 locals = ast_for_expr(c, CHILD(n, 5));
2462 if (!locals)
2463 return NULL;
2464 }
2465
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002466 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467}
2468
2469static stmt_ty
2470ast_for_assert_stmt(struct compiling *c, const node *n)
2471{
2472 /* assert_stmt: 'assert' test [',' test] */
2473 REQ(n, assert_stmt);
2474 if (NCH(n) == 2) {
2475 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2476 if (!expression)
2477 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002478 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 }
2480 else if (NCH(n) == 4) {
2481 expr_ty expr1, expr2;
2482
2483 expr1 = ast_for_expr(c, CHILD(n, 1));
2484 if (!expr1)
2485 return NULL;
2486 expr2 = ast_for_expr(c, CHILD(n, 3));
2487 if (!expr2)
2488 return NULL;
2489
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002490 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 }
Neal Norwitz79792652005-11-14 04:25:03 +00002492 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493 "improper number of parts to 'assert' statement: %d",
2494 NCH(n));
2495 return NULL;
2496}
2497
2498static asdl_seq *
2499ast_for_suite(struct compiling *c, const node *n)
2500{
2501 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002502 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 stmt_ty s;
2504 int i, total, num, end, pos = 0;
2505 node *ch;
2506
2507 REQ(n, suite);
2508
2509 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002510 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 if (!seq)
2512 return NULL;
2513 if (TYPE(CHILD(n, 0)) == simple_stmt) {
2514 n = CHILD(n, 0);
2515 /* simple_stmt always ends with a NEWLINE,
2516 and may have a trailing SEMI
2517 */
2518 end = NCH(n) - 1;
2519 if (TYPE(CHILD(n, end - 1)) == SEMI)
2520 end--;
2521 /* loop by 2 to skip semi-colons */
2522 for (i = 0; i < end; i += 2) {
2523 ch = CHILD(n, i);
2524 s = ast_for_stmt(c, ch);
2525 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002526 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 asdl_seq_SET(seq, pos++, s);
2528 }
2529 }
2530 else {
2531 for (i = 2; i < (NCH(n) - 1); i++) {
2532 ch = CHILD(n, i);
2533 REQ(ch, stmt);
2534 num = num_stmts(ch);
2535 if (num == 1) {
2536 /* small_stmt or compound_stmt with only one child */
2537 s = ast_for_stmt(c, ch);
2538 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002539 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 asdl_seq_SET(seq, pos++, s);
2541 }
2542 else {
2543 int j;
2544 ch = CHILD(ch, 0);
2545 REQ(ch, simple_stmt);
2546 for (j = 0; j < NCH(ch); j += 2) {
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002547 /* statement terminates with a semi-colon ';' */
2548 if (NCH(CHILD(ch, j)) == 0) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002549 assert((j + 1) == NCH(ch));
2550 break;
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002551 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 s = ast_for_stmt(c, CHILD(ch, j));
2553 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002554 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 asdl_seq_SET(seq, pos++, s);
2556 }
2557 }
2558 }
2559 }
2560 assert(pos == seq->size);
2561 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562}
2563
2564static stmt_ty
2565ast_for_if_stmt(struct compiling *c, const node *n)
2566{
2567 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2568 ['else' ':' suite]
2569 */
2570 char *s;
2571
2572 REQ(n, if_stmt);
2573
2574 if (NCH(n) == 4) {
2575 expr_ty expression;
2576 asdl_seq *suite_seq;
2577
2578 expression = ast_for_expr(c, CHILD(n, 1));
2579 if (!expression)
2580 return NULL;
2581 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002582 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 return NULL;
2584
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002585 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002587
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 s = STR(CHILD(n, 4));
2589 /* s[2], the third character in the string, will be
2590 's' for el_s_e, or
2591 'i' for el_i_f
2592 */
2593 if (s[2] == 's') {
2594 expr_ty expression;
2595 asdl_seq *seq1, *seq2;
2596
2597 expression = ast_for_expr(c, CHILD(n, 1));
2598 if (!expression)
2599 return NULL;
2600 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002601 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 return NULL;
2603 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002604 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 return NULL;
2606
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002607 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 }
2609 else if (s[2] == 'i') {
2610 int i, n_elif, has_else = 0;
Collin Winter7d9ac782007-03-16 04:12:48 +00002611 expr_ty expression;
2612 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 asdl_seq *orelse = NULL;
2614 n_elif = NCH(n) - 4;
2615 /* must reference the child n_elif+1 since 'else' token is third,
2616 not fourth, child from the end. */
2617 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2618 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2619 has_else = 1;
2620 n_elif -= 3;
2621 }
2622 n_elif /= 4;
2623
2624 if (has_else) {
Collin Winter7d9ac782007-03-16 04:12:48 +00002625 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002627 orelse = asdl_seq_new(1, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 if (!orelse)
2629 return NULL;
2630 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002631 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 return NULL;
Collin Winter7d9ac782007-03-16 04:12:48 +00002633 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2634 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 return NULL;
Collin Winter7d9ac782007-03-16 04:12:48 +00002636 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2637 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639
Collin Winter7d9ac782007-03-16 04:12:48 +00002640 asdl_seq_SET(orelse, 0, If(expression, suite_seq, suite_seq2,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002641 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002642 c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 /* the just-created orelse handled the last elif */
2644 n_elif--;
2645 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646
2647 for (i = 0; i < n_elif; i++) {
2648 int off = 5 + (n_elif - i - 1) * 4;
Anthony Baxtera863d332006-04-11 07:43:46 +00002649 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2650 if (!newobj)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 return NULL;
2652 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002653 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002656 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658
Anthony Baxtera863d332006-04-11 07:43:46 +00002659 asdl_seq_SET(newobj, 0,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 If(expression, suite_seq, orelse,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002661 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
Anthony Baxtera863d332006-04-11 07:43:46 +00002662 orelse = newobj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 }
Collin Winter7d9ac782007-03-16 04:12:48 +00002664 expression = ast_for_expr(c, CHILD(n, 1));
2665 if (!expression)
2666 return NULL;
2667 suite_seq = ast_for_suite(c, CHILD(n, 3));
2668 if (!suite_seq)
2669 return NULL;
2670 return If(expression, suite_seq, orelse,
2671 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002673
2674 PyErr_Format(PyExc_SystemError,
2675 "unexpected token in 'if' statement: %s", s);
2676 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677}
2678
2679static stmt_ty
2680ast_for_while_stmt(struct compiling *c, const node *n)
2681{
2682 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2683 REQ(n, while_stmt);
2684
2685 if (NCH(n) == 4) {
2686 expr_ty expression;
2687 asdl_seq *suite_seq;
2688
2689 expression = ast_for_expr(c, CHILD(n, 1));
2690 if (!expression)
2691 return NULL;
2692 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002695 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 }
2697 else if (NCH(n) == 7) {
2698 expr_ty expression;
2699 asdl_seq *seq1, *seq2;
2700
2701 expression = ast_for_expr(c, CHILD(n, 1));
2702 if (!expression)
2703 return NULL;
2704 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002705 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 return NULL;
2707 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002708 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 return NULL;
2710
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002711 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002713
2714 PyErr_Format(PyExc_SystemError,
2715 "wrong number of tokens for 'while' statement: %d",
2716 NCH(n));
2717 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718}
2719
2720static stmt_ty
2721ast_for_for_stmt(struct compiling *c, const node *n)
2722{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002723 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 expr_ty expression;
2725 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002726 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2728 REQ(n, for_stmt);
2729
2730 if (NCH(n) == 9) {
2731 seq = ast_for_suite(c, CHILD(n, 8));
2732 if (!seq)
2733 return NULL;
2734 }
2735
Neal Norwitzedef2be2006-07-12 05:26:17 +00002736 node_target = CHILD(n, 1);
2737 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002738 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002740 /* Check the # of children rather than the length of _target, since
2741 for x, in ... has 1 element in _target, but still requires a Tuple. */
2742 if (NCH(node_target) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00002743 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 else
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002745 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002747 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002748 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 return NULL;
2750 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002751 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 return NULL;
2753
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002754 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2755 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756}
2757
2758static excepthandler_ty
2759ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2760{
2761 /* except_clause: 'except' [test [',' test]] */
2762 REQ(exc, except_clause);
2763 REQ(body, suite);
2764
2765 if (NCH(exc) == 1) {
2766 asdl_seq *suite_seq = ast_for_suite(c, body);
2767 if (!suite_seq)
2768 return NULL;
2769
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002770 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
2771 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 }
2773 else if (NCH(exc) == 2) {
2774 expr_ty expression;
2775 asdl_seq *suite_seq;
2776
2777 expression = ast_for_expr(c, CHILD(exc, 1));
2778 if (!expression)
2779 return NULL;
2780 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002781 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 return NULL;
2783
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002784 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
2785 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 }
2787 else if (NCH(exc) == 4) {
2788 asdl_seq *suite_seq;
2789 expr_ty expression;
2790 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2791 if (!e)
2792 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002793 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794 return NULL;
2795 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002796 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 return NULL;
2798 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002799 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 return NULL;
2801
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002802 return excepthandler(expression, e, suite_seq, LINENO(exc),
2803 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002805
2806 PyErr_Format(PyExc_SystemError,
2807 "wrong number of children for 'except' clause: %d",
2808 NCH(exc));
2809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810}
2811
2812static stmt_ty
2813ast_for_try_stmt(struct compiling *c, const node *n)
2814{
Neal Norwitzf599f422005-12-17 21:33:47 +00002815 const int nch = NCH(n);
2816 int n_except = (nch - 3)/3;
2817 asdl_seq *body, *orelse = NULL, *finally = NULL;
2818
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 REQ(n, try_stmt);
2820
Neal Norwitzf599f422005-12-17 21:33:47 +00002821 body = ast_for_suite(c, CHILD(n, 2));
2822 if (body == NULL)
2823 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824
Neal Norwitzf599f422005-12-17 21:33:47 +00002825 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2826 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2827 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2828 /* we can assume it's an "else",
2829 because nch >= 9 for try-else-finally and
2830 it would otherwise have a type of except_clause */
2831 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2832 if (orelse == NULL)
2833 return NULL;
2834 n_except--;
2835 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836
Neal Norwitzf599f422005-12-17 21:33:47 +00002837 finally = ast_for_suite(c, CHILD(n, nch - 1));
2838 if (finally == NULL)
2839 return NULL;
2840 n_except--;
2841 }
2842 else {
2843 /* we can assume it's an "else",
2844 otherwise it would have a type of except_clause */
2845 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2846 if (orelse == NULL)
2847 return NULL;
2848 n_except--;
2849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002851 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002852 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853 return NULL;
2854 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002855
2856 if (n_except > 0) {
2857 int i;
2858 stmt_ty except_st;
2859 /* process except statements to create a try ... except */
2860 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2861 if (handlers == NULL)
2862 return NULL;
2863
2864 for (i = 0; i < n_except; i++) {
2865 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2866 CHILD(n, 5 + i * 3));
2867 if (!e)
2868 return NULL;
2869 asdl_seq_SET(handlers, i, e);
2870 }
2871
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002872 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2873 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002874 if (!finally)
2875 return except_st;
2876
2877 /* if a 'finally' is present too, we nest the TryExcept within a
2878 TryFinally to emulate try ... except ... finally */
2879 body = asdl_seq_new(1, c->c_arena);
2880 if (body == NULL)
2881 return NULL;
2882 asdl_seq_SET(body, 0, except_st);
2883 }
2884
2885 /* must be a try ... finally (except clauses are in body, if any exist) */
2886 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002887 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888}
2889
Guido van Rossumc2e20742006-02-27 22:32:47 +00002890static expr_ty
2891ast_for_with_var(struct compiling *c, const node *n)
2892{
2893 REQ(n, with_var);
2894 if (strcmp(STR(CHILD(n, 0)), "as") != 0) {
2895 ast_error(n, "expected \"with [expr] as [var]\"");
2896 return NULL;
2897 }
2898 return ast_for_expr(c, CHILD(n, 1));
2899}
2900
2901/* with_stmt: 'with' test [ with_var ] ':' suite */
2902static stmt_ty
2903ast_for_with_stmt(struct compiling *c, const node *n)
2904{
2905 expr_ty context_expr, optional_vars = NULL;
2906 int suite_index = 3; /* skip 'with', test, and ':' */
2907 asdl_seq *suite_seq;
2908
2909 assert(TYPE(n) == with_stmt);
2910 context_expr = ast_for_expr(c, CHILD(n, 1));
Collin Winter7d9ac782007-03-16 04:12:48 +00002911 if (!context_expr)
2912 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002913 if (TYPE(CHILD(n, 2)) == with_var) {
2914 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2915
2916 if (!optional_vars) {
2917 return NULL;
2918 }
2919 if (!set_context(optional_vars, Store, n)) {
2920 return NULL;
2921 }
2922 suite_index = 4;
2923 }
2924
2925 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2926 if (!suite_seq) {
2927 return NULL;
2928 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002929 return With(context_expr, optional_vars, suite_seq, LINENO(n),
2930 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002931}
2932
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933static stmt_ty
2934ast_for_classdef(struct compiling *c, const node *n)
2935{
2936 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 asdl_seq *bases, *s;
2938
2939 REQ(n, classdef);
2940
2941 if (!strcmp(STR(CHILD(n, 1)), "None")) {
2942 ast_error(n, "assignment to None");
2943 return NULL;
2944 }
2945
2946 if (NCH(n) == 4) {
2947 s = ast_for_suite(c, CHILD(n, 3));
2948 if (!s)
2949 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002950 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2951 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 }
2953 /* check for empty base list */
2954 if (TYPE(CHILD(n,3)) == RPAR) {
2955 s = ast_for_suite(c, CHILD(n,5));
2956 if (!s)
2957 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002958 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2959 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 }
2961
2962 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002963 bases = ast_for_class_bases(c, CHILD(n, 3));
2964 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966
2967 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002968 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002970 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
2971 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972}
2973
2974static stmt_ty
2975ast_for_stmt(struct compiling *c, const node *n)
2976{
2977 if (TYPE(n) == stmt) {
2978 assert(NCH(n) == 1);
2979 n = CHILD(n, 0);
2980 }
2981 if (TYPE(n) == simple_stmt) {
2982 assert(num_stmts(n) == 1);
2983 n = CHILD(n, 0);
2984 }
2985 if (TYPE(n) == small_stmt) {
2986 REQ(n, small_stmt);
2987 n = CHILD(n, 0);
2988 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2989 | flow_stmt | import_stmt | global_stmt | exec_stmt
2990 | assert_stmt
2991 */
2992 switch (TYPE(n)) {
2993 case expr_stmt:
2994 return ast_for_expr_stmt(c, n);
2995 case print_stmt:
2996 return ast_for_print_stmt(c, n);
2997 case del_stmt:
2998 return ast_for_del_stmt(c, n);
2999 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003000 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001 case flow_stmt:
3002 return ast_for_flow_stmt(c, n);
3003 case import_stmt:
3004 return ast_for_import_stmt(c, n);
3005 case global_stmt:
3006 return ast_for_global_stmt(c, n);
3007 case exec_stmt:
3008 return ast_for_exec_stmt(c, n);
3009 case assert_stmt:
3010 return ast_for_assert_stmt(c, n);
3011 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003012 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3014 TYPE(n), NCH(n));
3015 return NULL;
3016 }
3017 }
3018 else {
3019 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
3020 | funcdef | classdef
3021 */
3022 node *ch = CHILD(n, 0);
3023 REQ(n, compound_stmt);
3024 switch (TYPE(ch)) {
3025 case if_stmt:
3026 return ast_for_if_stmt(c, ch);
3027 case while_stmt:
3028 return ast_for_while_stmt(c, ch);
3029 case for_stmt:
3030 return ast_for_for_stmt(c, ch);
3031 case try_stmt:
3032 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003033 case with_stmt:
3034 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 case funcdef:
3036 return ast_for_funcdef(c, ch);
3037 case classdef:
3038 return ast_for_classdef(c, ch);
3039 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003040 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3042 TYPE(n), NCH(n));
3043 return NULL;
3044 }
3045 }
3046}
3047
3048static PyObject *
3049parsenumber(const char *s)
3050{
3051 const char *end;
3052 long x;
3053 double dx;
3054#ifndef WITHOUT_COMPLEX
3055 Py_complex c;
3056 int imflag;
3057#endif
3058
3059 errno = 0;
3060 end = s + strlen(s) - 1;
3061#ifndef WITHOUT_COMPLEX
3062 imflag = *end == 'j' || *end == 'J';
3063#endif
3064 if (*end == 'l' || *end == 'L')
3065 return PyLong_FromString((char *)s, (char **)0, 0);
3066 if (s[0] == '0') {
3067 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3068 if (x < 0 && errno == 0) {
3069 return PyLong_FromString((char *)s,
3070 (char **)0,
3071 0);
3072 }
3073 }
3074 else
3075 x = PyOS_strtol((char *)s, (char **)&end, 0);
3076 if (*end == '\0') {
3077 if (errno != 0)
3078 return PyLong_FromString((char *)s, (char **)0, 0);
3079 return PyInt_FromLong(x);
3080 }
3081 /* XXX Huge floats may silently fail */
3082#ifndef WITHOUT_COMPLEX
3083 if (imflag) {
3084 c.real = 0.;
3085 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003086 c.imag = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 PyFPE_END_PROTECT(c)
3088 return PyComplex_FromCComplex(c);
3089 }
3090 else
3091#endif
3092 {
3093 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003094 dx = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 PyFPE_END_PROTECT(dx)
3096 return PyFloat_FromDouble(dx);
3097 }
3098}
3099
3100static PyObject *
3101decode_utf8(const char **sPtr, const char *end, char* encoding)
3102{
3103#ifndef Py_USING_UNICODE
3104 Py_FatalError("decode_utf8 should not be called in this build.");
3105 return NULL;
3106#else
3107 PyObject *u, *v;
3108 char *s, *t;
3109 t = s = (char *)*sPtr;
3110 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3111 while (s < end && (*s & 0x80)) s++;
3112 *sPtr = s;
3113 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3114 if (u == NULL)
3115 return NULL;
3116 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3117 Py_DECREF(u);
3118 return v;
3119#endif
3120}
3121
Georg Brandleec47f32007-08-23 18:08:33 +00003122#ifdef Py_USING_UNICODE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123static PyObject *
3124decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3125{
3126 PyObject *v, *u;
3127 char *buf;
3128 char *p;
3129 const char *end;
3130 if (encoding == NULL) {
3131 buf = (char *)s;
3132 u = NULL;
3133 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3134 buf = (char *)s;
3135 u = NULL;
3136 } else {
Martin v. Löwis73c01d42008-02-14 11:26:18 +00003137 /* check for integer overflow */
3138 if (len > PY_SIZE_MAX / 4)
3139 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3141 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3142 if (u == NULL)
3143 return NULL;
3144 p = buf = PyString_AsString(u);
3145 end = s + len;
3146 while (s < end) {
3147 if (*s == '\\') {
3148 *p++ = *s++;
3149 if (*s & 0x80) {
3150 strcpy(p, "u005c");
3151 p += 5;
3152 }
3153 }
3154 if (*s & 0x80) { /* XXX inefficient */
3155 PyObject *w;
3156 char *r;
Martin v. Löwis66851282006-04-22 11:40:03 +00003157 Py_ssize_t rn, i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 w = decode_utf8(&s, end, "utf-16-be");
3159 if (w == NULL) {
3160 Py_DECREF(u);
3161 return NULL;
3162 }
3163 r = PyString_AsString(w);
3164 rn = PyString_Size(w);
3165 assert(rn % 2 == 0);
3166 for (i = 0; i < rn; i += 2) {
3167 sprintf(p, "\\u%02x%02x",
3168 r[i + 0] & 0xFF,
3169 r[i + 1] & 0xFF);
3170 p += 6;
3171 }
3172 Py_DECREF(w);
3173 } else {
3174 *p++ = *s++;
3175 }
3176 }
3177 len = p - buf;
3178 s = buf;
3179 }
3180 if (rawmode)
3181 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3182 else
3183 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3184 Py_XDECREF(u);
3185 return v;
3186}
Georg Brandleec47f32007-08-23 18:08:33 +00003187#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188
3189/* s is a Python string literal, including the bracketing quote characters,
3190 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3191 * parsestr parses it, and returns the decoded Python string object.
3192 */
3193static PyObject *
3194parsestr(const char *s, const char *encoding)
3195{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196 size_t len;
Neal Norwitz30b5c5d2005-12-19 06:05:18 +00003197 int quote = Py_CHARMASK(*s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 int rawmode = 0;
3199 int need_encoding;
3200 int unicode = 0;
3201
3202 if (isalpha(quote) || quote == '_') {
3203 if (quote == 'u' || quote == 'U') {
3204 quote = *++s;
3205 unicode = 1;
3206 }
3207 if (quote == 'r' || quote == 'R') {
3208 quote = *++s;
3209 rawmode = 1;
3210 }
3211 }
3212 if (quote != '\'' && quote != '\"') {
3213 PyErr_BadInternalCall();
3214 return NULL;
3215 }
3216 s++;
3217 len = strlen(s);
3218 if (len > INT_MAX) {
3219 PyErr_SetString(PyExc_OverflowError,
3220 "string to parse is too long");
3221 return NULL;
3222 }
3223 if (s[--len] != quote) {
3224 PyErr_BadInternalCall();
3225 return NULL;
3226 }
3227 if (len >= 4 && s[0] == quote && s[1] == quote) {
3228 s += 2;
3229 len -= 2;
3230 if (s[--len] != quote || s[--len] != quote) {
3231 PyErr_BadInternalCall();
3232 return NULL;
3233 }
3234 }
3235#ifdef Py_USING_UNICODE
3236 if (unicode || Py_UnicodeFlag) {
3237 return decode_unicode(s, len, rawmode, encoding);
3238 }
3239#endif
3240 need_encoding = (encoding != NULL &&
3241 strcmp(encoding, "utf-8") != 0 &&
3242 strcmp(encoding, "iso-8859-1") != 0);
3243 if (rawmode || strchr(s, '\\') == NULL) {
3244 if (need_encoding) {
3245#ifndef Py_USING_UNICODE
3246 /* This should not happen - we never see any other
3247 encoding. */
Jeremy Hylton2f327c12006-04-04 04:00:23 +00003248 Py_FatalError(
3249 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250#else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003251 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 if (u == NULL)
3253 return NULL;
3254 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3255 Py_DECREF(u);
3256 return v;
3257#endif
3258 } else {
3259 return PyString_FromStringAndSize(s, len);
3260 }
3261 }
3262
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003263 return PyString_DecodeEscape(s, len, NULL, unicode,
3264 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265}
3266
3267/* Build a Python string object out of a STRING atom. This takes care of
3268 * compile-time literal catenation, calling parsestr() on each piece, and
3269 * pasting the intermediate results together.
3270 */
3271static PyObject *
3272parsestrplus(struct compiling *c, const node *n)
3273{
3274 PyObject *v;
3275 int i;
3276 REQ(CHILD(n, 0), STRING);
3277 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3278 /* String literal concatenation */
3279 for (i = 1; i < NCH(n); i++) {
3280 PyObject *s;
3281 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3282 if (s == NULL)
3283 goto onError;
3284 if (PyString_Check(v) && PyString_Check(s)) {
3285 PyString_ConcatAndDel(&v, s);
3286 if (v == NULL)
3287 goto onError;
3288 }
3289#ifdef Py_USING_UNICODE
3290 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003291 PyObject *temp = PyUnicode_Concat(v, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292 Py_DECREF(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293 Py_DECREF(v);
3294 v = temp;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003295 if (v == NULL)
3296 goto onError;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 }
3298#endif
3299 }
3300 }
3301 return v;
3302
3303 onError:
3304 Py_XDECREF(v);
3305 return NULL;
3306}