blob: 42dcc2d82646410466204e573f9e84d25f8cf2a7 [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/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
31static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
36static PyObject *parsenumber(const char *);
37static PyObject *parsestr(const char *s, const char *encoding);
38static PyObject *parsestrplus(struct compiling *, const node *n);
39
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040#ifndef LINENO
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000041#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#endif
43
Neal Norwitzadb69fc2005-12-17 20:54:49 +000044static identifier
45new_identifier(const char* n, PyArena *arena) {
46 PyObject* id = PyString_InternFromString(n);
47 PyArena_AddPyObject(arena, id);
48 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000049}
50
Neal Norwitzadb69fc2005-12-17 20:54:49 +000051#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000052
53/* This routine provides an invalid object for the syntax error.
54 The outermost routine must unpack this error and create the
55 proper object. We do this so that we don't have to pass
56 the filename to everything function.
57
58 XXX Maybe we should just pass the filename...
59*/
60
61static int
62ast_error(const node *n, const char *errstr)
63{
64 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
65 if (!u)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000066 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000067 PyErr_SetObject(PyExc_SyntaxError, u);
68 Py_DECREF(u);
69 return 0;
70}
71
72static void
73ast_error_finish(const char *filename)
74{
75 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000076 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077
78 assert(PyErr_Occurred());
79 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000080 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82 PyErr_Fetch(&type, &value, &tback);
83 errstr = PyTuple_GetItem(value, 0);
84 if (!errstr)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000085 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086 Py_INCREF(errstr);
87 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000088 if (lineno == -1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000089 Py_DECREF(errstr);
90 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000091 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 Py_DECREF(value);
93
94 loc = PyErr_ProgramText(filename, lineno);
95 if (!loc) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +000096 Py_INCREF(Py_None);
97 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +000099 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000100 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000101 if (!tmp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000102 Py_DECREF(errstr);
103 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000104 }
Georg Brandl7784f122006-05-26 20:04:44 +0000105 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106 Py_DECREF(errstr);
107 Py_DECREF(tmp);
108 if (!value)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110 PyErr_Restore(type, value, tback);
111}
112
113/* num_stmts() returns number of contained statements.
114
115 Use this routine to determine how big a sequence is needed for
116 the statements in a parse tree. Its raison d'etre is this bit of
117 grammar:
118
119 stmt: simple_stmt | compound_stmt
120 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
121
122 A simple_stmt can contain multiple small_stmt elements joined
123 by semicolons. If the arg is a simple_stmt, the number of
124 small_stmt elements is returned.
125*/
126
127static int
128num_stmts(const node *n)
129{
130 int i, l;
131 node *ch;
132
133 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000134 case single_input:
135 if (TYPE(CHILD(n, 0)) == NEWLINE)
136 return 0;
137 else
138 return num_stmts(CHILD(n, 0));
139 case file_input:
140 l = 0;
141 for (i = 0; i < NCH(n); i++) {
142 ch = CHILD(n, i);
143 if (TYPE(ch) == stmt)
144 l += num_stmts(ch);
145 }
146 return l;
147 case stmt:
148 return num_stmts(CHILD(n, 0));
149 case compound_stmt:
150 return 1;
151 case simple_stmt:
152 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
153 case suite:
154 if (NCH(n) == 1)
155 return num_stmts(CHILD(n, 0));
156 else {
157 l = 0;
158 for (i = 2; i < (NCH(n) - 1); i++)
159 l += num_stmts(CHILD(n, i));
160 return l;
161 }
162 default: {
163 char buf[128];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000164
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000165 sprintf(buf, "Non-statement found: %d %d\n",
166 TYPE(n), NCH(n));
167 Py_FatalError(buf);
168 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000169 }
170 assert(0);
171 return 0;
172}
173
174/* Transform the CST rooted at node * to the appropriate AST
175*/
176
177mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000178PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000179 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000180{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000181 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000182 asdl_seq *stmts = NULL;
183 stmt_ty s;
184 node *ch;
185 struct compiling c;
186
187 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000188 c.c_encoding = "utf-8";
189 if (TYPE(n) == encoding_decl) {
190 ast_error(n, "encoding declaration in Unicode string");
191 goto error;
192 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000193 } else if (TYPE(n) == encoding_decl) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000194 c.c_encoding = STR(n);
195 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196 } else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000197 c.c_encoding = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000199 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200
Jeremy Hyltona8293132006-02-28 17:58:27 +0000201 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000202 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000203 case file_input:
204 stmts = asdl_seq_new(num_stmts(n), arena);
205 if (!stmts)
206 return NULL;
207 for (i = 0; i < NCH(n) - 1; i++) {
208 ch = CHILD(n, i);
209 if (TYPE(ch) == NEWLINE)
210 continue;
211 REQ(ch, stmt);
212 num = num_stmts(ch);
213 if (num == 1) {
214 s = ast_for_stmt(&c, ch);
215 if (!s)
216 goto error;
217 asdl_seq_SET(stmts, k++, s);
218 }
219 else {
220 ch = CHILD(ch, 0);
221 REQ(ch, simple_stmt);
222 for (j = 0; j < num; j++) {
223 s = ast_for_stmt(&c, CHILD(ch, j * 2));
224 if (!s)
225 goto error;
226 asdl_seq_SET(stmts, k++, s);
227 }
228 }
229 }
230 return Module(stmts, arena);
231 case eval_input: {
232 expr_ty testlist_ast;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000234 /* XXX Why not gen_for here? */
235 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
236 if (!testlist_ast)
237 goto error;
238 return Expression(testlist_ast, arena);
239 }
240 case single_input:
241 if (TYPE(CHILD(n, 0)) == NEWLINE) {
242 stmts = asdl_seq_new(1, arena);
243 if (!stmts)
244 goto error;
245 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
246 arena));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000247 if (!asdl_seq_GET(stmts, 0))
248 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000249 return Interactive(stmts, arena);
250 }
251 else {
252 n = CHILD(n, 0);
253 num = num_stmts(n);
254 stmts = asdl_seq_new(num, arena);
255 if (!stmts)
256 goto error;
257 if (num == 1) {
258 s = ast_for_stmt(&c, n);
259 if (!s)
260 goto error;
261 asdl_seq_SET(stmts, 0, s);
262 }
263 else {
264 /* Only a simple_stmt can contain multiple statements. */
265 REQ(n, simple_stmt);
266 for (i = 0; i < NCH(n); i += 2) {
267 if (TYPE(CHILD(n, i)) == NEWLINE)
268 break;
269 s = ast_for_stmt(&c, CHILD(n, i));
270 if (!s)
271 goto error;
272 asdl_seq_SET(stmts, i / 2, s);
273 }
274 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000276 return Interactive(stmts, arena);
277 }
278 default:
Georg Brandlb8ae3d02007-05-02 20:02:29 +0000279 PyErr_Format(PyExc_SystemError,
280 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000281 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000282 }
283 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 ast_error_finish(filename);
285 return NULL;
286}
287
288/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
289*/
290
291static operator_ty
292get_operator(const node *n)
293{
294 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000295 case VBAR:
296 return BitOr;
297 case CIRCUMFLEX:
298 return BitXor;
299 case AMPER:
300 return BitAnd;
301 case LEFTSHIFT:
302 return LShift;
303 case RIGHTSHIFT:
304 return RShift;
305 case PLUS:
306 return Add;
307 case MINUS:
308 return Sub;
309 case STAR:
310 return Mult;
311 case SLASH:
312 return Div;
313 case DOUBLESLASH:
314 return FloorDiv;
315 case PERCENT:
316 return Mod;
317 default:
318 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319 }
320}
321
Jeremy Hyltona8293132006-02-28 17:58:27 +0000322/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323
324 Only sets context for expr kinds that "can appear in assignment context"
325 (according to ../Parser/Python.asdl). For other expr kinds, it sets
326 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327*/
328
329static int
330set_context(expr_ty e, expr_context_ty ctx, const node *n)
331{
332 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000333 /* If a particular expression type can't be used for assign / delete,
334 set expr_name to its name and an error message will be generated.
335 */
336 const char* expr_name = NULL;
337
338 /* The ast defines augmented store and load contexts, but the
339 implementation here doesn't actually use them. The code may be
340 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000341 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000342 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000343 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000344 */
345 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000346
347 switch (e->kind) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000348 case Attribute_kind:
349 if (ctx == Store &&
350 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
351 return ast_error(n, "assignment to None");
352 }
353 e->v.Attribute.ctx = ctx;
354 break;
355 case Subscript_kind:
356 e->v.Subscript.ctx = ctx;
357 break;
358 case Name_kind:
359 if (ctx == Store &&
360 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
361 return ast_error(n, "assignment to None");
362 }
363 e->v.Name.ctx = ctx;
364 break;
365 case List_kind:
366 e->v.List.ctx = ctx;
367 s = e->v.List.elts;
368 break;
369 case Tuple_kind:
370 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
371 return ast_error(n, "can't assign to ()");
372 e->v.Tuple.ctx = ctx;
373 s = e->v.Tuple.elts;
374 break;
375 case Lambda_kind:
376 expr_name = "lambda";
377 break;
378 case Call_kind:
379 expr_name = "function call";
380 break;
381 case BoolOp_kind:
382 case BinOp_kind:
383 case UnaryOp_kind:
384 expr_name = "operator";
385 break;
386 case GeneratorExp_kind:
387 expr_name = "generator expression";
388 break;
389 case Yield_kind:
390 expr_name = "yield expression";
391 break;
392 case ListComp_kind:
393 expr_name = "list comprehension";
394 break;
395 case Dict_kind:
396 case Num_kind:
397 case Str_kind:
398 expr_name = "literal";
399 break;
400 case Compare_kind:
401 expr_name = "comparison";
402 break;
403 case Repr_kind:
404 expr_name = "repr";
405 break;
406 case IfExp_kind:
407 expr_name = "conditional expression";
408 break;
409 default:
410 PyErr_Format(PyExc_SystemError,
411 "unexpected expression in assignment %d (line %d)",
412 e->kind, e->lineno);
413 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000415 /* Check for error string set by switch */
416 if (expr_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000417 char buf[300];
418 PyOS_snprintf(buf, sizeof(buf),
419 "can't %s %s",
420 ctx == Store ? "assign to" : "delete",
421 expr_name);
422 return ast_error(n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000423 }
424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000426 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427 */
428 if (s) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000429 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000430
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000431 for (i = 0; i < asdl_seq_LEN(s); i++) {
432 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
433 return 0;
434 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 }
436 return 1;
437}
438
439static operator_ty
440ast_for_augassign(const node *n)
441{
442 REQ(n, augassign);
443 n = CHILD(n, 0);
444 switch (STR(n)[0]) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000445 case '+':
446 return Add;
447 case '-':
448 return Sub;
449 case '/':
450 if (STR(n)[1] == '/')
451 return FloorDiv;
452 else
453 return Div;
454 case '%':
455 return Mod;
456 case '<':
457 return LShift;
458 case '>':
459 return RShift;
460 case '&':
461 return BitAnd;
462 case '^':
463 return BitXor;
464 case '|':
465 return BitOr;
466 case '*':
467 if (STR(n)[1] == '*')
468 return Pow;
469 else
470 return Mult;
471 default:
472 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
473 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
475}
476
477static cmpop_ty
478ast_for_comp_op(const node *n)
479{
480 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000481 |'is' 'not'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000482 */
483 REQ(n, comp_op);
484 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000485 n = CHILD(n, 0);
486 switch (TYPE(n)) {
487 case LESS:
488 return Lt;
489 case GREATER:
490 return Gt;
491 case EQEQUAL: /* == */
492 return Eq;
493 case LESSEQUAL:
494 return LtE;
495 case GREATEREQUAL:
496 return GtE;
497 case NOTEQUAL:
498 return NotEq;
499 case NAME:
500 if (strcmp(STR(n), "in") == 0)
501 return In;
502 if (strcmp(STR(n), "is") == 0)
503 return Is;
504 default:
505 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
506 STR(n));
507 return (cmpop_ty)0;
508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 else if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000511 /* handle "not in" and "is not" */
512 switch (TYPE(CHILD(n, 0))) {
513 case NAME:
514 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
515 return NotIn;
516 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
517 return IsNot;
518 default:
519 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
520 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
521 return (cmpop_ty)0;
522 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
Neal Norwitz79792652005-11-14 04:25:03 +0000524 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000525 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000526 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527}
528
529static asdl_seq *
530seq_for_testlist(struct compiling *c, const node *n)
531{
532 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000533 asdl_seq *seq;
534 expr_ty expression;
535 int i;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000536 assert(TYPE(n) == testlist ||
537 TYPE(n) == listmaker ||
538 TYPE(n) == testlist_gexp ||
539 TYPE(n) == testlist_safe ||
540 TYPE(n) == testlist1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000542 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000544 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545
546 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000547 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000549 expression = ast_for_expr(c, CHILD(n, i));
550 if (!expression)
551 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000553 assert(i / 2 < seq->size);
554 asdl_seq_SET(seq, i / 2, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 }
556 return seq;
557}
558
559static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000560compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561{
562 int i, len = (NCH(n) + 1) / 2;
563 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000564 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000565 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000566 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567
Neal Norwitz3a230172006-09-22 08:18:10 +0000568 /* fpdef: NAME | '(' fplist ')'
569 fplist: fpdef (',' fpdef)* [',']
570 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572 for (i = 0; i < len; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000573 const node *fpdef_node = CHILD(n, 2*i);
574 const node *child;
575 expr_ty arg;
Neal Norwitz3a230172006-09-22 08:18:10 +0000576set_name:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000577 /* fpdef_node is either a NAME or an fplist */
578 child = CHILD(fpdef_node, 0);
579 if (TYPE(child) == NAME) {
580 if (!strcmp(STR(child), "None")) {
581 ast_error(child, "assignment to None");
582 return NULL;
583 }
584 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
585 child->n_col_offset, c->c_arena);
586 }
587 else {
588 assert(TYPE(fpdef_node) == fpdef);
589 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
590 child = CHILD(fpdef_node, 1);
591 assert(TYPE(child) == fplist);
592 /* NCH == 1 means we have (x), we need to elide the extra parens */
593 if (NCH(child) == 1) {
594 fpdef_node = CHILD(child, 0);
595 assert(TYPE(fpdef_node) == fpdef);
596 goto set_name;
597 }
598 arg = compiler_complex_args(c, child);
599 }
600 asdl_seq_SET(args, i, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601 }
602
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000603 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000604 if (!set_context(result, Store, n))
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000605 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 return result;
607}
608
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609
Jeremy Hyltona8293132006-02-28 17:58:27 +0000610/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
612static arguments_ty
613ast_for_arguments(struct compiling *c, const node *n)
614{
615 /* parameters: '(' [varargslist] ')'
616 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000617 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000619 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 asdl_seq *args, *defaults;
621 identifier vararg = NULL, kwarg = NULL;
622 node *ch;
623
624 if (TYPE(n) == parameters) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000625 if (NCH(n) == 2) /* () as argument list */
626 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
627 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628 }
629 REQ(n, varargslist);
630
631 /* first count the number of normal args & defaults */
632 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000633 ch = CHILD(n, i);
634 if (TYPE(ch) == fpdef)
635 n_args++;
636 if (TYPE(ch) == EQUAL)
637 n_defaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000639 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000640 if (!args && n_args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000641 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000642 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000643 if (!defaults && n_defaults)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000644 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645
646 /* fpdef: NAME | '(' fplist ')'
647 fplist: fpdef (',' fpdef)* [',']
648 */
649 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000650 j = 0; /* index for defaults */
651 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000652 while (i < NCH(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000653 ch = CHILD(n, i);
654 switch (TYPE(ch)) {
655 case fpdef:
656 handle_fpdef:
657 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
658 anything other than EQUAL or a comma? */
659 /* XXX Should NCH(n) check be made a separate check? */
660 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
661 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
662 if (!expression)
663 goto error;
664 assert(defaults != NULL);
665 asdl_seq_SET(defaults, j++, expression);
666 i += 2;
667 found_default = 1;
668 }
669 else if (found_default) {
670 ast_error(n,
671 "non-default argument follows default argument");
672 goto error;
673 }
674 if (NCH(ch) == 3) {
675 ch = CHILD(ch, 1);
676 /* def foo((x)): is not complex, special case. */
677 if (NCH(ch) != 1) {
678 /* We have complex arguments, setup for unpacking. */
679 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
Neal Norwitzdc9b32e2007-05-03 06:47:18 +0000680 if (!asdl_seq_GET(args, k-1))
681 goto error;
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000682 } else {
683 /* def foo((x)): setup for checking NAME below. */
684 /* Loop because there can be many parens and tuple
685 unpacking mixed in. */
686 ch = CHILD(ch, 0);
687 assert(TYPE(ch) == fpdef);
688 goto handle_fpdef;
689 }
690 }
691 if (TYPE(CHILD(ch, 0)) == NAME) {
692 expr_ty name;
693 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
694 ast_error(CHILD(ch, 0), "assignment to None");
695 goto error;
696 }
697 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
698 Param, LINENO(ch), ch->n_col_offset,
699 c->c_arena);
700 if (!name)
701 goto error;
702 asdl_seq_SET(args, k++, name);
703
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:
724 PyErr_Format(PyExc_SystemError,
725 "unexpected node in varargslist: %d @ %d",
726 TYPE(ch), i);
727 goto error;
728 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 }
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)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +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)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000757 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758
759 for (i = 2; i < NCH(n); i+=2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000760 id = NEW_IDENTIFIER(CHILD(n, i));
761 if (!id)
762 return NULL;
763 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
764 if (!e)
765 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)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000784 return NULL;
785
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 if (NCH(n) == 3) { /* No arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000787 d = name_expr;
788 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 }
790 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000791 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
792 n->n_col_offset, c->c_arena);
793 if (!d)
794 return NULL;
795 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796 }
797 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000798 d = ast_for_call(c, CHILD(n, 3), name_expr);
799 if (!d)
800 return NULL;
801 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 }
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)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000817 return NULL;
818
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +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 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000841 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
842 if (!decorator_seq)
843 return NULL;
844 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 }
846 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000847 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 }
849
850 name = NEW_IDENTIFIER(CHILD(n, name_i));
851 if (!name)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000852 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000854 ast_error(CHILD(n, name_i), "assignment to None");
855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 }
857 args = ast_for_arguments(c, CHILD(n, name_i + 1));
858 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 body = ast_for_suite(c, CHILD(n, name_i + 3));
861 if (!body)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +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),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000865 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) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000876 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
877 if (!args)
878 return NULL;
879 expression = ast_for_expr(c, CHILD(n, 2));
880 if (!expression)
881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 }
883 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000884 args = ast_for_arguments(c, CHILD(n, 1));
885 if (!args)
886 return NULL;
887 expression = ast_for_expr(c, CHILD(n, 3));
888 if (!expression)
889 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)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000904 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000905 expression = ast_for_expr(c, CHILD(n, 2));
906 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000907 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000908 orelse = ast_for_expr(c, CHILD(n, 4));
909 if (!orelse)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000910 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000911 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000912 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000913}
914
Neal Norwitze4d4f002006-09-05 03:58:26 +0000915/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
916 so there is only a single version. Possibly for loops can also re-use
917 the code.
918*/
919
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920/* Count the number of 'for' loop in a list comprehension.
921
922 Helper for ast_for_listcomp().
923*/
924
925static int
926count_list_fors(const node *n)
927{
928 int n_fors = 0;
929 node *ch = CHILD(n, 1);
930
931 count_list_for:
932 n_fors++;
933 REQ(ch, list_for);
934 if (NCH(ch) == 5)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000935 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000937 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938 count_list_iter:
939 REQ(ch, list_iter);
940 ch = CHILD(ch, 0);
941 if (TYPE(ch) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000942 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 else if (TYPE(ch) == list_if) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000944 if (NCH(ch) == 3) {
945 ch = CHILD(ch, 2);
946 goto count_list_iter;
947 }
948 else
949 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000951
952 /* Should never be reached */
953 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
954 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955}
956
957/* Count the number of 'if' statements in a list comprehension.
958
959 Helper for ast_for_listcomp().
960*/
961
962static int
963count_list_ifs(const node *n)
964{
965 int n_ifs = 0;
966
967 count_list_iter:
968 REQ(n, list_iter);
969 if (TYPE(CHILD(n, 0)) == list_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000970 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 n = CHILD(n, 0);
972 REQ(n, list_if);
973 n_ifs++;
974 if (NCH(n) == 2)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000975 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 n = CHILD(n, 2);
977 goto count_list_iter;
978}
979
980static expr_ty
981ast_for_listcomp(struct compiling *c, const node *n)
982{
983 /* listmaker: test ( list_for | (',' test)* [','] )
984 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
985 list_iter: list_for | list_if
986 list_if: 'if' test [list_iter]
987 testlist_safe: test [(',' test)+ [',']]
988 */
989 expr_ty elt;
990 asdl_seq *listcomps;
991 int i, n_fors;
992 node *ch;
993
994 REQ(n, listmaker);
995 assert(NCH(n) > 1);
996
997 elt = ast_for_expr(c, CHILD(n, 0));
998 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +0000999 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000
1001 n_fors = count_list_fors(n);
1002 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001005 listcomps = asdl_seq_new(n_fors, c->c_arena);
1006 if (!listcomps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001007 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001008
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009 ch = CHILD(n, 1);
1010 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001011 comprehension_ty lc;
1012 asdl_seq *t;
1013 expr_ty expression;
1014 node *for_ch;
1015
1016 REQ(ch, list_for);
1017
1018 for_ch = CHILD(ch, 1);
1019 t = ast_for_exprlist(c, for_ch, Store);
1020 if (!t)
1021 return NULL;
1022 expression = ast_for_testlist(c, CHILD(ch, 3));
1023 if (!expression)
1024 return NULL;
1025
1026 /* Check the # of children rather than the length of t, since
1027 [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1028 */
1029 if (NCH(for_ch) == 1)
1030 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
1031 c->c_arena);
1032 else
1033 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1034 c->c_arena),
1035 expression, NULL, c->c_arena);
1036 if (!lc)
1037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001039 if (NCH(ch) == 5) {
1040 int j, n_ifs;
1041 asdl_seq *ifs;
1042 expr_ty list_for_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001044 ch = CHILD(ch, 4);
1045 n_ifs = count_list_ifs(ch);
1046 if (n_ifs == -1)
1047 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001049 ifs = asdl_seq_new(n_ifs, c->c_arena);
1050 if (!ifs)
1051 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001053 for (j = 0; j < n_ifs; j++) {
1054 REQ(ch, list_iter);
1055 ch = CHILD(ch, 0);
1056 REQ(ch, list_if);
1057
1058 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1059 if (!list_for_expr)
1060 return NULL;
1061
1062 asdl_seq_SET(ifs, j, list_for_expr);
1063 if (NCH(ch) == 3)
1064 ch = CHILD(ch, 2);
1065 }
1066 /* on exit, must guarantee that ch is a list_for */
1067 if (TYPE(ch) == list_iter)
1068 ch = CHILD(ch, 0);
1069 lc->ifs = ifs;
1070 }
1071 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 }
1073
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001074 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001077/* Count the number of 'for' loops in a generator expression.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078
1079 Helper for ast_for_genexp().
1080*/
1081
1082static int
1083count_gen_fors(const node *n)
1084{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001085 int n_fors = 0;
1086 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087
1088 count_gen_for:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001089 n_fors++;
1090 REQ(ch, gen_for);
1091 if (NCH(ch) == 5)
1092 ch = CHILD(ch, 4);
1093 else
1094 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 count_gen_iter:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001096 REQ(ch, gen_iter);
1097 ch = CHILD(ch, 0);
1098 if (TYPE(ch) == gen_for)
1099 goto count_gen_for;
1100 else if (TYPE(ch) == gen_if) {
1101 if (NCH(ch) == 3) {
1102 ch = CHILD(ch, 2);
1103 goto count_gen_iter;
1104 }
1105 else
1106 return n_fors;
1107 }
1108
1109 /* Should never be reached */
1110 PyErr_SetString(PyExc_SystemError,
1111 "logic error in count_gen_fors");
1112 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113}
1114
1115/* Count the number of 'if' statements in a generator expression.
1116
1117 Helper for ast_for_genexp().
1118*/
1119
1120static int
1121count_gen_ifs(const node *n)
1122{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001123 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001125 while (1) {
1126 REQ(n, gen_iter);
1127 if (TYPE(CHILD(n, 0)) == gen_for)
1128 return n_ifs;
1129 n = CHILD(n, 0);
1130 REQ(n, gen_if);
1131 n_ifs++;
1132 if (NCH(n) == 2)
1133 return n_ifs;
1134 n = CHILD(n, 2);
1135 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136}
1137
Jeremy Hyltona8293132006-02-28 17:58:27 +00001138/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139static expr_ty
1140ast_for_genexp(struct compiling *c, const node *n)
1141{
1142 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001143 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144 expr_ty elt;
1145 asdl_seq *genexps;
1146 int i, n_fors;
1147 node *ch;
1148
1149 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1150 assert(NCH(n) > 1);
1151
1152 elt = ast_for_expr(c, CHILD(n, 0));
1153 if (!elt)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001154 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155
1156 n_fors = count_gen_fors(n);
1157 if (n_fors == -1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001158 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001159
1160 genexps = asdl_seq_new(n_fors, c->c_arena);
1161 if (!genexps)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001162 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001163
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 ch = CHILD(n, 1);
1165 for (i = 0; i < n_fors; i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001166 comprehension_ty ge;
1167 asdl_seq *t;
1168 expr_ty expression;
1169 node *for_ch;
1170
1171 REQ(ch, gen_for);
1172
1173 for_ch = CHILD(ch, 1);
1174 t = ast_for_exprlist(c, for_ch, Store);
1175 if (!t)
1176 return NULL;
1177 expression = ast_for_expr(c, CHILD(ch, 3));
1178 if (!expression)
1179 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001181 /* Check the # of children rather than the length of t, since
1182 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1183 if (NCH(for_ch) == 1)
1184 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1185 NULL, c->c_arena);
1186 else
1187 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1188 c->c_arena),
1189 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001191 if (!ge)
1192 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001193
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001194 if (NCH(ch) == 5) {
1195 int j, n_ifs;
1196 asdl_seq *ifs;
1197
1198 ch = CHILD(ch, 4);
1199 n_ifs = count_gen_ifs(ch);
1200 if (n_ifs == -1)
1201 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001203 ifs = asdl_seq_new(n_ifs, c->c_arena);
1204 if (!ifs)
1205 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001206
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001207 for (j = 0; j < n_ifs; j++) {
1208 REQ(ch, gen_iter);
1209 ch = CHILD(ch, 0);
1210 REQ(ch, gen_if);
1211
1212 expression = ast_for_expr(c, CHILD(ch, 1));
1213 if (!expression)
1214 return NULL;
1215 asdl_seq_SET(ifs, j, expression);
1216 if (NCH(ch) == 3)
1217 ch = CHILD(ch, 2);
1218 }
1219 /* on exit, must guarantee that ch is a gen_for */
1220 if (TYPE(ch) == gen_iter)
1221 ch = CHILD(ch, 0);
1222 ge->ifs = ifs;
1223 }
1224 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 }
1226
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001227 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228}
1229
1230static expr_ty
1231ast_for_atom(struct compiling *c, const node *n)
1232{
1233 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1234 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1235 */
1236 node *ch = CHILD(n, 0);
1237
1238 switch (TYPE(ch)) {
1239 case NAME:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001240 /* All names start in Load context, but may later be
1241 changed. */
1242 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset,
1243 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 case STRING: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001245 PyObject *str = parsestrplus(c, n);
1246 if (!str)
1247 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001248
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001249 PyArena_AddPyObject(c->c_arena, str);
1250 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 }
1252 case NUMBER: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001253 PyObject *pynum = parsenumber(STR(ch));
1254 if (!pynum)
1255 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001256
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001257 PyArena_AddPyObject(c->c_arena, pynum);
1258 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259 }
1260 case LPAR: /* some parenthesized expressions */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001261 ch = CHILD(n, 1);
1262
1263 if (TYPE(ch) == RPAR)
1264 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1265
1266 if (TYPE(ch) == yield_expr)
1267 return ast_for_expr(c, ch);
1268
1269 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1270 return ast_for_genexp(c, ch);
1271
1272 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 case LSQB: /* list (or list comprehension) */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001274 ch = CHILD(n, 1);
1275
1276 if (TYPE(ch) == RSQB)
1277 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1278
1279 REQ(ch, listmaker);
1280 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1281 asdl_seq *elts = seq_for_testlist(c, ch);
1282 if (!elts)
1283 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001284
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001285 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1286 }
1287 else
1288 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289 case LBRACE: {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001290 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1291 int i, size;
1292 asdl_seq *keys, *values;
1293
1294 ch = CHILD(n, 1);
1295 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1296 keys = asdl_seq_new(size, c->c_arena);
1297 if (!keys)
1298 return NULL;
1299
1300 values = asdl_seq_new(size, c->c_arena);
1301 if (!values)
1302 return NULL;
1303
1304 for (i = 0; i < NCH(ch); i += 4) {
1305 expr_ty expression;
1306
1307 expression = ast_for_expr(c, CHILD(ch, i));
1308 if (!expression)
1309 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001310
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001311 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001312
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001313 expression = ast_for_expr(c, CHILD(ch, i + 2));
1314 if (!expression)
1315 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001316
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001317 asdl_seq_SET(values, i / 4, expression);
1318 }
1319 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001320 }
1321 case BACKQUOTE: { /* repr */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001322 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
1323 if (!expression)
1324 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001325
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001326 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 }
1328 default:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001329 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1330 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 }
1332}
1333
1334static slice_ty
1335ast_for_slice(struct compiling *c, const node *n)
1336{
1337 node *ch;
1338 expr_ty lower = NULL, upper = NULL, step = NULL;
1339
1340 REQ(n, subscript);
1341
1342 /*
1343 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1344 sliceop: ':' [test]
1345 */
1346 ch = CHILD(n, 0);
1347 if (TYPE(ch) == DOT)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001348 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349
1350 if (NCH(n) == 1 && TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001351 /* 'step' variable hold no significance in terms of being used over
1352 other vars */
1353 step = ast_for_expr(c, ch);
1354 if (!step)
1355 return NULL;
1356
1357 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 }
1359
1360 if (TYPE(ch) == test) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001361 lower = ast_for_expr(c, ch);
1362 if (!lower)
1363 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 }
1365
1366 /* If there's an upper bound it's in the second or third position. */
1367 if (TYPE(ch) == COLON) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001368 if (NCH(n) > 1) {
1369 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001371 if (TYPE(n2) == test) {
1372 upper = ast_for_expr(c, n2);
1373 if (!upper)
1374 return NULL;
1375 }
1376 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377 } else if (NCH(n) > 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001378 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001380 if (TYPE(n2) == test) {
1381 upper = ast_for_expr(c, n2);
1382 if (!upper)
1383 return NULL;
1384 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 }
1386
1387 ch = CHILD(n, NCH(n) - 1);
1388 if (TYPE(ch) == sliceop) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001389 if (NCH(ch) == 1) {
1390 /* No expression, so step is None */
1391 ch = CHILD(ch, 0);
1392 step = Name(new_identifier("None", c->c_arena), Load,
1393 LINENO(ch), ch->n_col_offset, c->c_arena);
1394 if (!step)
1395 return NULL;
1396 } else {
1397 ch = CHILD(ch, 1);
1398 if (TYPE(ch) == test) {
1399 step = ast_for_expr(c, ch);
1400 if (!step)
1401 return NULL;
1402 }
1403 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 }
1405
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001406 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407}
1408
1409static expr_ty
1410ast_for_binop(struct compiling *c, const node *n)
1411{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001412 /* Must account for a sequence of expressions.
1413 How should A op B op C by represented?
1414 BinOp(BinOp(A, op, B), op, C).
1415 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001417 int i, nops;
1418 expr_ty expr1, expr2, result;
1419 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001421 expr1 = ast_for_expr(c, CHILD(n, 0));
1422 if (!expr1)
1423 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001425 expr2 = ast_for_expr(c, CHILD(n, 2));
1426 if (!expr2)
1427 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001429 newoperator = get_operator(CHILD(n, 1));
1430 if (!newoperator)
1431 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001433 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1434 c->c_arena);
1435 if (!result)
1436 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001438 nops = (NCH(n) - 1) / 2;
1439 for (i = 1; i < nops; i++) {
1440 expr_ty tmp_result, tmp;
1441 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001443 newoperator = get_operator(next_oper);
1444 if (!newoperator)
1445 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001447 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1448 if (!tmp)
1449 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001451 tmp_result = BinOp(result, newoperator, tmp,
1452 LINENO(next_oper), next_oper->n_col_offset,
1453 c->c_arena);
1454 if (!tmp)
1455 return NULL;
1456 result = tmp_result;
1457 }
1458 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459}
1460
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001461static expr_ty
1462ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1463{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001464 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1465 subscriptlist: subscript (',' subscript)* [',']
1466 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1467 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001468 REQ(n, trailer);
1469 if (TYPE(CHILD(n, 0)) == LPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001470 if (NCH(n) == 2)
1471 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1472 n->n_col_offset, c->c_arena);
1473 else
1474 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001475 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001476 else if (TYPE(CHILD(n, 0)) == DOT ) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001477 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
1478 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001479 }
1480 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001481 REQ(CHILD(n, 0), LSQB);
1482 REQ(CHILD(n, 2), RSQB);
1483 n = CHILD(n, 1);
1484 if (NCH(n) == 1) {
1485 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1486 if (!slc)
1487 return NULL;
1488 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1489 c->c_arena);
1490 }
1491 else {
1492 /* The grammar is ambiguous here. The ambiguity is resolved
1493 by treating the sequence as a tuple literal if there are
1494 no slice features.
1495 */
1496 int j;
1497 slice_ty slc;
1498 expr_ty e;
1499 bool simple = true;
1500 asdl_seq *slices, *elts;
1501 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1502 if (!slices)
1503 return NULL;
1504 for (j = 0; j < NCH(n); j += 2) {
1505 slc = ast_for_slice(c, CHILD(n, j));
1506 if (!slc)
1507 return NULL;
1508 if (slc->kind != Index_kind)
1509 simple = false;
1510 asdl_seq_SET(slices, j / 2, slc);
1511 }
1512 if (!simple) {
1513 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1514 Load, LINENO(n), n->n_col_offset, c->c_arena);
1515 }
1516 /* extract Index values and put them in a Tuple */
1517 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1518 if (!elts)
1519 return NULL;
1520 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1521 slc = (slice_ty)asdl_seq_GET(slices, j);
1522 assert(slc->kind == Index_kind && slc->v.Index.value);
1523 asdl_seq_SET(elts, j, slc->v.Index.value);
1524 }
1525 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1526 if (!e)
1527 return NULL;
1528 return Subscript(left_expr, Index(e, c->c_arena),
1529 Load, LINENO(n), n->n_col_offset, c->c_arena);
1530 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001531 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001532}
1533
1534static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001535ast_for_factor(struct compiling *c, const node *n)
1536{
1537 node *pfactor, *ppower, *patom, *pnum;
1538 expr_ty expression;
1539
1540 /* If the unary - operator is applied to a constant, don't generate
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001541 a UNARY_NEGATIVE opcode. Just store the approriate value as a
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001542 constant. The peephole optimizer already does something like
1543 this but it doesn't handle the case where the constant is
1544 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1545 PyLongObject.
1546 */
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001547 if (TYPE(CHILD(n, 0)) == MINUS &&
1548 NCH(n) == 2 &&
1549 TYPE((pfactor = CHILD(n, 1))) == factor &&
1550 NCH(pfactor) == 1 &&
1551 TYPE((ppower = CHILD(pfactor, 0))) == power &&
1552 NCH(ppower) == 1 &&
1553 TYPE((patom = CHILD(ppower, 0))) == atom &&
1554 TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1555 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1556 if (s == NULL)
1557 return NULL;
1558 s[0] = '-';
1559 strcpy(s + 1, STR(pnum));
1560 PyObject_FREE(STR(pnum));
1561 STR(pnum) = s;
1562 return ast_for_atom(c, patom);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001563 }
1564
1565 expression = ast_for_expr(c, CHILD(n, 1));
1566 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001567 return NULL;
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001568
1569 switch (TYPE(CHILD(n, 0))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001570 case PLUS:
1571 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1572 c->c_arena);
1573 case MINUS:
1574 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1575 c->c_arena);
1576 case TILDE:
1577 return UnaryOp(Invert, expression, LINENO(n),
1578 n->n_col_offset, c->c_arena);
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001579 }
1580 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001581 TYPE(CHILD(n, 0)));
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001582 return NULL;
1583}
1584
1585static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001586ast_for_power(struct compiling *c, const node *n)
1587{
1588 /* power: atom trailer* ('**' factor)*
1589 */
1590 int i;
1591 expr_ty e, tmp;
1592 REQ(n, power);
1593 e = ast_for_atom(c, CHILD(n, 0));
1594 if (!e)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001595 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001596 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001597 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001598 for (i = 1; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001599 node *ch = CHILD(n, i);
1600 if (TYPE(ch) != trailer)
1601 break;
1602 tmp = ast_for_trailer(c, ch, e);
1603 if (!tmp)
1604 return NULL;
1605 tmp->lineno = e->lineno;
1606 tmp->col_offset = e->col_offset;
1607 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001608 }
1609 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001610 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1611 if (!f)
1612 return NULL;
1613 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1614 if (!tmp)
1615 return NULL;
1616 e = tmp;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001617 }
1618 return e;
1619}
1620
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621/* Do not name a variable 'expr'! Will cause a compile error.
1622*/
1623
1624static expr_ty
1625ast_for_expr(struct compiling *c, const node *n)
1626{
1627 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001628 test: or_test ['if' or_test 'else' test] | lambdef
1629 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630 and_test: not_test ('and' not_test)*
1631 not_test: 'not' not_test | comparison
1632 comparison: expr (comp_op expr)*
1633 expr: xor_expr ('|' xor_expr)*
1634 xor_expr: and_expr ('^' and_expr)*
1635 and_expr: shift_expr ('&' shift_expr)*
1636 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1637 arith_expr: term (('+'|'-') term)*
1638 term: factor (('*'|'/'|'%'|'//') factor)*
1639 factor: ('+'|'-'|'~') factor | power
1640 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001641
1642 As well as modified versions that exist for backward compatibility,
1643 to explicitly allow:
1644 [ x for x in lambda: 0, lambda: 1 ]
1645 (which would be ambiguous without these extra rules)
1646
1647 old_test: or_test | old_lambdef
1648 old_lambdef: 'lambda' [vararglist] ':' old_test
1649
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650 */
1651
1652 asdl_seq *seq;
1653 int i;
1654
1655 loop:
1656 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001657 case test:
1658 case old_test:
1659 if (TYPE(CHILD(n, 0)) == lambdef ||
1660 TYPE(CHILD(n, 0)) == old_lambdef)
1661 return ast_for_lambdef(c, CHILD(n, 0));
1662 else if (NCH(n) > 1)
1663 return ast_for_ifexpr(c, n);
1664 /* Fallthrough */
1665 case or_test:
1666 case and_test:
1667 if (NCH(n) == 1) {
1668 n = CHILD(n, 0);
1669 goto loop;
1670 }
1671 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1672 if (!seq)
1673 return NULL;
1674 for (i = 0; i < NCH(n); i += 2) {
1675 expr_ty e = ast_for_expr(c, CHILD(n, i));
1676 if (!e)
1677 return NULL;
1678 asdl_seq_SET(seq, i / 2, e);
1679 }
1680 if (!strcmp(STR(CHILD(n, 1)), "and"))
1681 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1682 c->c_arena);
1683 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1684 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1685 case not_test:
1686 if (NCH(n) == 1) {
1687 n = CHILD(n, 0);
1688 goto loop;
1689 }
1690 else {
1691 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1692 if (!expression)
1693 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001695 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1696 c->c_arena);
1697 }
1698 case comparison:
1699 if (NCH(n) == 1) {
1700 n = CHILD(n, 0);
1701 goto loop;
1702 }
1703 else {
1704 expr_ty expression;
1705 asdl_int_seq *ops;
1706 asdl_seq *cmps;
1707 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1708 if (!ops)
1709 return NULL;
1710 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1711 if (!cmps) {
1712 return NULL;
1713 }
1714 for (i = 1; i < NCH(n); i += 2) {
1715 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001717 newoperator = ast_for_comp_op(CHILD(n, i));
1718 if (!newoperator) {
1719 return NULL;
1720 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001722 expression = ast_for_expr(c, CHILD(n, i + 1));
1723 if (!expression) {
1724 return NULL;
1725 }
1726
1727 asdl_seq_SET(ops, i / 2, newoperator);
1728 asdl_seq_SET(cmps, i / 2, expression);
1729 }
1730 expression = ast_for_expr(c, CHILD(n, 0));
1731 if (!expression) {
1732 return NULL;
1733 }
1734
1735 return Compare(expression, ops, cmps, LINENO(n),
1736 n->n_col_offset, c->c_arena);
1737 }
1738 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001739
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001740 /* The next five cases all handle BinOps. The main body of code
1741 is the same in each case, but the switch turned inside out to
1742 reuse the code for each type of operator.
1743 */
1744 case expr:
1745 case xor_expr:
1746 case and_expr:
1747 case shift_expr:
1748 case arith_expr:
1749 case term:
1750 if (NCH(n) == 1) {
1751 n = CHILD(n, 0);
1752 goto loop;
1753 }
1754 return ast_for_binop(c, n);
1755 case yield_expr: {
1756 expr_ty exp = NULL;
1757 if (NCH(n) == 2) {
1758 exp = ast_for_testlist(c, CHILD(n, 1));
1759 if (!exp)
1760 return NULL;
1761 }
1762 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1763 }
1764 case factor:
1765 if (NCH(n) == 1) {
1766 n = CHILD(n, 0);
1767 goto loop;
1768 }
1769 return ast_for_factor(c, n);
1770 case power:
1771 return ast_for_power(c, n);
1772 default:
1773 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1774 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001776 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 return NULL;
1778}
1779
1780static expr_ty
1781ast_for_call(struct compiling *c, const node *n, expr_ty func)
1782{
1783 /*
1784 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001785 | '**' test)
1786 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 */
1788
1789 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001790 asdl_seq *args;
1791 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792 expr_ty vararg = NULL, kwarg = NULL;
1793
1794 REQ(n, arglist);
1795
1796 nargs = 0;
1797 nkeywords = 0;
1798 ngens = 0;
1799 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001800 node *ch = CHILD(n, i);
1801 if (TYPE(ch) == argument) {
1802 if (NCH(ch) == 1)
1803 nargs++;
1804 else if (TYPE(CHILD(ch, 1)) == gen_for)
1805 ngens++;
1806 else
1807 nkeywords++;
1808 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 }
1810 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001811 ast_error(n, "Generator expression must be parenthesized "
1812 "if not sole argument");
1813 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 }
1815
1816 if (nargs + nkeywords + ngens > 255) {
1817 ast_error(n, "more than 255 arguments");
1818 return NULL;
1819 }
1820
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001821 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 if (!args)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001823 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001824 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 if (!keywords)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001826 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 nargs = 0;
1828 nkeywords = 0;
1829 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001830 node *ch = CHILD(n, i);
1831 if (TYPE(ch) == argument) {
1832 expr_ty e;
1833 if (NCH(ch) == 1) {
1834 if (nkeywords) {
1835 ast_error(CHILD(ch, 0),
1836 "non-keyword arg after keyword arg");
1837 return NULL;
1838 }
1839 e = ast_for_expr(c, CHILD(ch, 0));
1840 if (!e)
1841 return NULL;
1842 asdl_seq_SET(args, nargs++, e);
1843 }
1844 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1845 e = ast_for_genexp(c, ch);
1846 if (!e)
1847 return NULL;
1848 asdl_seq_SET(args, nargs++, e);
1849 }
1850 else {
1851 keyword_ty kw;
1852 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001854 /* CHILD(ch, 0) is test, but must be an identifier? */
1855 e = ast_for_expr(c, CHILD(ch, 0));
1856 if (!e)
1857 return NULL;
1858 /* f(lambda x: x[0] = 3) ends up getting parsed with
1859 * LHS test = lambda x: x[0], and RHS test = 3.
1860 * SF bug 132313 points out that complaining about a keyword
1861 * then is very confusing.
1862 */
1863 if (e->kind == Lambda_kind) {
1864 ast_error(CHILD(ch, 0),
1865 "lambda cannot contain assignment");
1866 return NULL;
1867 } else if (e->kind != Name_kind) {
1868 ast_error(CHILD(ch, 0), "keyword can't be an expression");
1869 return NULL;
1870 }
1871 key = e->v.Name.id;
Georg Brandle06cf452007-06-07 13:23:24 +00001872 if (!strcmp(PyString_AS_STRING(key), "None")) {
1873 ast_error(CHILD(ch, 0), "assignment to None");
1874 return NULL;
1875 }
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001876 e = ast_for_expr(c, CHILD(ch, 2));
1877 if (!e)
1878 return NULL;
1879 kw = keyword(key, e, c->c_arena);
1880 if (!kw)
1881 return NULL;
1882 asdl_seq_SET(keywords, nkeywords++, kw);
1883 }
1884 }
1885 else if (TYPE(ch) == STAR) {
1886 vararg = ast_for_expr(c, CHILD(n, i+1));
1887 i++;
1888 }
1889 else if (TYPE(ch) == DOUBLESTAR) {
1890 kwarg = ast_for_expr(c, CHILD(n, i+1));
1891 i++;
1892 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 }
1894
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001895 return Call(func, args, keywords, vararg, kwarg, func->lineno,
1896 func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897}
1898
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001900ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001902 /* testlist_gexp: test (',' test)* [','] */
1903 /* testlist: test (',' test)* [','] */
1904 /* testlist_safe: test (',' test)+ [','] */
1905 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001907 if (TYPE(n) == testlist_gexp) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001908 if (NCH(n) > 1)
1909 assert(TYPE(CHILD(n, 1)) != gen_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001910 }
1911 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001912 assert(TYPE(n) == testlist ||
1913 TYPE(n) == testlist_safe ||
1914 TYPE(n) == testlist1);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001915 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 if (NCH(n) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001917 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001919 asdl_seq *tmp = seq_for_testlist(c, n);
1920 if (!tmp)
1921 return NULL;
1922 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001924}
1925
1926static expr_ty
1927ast_for_testlist_gexp(struct compiling *c, const node* n)
1928{
1929 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1930 /* argument: test [ gen_for ] */
1931 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001932 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001933 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001934 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001935}
1936
1937/* like ast_for_testlist() but returns a sequence */
1938static asdl_seq*
1939ast_for_class_bases(struct compiling *c, const node* n)
1940{
1941 /* testlist: test (',' test)* [','] */
1942 assert(NCH(n) > 0);
1943 REQ(n, testlist);
1944 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001945 expr_ty base;
1946 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
1947 if (!bases)
1948 return NULL;
1949 base = ast_for_expr(c, CHILD(n, 0));
1950 if (!base)
1951 return NULL;
1952 asdl_seq_SET(bases, 0, base);
1953 return bases;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001954 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001955
1956 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957}
1958
1959static stmt_ty
1960ast_for_expr_stmt(struct compiling *c, const node *n)
1961{
1962 REQ(n, expr_stmt);
1963 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001964 | ('=' (yield_expr|testlist))*)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 testlist: test (',' test)* [',']
1966 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001967 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 test: ... here starts the operator precendence dance
1969 */
1970
1971 if (NCH(n) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001972 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
1973 if (!e)
1974 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001976 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 }
1978 else if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001979 expr_ty expr1, expr2;
1980 operator_ty newoperator;
1981 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00001983 expr1 = ast_for_testlist(c, ch);
1984 if (!expr1)
1985 return NULL;
1986 /* TODO(nas): Remove duplicated error checks (set_context does it) */
1987 switch (expr1->kind) {
1988 case GeneratorExp_kind:
1989 ast_error(ch, "augmented assignment to generator "
1990 "expression not possible");
1991 return NULL;
1992 case Yield_kind:
1993 ast_error(ch, "augmented assignment to yield "
1994 "expression not possible");
1995 return NULL;
1996 case Name_kind: {
1997 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1998 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1999 ast_error(ch, "assignment to None");
2000 return NULL;
2001 }
2002 break;
2003 }
2004 case Attribute_kind:
2005 case Subscript_kind:
2006 break;
2007 default:
2008 ast_error(ch, "illegal expression for augmented "
2009 "assignment");
2010 return NULL;
2011 }
2012 if(!set_context(expr1, Store, ch))
2013 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002015 ch = CHILD(n, 2);
2016 if (TYPE(ch) == testlist)
2017 expr2 = ast_for_testlist(c, ch);
2018 else
2019 expr2 = ast_for_expr(c, ch);
2020 if (!expr2)
2021 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002023 newoperator = ast_for_augassign(CHILD(n, 1));
2024 if (!newoperator)
2025 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002027 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2028 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 }
2030 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002031 int i;
2032 asdl_seq *targets;
2033 node *value;
2034 expr_ty expression;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002036 /* a normal assignment */
2037 REQ(CHILD(n, 1), EQUAL);
2038 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2039 if (!targets)
2040 return NULL;
2041 for (i = 0; i < NCH(n) - 2; i += 2) {
2042 expr_ty e;
2043 node *ch = CHILD(n, i);
2044 if (TYPE(ch) == yield_expr) {
2045 ast_error(ch, "assignment to yield expression not possible");
2046 return NULL;
2047 }
2048 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002050 /* set context to assign */
2051 if (!e)
2052 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002054 if (!set_context(e, Store, CHILD(n, i)))
2055 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002057 asdl_seq_SET(targets, i / 2, e);
2058 }
2059 value = CHILD(n, NCH(n) - 1);
2060 if (TYPE(value) == testlist)
2061 expression = ast_for_testlist(c, value);
2062 else
2063 expression = ast_for_expr(c, value);
2064 if (!expression)
2065 return NULL;
2066 return Assign(targets, expression, LINENO(n), n->n_col_offset,
2067 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069}
2070
2071static stmt_ty
2072ast_for_print_stmt(struct compiling *c, const node *n)
2073{
2074 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002075 | '>>' test [ (',' test)+ [','] ] )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 */
2077 expr_ty dest = NULL, expression;
2078 asdl_seq *seq;
2079 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002080 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081
2082 REQ(n, print_stmt);
2083 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002084 dest = ast_for_expr(c, CHILD(n, 2));
2085 if (!dest)
2086 return NULL;
2087 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002089 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002091 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002092 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002093 expression = ast_for_expr(c, CHILD(n, i));
2094 if (!expression)
2095 return NULL;
2096 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 }
2098 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002099 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100}
2101
2102static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002103ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104{
2105 asdl_seq *seq;
2106 int i;
2107 expr_ty e;
2108
2109 REQ(n, exprlist);
2110
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002111 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002113 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002115 e = ast_for_expr(c, CHILD(n, i));
2116 if (!e)
2117 return NULL;
2118 asdl_seq_SET(seq, i / 2, e);
2119 if (context && !set_context(e, context, CHILD(n, i)))
2120 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121 }
2122 return seq;
2123}
2124
2125static stmt_ty
2126ast_for_del_stmt(struct compiling *c, const node *n)
2127{
2128 asdl_seq *expr_list;
2129
2130 /* del_stmt: 'del' exprlist */
2131 REQ(n, del_stmt);
2132
2133 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2134 if (!expr_list)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002135 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002136 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137}
2138
2139static stmt_ty
2140ast_for_flow_stmt(struct compiling *c, const node *n)
2141{
2142 /*
2143 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002144 | yield_stmt
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 break_stmt: 'break'
2146 continue_stmt: 'continue'
2147 return_stmt: 'return' [testlist]
2148 yield_stmt: yield_expr
2149 yield_expr: 'yield' testlist
2150 raise_stmt: 'raise' [test [',' test [',' test]]]
2151 */
2152 node *ch;
2153
2154 REQ(n, flow_stmt);
2155 ch = CHILD(n, 0);
2156 switch (TYPE(ch)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002157 case break_stmt:
2158 return Break(LINENO(n), n->n_col_offset, c->c_arena);
2159 case continue_stmt:
2160 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2161 case yield_stmt: { /* will reduce to yield_expr */
2162 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2163 if (!exp)
2164 return NULL;
2165 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2166 }
2167 case return_stmt:
2168 if (NCH(ch) == 1)
2169 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2170 else {
2171 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2172 if (!expression)
2173 return NULL;
2174 return Return(expression, LINENO(n), n->n_col_offset,
2175 c->c_arena);
2176 }
2177 case raise_stmt:
2178 if (NCH(ch) == 1)
2179 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2180 c->c_arena);
2181 else if (NCH(ch) == 2) {
2182 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2183 if (!expression)
2184 return NULL;
2185 return Raise(expression, NULL, NULL, LINENO(n),
2186 n->n_col_offset, c->c_arena);
2187 }
2188 else if (NCH(ch) == 4) {
2189 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002191 expr1 = ast_for_expr(c, CHILD(ch, 1));
2192 if (!expr1)
2193 return NULL;
2194 expr2 = ast_for_expr(c, CHILD(ch, 3));
2195 if (!expr2)
2196 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002198 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2199 c->c_arena);
2200 }
2201 else if (NCH(ch) == 6) {
2202 expr_ty expr1, expr2, expr3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002204 expr1 = ast_for_expr(c, CHILD(ch, 1));
2205 if (!expr1)
2206 return NULL;
2207 expr2 = ast_for_expr(c, CHILD(ch, 3));
2208 if (!expr2)
2209 return NULL;
2210 expr3 = ast_for_expr(c, CHILD(ch, 5));
2211 if (!expr3)
2212 return NULL;
2213
2214 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2215 c->c_arena);
2216 }
2217 default:
2218 PyErr_Format(PyExc_SystemError,
2219 "unexpected flow_stmt: %d", TYPE(ch));
2220 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002222
2223 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2224 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002225}
2226
2227static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002228alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229{
2230 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002231 import_as_name: NAME ['as' NAME]
2232 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 dotted_name: NAME ('.' NAME)*
2234 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002235 PyObject *str;
2236
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 loop:
2238 switch (TYPE(n)) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002239 case import_as_name:
2240 str = NULL;
2241 if (NCH(n) == 3) {
2242 str = NEW_IDENTIFIER(CHILD(n, 2));
2243 }
2244 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
2245 case dotted_as_name:
2246 if (NCH(n) == 1) {
2247 n = CHILD(n, 0);
2248 goto loop;
2249 }
2250 else {
2251 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
2252 if (!a)
2253 return NULL;
2254 assert(!a->asname);
2255 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2256 return a;
2257 }
2258 break;
2259 case dotted_name:
2260 if (NCH(n) == 1)
2261 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
2262 else {
2263 /* Create a string of the form "a.b.c" */
2264 int i;
2265 size_t len;
2266 char *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002268 len = 0;
2269 for (i = 0; i < NCH(n); i += 2)
2270 /* length of string plus one for the dot */
2271 len += strlen(STR(CHILD(n, i))) + 1;
2272 len--; /* the last name doesn't have a dot */
2273 str = PyString_FromStringAndSize(NULL, len);
2274 if (!str)
2275 return NULL;
2276 s = PyString_AS_STRING(str);
2277 if (!s)
2278 return NULL;
2279 for (i = 0; i < NCH(n); i += 2) {
2280 char *sch = STR(CHILD(n, i));
2281 strcpy(s, STR(CHILD(n, i)));
2282 s += strlen(sch);
2283 *s++ = '.';
2284 }
2285 --s;
2286 *s = '\0';
2287 PyString_InternInPlace(&str);
2288 PyArena_AddPyObject(c->c_arena, str);
2289 return alias(str, NULL, c->c_arena);
2290 }
2291 break;
2292 case STAR:
2293 str = PyString_InternFromString("*");
2294 PyArena_AddPyObject(c->c_arena, str);
2295 return alias(str, NULL, c->c_arena);
2296 default:
2297 PyErr_Format(PyExc_SystemError,
2298 "unexpected import name: %d", TYPE(n));
2299 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002301
2302 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 return NULL;
2304}
2305
2306static stmt_ty
2307ast_for_import_stmt(struct compiling *c, const node *n)
2308{
2309 /*
2310 import_stmt: import_name | import_from
2311 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002312 import_from: 'from' ('.'* dotted_name | '.') 'import'
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002313 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002315 int lineno;
2316 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 int i;
2318 asdl_seq *aliases;
2319
2320 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002321 lineno = LINENO(n);
2322 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002324 if (TYPE(n) == import_name) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002325 n = CHILD(n, 1);
2326 REQ(n, dotted_as_names);
2327 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2328 if (!aliases)
2329 return NULL;
2330 for (i = 0; i < NCH(n); i += 2) {
2331 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2332 if (!import_alias)
2333 return NULL;
2334 asdl_seq_SET(aliases, i / 2, import_alias);
2335 }
2336 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002338 else if (TYPE(n) == import_from) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002339 int n_children;
2340 int idx, ndots = 0;
2341 alias_ty mod = NULL;
2342 identifier modname;
2343
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002344 /* Count the number of dots (for relative imports) and check for the
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002345 optional module name */
2346 for (idx = 1; idx < NCH(n); idx++) {
2347 if (TYPE(CHILD(n, idx)) == dotted_name) {
2348 mod = alias_for_import_name(c, CHILD(n, idx));
2349 idx++;
2350 break;
2351 } else if (TYPE(CHILD(n, idx)) != DOT) {
2352 break;
2353 }
2354 ndots++;
2355 }
2356 idx++; /* skip over the 'import' keyword */
2357 switch (TYPE(CHILD(n, idx))) {
2358 case STAR:
2359 /* from ... import * */
2360 n = CHILD(n, idx);
2361 n_children = 1;
2362 if (ndots) {
2363 ast_error(n, "'import *' not allowed with 'from .'");
2364 return NULL;
2365 }
2366 break;
2367 case LPAR:
2368 /* from ... import (x, y, z) */
2369 n = CHILD(n, idx + 1);
2370 n_children = NCH(n);
2371 break;
2372 case import_as_names:
2373 /* from ... import x, y, z */
2374 n = CHILD(n, idx);
2375 n_children = NCH(n);
2376 if (n_children % 2 == 0) {
2377 ast_error(n, "trailing comma not allowed without"
2378 " surrounding parentheses");
2379 return NULL;
2380 }
2381 break;
2382 default:
2383 ast_error(n, "Unexpected node-type in from-import");
2384 return NULL;
2385 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002387 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2388 if (!aliases)
2389 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002391 /* handle "from ... import *" special b/c there's no children */
2392 if (TYPE(n) == STAR) {
2393 alias_ty import_alias = alias_for_import_name(c, n);
2394 if (!import_alias)
2395 return NULL;
2396 asdl_seq_SET(aliases, 0, import_alias);
2397 }
2398 else {
2399 for (i = 0; i < NCH(n); i += 2) {
2400 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2401 if (!import_alias)
2402 return NULL;
2403 asdl_seq_SET(aliases, i / 2, import_alias);
2404 }
2405 }
2406 if (mod != NULL)
2407 modname = mod->name;
2408 else
2409 modname = new_identifier("", c->c_arena);
2410 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2411 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 }
Neal Norwitz79792652005-11-14 04:25:03 +00002413 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002414 "unknown import statement: starts with command '%s'",
2415 STR(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 return NULL;
2417}
2418
2419static stmt_ty
2420ast_for_global_stmt(struct compiling *c, const node *n)
2421{
2422 /* global_stmt: 'global' NAME (',' NAME)* */
2423 identifier name;
2424 asdl_seq *s;
2425 int i;
2426
2427 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002428 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002430 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002432 name = NEW_IDENTIFIER(CHILD(n, i));
2433 if (!name)
2434 return NULL;
2435 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002437 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438}
2439
2440static stmt_ty
2441ast_for_exec_stmt(struct compiling *c, const node *n)
2442{
2443 expr_ty expr1, globals = NULL, locals = NULL;
2444 int n_children = NCH(n);
2445 if (n_children != 2 && n_children != 4 && n_children != 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002446 PyErr_Format(PyExc_SystemError,
2447 "poorly formed 'exec' statement: %d parts to statement",
2448 n_children);
2449 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 }
2451
2452 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2453 REQ(n, exec_stmt);
2454 expr1 = ast_for_expr(c, CHILD(n, 1));
2455 if (!expr1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002456 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 if (n_children >= 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002458 globals = ast_for_expr(c, CHILD(n, 3));
2459 if (!globals)
2460 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 }
2462 if (n_children == 6) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002463 locals = ast_for_expr(c, CHILD(n, 5));
2464 if (!locals)
2465 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 }
2467
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002468 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2469 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470}
2471
2472static stmt_ty
2473ast_for_assert_stmt(struct compiling *c, const node *n)
2474{
2475 /* assert_stmt: 'assert' test [',' test] */
2476 REQ(n, assert_stmt);
2477 if (NCH(n) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002478 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2479 if (!expression)
2480 return NULL;
2481 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2482 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 }
2484 else if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002485 expr_ty expr1, expr2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002487 expr1 = ast_for_expr(c, CHILD(n, 1));
2488 if (!expr1)
2489 return NULL;
2490 expr2 = ast_for_expr(c, CHILD(n, 3));
2491 if (!expr2)
2492 return NULL;
2493
2494 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 }
Neal Norwitz79792652005-11-14 04:25:03 +00002496 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002497 "improper number of parts to 'assert' statement: %d",
2498 NCH(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 return NULL;
2500}
2501
2502static asdl_seq *
2503ast_for_suite(struct compiling *c, const node *n)
2504{
2505 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002506 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 stmt_ty s;
2508 int i, total, num, end, pos = 0;
2509 node *ch;
2510
2511 REQ(n, suite);
2512
2513 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002514 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 if (!seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002516 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002518 n = CHILD(n, 0);
2519 /* simple_stmt always ends with a NEWLINE,
2520 and may have a trailing SEMI
2521 */
2522 end = NCH(n) - 1;
2523 if (TYPE(CHILD(n, end - 1)) == SEMI)
2524 end--;
2525 /* loop by 2 to skip semi-colons */
2526 for (i = 0; i < end; i += 2) {
2527 ch = CHILD(n, i);
2528 s = ast_for_stmt(c, ch);
2529 if (!s)
2530 return NULL;
2531 asdl_seq_SET(seq, pos++, s);
2532 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 }
2534 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002535 for (i = 2; i < (NCH(n) - 1); i++) {
2536 ch = CHILD(n, i);
2537 REQ(ch, stmt);
2538 num = num_stmts(ch);
2539 if (num == 1) {
2540 /* small_stmt or compound_stmt with only one child */
2541 s = ast_for_stmt(c, ch);
2542 if (!s)
2543 return NULL;
2544 asdl_seq_SET(seq, pos++, s);
2545 }
2546 else {
2547 int j;
2548 ch = CHILD(ch, 0);
2549 REQ(ch, simple_stmt);
2550 for (j = 0; j < NCH(ch); j += 2) {
2551 /* statement terminates with a semi-colon ';' */
2552 if (NCH(CHILD(ch, j)) == 0) {
2553 assert((j + 1) == NCH(ch));
2554 break;
2555 }
2556 s = ast_for_stmt(c, CHILD(ch, j));
2557 if (!s)
2558 return NULL;
2559 asdl_seq_SET(seq, pos++, s);
2560 }
2561 }
2562 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 }
2564 assert(pos == seq->size);
2565 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566}
2567
2568static stmt_ty
2569ast_for_if_stmt(struct compiling *c, const node *n)
2570{
2571 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2572 ['else' ':' suite]
2573 */
2574 char *s;
2575
2576 REQ(n, if_stmt);
2577
2578 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002579 expr_ty expression;
2580 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002582 expression = ast_for_expr(c, CHILD(n, 1));
2583 if (!expression)
2584 return NULL;
2585 suite_seq = ast_for_suite(c, CHILD(n, 3));
2586 if (!suite_seq)
2587 return NULL;
2588
2589 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2590 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002592
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 s = STR(CHILD(n, 4));
2594 /* s[2], the third character in the string, will be
2595 's' for el_s_e, or
2596 'i' for el_i_f
2597 */
2598 if (s[2] == 's') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002599 expr_ty expression;
2600 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002602 expression = ast_for_expr(c, CHILD(n, 1));
2603 if (!expression)
2604 return NULL;
2605 seq1 = ast_for_suite(c, CHILD(n, 3));
2606 if (!seq1)
2607 return NULL;
2608 seq2 = ast_for_suite(c, CHILD(n, 6));
2609 if (!seq2)
2610 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002612 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2613 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 }
2615 else if (s[2] == 'i') {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002616 int i, n_elif, has_else = 0;
2617 expr_ty expression;
2618 asdl_seq *suite_seq;
2619 asdl_seq *orelse = NULL;
2620 n_elif = NCH(n) - 4;
2621 /* must reference the child n_elif+1 since 'else' token is third,
2622 not fourth, child from the end. */
2623 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2624 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2625 has_else = 1;
2626 n_elif -= 3;
2627 }
2628 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002630 if (has_else) {
2631 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002633 orelse = asdl_seq_new(1, c->c_arena);
2634 if (!orelse)
2635 return NULL;
2636 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2637 if (!expression)
2638 return NULL;
2639 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2640 if (!suite_seq)
2641 return NULL;
2642 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2643 if (!suite_seq2)
2644 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002646 asdl_seq_SET(orelse, 0,
2647 If(expression, suite_seq, suite_seq2,
2648 LINENO(CHILD(n, NCH(n) - 6)),
2649 CHILD(n, NCH(n) - 6)->n_col_offset,
2650 c->c_arena));
2651 /* the just-created orelse handled the last elif */
2652 n_elif--;
2653 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002655 for (i = 0; i < n_elif; i++) {
2656 int off = 5 + (n_elif - i - 1) * 4;
2657 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2658 if (!newobj)
2659 return NULL;
2660 expression = ast_for_expr(c, CHILD(n, off));
2661 if (!expression)
2662 return NULL;
2663 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2664 if (!suite_seq)
2665 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002667 asdl_seq_SET(newobj, 0,
2668 If(expression, suite_seq, orelse,
2669 LINENO(CHILD(n, off)),
2670 CHILD(n, off)->n_col_offset, c->c_arena));
2671 orelse = newobj;
2672 }
2673 expression = ast_for_expr(c, CHILD(n, 1));
2674 if (!expression)
2675 return NULL;
2676 suite_seq = ast_for_suite(c, CHILD(n, 3));
2677 if (!suite_seq)
2678 return NULL;
2679 return If(expression, suite_seq, orelse,
2680 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002682
2683 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002684 "unexpected token in 'if' statement: %s", s);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002685 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686}
2687
2688static stmt_ty
2689ast_for_while_stmt(struct compiling *c, const node *n)
2690{
2691 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2692 REQ(n, while_stmt);
2693
2694 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002695 expr_ty expression;
2696 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002698 expression = ast_for_expr(c, CHILD(n, 1));
2699 if (!expression)
2700 return NULL;
2701 suite_seq = ast_for_suite(c, CHILD(n, 3));
2702 if (!suite_seq)
2703 return NULL;
2704 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2705 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 }
2707 else if (NCH(n) == 7) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002708 expr_ty expression;
2709 asdl_seq *seq1, *seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002711 expression = ast_for_expr(c, CHILD(n, 1));
2712 if (!expression)
2713 return NULL;
2714 seq1 = ast_for_suite(c, CHILD(n, 3));
2715 if (!seq1)
2716 return NULL;
2717 seq2 = ast_for_suite(c, CHILD(n, 6));
2718 if (!seq2)
2719 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002721 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2722 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002724
2725 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002726 "wrong number of tokens for 'while' statement: %d",
2727 NCH(n));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729}
2730
2731static stmt_ty
2732ast_for_for_stmt(struct compiling *c, const node *n)
2733{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002734 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 expr_ty expression;
2736 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002737 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2739 REQ(n, for_stmt);
2740
2741 if (NCH(n) == 9) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002742 seq = ast_for_suite(c, CHILD(n, 8));
2743 if (!seq)
2744 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 }
2746
Neal Norwitzedef2be2006-07-12 05:26:17 +00002747 node_target = CHILD(n, 1);
2748 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002749 if (!_target)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002750 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002751 /* Check the # of children rather than the length of _target, since
2752 for x, in ... has 1 element in _target, but still requires a Tuple. */
2753 if (NCH(node_target) == 1)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002754 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755 else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002756 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002758 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002759 if (!expression)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002760 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002762 if (!suite_seq)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002763 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002765 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002766 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767}
2768
2769static excepthandler_ty
2770ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2771{
Collin Winter62903052007-05-18 23:11:24 +00002772 /* except_clause: 'except' [test [(',' | 'as') test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773 REQ(exc, except_clause);
2774 REQ(body, suite);
2775
2776 if (NCH(exc) == 1) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002777 asdl_seq *suite_seq = ast_for_suite(c, body);
2778 if (!suite_seq)
2779 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002781 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
2782 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 }
2784 else if (NCH(exc) == 2) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002785 expr_ty expression;
2786 asdl_seq *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002788 expression = ast_for_expr(c, CHILD(exc, 1));
2789 if (!expression)
2790 return NULL;
2791 suite_seq = ast_for_suite(c, body);
2792 if (!suite_seq)
2793 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002795 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
2796 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 }
2798 else if (NCH(exc) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002799 asdl_seq *suite_seq;
2800 expr_ty expression;
2801 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2802 if (!e)
2803 return NULL;
2804 if (!set_context(e, Store, CHILD(exc, 3)))
2805 return NULL;
2806 expression = ast_for_expr(c, CHILD(exc, 1));
2807 if (!expression)
2808 return NULL;
2809 suite_seq = ast_for_suite(c, body);
2810 if (!suite_seq)
2811 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002813 return excepthandler(expression, e, suite_seq, LINENO(exc),
2814 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002816
2817 PyErr_Format(PyExc_SystemError,
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002818 "wrong number of children for 'except' clause: %d",
2819 NCH(exc));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821}
2822
2823static stmt_ty
2824ast_for_try_stmt(struct compiling *c, const node *n)
2825{
Neal Norwitzf599f422005-12-17 21:33:47 +00002826 const int nch = NCH(n);
2827 int n_except = (nch - 3)/3;
2828 asdl_seq *body, *orelse = NULL, *finally = NULL;
2829
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 REQ(n, try_stmt);
2831
Neal Norwitzf599f422005-12-17 21:33:47 +00002832 body = ast_for_suite(c, CHILD(n, 2));
2833 if (body == NULL)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002834 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
Neal Norwitzf599f422005-12-17 21:33:47 +00002836 if (TYPE(CHILD(n, nch - 3)) == NAME) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002837 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2838 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2839 /* we can assume it's an "else",
2840 because nch >= 9 for try-else-finally and
2841 it would otherwise have a type of except_clause */
2842 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2843 if (orelse == NULL)
2844 return NULL;
2845 n_except--;
2846 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002847
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002848 finally = ast_for_suite(c, CHILD(n, nch - 1));
2849 if (finally == NULL)
2850 return NULL;
2851 n_except--;
2852 }
2853 else {
2854 /* we can assume it's an "else",
2855 otherwise it would have a type of except_clause */
2856 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2857 if (orelse == NULL)
2858 return NULL;
2859 n_except--;
2860 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002862 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002863 ast_error(n, "malformed 'try' statement");
2864 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002866
2867 if (n_except > 0) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002868 int i;
2869 stmt_ty except_st;
2870 /* process except statements to create a try ... except */
2871 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2872 if (handlers == NULL)
2873 return NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00002874
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002875 for (i = 0; i < n_except; i++) {
2876 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2877 CHILD(n, 5 + i * 3));
2878 if (!e)
2879 return NULL;
2880 asdl_seq_SET(handlers, i, e);
2881 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002882
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002883 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2884 n->n_col_offset, c->c_arena);
2885 if (!finally)
2886 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002887
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002888 /* if a 'finally' is present too, we nest the TryExcept within a
2889 TryFinally to emulate try ... except ... finally */
2890 body = asdl_seq_new(1, c->c_arena);
2891 if (body == NULL)
2892 return NULL;
2893 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002894 }
2895
2896 /* must be a try ... finally (except clauses are in body, if any exist) */
2897 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002898 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899}
2900
Guido van Rossumc2e20742006-02-27 22:32:47 +00002901static expr_ty
2902ast_for_with_var(struct compiling *c, const node *n)
2903{
2904 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002905 return ast_for_expr(c, CHILD(n, 1));
2906}
2907
2908/* with_stmt: 'with' test [ with_var ] ':' suite */
2909static stmt_ty
2910ast_for_with_stmt(struct compiling *c, const node *n)
2911{
2912 expr_ty context_expr, optional_vars = NULL;
2913 int suite_index = 3; /* skip 'with', test, and ':' */
2914 asdl_seq *suite_seq;
2915
2916 assert(TYPE(n) == with_stmt);
2917 context_expr = ast_for_expr(c, CHILD(n, 1));
Collin Winter77c67bd2007-03-16 04:11:30 +00002918 if (!context_expr)
2919 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002920 if (TYPE(CHILD(n, 2)) == with_var) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002921 optional_vars = ast_for_with_var(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002922
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002923 if (!optional_vars) {
2924 return NULL;
2925 }
2926 if (!set_context(optional_vars, Store, n)) {
2927 return NULL;
2928 }
2929 suite_index = 4;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002930 }
2931
2932 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2933 if (!suite_seq) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002934 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002935 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002936 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002937 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002938}
2939
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940static stmt_ty
2941ast_for_classdef(struct compiling *c, const node *n)
2942{
2943 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 asdl_seq *bases, *s;
2945
2946 REQ(n, classdef);
2947
2948 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002949 ast_error(n, "assignment to None");
2950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 }
2952
2953 if (NCH(n) == 4) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002954 s = ast_for_suite(c, CHILD(n, 3));
2955 if (!s)
2956 return NULL;
2957 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2958 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959 }
2960 /* check for empty base list */
2961 if (TYPE(CHILD(n,3)) == RPAR) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002962 s = ast_for_suite(c, CHILD(n,5));
2963 if (!s)
2964 return NULL;
2965 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2966 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 }
2968
2969 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002970 bases = ast_for_class_bases(c, CHILD(n, 3));
2971 if (!bases)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002972 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973
2974 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002975 if (!s)
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002976 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002977 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002978 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979}
2980
2981static stmt_ty
2982ast_for_stmt(struct compiling *c, const node *n)
2983{
2984 if (TYPE(n) == stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002985 assert(NCH(n) == 1);
2986 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 }
2988 if (TYPE(n) == simple_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002989 assert(num_stmts(n) == 1);
2990 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 }
2992 if (TYPE(n) == small_stmt) {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00002993 REQ(n, small_stmt);
2994 n = CHILD(n, 0);
2995 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2996 | flow_stmt | import_stmt | global_stmt | exec_stmt
2997 | assert_stmt
2998 */
2999 switch (TYPE(n)) {
3000 case expr_stmt:
3001 return ast_for_expr_stmt(c, n);
3002 case print_stmt:
3003 return ast_for_print_stmt(c, n);
3004 case del_stmt:
3005 return ast_for_del_stmt(c, n);
3006 case pass_stmt:
3007 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3008 case flow_stmt:
3009 return ast_for_flow_stmt(c, n);
3010 case import_stmt:
3011 return ast_for_import_stmt(c, n);
3012 case global_stmt:
3013 return ast_for_global_stmt(c, n);
3014 case exec_stmt:
3015 return ast_for_exec_stmt(c, n);
3016 case assert_stmt:
3017 return ast_for_assert_stmt(c, n);
3018 default:
3019 PyErr_Format(PyExc_SystemError,
3020 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3021 TYPE(n), NCH(n));
3022 return NULL;
3023 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024 }
3025 else {
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003026 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
3027 | funcdef | classdef
3028 */
3029 node *ch = CHILD(n, 0);
3030 REQ(n, compound_stmt);
3031 switch (TYPE(ch)) {
3032 case if_stmt:
3033 return ast_for_if_stmt(c, ch);
3034 case while_stmt:
3035 return ast_for_while_stmt(c, ch);
3036 case for_stmt:
3037 return ast_for_for_stmt(c, ch);
3038 case try_stmt:
3039 return ast_for_try_stmt(c, ch);
3040 case with_stmt:
3041 return ast_for_with_stmt(c, ch);
3042 case funcdef:
3043 return ast_for_funcdef(c, ch);
3044 case classdef:
3045 return ast_for_classdef(c, ch);
3046 default:
3047 PyErr_Format(PyExc_SystemError,
3048 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3049 TYPE(n), NCH(n));
3050 return NULL;
3051 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 }
3053}
3054
3055static PyObject *
3056parsenumber(const char *s)
3057{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003058 const char *end;
3059 long x;
3060 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003062 Py_complex c;
3063 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064#endif
3065
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003066 errno = 0;
3067 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003069 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003071 if (*end == 'l' || *end == 'L')
3072 return PyLong_FromString((char *)s, (char **)0, 0);
3073 if (s[0] == '0') {
3074 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3075 if (x < 0 && errno == 0) {
3076 return PyLong_FromString((char *)s,
3077 (char **)0,
3078 0);
3079 }
3080 }
3081 else
3082 x = PyOS_strtol((char *)s, (char **)&end, 0);
3083 if (*end == '\0') {
3084 if (errno != 0)
3085 return PyLong_FromString((char *)s, (char **)0, 0);
3086 return PyInt_FromLong(x);
3087 }
3088 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089#ifndef WITHOUT_COMPLEX
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003090 if (imflag) {
3091 c.real = 0.;
3092 PyFPE_START_PROTECT("atof", return 0)
3093 c.imag = PyOS_ascii_atof(s);
3094 PyFPE_END_PROTECT(c)
3095 return PyComplex_FromCComplex(c);
3096 }
3097 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003099 {
3100 PyFPE_START_PROTECT("atof", return 0)
3101 dx = PyOS_ascii_atof(s);
3102 PyFPE_END_PROTECT(dx)
3103 return PyFloat_FromDouble(dx);
3104 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105}
3106
3107static PyObject *
3108decode_utf8(const char **sPtr, const char *end, char* encoding)
3109{
3110#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003111 Py_FatalError("decode_utf8 should not be called in this build.");
3112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003114 PyObject *u, *v;
3115 char *s, *t;
3116 t = s = (char *)*sPtr;
3117 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3118 while (s < end && (*s & 0x80)) s++;
3119 *sPtr = s;
3120 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3121 if (u == NULL)
3122 return NULL;
3123 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3124 Py_DECREF(u);
3125 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126#endif
3127}
3128
3129static PyObject *
3130decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3131{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003132 PyObject *v, *u;
3133 char *buf;
3134 char *p;
3135 const char *end;
3136 if (encoding == NULL) {
3137 buf = (char *)s;
3138 u = NULL;
3139 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3140 buf = (char *)s;
3141 u = NULL;
3142 } else {
3143 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3144 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3145 if (u == NULL)
3146 return NULL;
3147 p = buf = PyString_AsString(u);
3148 end = s + len;
3149 while (s < end) {
3150 if (*s == '\\') {
3151 *p++ = *s++;
3152 if (*s & 0x80) {
3153 strcpy(p, "u005c");
3154 p += 5;
3155 }
3156 }
3157 if (*s & 0x80) { /* XXX inefficient */
3158 PyObject *w;
3159 char *r;
3160 Py_ssize_t rn, i;
3161 w = decode_utf8(&s, end, "utf-16-be");
3162 if (w == NULL) {
3163 Py_DECREF(u);
3164 return NULL;
3165 }
3166 r = PyString_AsString(w);
3167 rn = PyString_Size(w);
3168 assert(rn % 2 == 0);
3169 for (i = 0; i < rn; i += 2) {
3170 sprintf(p, "\\u%02x%02x",
3171 r[i + 0] & 0xFF,
3172 r[i + 1] & 0xFF);
3173 p += 6;
3174 }
3175 Py_DECREF(w);
3176 } else {
3177 *p++ = *s++;
3178 }
3179 }
3180 len = p - buf;
3181 s = buf;
3182 }
3183 if (rawmode)
3184 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3185 else
3186 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3187 Py_XDECREF(u);
3188 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189}
3190
3191/* s is a Python string literal, including the bracketing quote characters,
3192 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3193 * parsestr parses it, and returns the decoded Python string object.
3194 */
3195static PyObject *
3196parsestr(const char *s, const char *encoding)
3197{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003198 size_t len;
3199 int quote = Py_CHARMASK(*s);
3200 int rawmode = 0;
3201 int need_encoding;
3202 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003204 if (isalpha(quote) || quote == '_') {
3205 if (quote == 'u' || quote == 'U') {
3206 quote = *++s;
3207 unicode = 1;
3208 }
3209 if (quote == 'r' || quote == 'R') {
3210 quote = *++s;
3211 rawmode = 1;
3212 }
3213 }
3214 if (quote != '\'' && quote != '\"') {
3215 PyErr_BadInternalCall();
3216 return NULL;
3217 }
3218 s++;
3219 len = strlen(s);
3220 if (len > INT_MAX) {
3221 PyErr_SetString(PyExc_OverflowError,
3222 "string to parse is too long");
3223 return NULL;
3224 }
3225 if (s[--len] != quote) {
3226 PyErr_BadInternalCall();
3227 return NULL;
3228 }
3229 if (len >= 4 && s[0] == quote && s[1] == quote) {
3230 s += 2;
3231 len -= 2;
3232 if (s[--len] != quote || s[--len] != quote) {
3233 PyErr_BadInternalCall();
3234 return NULL;
3235 }
3236 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003238 if (unicode || Py_UnicodeFlag) {
3239 return decode_unicode(s, len, rawmode, encoding);
3240 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003241#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003242 need_encoding = (encoding != NULL &&
3243 strcmp(encoding, "utf-8") != 0 &&
3244 strcmp(encoding, "iso-8859-1") != 0);
3245 if (rawmode || strchr(s, '\\') == NULL) {
3246 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247#ifndef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003248 /* This should not happen - we never see any other
3249 encoding. */
3250 Py_FatalError(
3251 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252#else
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003253 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3254 if (u == NULL)
3255 return NULL;
3256 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3257 Py_DECREF(u);
3258 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003259#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003260 } else {
3261 return PyString_FromStringAndSize(s, len);
3262 }
3263 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003265 return PyString_DecodeEscape(s, len, NULL, unicode,
3266 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267}
3268
3269/* Build a Python string object out of a STRING atom. This takes care of
3270 * compile-time literal catenation, calling parsestr() on each piece, and
3271 * pasting the intermediate results together.
3272 */
3273static PyObject *
3274parsestrplus(struct compiling *c, const node *n)
3275{
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003276 PyObject *v;
3277 int i;
3278 REQ(CHILD(n, 0), STRING);
3279 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3280 /* String literal concatenation */
3281 for (i = 1; i < NCH(n); i++) {
3282 PyObject *s;
3283 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3284 if (s == NULL)
3285 goto onError;
3286 if (PyString_Check(v) && PyString_Check(s)) {
3287 PyString_ConcatAndDel(&v, s);
3288 if (v == NULL)
3289 goto onError;
3290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291#ifdef Py_USING_UNICODE
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003292 else {
3293 PyObject *temp = PyUnicode_Concat(v, s);
3294 Py_DECREF(s);
3295 Py_DECREF(v);
3296 v = temp;
3297 if (v == NULL)
3298 goto onError;
3299 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300#endif
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003301 }
3302 }
3303 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304
3305 onError:
Jeremy Hyltondd2cf1c2007-03-16 15:59:47 +00003306 Py_XDECREF(v);
3307 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308}