blob: d4c89677f7a411becac8bec5f39556c07865eebe [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 *);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *, expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000029static expr_ty ast_for_testlist(struct compiling *, const node *);
30static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000031
32/* Note different signature for ast_for_call */
33static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
34
35static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000036static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
37static PyObject *parsestrplus(struct compiling *, const node *n,
38 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000039
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +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)
Thomas Wouters89f507f2006-12-13 04:49:30 +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))
Thomas Wouters89f507f2006-12-13 04:49:30 +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)
Thomas Wouters89f507f2006-12-13 04:49:30 +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) {
Thomas Wouters89f507f2006-12-13 04:49:30 +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) {
Thomas Wouters89f507f2006-12-13 04:49:30 +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) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000102 Py_DECREF(errstr);
103 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000104 }
Thomas Wouters477c8d52006-05-27 19:21:47 +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)
Thomas Wouters89f507f2006-12-13 04:49:30 +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)) {
134 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];
164
165 sprintf(buf, "Non-statement found: %d %d\n",
166 TYPE(n), NCH(n));
167 Py_FatalError(buf);
168 }
169 }
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,
179 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) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000188 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000189 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) {
194 c.c_encoding = STR(n);
195 n = CHILD(n, 0);
196 } else {
197 c.c_encoding = NULL;
198 }
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)) {
203 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205 if (!stmts)
206 return NULL;
207 for (i = 0; i < NCH(n) - 1; i++) {
208 ch = CHILD(n, i);
209 if (TYPE(ch) == NEWLINE)
210 continue;
211 REQ(ch, stmt);
212 num = num_stmts(ch);
213 if (num == 1) {
214 s = ast_for_stmt(&c, ch);
215 if (!s)
216 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000217 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000218 }
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;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000226 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227 }
228 }
229 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000230 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 case eval_input: {
232 expr_ty testlist_ast;
233
234 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000235 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 if (!testlist_ast)
237 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 }
240 case single_input:
241 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000242 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000243 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000244 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000245 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
246 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 }
249 else {
250 n = CHILD(n, 0);
251 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000254 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000256 s = ast_for_stmt(&c, n);
257 if (!s)
258 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 asdl_seq_SET(stmts, 0, s);
260 }
261 else {
262 /* Only a simple_stmt can contain multiple statements. */
263 REQ(n, simple_stmt);
264 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 if (TYPE(CHILD(n, i)) == NEWLINE)
266 break;
267 s = ast_for_stmt(&c, CHILD(n, i));
268 if (!s)
269 goto error;
270 asdl_seq_SET(stmts, i / 2, s);
271 }
272 }
273
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000274 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 }
276 default:
277 goto error;
278 }
279 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 ast_error_finish(filename);
281 return NULL;
282}
283
284/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
285*/
286
287static operator_ty
288get_operator(const node *n)
289{
290 switch (TYPE(n)) {
291 case VBAR:
292 return BitOr;
293 case CIRCUMFLEX:
294 return BitXor;
295 case AMPER:
296 return BitAnd;
297 case LEFTSHIFT:
298 return LShift;
299 case RIGHTSHIFT:
300 return RShift;
301 case PLUS:
302 return Add;
303 case MINUS:
304 return Sub;
305 case STAR:
306 return Mult;
307 case SLASH:
308 return Div;
309 case DOUBLESLASH:
310 return FloorDiv;
311 case PERCENT:
312 return Mod;
313 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000314 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 }
316}
317
Jeremy Hyltona8293132006-02-28 17:58:27 +0000318/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319
320 Only sets context for expr kinds that "can appear in assignment context"
321 (according to ../Parser/Python.asdl). For other expr kinds, it sets
322 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323*/
324
325static int
326set_context(expr_ty e, expr_context_ty ctx, const node *n)
327{
328 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000329 /* If a particular expression type can't be used for assign / delete,
330 set expr_name to its name and an error message will be generated.
331 */
332 const char* expr_name = NULL;
333
334 /* The ast defines augmented store and load contexts, but the
335 implementation here doesn't actually use them. The code may be
336 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000337 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000338 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000339 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000340 */
341 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000342
343 switch (e->kind) {
344 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000345 if (ctx == Store &&
346 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
347 return ast_error(n, "assignment to None");
348 }
349 e->v.Attribute.ctx = ctx;
350 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000351 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000352 e->v.Subscript.ctx = ctx;
353 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000354 case Name_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000355 if (ctx == Store &&
356 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
357 return ast_error(n, "assignment to None");
358 }
359 e->v.Name.ctx = ctx;
360 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000361 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000362 e->v.List.ctx = ctx;
363 s = e->v.List.elts;
364 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000365 case Tuple_kind:
366 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
367 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000368 e->v.Tuple.ctx = ctx;
369 s = e->v.Tuple.elts;
370 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000371 case Lambda_kind:
372 expr_name = "lambda";
373 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000374 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000375 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000376 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000377 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000378 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000379 case UnaryOp_kind:
380 expr_name = "operator";
381 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000382 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000383 expr_name = "generator expression";
384 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000385 case Yield_kind:
386 expr_name = "yield expression";
387 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 case ListComp_kind:
389 expr_name = "list comprehension";
390 break;
391 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000392 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393 case Num_kind:
394 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000395 expr_name = "literal";
396 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000397 case Ellipsis_kind:
398 expr_name = "Ellipsis";
399 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000400 case Compare_kind:
401 expr_name = "comparison";
402 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000403 case IfExp_kind:
404 expr_name = "conditional expression";
405 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000406 default:
407 PyErr_Format(PyExc_SystemError,
408 "unexpected expression in assignment %d (line %d)",
409 e->kind, e->lineno);
410 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000412 /* Check for error string set by switch */
413 if (expr_name) {
414 char buf[300];
415 PyOS_snprintf(buf, sizeof(buf),
416 "can't %s %s",
417 ctx == Store ? "assign to" : "delete",
418 expr_name);
419 return ast_error(n, buf);
420 }
421
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000423 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000424 */
425 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427
Thomas Wouters89f507f2006-12-13 04:49:30 +0000428 for (i = 0; i < asdl_seq_LEN(s); i++) {
429 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
430 return 0;
431 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432 }
433 return 1;
434}
435
436static operator_ty
437ast_for_augassign(const node *n)
438{
439 REQ(n, augassign);
440 n = CHILD(n, 0);
441 switch (STR(n)[0]) {
442 case '+':
443 return Add;
444 case '-':
445 return Sub;
446 case '/':
447 if (STR(n)[1] == '/')
448 return FloorDiv;
449 else
450 return Div;
451 case '%':
452 return Mod;
453 case '<':
454 return LShift;
455 case '>':
456 return RShift;
457 case '&':
458 return BitAnd;
459 case '^':
460 return BitXor;
461 case '|':
462 return BitOr;
463 case '*':
464 if (STR(n)[1] == '*')
465 return Pow;
466 else
467 return Mult;
468 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000469 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000470 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000471 }
472}
473
474static cmpop_ty
475ast_for_comp_op(const node *n)
476{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000477 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478 |'is' 'not'
479 */
480 REQ(n, comp_op);
481 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000482 n = CHILD(n, 0);
483 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000484 case LESS:
485 return Lt;
486 case GREATER:
487 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000488 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489 return Eq;
490 case LESSEQUAL:
491 return LtE;
492 case GREATEREQUAL:
493 return GtE;
494 case NOTEQUAL:
495 return NotEq;
496 case NAME:
497 if (strcmp(STR(n), "in") == 0)
498 return In;
499 if (strcmp(STR(n), "is") == 0)
500 return Is;
501 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000502 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000503 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000504 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506 }
507 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000508 /* handle "not in" and "is not" */
509 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000510 case NAME:
511 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
512 return NotIn;
513 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
514 return IsNot;
515 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000516 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000517 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000518 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000519 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520 }
Neal Norwitz79792652005-11-14 04:25:03 +0000521 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000523 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524}
525
526static asdl_seq *
527seq_for_testlist(struct compiling *c, const node *n)
528{
529 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000530 asdl_seq *seq;
531 expr_ty expression;
532 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000533 assert(TYPE(n) == testlist
Thomas Wouters89f507f2006-12-13 04:49:30 +0000534 || TYPE(n) == listmaker
535 || TYPE(n) == testlist_gexp
536 || TYPE(n) == testlist_safe
537 || TYPE(n) == testlist1
538 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000540 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 if (!seq)
542 return NULL;
543
544 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000545 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546
547 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000548 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550
551 assert(i / 2 < seq->size);
552 asdl_seq_SET(seq, i / 2, expression);
553 }
554 return seq;
555}
556
Neal Norwitzc1505362006-12-28 06:47:50 +0000557static arg_ty
558compiler_simple_arg(struct compiling *c, const node *n)
559{
560 identifier name;
561 expr_ty annotation = NULL;
562 node *ch;
563
564 assert(TYPE(n) == tname || TYPE(n) == vname);
565 ch = CHILD(n, 0);
566 if (!strcmp(STR(ch), "None")) {
567 ast_error(ch, "assignment to None");
568 return NULL;
569 }
570 name = NEW_IDENTIFIER(ch);
571 if (!name)
572 return NULL;
573
574 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
575 annotation = ast_for_expr(c, CHILD(n, 2));
576 if (!annotation)
577 return NULL;
578 }
579
580 return SimpleArg(name, annotation, c->c_arena);
581}
582
583static arg_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000584compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585{
586 int i, len = (NCH(n) + 1) / 2;
Neal Norwitzc1505362006-12-28 06:47:50 +0000587 arg_ty arg;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000588 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 if (!args)
590 return NULL;
591
Neal Norwitzc1505362006-12-28 06:47:50 +0000592 assert(TYPE(n) == tfplist || TYPE(n) == vfplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593 for (i = 0; i < len; i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000594 const node *child = CHILD(n, 2*i);
595 /* def foo(((x), y)): -- x is not nested complex, special case. */
596 while (NCH(child) == 3 && NCH(CHILD(child, 1)) == 1)
597 child = CHILD(CHILD(child, 1), 0);
598
599 /* child either holds a tname or '(', a tfplist, ')' */
600 switch (TYPE(CHILD(child, 0))) {
601 case tname:
602 case vname:
603 arg = compiler_simple_arg(c, CHILD(child, 0));
604 break;
605 case LPAR:
606 arg = compiler_complex_args(c, CHILD(child, 1));
607 break;
608 default:
609 PyErr_Format(PyExc_SystemError,
610 "unexpected node in args: %d @ %d",
611 TYPE(CHILD(child, 0)), i);
612 arg = NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000613 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000614 if (!arg)
615 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616 asdl_seq_SET(args, i, arg);
617 }
618
Neal Norwitzc1505362006-12-28 06:47:50 +0000619 return NestedArgs(args, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620}
621
Guido van Rossum4f72a782006-10-27 23:31:49 +0000622/* returns -1 if failed to handle keyword only arguments
623 returns new position to keep processing if successful
Neal Norwitzc1505362006-12-28 06:47:50 +0000624 (',' tname ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000625 ^^^
626 start pointing here
627 */
628static int
629handle_keywordonly_args(struct compiling *c, const node *n, int start,
630 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
631{
632 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000633 expr_ty expression, annotation;
634 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000635 int i = start;
636 int j = 0; /* index for kwdefaults and kwonlyargs */
637 assert(kwonlyargs != NULL);
638 assert(kwdefaults != NULL);
639 while (i < NCH(n)) {
640 ch = CHILD(n, i);
641 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000642 case vname:
643 case tname:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000644 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000645 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000646 if (!expression) {
647 ast_error(ch, "assignment to None");
648 goto error;
649 }
650 asdl_seq_SET(kwdefaults, j, expression);
651 i += 2; /* '=' and test */
652 }
653 else { /* setting NULL if no default value exists */
654 asdl_seq_SET(kwdefaults, j, NULL);
655 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000656 if (NCH(ch) == 3) {
657 /* ch is NAME ':' test */
658 annotation = ast_for_expr(c, CHILD(ch, 2));
659 if (!annotation) {
660 ast_error(ch, "expected expression");
661 goto error;
662 }
663 }
664 else {
665 annotation = NULL;
666 }
667 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000668 if (!strcmp(STR(ch), "None")) {
669 ast_error(ch, "assignment to None");
670 goto error;
671 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000672 arg = SimpleArg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
673 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 ast_error(ch, "expecting name");
675 goto error;
676 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000677 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000678 i += 2; /* the name and the comma */
679 break;
680 case DOUBLESTAR:
681 return i;
682 default:
683 ast_error(ch, "unexpected node");
684 goto error;
685 }
686 }
687 return i;
688 error:
689 return -1;
690}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000691
Jeremy Hyltona8293132006-02-28 17:58:27 +0000692/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000693
694static arguments_ty
695ast_for_arguments(struct compiling *c, const node *n)
696{
Neal Norwitzc1505362006-12-28 06:47:50 +0000697 /* This function handles both typedargslist (function definition)
698 and varargslist (lambda definition).
699
700 parameters: '(' [typedargslist] ')'
701 typedargslist: ((tfpdef ['=' test] ',')*
702 ('*' [tname] (',' tname ['=' test])* [',' '**' tname]
703 | '**' tname)
704 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
705 varargslist: ((vfpdef ['=' test] ',')*
706 ('*' [vname] (',' vname ['=' test])* [',' '**' vname]
707 | '**' vname)
708 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000710 int i, j, k, nposargs = 0, nkwonlyargs = 0;
711 int nposdefaults = 0, found_default = 0;
712 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 arg_ty arg;
715 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 node *ch;
717
718 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000719 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
721 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000722 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000724 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725
Guido van Rossum4f72a782006-10-27 23:31:49 +0000726 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000728 ch = CHILD(n, i);
729 if (TYPE(ch) == STAR) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000730 if (TYPE(CHILD(n, i+1)) == tname
731 || TYPE(CHILD(n, i+1)) == vname) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000732 /* skip NAME of vararg */
733 /* so that following can count only keyword only args */
734 i += 2;
735 }
736 else {
737 i++;
738 }
739 break;
740 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000741 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000742 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000743 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744 /* count the number of keyword only args &
745 defaults for keyword only args */
746 for ( ; i < NCH(n); ++i) {
747 ch = CHILD(n, i);
748 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 if (TYPE(ch) == tname || TYPE(ch) == vname) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000750 }
751
752 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
753 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000754 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000755 kwonlyargs = (nkwonlyargs ?
756 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
757 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000758 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000759 posdefaults = (nposdefaults ?
760 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
761 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000762 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000763 /* The length of kwonlyargs and kwdefaults are same
764 since we set NULL as default for keyword only argument w/o default
765 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
768 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000769 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000770
771 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000772 ast_error(n, "more than 255 arguments");
773 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000774 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775
Neal Norwitzc1505362006-12-28 06:47:50 +0000776 /* tname: NAME [':' test]
777 tfpdef: tname | '(' tfplist ')'
778 tfplist: tfpdef (',' tfpdef)* [',']
779 vname: NAME
780 vfpdef: NAME | '(' vfplist ')'
781 vfplist: vfpdef (',' vfpdef)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 */
783 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000784 j = 0; /* index for defaults */
785 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000787 ch = CHILD(n, i);
788 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000789 case tfpdef:
790 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
792 anything other than EQUAL or a comma? */
793 /* XXX Should NCH(n) check be made a separate check? */
794 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000795 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
796 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000797 goto error;
798 assert(posdefaults != NULL);
799 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 else if (found_default) {
804 ast_error(n,
805 "non-default argument follows default argument");
806 goto error;
807 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000808 /* def foo((x)): is not complex, special case. */
809 while (NCH(ch) == 3 && NCH(CHILD(ch, 1)) == 1)
810 ch = CHILD(CHILD(ch, 1), 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000811
Neal Norwitzc1505362006-12-28 06:47:50 +0000812 if (NCH(ch) != 1)
813 arg = compiler_complex_args(c, CHILD(ch, 1));
814 else
815 arg = compiler_simple_arg(c, CHILD(ch, 0));
816 if (!arg)
817 goto error;
818 asdl_seq_SET(posargs, k++, arg);
819
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 i += 2; /* the name and the comma */
821 break;
822 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 if (i+1 >= NCH(n)) {
824 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000825 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000826 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000827 ch = CHILD(n, i+1); /* tname or COMMA */
828 if (TYPE(ch) == COMMA) {
829 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000830 i += 2; /* now follows keyword only arguments */
831 res = handle_keywordonly_args(c, n, i,
832 kwonlyargs, kwdefaults);
833 if (res == -1) goto error;
834 i = res; /* res has new position to process */
835 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000836 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
837 ast_error(CHILD(ch, 0), "assignment to None");
838 goto error;
839 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000841 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
842 if (NCH(ch) > 1) {
843 /* there is an annotation on the vararg */
844 varargannotation = ast_for_expr(c, CHILD(ch, 2));
845 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000846 i += 3;
Neal Norwitzc1505362006-12-28 06:47:50 +0000847 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tname
848 || TYPE(CHILD(n, i)) == vname)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000849 int res = 0;
850 res = handle_keywordonly_args(c, n, i,
851 kwonlyargs, kwdefaults);
852 if (res == -1) goto error;
853 i = res; /* res has new position to process */
854 }
855 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 break;
857 case DOUBLESTAR:
Neal Norwitzc1505362006-12-28 06:47:50 +0000858 ch = CHILD(n, i+1); /* tname */
859 assert(TYPE(ch) == tname || TYPE(ch) == vname);
860 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
861 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000862 goto error;
863 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000864 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
865 if (NCH(ch) > 1) {
866 /* there is an annotation on the kwarg */
867 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869 i += 3;
870 break;
871 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000872 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 "unexpected node in varargslist: %d @ %d",
874 TYPE(ch), i);
875 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000876 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000878 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
879 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000881 Py_XDECREF(vararg);
882 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883 return NULL;
884}
885
886static expr_ty
887ast_for_dotted_name(struct compiling *c, const node *n)
888{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000889 expr_ty e;
890 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000891 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892 int i;
893
894 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000895
896 lineno = LINENO(n);
897 col_offset = n->n_col_offset;
898
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 id = NEW_IDENTIFIER(CHILD(n, 0));
900 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000901 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000902 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000904 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905
906 for (i = 2; i < NCH(n); i+=2) {
907 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000908 if (!id)
909 return NULL;
910 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
911 if (!e)
912 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913 }
914
915 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916}
917
918static expr_ty
919ast_for_decorator(struct compiling *c, const node *n)
920{
921 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
922 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000923 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924
925 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000926 REQ(CHILD(n, 0), AT);
927 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928
929 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
930 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000931 return NULL;
932
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934 d = name_expr;
935 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 }
937 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000938 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000939 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000940 if (!d)
941 return NULL;
942 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 }
944 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 d = ast_for_call(c, CHILD(n, 3), name_expr);
946 if (!d)
947 return NULL;
948 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 }
950
951 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952}
953
954static asdl_seq*
955ast_for_decorators(struct compiling *c, const node *n)
956{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000957 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000958 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959 int i;
960
961 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000962 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963 if (!decorator_seq)
964 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000965
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000967 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000968 if (!d)
969 return NULL;
970 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 }
972 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973}
974
975static stmt_ty
976ast_for_funcdef(struct compiling *c, const node *n)
977{
Neal Norwitzc1505362006-12-28 06:47:50 +0000978 /* funcdef: 'def' [decorators] NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000979 identifier name;
980 arguments_ty args;
981 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 asdl_seq *decorator_seq = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000983 expr_ty returns = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 int name_i;
985
986 REQ(n, funcdef);
987
988 if (NCH(n) == 6) { /* decorators are present */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000989 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
990 if (!decorator_seq)
991 return NULL;
992 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 }
994 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000995 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 }
997
998 name = NEW_IDENTIFIER(CHILD(n, name_i));
999 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001002 ast_error(CHILD(n, name_i), "assignment to None");
1003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 }
1005 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1006 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001007 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001008 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1009 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1010 if (!returns)
1011 return NULL;
1012 name_i += 2;
1013 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014 body = ast_for_suite(c, CHILD(n, name_i + 3));
1015 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001016 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017
Neal Norwitzc1505362006-12-28 06:47:50 +00001018 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001019 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020}
1021
1022static expr_ty
1023ast_for_lambdef(struct compiling *c, const node *n)
1024{
1025 /* lambdef: 'lambda' [varargslist] ':' test */
1026 arguments_ty args;
1027 expr_ty expression;
1028
1029 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001030 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1031 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 if (!args)
1033 return NULL;
1034 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001035 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 }
1038 else {
1039 args = ast_for_arguments(c, CHILD(n, 1));
1040 if (!args)
1041 return NULL;
1042 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001043 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045 }
1046
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001047 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048}
1049
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001050static expr_ty
1051ast_for_ifexpr(struct compiling *c, const node *n)
1052{
1053 /* test: or_test 'if' or_test 'else' test */
1054 expr_ty expression, body, orelse;
1055
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001056 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001057 body = ast_for_expr(c, CHILD(n, 0));
1058 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001059 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001060 expression = ast_for_expr(c, CHILD(n, 2));
1061 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001062 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001063 orelse = ast_for_expr(c, CHILD(n, 4));
1064 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001066 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1067 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001068}
1069
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
1071 so there is only a single version. Possibly for loops can also re-use
1072 the code.
1073*/
1074
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075/* Count the number of 'for' loop in a list comprehension.
1076
1077 Helper for ast_for_listcomp().
1078*/
1079
1080static int
1081count_list_fors(const node *n)
1082{
1083 int n_fors = 0;
1084 node *ch = CHILD(n, 1);
1085
1086 count_list_for:
1087 n_fors++;
1088 REQ(ch, list_for);
1089 if (NCH(ch) == 5)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001090 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093 count_list_iter:
1094 REQ(ch, list_iter);
1095 ch = CHILD(ch, 0);
1096 if (TYPE(ch) == list_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001097 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098 else if (TYPE(ch) == list_if) {
1099 if (NCH(ch) == 3) {
1100 ch = CHILD(ch, 2);
1101 goto count_list_iter;
1102 }
1103 else
1104 return n_fors;
1105 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001106
1107 /* Should never be reached */
1108 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
1109 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110}
1111
1112/* Count the number of 'if' statements in a list comprehension.
1113
1114 Helper for ast_for_listcomp().
1115*/
1116
1117static int
1118count_list_ifs(const node *n)
1119{
1120 int n_ifs = 0;
1121
1122 count_list_iter:
1123 REQ(n, list_iter);
1124 if (TYPE(CHILD(n, 0)) == list_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001125 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126 n = CHILD(n, 0);
1127 REQ(n, list_if);
1128 n_ifs++;
1129 if (NCH(n) == 2)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001130 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 n = CHILD(n, 2);
1132 goto count_list_iter;
1133}
1134
1135static expr_ty
1136ast_for_listcomp(struct compiling *c, const node *n)
1137{
1138 /* listmaker: test ( list_for | (',' test)* [','] )
1139 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1140 list_iter: list_for | list_if
1141 list_if: 'if' test [list_iter]
1142 testlist_safe: test [(',' test)+ [',']]
1143 */
1144 expr_ty elt;
1145 asdl_seq *listcomps;
1146 int i, n_fors;
1147 node *ch;
1148
1149 REQ(n, listmaker);
1150 assert(NCH(n) > 1);
1151
1152 elt = ast_for_expr(c, CHILD(n, 0));
1153 if (!elt)
1154 return NULL;
1155
1156 n_fors = count_list_fors(n);
1157 if (n_fors == -1)
1158 return NULL;
1159
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001160 listcomps = asdl_seq_new(n_fors, c->c_arena);
1161 if (!listcomps)
Thomas Wouters89f507f2006-12-13 04:49:30 +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++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001166 comprehension_ty lc;
1167 asdl_seq *t;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001169 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170
Thomas Wouters89f507f2006-12-13 04:49:30 +00001171 REQ(ch, list_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172
Thomas Wouters89f507f2006-12-13 04:49:30 +00001173 for_ch = CHILD(ch, 1);
1174 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001175 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001177 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001178 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180
Thomas Wouters89f507f2006-12-13 04:49:30 +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 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001185 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001186 else
1187 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001188 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001189 expression, NULL, c->c_arena);
1190 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192
Thomas Wouters89f507f2006-12-13 04:49:30 +00001193 if (NCH(ch) == 5) {
1194 int j, n_ifs;
1195 asdl_seq *ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196
Thomas Wouters89f507f2006-12-13 04:49:30 +00001197 ch = CHILD(ch, 4);
1198 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001199 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001201
Thomas Wouters89f507f2006-12-13 04:49:30 +00001202 ifs = asdl_seq_new(n_ifs, c->c_arena);
1203 if (!ifs)
1204 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205
Thomas Wouters89f507f2006-12-13 04:49:30 +00001206 for (j = 0; j < n_ifs; j++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001207 REQ(ch, list_iter);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001208 ch = CHILD(ch, 0);
1209 REQ(ch, list_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210
Thomas Wouters89f507f2006-12-13 04:49:30 +00001211 asdl_seq_SET(ifs, j, ast_for_expr(c, CHILD(ch, 1)));
1212 if (NCH(ch) == 3)
1213 ch = CHILD(ch, 2);
1214 }
1215 /* on exit, must guarantee that ch is a list_for */
1216 if (TYPE(ch) == list_iter)
1217 ch = CHILD(ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 lc->ifs = ifs;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001219 }
1220 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 }
1222
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001223 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224}
1225
1226/*
1227 Count the number of 'for' loops in a generator expression.
1228
1229 Helper for ast_for_genexp().
1230*/
1231
1232static int
1233count_gen_fors(const node *n)
1234{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001235 int n_fors = 0;
1236 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237
1238 count_gen_for:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001239 n_fors++;
1240 REQ(ch, gen_for);
1241 if (NCH(ch) == 5)
1242 ch = CHILD(ch, 4);
1243 else
1244 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 count_gen_iter:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001246 REQ(ch, gen_iter);
1247 ch = CHILD(ch, 0);
1248 if (TYPE(ch) == gen_for)
1249 goto count_gen_for;
1250 else if (TYPE(ch) == gen_if) {
1251 if (NCH(ch) == 3) {
1252 ch = CHILD(ch, 2);
1253 goto count_gen_iter;
1254 }
1255 else
1256 return n_fors;
1257 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001258
Thomas Wouters89f507f2006-12-13 04:49:30 +00001259 /* Should never be reached */
1260 PyErr_SetString(PyExc_SystemError,
1261 "logic error in count_gen_fors");
1262 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263}
1264
1265/* Count the number of 'if' statements in a generator expression.
1266
1267 Helper for ast_for_genexp().
1268*/
1269
1270static int
1271count_gen_ifs(const node *n)
1272{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001273 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274
Thomas Wouters89f507f2006-12-13 04:49:30 +00001275 while (1) {
1276 REQ(n, gen_iter);
1277 if (TYPE(CHILD(n, 0)) == gen_for)
1278 return n_ifs;
1279 n = CHILD(n, 0);
1280 REQ(n, gen_if);
1281 n_ifs++;
1282 if (NCH(n) == 2)
1283 return n_ifs;
1284 n = CHILD(n, 2);
1285 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286}
1287
Jeremy Hyltona8293132006-02-28 17:58:27 +00001288/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289static expr_ty
1290ast_for_genexp(struct compiling *c, const node *n)
1291{
1292 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Thomas Wouters89f507f2006-12-13 04:49:30 +00001293 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001294 expr_ty elt;
1295 asdl_seq *genexps;
1296 int i, n_fors;
1297 node *ch;
1298
1299 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1300 assert(NCH(n) > 1);
1301
1302 elt = ast_for_expr(c, CHILD(n, 0));
1303 if (!elt)
1304 return NULL;
1305
1306 n_fors = count_gen_fors(n);
1307 if (n_fors == -1)
1308 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001309
1310 genexps = asdl_seq_new(n_fors, c->c_arena);
1311 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001313
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 ch = CHILD(n, 1);
1315 for (i = 0; i < n_fors; i++) {
1316 comprehension_ty ge;
1317 asdl_seq *t;
1318 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001319 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001320
1321 REQ(ch, gen_for);
1322
Thomas Wouters89f507f2006-12-13 04:49:30 +00001323 for_ch = CHILD(ch, 1);
1324 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001325 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001326 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001327 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001328 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001330
Thomas Wouters89f507f2006-12-13 04:49:30 +00001331 /* Check the # of children rather than the length of t, since
1332 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1333 if (NCH(for_ch) == 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001334 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001335 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001337 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1338 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001339 expression, NULL, c->c_arena);
1340
1341 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001343
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 if (NCH(ch) == 5) {
1345 int j, n_ifs;
1346 asdl_seq *ifs;
1347
1348 ch = CHILD(ch, 4);
1349 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001350 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001352
1353 ifs = asdl_seq_new(n_ifs, c->c_arena);
1354 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001356
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 for (j = 0; j < n_ifs; j++) {
1358 REQ(ch, gen_iter);
1359 ch = CHILD(ch, 0);
1360 REQ(ch, gen_if);
1361
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001362 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001363 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001364 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001365 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 if (NCH(ch) == 3)
1367 ch = CHILD(ch, 2);
1368 }
1369 /* on exit, must guarantee that ch is a gen_for */
1370 if (TYPE(ch) == gen_iter)
1371 ch = CHILD(ch, 0);
1372 ge->ifs = ifs;
1373 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00001374 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375 }
1376
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001377 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001378}
1379
1380static expr_ty
1381ast_for_atom(struct compiling *c, const node *n)
1382{
1383 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
Guido van Rossum86e58e22006-08-28 15:27:34 +00001384 | '{' [dictsetmaker] '}' | NAME | NUMBER | STRING+
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 */
1386 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001387 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388
1389 switch (TYPE(ch)) {
1390 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001391 /* All names start in Load context, but may later be
1392 changed. */
1393 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001395 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 if (!str)
1397 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001398
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001400 if (bytesmode)
1401 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1402 else
1403 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 }
1405 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 PyObject *pynum = parsenumber(STR(ch));
1407 if (!pynum)
1408 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001409
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 PyArena_AddPyObject(c->c_arena, pynum);
1411 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001413 case DOT: /* Ellipsis */
1414 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 ch = CHILD(n, 1);
1417
1418 if (TYPE(ch) == RPAR)
1419 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1420
1421 if (TYPE(ch) == yield_expr)
1422 return ast_for_expr(c, ch);
1423
1424 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1425 return ast_for_genexp(c, ch);
1426
1427 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 ch = CHILD(n, 1);
1430
1431 if (TYPE(ch) == RSQB)
1432 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1433
1434 REQ(ch, listmaker);
1435 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1436 asdl_seq *elts = seq_for_testlist(c, ch);
1437 if (!elts)
1438 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001439
Thomas Wouters89f507f2006-12-13 04:49:30 +00001440 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1441 }
1442 else
1443 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444 case LBRACE: {
Neal Norwitzc1505362006-12-28 06:47:50 +00001445 /* dictsetmaker: test ':' test (',' test ':' test)* [','] |
1446 * test (',' test)* [','] */
1447 int i, size;
1448 asdl_seq *keys, *values;
1449
1450 ch = CHILD(n, 1);
1451 if (NCH(ch) == 1 || (NCH(ch) > 0 && STR(CHILD(ch, 1))[0] == ',')) {
Guido van Rossum86e58e22006-08-28 15:27:34 +00001452 /* it's a set */
1453 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
1454 keys = asdl_seq_new(size, c->c_arena);
1455 if (!keys)
1456 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001457
Guido van Rossum86e58e22006-08-28 15:27:34 +00001458 for (i = 0; i < NCH(ch); i += 2) {
1459 expr_ty expression;
1460 expression = ast_for_expr(c, CHILD(ch, i));
1461 if (!expression)
1462 return NULL;
1463 asdl_seq_SET(keys, i / 2, expression);
1464 }
1465 return Set(keys, LINENO(n), n->n_col_offset, c->c_arena);
1466 } else {
1467 /* it's a dict */
1468 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1469 keys = asdl_seq_new(size, c->c_arena);
1470 if (!keys)
1471 return NULL;
1472
1473 values = asdl_seq_new(size, c->c_arena);
1474 if (!values)
1475 return NULL;
1476
1477 for (i = 0; i < NCH(ch); i += 4) {
1478 expr_ty expression;
1479
1480 expression = ast_for_expr(c, CHILD(ch, i));
1481 if (!expression)
1482 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001483
Guido van Rossum86e58e22006-08-28 15:27:34 +00001484 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001485
Guido van Rossum86e58e22006-08-28 15:27:34 +00001486 expression = ast_for_expr(c, CHILD(ch, i + 2));
1487 if (!expression)
1488 return NULL;
1489
1490 asdl_seq_SET(values, i / 4, expression);
1491 }
1492 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1493 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1497 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 }
1499}
1500
1501static slice_ty
1502ast_for_slice(struct compiling *c, const node *n)
1503{
1504 node *ch;
1505 expr_ty lower = NULL, upper = NULL, step = NULL;
1506
1507 REQ(n, subscript);
1508
1509 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001510 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 sliceop: ':' [test]
1512 */
1513 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514 if (NCH(n) == 1 && TYPE(ch) == test) {
1515 /* 'step' variable hold no significance in terms of being used over
1516 other vars */
1517 step = ast_for_expr(c, ch);
1518 if (!step)
1519 return NULL;
1520
Thomas Wouters89f507f2006-12-13 04:49:30 +00001521 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522 }
1523
1524 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526 if (!lower)
1527 return NULL;
1528 }
1529
1530 /* If there's an upper bound it's in the second or third position. */
1531 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001532 if (NCH(n) > 1) {
1533 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534
Thomas Wouters89f507f2006-12-13 04:49:30 +00001535 if (TYPE(n2) == test) {
1536 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537 if (!upper)
1538 return NULL;
1539 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001542 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Thomas Wouters89f507f2006-12-13 04:49:30 +00001544 if (TYPE(n2) == test) {
1545 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546 if (!upper)
1547 return NULL;
1548 }
1549 }
1550
1551 ch = CHILD(n, NCH(n) - 1);
1552 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001553 if (NCH(ch) == 1) {
1554 /* No expression, so step is None */
1555 ch = CHILD(ch, 0);
1556 step = Name(new_identifier("None", c->c_arena), Load,
1557 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 if (!step)
1559 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001560 } else {
1561 ch = CHILD(ch, 1);
1562 if (TYPE(ch) == test) {
1563 step = ast_for_expr(c, ch);
1564 if (!step)
1565 return NULL;
1566 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001567 }
1568 }
1569
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001570 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571}
1572
1573static expr_ty
1574ast_for_binop(struct compiling *c, const node *n)
1575{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001576 /* Must account for a sequence of expressions.
1577 How should A op B op C by represented?
1578 BinOp(BinOp(A, op, B), op, C).
1579 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580
Thomas Wouters89f507f2006-12-13 04:49:30 +00001581 int i, nops;
1582 expr_ty expr1, expr2, result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001583 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584
1585 expr1 = ast_for_expr(c, CHILD(n, 0));
1586 if (!expr1)
1587 return NULL;
1588
1589 expr2 = ast_for_expr(c, CHILD(n, 2));
1590 if (!expr2)
1591 return NULL;
1592
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001593 newoperator = get_operator(CHILD(n, 1));
1594 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595 return NULL;
1596
Thomas Wouters89f507f2006-12-13 04:49:30 +00001597 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001598 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001599 if (!result)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600 return NULL;
1601
Thomas Wouters89f507f2006-12-13 04:49:30 +00001602 nops = (NCH(n) - 1) / 2;
1603 for (i = 1; i < nops; i++) {
1604 expr_ty tmp_result, tmp;
1605 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606
Thomas Wouters89f507f2006-12-13 04:49:30 +00001607 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001608 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609 return NULL;
1610
1611 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1612 if (!tmp)
1613 return NULL;
1614
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001615 tmp_result = BinOp(result, newoperator, tmp,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001616 LINENO(next_oper), next_oper->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001617 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001618 if (!tmp)
1619 return NULL;
1620 result = tmp_result;
1621 }
1622 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623}
1624
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625static expr_ty
1626ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1627{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1629 subscriptlist: subscript (',' subscript)* [',']
1630 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1631 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001632 REQ(n, trailer);
1633 if (TYPE(CHILD(n, 0)) == LPAR) {
1634 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001635 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1636 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001638 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001639 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001640 else if (TYPE(CHILD(n, 0)) == DOT ) {
1641 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001642 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001643 }
1644 else {
1645 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 REQ(CHILD(n, 2), RSQB);
1647 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001648 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001649 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1650 if (!slc)
1651 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001652 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1653 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 }
1655 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 /* The grammar is ambiguous here. The ambiguity is resolved
1657 by treating the sequence as a tuple literal if there are
1658 no slice features.
1659 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660 int j;
1661 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001662 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001663 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001664 asdl_seq *slices, *elts;
1665 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001666 if (!slices)
1667 return NULL;
1668 for (j = 0; j < NCH(n); j += 2) {
1669 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001670 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001671 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001672 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001673 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001674 asdl_seq_SET(slices, j / 2, slc);
1675 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001676 if (!simple) {
1677 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001678 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001679 }
1680 /* extract Index values and put them in a Tuple */
1681 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001682 if (!elts)
1683 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001684 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1685 slc = (slice_ty)asdl_seq_GET(slices, j);
1686 assert(slc->kind == Index_kind && slc->v.Index.value);
1687 asdl_seq_SET(elts, j, slc->v.Index.value);
1688 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001689 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001690 if (!e)
1691 return NULL;
1692 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001693 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001694 }
1695 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001696}
1697
1698static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001699ast_for_factor(struct compiling *c, const node *n)
1700{
1701 node *pfactor, *ppower, *patom, *pnum;
1702 expr_ty expression;
1703
1704 /* If the unary - operator is applied to a constant, don't generate
1705 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1706 constant. The peephole optimizer already does something like
1707 this but it doesn't handle the case where the constant is
1708 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1709 PyLongObject.
1710 */
1711 if (TYPE(CHILD(n, 0)) == MINUS
1712 && NCH(n) == 2
1713 && TYPE((pfactor = CHILD(n, 1))) == factor
1714 && NCH(pfactor) == 1
1715 && TYPE((ppower = CHILD(pfactor, 0))) == power
1716 && NCH(ppower) == 1
1717 && TYPE((patom = CHILD(ppower, 0))) == atom
1718 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1719 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1720 if (s == NULL)
1721 return NULL;
1722 s[0] = '-';
1723 strcpy(s + 1, STR(pnum));
1724 PyObject_FREE(STR(pnum));
1725 STR(pnum) = s;
1726 return ast_for_atom(c, patom);
1727 }
1728
1729 expression = ast_for_expr(c, CHILD(n, 1));
1730 if (!expression)
1731 return NULL;
1732
1733 switch (TYPE(CHILD(n, 0))) {
1734 case PLUS:
1735 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1736 c->c_arena);
1737 case MINUS:
1738 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1739 c->c_arena);
1740 case TILDE:
1741 return UnaryOp(Invert, expression, LINENO(n),
1742 n->n_col_offset, c->c_arena);
1743 }
1744 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1745 TYPE(CHILD(n, 0)));
1746 return NULL;
1747}
1748
1749static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001750ast_for_power(struct compiling *c, const node *n)
1751{
1752 /* power: atom trailer* ('**' factor)*
1753 */
1754 int i;
1755 expr_ty e, tmp;
1756 REQ(n, power);
1757 e = ast_for_atom(c, CHILD(n, 0));
1758 if (!e)
1759 return NULL;
1760 if (NCH(n) == 1)
1761 return e;
1762 for (i = 1; i < NCH(n); i++) {
1763 node *ch = CHILD(n, i);
1764 if (TYPE(ch) != trailer)
1765 break;
1766 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001767 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001768 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001769 tmp->lineno = e->lineno;
1770 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001771 e = tmp;
1772 }
1773 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1774 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001775 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001776 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001777 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001778 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001779 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001780 e = tmp;
1781 }
1782 return e;
1783}
1784
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785/* Do not name a variable 'expr'! Will cause a compile error.
1786*/
1787
1788static expr_ty
1789ast_for_expr(struct compiling *c, const node *n)
1790{
1791 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001792 test: or_test ['if' or_test 'else' test] | lambdef
1793 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 and_test: not_test ('and' not_test)*
1795 not_test: 'not' not_test | comparison
1796 comparison: expr (comp_op expr)*
1797 expr: xor_expr ('|' xor_expr)*
1798 xor_expr: and_expr ('^' and_expr)*
1799 and_expr: shift_expr ('&' shift_expr)*
1800 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1801 arith_expr: term (('+'|'-') term)*
1802 term: factor (('*'|'/'|'%'|'//') factor)*
1803 factor: ('+'|'-'|'~') factor | power
1804 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001805
1806 As well as modified versions that exist for backward compatibility,
1807 to explicitly allow:
1808 [ x for x in lambda: 0, lambda: 1 ]
1809 (which would be ambiguous without these extra rules)
1810
1811 old_test: or_test | old_lambdef
1812 old_lambdef: 'lambda' [vararglist] ':' old_test
1813
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 */
1815
1816 asdl_seq *seq;
1817 int i;
1818
1819 loop:
1820 switch (TYPE(n)) {
1821 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001822 case old_test:
1823 if (TYPE(CHILD(n, 0)) == lambdef ||
1824 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001826 else if (NCH(n) > 1)
1827 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001828 /* Fallthrough */
1829 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 case and_test:
1831 if (NCH(n) == 1) {
1832 n = CHILD(n, 0);
1833 goto loop;
1834 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001835 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 if (!seq)
1837 return NULL;
1838 for (i = 0; i < NCH(n); i += 2) {
1839 expr_ty e = ast_for_expr(c, CHILD(n, i));
1840 if (!e)
1841 return NULL;
1842 asdl_seq_SET(seq, i / 2, e);
1843 }
1844 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1846 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001847 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001848 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 case not_test:
1850 if (NCH(n) == 1) {
1851 n = CHILD(n, 0);
1852 goto loop;
1853 }
1854 else {
1855 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1856 if (!expression)
1857 return NULL;
1858
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001859 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1860 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 }
1862 case comparison:
1863 if (NCH(n) == 1) {
1864 n = CHILD(n, 0);
1865 goto loop;
1866 }
1867 else {
1868 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001871 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 if (!ops)
1873 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001874 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 return NULL;
1877 }
1878 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001879 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001881 newoperator = ast_for_comp_op(CHILD(n, i));
1882 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885
1886 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001887 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001891 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 asdl_seq_SET(cmps, i / 2, expression);
1893 }
1894 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001895 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001899 return Compare(expression, ops, cmps, LINENO(n),
1900 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 }
1902 break;
1903
1904 /* The next five cases all handle BinOps. The main body of code
1905 is the same in each case, but the switch turned inside out to
1906 reuse the code for each type of operator.
1907 */
1908 case expr:
1909 case xor_expr:
1910 case and_expr:
1911 case shift_expr:
1912 case arith_expr:
1913 case term:
1914 if (NCH(n) == 1) {
1915 n = CHILD(n, 0);
1916 goto loop;
1917 }
1918 return ast_for_binop(c, n);
1919 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001920 expr_ty exp = NULL;
1921 if (NCH(n) == 2) {
1922 exp = ast_for_testlist(c, CHILD(n, 1));
1923 if (!exp)
1924 return NULL;
1925 }
1926 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1927 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001928 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 if (NCH(n) == 1) {
1930 n = CHILD(n, 0);
1931 goto loop;
1932 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001934 case power:
1935 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001937 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 return NULL;
1939 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001940 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 return NULL;
1942}
1943
1944static expr_ty
1945ast_for_call(struct compiling *c, const node *n, expr_ty func)
1946{
1947 /*
1948 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1949 | '**' test)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001950 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 */
1952
1953 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001954 asdl_seq *args;
1955 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 expr_ty vararg = NULL, kwarg = NULL;
1957
1958 REQ(n, arglist);
1959
1960 nargs = 0;
1961 nkeywords = 0;
1962 ngens = 0;
1963 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001964 node *ch = CHILD(n, i);
1965 if (TYPE(ch) == argument) {
1966 if (NCH(ch) == 1)
1967 nargs++;
1968 else if (TYPE(CHILD(ch, 1)) == gen_for)
1969 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001971 nkeywords++;
1972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 }
1974 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001975 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 "if not sole argument");
1977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
1979
1980 if (nargs + nkeywords + ngens > 255) {
1981 ast_error(n, "more than 255 arguments");
1982 return NULL;
1983 }
1984
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001985 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001987 return NULL;
1988 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 nargs = 0;
1992 nkeywords = 0;
1993 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 node *ch = CHILD(n, i);
1995 if (TYPE(ch) == argument) {
1996 expr_ty e;
1997 if (NCH(ch) == 1) {
1998 if (nkeywords) {
1999 ast_error(CHILD(ch, 0),
2000 "non-keyword arg after keyword arg");
2001 return NULL;
2002 }
2003 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 asdl_seq_SET(args, nargs++, e);
2007 }
2008 else if (TYPE(CHILD(ch, 1)) == gen_for) {
2009 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002011 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 else {
2015 keyword_ty kw;
2016 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 /* CHILD(ch, 0) is test, but must be an identifier? */
2019 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002021 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 /* f(lambda x: x[0] = 3) ends up getting parsed with
2023 * LHS test = lambda x: x[0], and RHS test = 3.
2024 * SF bug 132313 points out that complaining about a keyword
2025 * then is very confusing.
2026 */
2027 if (e->kind == Lambda_kind) {
2028 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002029 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 } else if (e->kind != Name_kind) {
2031 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 key = e->v.Name.id;
2035 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002037 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 asdl_seq_SET(keywords, nkeywords++, kw);
2042 }
2043 }
2044 else if (TYPE(ch) == STAR) {
2045 vararg = ast_for_expr(c, CHILD(n, i+1));
2046 i++;
2047 }
2048 else if (TYPE(ch) == DOUBLESTAR) {
2049 kwarg = ast_for_expr(c, CHILD(n, i+1));
2050 i++;
2051 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052 }
2053
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002054 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055}
2056
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002058ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002060 /* testlist_gexp: test (',' test)* [','] */
2061 /* testlist: test (',' test)* [','] */
2062 /* testlist_safe: test (',' test)+ [','] */
2063 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002065 if (TYPE(n) == testlist_gexp) {
2066 if (NCH(n) > 1)
2067 assert(TYPE(CHILD(n, 1)) != gen_for);
2068 }
2069 else {
2070 assert(TYPE(n) == testlist ||
2071 TYPE(n) == testlist_safe ||
2072 TYPE(n) == testlist1);
2073 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002075 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 else {
2077 asdl_seq *tmp = seq_for_testlist(c, n);
2078 if (!tmp)
2079 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002082}
2083
2084static expr_ty
2085ast_for_testlist_gexp(struct compiling *c, const node* n)
2086{
2087 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2088 /* argument: test [ gen_for ] */
2089 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002090 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002092 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002093}
2094
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095static stmt_ty
2096ast_for_expr_stmt(struct compiling *c, const node *n)
2097{
2098 REQ(n, expr_stmt);
2099 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2100 | ('=' (yield_expr|testlist))*)
2101 testlist: test (',' test)* [',']
2102 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002103 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 test: ... here starts the operator precendence dance
2105 */
2106
2107 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002108 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 if (!e)
2110 return NULL;
2111
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 }
2114 else if (TYPE(CHILD(n, 1)) == augassign) {
2115 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002116 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002117 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118
Thomas Wouters89f507f2006-12-13 04:49:30 +00002119 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 if (!expr1)
2121 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002122 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002123 switch (expr1->kind) {
2124 case GeneratorExp_kind:
2125 ast_error(ch, "augmented assignment to generator "
2126 "expression not possible");
2127 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002128 case Yield_kind:
2129 ast_error(ch, "augmented assignment to yield "
2130 "expression not possible");
2131 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002132 case Name_kind: {
2133 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
2134 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
2135 ast_error(ch, "assignment to None");
2136 return NULL;
2137 }
2138 break;
2139 }
2140 case Attribute_kind:
2141 case Subscript_kind:
2142 break;
2143 default:
2144 ast_error(ch, "illegal expression for augmented "
2145 "assignment");
2146 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002148 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 ch = CHILD(n, 2);
2151 if (TYPE(ch) == testlist)
2152 expr2 = ast_for_testlist(c, ch);
2153 else
2154 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002155 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 return NULL;
2157
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002158 newoperator = ast_for_augassign(CHILD(n, 1));
2159 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 return NULL;
2161
Thomas Wouters89f507f2006-12-13 04:49:30 +00002162 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 }
2164 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002165 int i;
2166 asdl_seq *targets;
2167 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 expr_ty expression;
2169
Thomas Wouters89f507f2006-12-13 04:49:30 +00002170 /* a normal assignment */
2171 REQ(CHILD(n, 1), EQUAL);
2172 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2173 if (!targets)
2174 return NULL;
2175 for (i = 0; i < NCH(n) - 2; i += 2) {
2176 expr_ty e;
2177 node *ch = CHILD(n, i);
2178 if (TYPE(ch) == yield_expr) {
2179 ast_error(ch, "assignment to yield expression not possible");
2180 return NULL;
2181 }
2182 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183
Thomas Wouters89f507f2006-12-13 04:49:30 +00002184 /* set context to assign */
2185 if (!e)
2186 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 if (!set_context(e, Store, CHILD(n, i)))
2189 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190
Thomas Wouters89f507f2006-12-13 04:49:30 +00002191 asdl_seq_SET(targets, i / 2, e);
2192 }
2193 value = CHILD(n, NCH(n) - 1);
2194 if (TYPE(value) == testlist)
2195 expression = ast_for_testlist(c, value);
2196 else
2197 expression = ast_for_expr(c, value);
2198 if (!expression)
2199 return NULL;
2200 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202}
2203
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002205ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206{
2207 asdl_seq *seq;
2208 int i;
2209 expr_ty e;
2210
2211 REQ(n, exprlist);
2212
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002213 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002215 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002217 e = ast_for_expr(c, CHILD(n, i));
2218 if (!e)
2219 return NULL;
2220 asdl_seq_SET(seq, i / 2, e);
2221 if (context && !set_context(e, context, CHILD(n, i)))
2222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 }
2224 return seq;
2225}
2226
2227static stmt_ty
2228ast_for_del_stmt(struct compiling *c, const node *n)
2229{
2230 asdl_seq *expr_list;
2231
2232 /* del_stmt: 'del' exprlist */
2233 REQ(n, del_stmt);
2234
2235 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2236 if (!expr_list)
2237 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002238 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239}
2240
2241static stmt_ty
2242ast_for_flow_stmt(struct compiling *c, const node *n)
2243{
2244 /*
2245 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2246 | yield_stmt
2247 break_stmt: 'break'
2248 continue_stmt: 'continue'
2249 return_stmt: 'return' [testlist]
2250 yield_stmt: yield_expr
2251 yield_expr: 'yield' testlist
2252 raise_stmt: 'raise' [test [',' test [',' test]]]
2253 */
2254 node *ch;
2255
2256 REQ(n, flow_stmt);
2257 ch = CHILD(n, 0);
2258 switch (TYPE(ch)) {
2259 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002260 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002262 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002264 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2265 if (!exp)
2266 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002267 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 }
2269 case return_stmt:
2270 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002271 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002273 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 if (!expression)
2275 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002276 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 }
2278 case raise_stmt:
2279 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002280 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 else if (NCH(ch) == 2) {
2282 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2283 if (!expression)
2284 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002285 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 }
2287 else if (NCH(ch) == 4) {
2288 expr_ty expr1, expr2;
2289
2290 expr1 = ast_for_expr(c, CHILD(ch, 1));
2291 if (!expr1)
2292 return NULL;
2293 expr2 = ast_for_expr(c, CHILD(ch, 3));
2294 if (!expr2)
2295 return NULL;
2296
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002297 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 }
2299 else if (NCH(ch) == 6) {
2300 expr_ty expr1, expr2, expr3;
2301
2302 expr1 = ast_for_expr(c, CHILD(ch, 1));
2303 if (!expr1)
2304 return NULL;
2305 expr2 = ast_for_expr(c, CHILD(ch, 3));
2306 if (!expr2)
2307 return NULL;
2308 expr3 = ast_for_expr(c, CHILD(ch, 5));
2309 if (!expr3)
2310 return NULL;
2311
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002312 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 }
2314 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002315 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 "unexpected flow_stmt: %d", TYPE(ch));
2317 return NULL;
2318 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002319
2320 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2321 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322}
2323
2324static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002325alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326{
2327 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002328 import_as_name: NAME ['as' NAME]
2329 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 dotted_name: NAME ('.' NAME)*
2331 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002332 PyObject *str;
2333
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 loop:
2335 switch (TYPE(n)) {
2336 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002337 str = NULL;
2338 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002339 str = NEW_IDENTIFIER(CHILD(n, 2));
2340 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002341 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 case dotted_as_name:
2343 if (NCH(n) == 1) {
2344 n = CHILD(n, 0);
2345 goto loop;
2346 }
2347 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002348 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002349 if (!a)
2350 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351 assert(!a->asname);
2352 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2353 return a;
2354 }
2355 break;
2356 case dotted_name:
2357 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002358 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 else {
2360 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002361 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002362 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 char *s;
2364
2365 len = 0;
2366 for (i = 0; i < NCH(n); i += 2)
2367 /* length of string plus one for the dot */
2368 len += strlen(STR(CHILD(n, i))) + 1;
2369 len--; /* the last name doesn't have a dot */
2370 str = PyString_FromStringAndSize(NULL, len);
2371 if (!str)
2372 return NULL;
2373 s = PyString_AS_STRING(str);
2374 if (!s)
2375 return NULL;
2376 for (i = 0; i < NCH(n); i += 2) {
2377 char *sch = STR(CHILD(n, i));
2378 strcpy(s, STR(CHILD(n, i)));
2379 s += strlen(sch);
2380 *s++ = '.';
2381 }
2382 --s;
2383 *s = '\0';
2384 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002385 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002386 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 }
2388 break;
2389 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 str = PyString_InternFromString("*");
2391 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002392 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002394 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 "unexpected import name: %d", TYPE(n));
2396 return NULL;
2397 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002398
2399 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 return NULL;
2401}
2402
2403static stmt_ty
2404ast_for_import_stmt(struct compiling *c, const node *n)
2405{
2406 /*
2407 import_stmt: import_name | import_from
2408 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002409 import_from: 'from' ('.'* dotted_name | '.') 'import'
2410 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002412 int lineno;
2413 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 int i;
2415 asdl_seq *aliases;
2416
2417 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002418 lineno = LINENO(n);
2419 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002421 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 REQ(n, dotted_as_names);
2424 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2425 if (!aliases)
2426 return NULL;
2427 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002428 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002429 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002433 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002435 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 int idx, ndots = 0;
2438 alias_ty mod = NULL;
2439 identifier modname;
2440
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002441 /* Count the number of dots (for relative imports) and check for the
2442 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002443 for (idx = 1; idx < NCH(n); idx++) {
2444 if (TYPE(CHILD(n, idx)) == dotted_name) {
2445 mod = alias_for_import_name(c, CHILD(n, idx));
2446 idx++;
2447 break;
2448 } else if (TYPE(CHILD(n, idx)) != DOT) {
2449 break;
2450 }
2451 ndots++;
2452 }
2453 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002454 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002455 case STAR:
2456 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 n = CHILD(n, idx);
2458 n_children = 1;
2459 if (ndots) {
2460 ast_error(n, "'import *' not allowed with 'from .'");
2461 return NULL;
2462 }
2463 break;
2464 case LPAR:
2465 /* from ... import (x, y, z) */
2466 n = CHILD(n, idx + 1);
2467 n_children = NCH(n);
2468 break;
2469 case import_as_names:
2470 /* from ... import x, y, z */
2471 n = CHILD(n, idx);
2472 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002473 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 ast_error(n, "trailing comma not allowed without"
2475 " surrounding parentheses");
2476 return NULL;
2477 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002478 break;
2479 default:
2480 ast_error(n, "Unexpected node-type in from-import");
2481 return NULL;
2482 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483
Thomas Wouters89f507f2006-12-13 04:49:30 +00002484 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2485 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487
2488 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002489 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002490 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002491 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002495 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002497 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2498 if (!import_alias)
2499 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002500 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002501 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002503 if (mod != NULL)
2504 modname = mod->name;
2505 else
2506 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002507 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002508 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 }
Neal Norwitz79792652005-11-14 04:25:03 +00002510 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 "unknown import statement: starts with command '%s'",
2512 STR(CHILD(n, 0)));
2513 return NULL;
2514}
2515
2516static stmt_ty
2517ast_for_global_stmt(struct compiling *c, const node *n)
2518{
2519 /* global_stmt: 'global' NAME (',' NAME)* */
2520 identifier name;
2521 asdl_seq *s;
2522 int i;
2523
2524 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002525 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002527 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002529 name = NEW_IDENTIFIER(CHILD(n, i));
2530 if (!name)
2531 return NULL;
2532 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002534 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535}
2536
2537static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002538ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2539{
2540 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2541 identifier name;
2542 asdl_seq *s;
2543 int i;
2544
2545 REQ(n, nonlocal_stmt);
2546 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2547 if (!s)
2548 return NULL;
2549 for (i = 1; i < NCH(n); i += 2) {
2550 name = NEW_IDENTIFIER(CHILD(n, i));
2551 if (!name)
2552 return NULL;
2553 asdl_seq_SET(s, i / 2, name);
2554 }
2555 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2556}
2557
2558static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559ast_for_assert_stmt(struct compiling *c, const node *n)
2560{
2561 /* assert_stmt: 'assert' test [',' test] */
2562 REQ(n, assert_stmt);
2563 if (NCH(n) == 2) {
2564 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2565 if (!expression)
2566 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002567 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 }
2569 else if (NCH(n) == 4) {
2570 expr_ty expr1, expr2;
2571
2572 expr1 = ast_for_expr(c, CHILD(n, 1));
2573 if (!expr1)
2574 return NULL;
2575 expr2 = ast_for_expr(c, CHILD(n, 3));
2576 if (!expr2)
2577 return NULL;
2578
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 }
Neal Norwitz79792652005-11-14 04:25:03 +00002581 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 "improper number of parts to 'assert' statement: %d",
2583 NCH(n));
2584 return NULL;
2585}
2586
2587static asdl_seq *
2588ast_for_suite(struct compiling *c, const node *n)
2589{
2590 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002591 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 stmt_ty s;
2593 int i, total, num, end, pos = 0;
2594 node *ch;
2595
2596 REQ(n, suite);
2597
2598 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002599 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002601 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002603 n = CHILD(n, 0);
2604 /* simple_stmt always ends with a NEWLINE,
2605 and may have a trailing SEMI
2606 */
2607 end = NCH(n) - 1;
2608 if (TYPE(CHILD(n, end - 1)) == SEMI)
2609 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002611 for (i = 0; i < end; i += 2) {
2612 ch = CHILD(n, i);
2613 s = ast_for_stmt(c, ch);
2614 if (!s)
2615 return NULL;
2616 asdl_seq_SET(seq, pos++, s);
2617 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 }
2619 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002620 for (i = 2; i < (NCH(n) - 1); i++) {
2621 ch = CHILD(n, i);
2622 REQ(ch, stmt);
2623 num = num_stmts(ch);
2624 if (num == 1) {
2625 /* small_stmt or compound_stmt with only one child */
2626 s = ast_for_stmt(c, ch);
2627 if (!s)
2628 return NULL;
2629 asdl_seq_SET(seq, pos++, s);
2630 }
2631 else {
2632 int j;
2633 ch = CHILD(ch, 0);
2634 REQ(ch, simple_stmt);
2635 for (j = 0; j < NCH(ch); j += 2) {
2636 /* statement terminates with a semi-colon ';' */
2637 if (NCH(CHILD(ch, j)) == 0) {
2638 assert((j + 1) == NCH(ch));
2639 break;
2640 }
2641 s = ast_for_stmt(c, CHILD(ch, j));
2642 if (!s)
2643 return NULL;
2644 asdl_seq_SET(seq, pos++, s);
2645 }
2646 }
2647 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 }
2649 assert(pos == seq->size);
2650 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651}
2652
2653static stmt_ty
2654ast_for_if_stmt(struct compiling *c, const node *n)
2655{
2656 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2657 ['else' ':' suite]
2658 */
2659 char *s;
2660
2661 REQ(n, if_stmt);
2662
2663 if (NCH(n) == 4) {
2664 expr_ty expression;
2665 asdl_seq *suite_seq;
2666
2667 expression = ast_for_expr(c, CHILD(n, 1));
2668 if (!expression)
2669 return NULL;
2670 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002671 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 return NULL;
2673
Thomas Wouters89f507f2006-12-13 04:49:30 +00002674 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002676
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 s = STR(CHILD(n, 4));
2678 /* s[2], the third character in the string, will be
2679 's' for el_s_e, or
2680 'i' for el_i_f
2681 */
2682 if (s[2] == 's') {
2683 expr_ty expression;
2684 asdl_seq *seq1, *seq2;
2685
2686 expression = ast_for_expr(c, CHILD(n, 1));
2687 if (!expression)
2688 return NULL;
2689 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002690 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 return NULL;
2692 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return NULL;
2695
Thomas Wouters89f507f2006-12-13 04:49:30 +00002696 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 }
2698 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002699 int i, n_elif, has_else = 0;
2700 asdl_seq *orelse = NULL;
2701 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 /* must reference the child n_elif+1 since 'else' token is third,
2703 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002704 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2705 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2706 has_else = 1;
2707 n_elif -= 3;
2708 }
2709 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710
Thomas Wouters89f507f2006-12-13 04:49:30 +00002711 if (has_else) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 expr_ty expression;
2713 asdl_seq *seq1, *seq2;
2714
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 orelse = asdl_seq_new(1, c->c_arena);
2716 if (!orelse)
2717 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002719 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002722 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002725 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727
Thomas Wouters89f507f2006-12-13 04:49:30 +00002728 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
2729 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002730 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002731 /* the just-created orelse handled the last elif */
2732 n_elif--;
2733 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 for (i = 0; i < n_elif; i++) {
2736 int off = 5 + (n_elif - i - 1) * 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 expr_ty expression;
2738 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002739 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2740 if (!newobj)
2741 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002743 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002746 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748
Thomas Wouters89f507f2006-12-13 04:49:30 +00002749 asdl_seq_SET(newobj, 0,
2750 If(expression, suite_seq, orelse,
2751 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
2752 orelse = newobj;
2753 }
2754 return If(ast_for_expr(c, CHILD(n, 1)),
2755 ast_for_suite(c, CHILD(n, 3)),
2756 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002758
2759 PyErr_Format(PyExc_SystemError,
2760 "unexpected token in 'if' statement: %s", s);
2761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762}
2763
2764static stmt_ty
2765ast_for_while_stmt(struct compiling *c, const node *n)
2766{
2767 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2768 REQ(n, while_stmt);
2769
2770 if (NCH(n) == 4) {
2771 expr_ty expression;
2772 asdl_seq *suite_seq;
2773
2774 expression = ast_for_expr(c, CHILD(n, 1));
2775 if (!expression)
2776 return NULL;
2777 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002778 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002780 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 }
2782 else if (NCH(n) == 7) {
2783 expr_ty expression;
2784 asdl_seq *seq1, *seq2;
2785
2786 expression = ast_for_expr(c, CHILD(n, 1));
2787 if (!expression)
2788 return NULL;
2789 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002790 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791 return NULL;
2792 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002793 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794 return NULL;
2795
Thomas Wouters89f507f2006-12-13 04:49:30 +00002796 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002798
2799 PyErr_Format(PyExc_SystemError,
2800 "wrong number of tokens for 'while' statement: %d",
2801 NCH(n));
2802 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803}
2804
2805static stmt_ty
2806ast_for_for_stmt(struct compiling *c, const node *n)
2807{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002808 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 expr_ty expression;
2810 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002811 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2813 REQ(n, for_stmt);
2814
2815 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002816 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 if (!seq)
2818 return NULL;
2819 }
2820
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002821 node_target = CHILD(n, 1);
2822 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002823 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002825 /* Check the # of children rather than the length of _target, since
2826 for x, in ... has 1 element in _target, but still requires a Tuple. */
2827 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002828 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002830 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002832 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002833 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 return NULL;
2835 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002836 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 return NULL;
2838
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002839 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2840 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841}
2842
2843static excepthandler_ty
2844ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2845{
2846 /* except_clause: 'except' [test [',' test]] */
2847 REQ(exc, except_clause);
2848 REQ(body, suite);
2849
2850 if (NCH(exc) == 1) {
2851 asdl_seq *suite_seq = ast_for_suite(c, body);
2852 if (!suite_seq)
2853 return NULL;
2854
Thomas Wouters89f507f2006-12-13 04:49:30 +00002855 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002856 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 }
2858 else if (NCH(exc) == 2) {
2859 expr_ty expression;
2860 asdl_seq *suite_seq;
2861
2862 expression = ast_for_expr(c, CHILD(exc, 1));
2863 if (!expression)
2864 return NULL;
2865 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002866 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 return NULL;
2868
Thomas Wouters89f507f2006-12-13 04:49:30 +00002869 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002870 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 }
2872 else if (NCH(exc) == 4) {
2873 asdl_seq *suite_seq;
2874 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002875 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002876 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002879 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 return NULL;
2881 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002882 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 return NULL;
2884
Thomas Wouters89f507f2006-12-13 04:49:30 +00002885 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002886 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002888
2889 PyErr_Format(PyExc_SystemError,
2890 "wrong number of children for 'except' clause: %d",
2891 NCH(exc));
2892 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893}
2894
2895static stmt_ty
2896ast_for_try_stmt(struct compiling *c, const node *n)
2897{
Neal Norwitzf599f422005-12-17 21:33:47 +00002898 const int nch = NCH(n);
2899 int n_except = (nch - 3)/3;
2900 asdl_seq *body, *orelse = NULL, *finally = NULL;
2901
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 REQ(n, try_stmt);
2903
Neal Norwitzf599f422005-12-17 21:33:47 +00002904 body = ast_for_suite(c, CHILD(n, 2));
2905 if (body == NULL)
2906 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907
Neal Norwitzf599f422005-12-17 21:33:47 +00002908 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2909 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2910 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2911 /* we can assume it's an "else",
2912 because nch >= 9 for try-else-finally and
2913 it would otherwise have a type of except_clause */
2914 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2915 if (orelse == NULL)
2916 return NULL;
2917 n_except--;
2918 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 finally = ast_for_suite(c, CHILD(n, nch - 1));
2921 if (finally == NULL)
2922 return NULL;
2923 n_except--;
2924 }
2925 else {
2926 /* we can assume it's an "else",
2927 otherwise it would have a type of except_clause */
2928 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2929 if (orelse == NULL)
2930 return NULL;
2931 n_except--;
2932 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002934 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002935 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 return NULL;
2937 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002938
2939 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002940 int i;
2941 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002942 /* process except statements to create a try ... except */
2943 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2944 if (handlers == NULL)
2945 return NULL;
2946
2947 for (i = 0; i < n_except; i++) {
2948 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2949 CHILD(n, 5 + i * 3));
2950 if (!e)
2951 return NULL;
2952 asdl_seq_SET(handlers, i, e);
2953 }
2954
Thomas Wouters89f507f2006-12-13 04:49:30 +00002955 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002956 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002957 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002959
2960 /* if a 'finally' is present too, we nest the TryExcept within a
2961 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 body = asdl_seq_new(1, c->c_arena);
2963 if (body == NULL)
2964 return NULL;
2965 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002966 }
2967
2968 /* must be a try ... finally (except clauses are in body, if any exist) */
2969 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002970 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971}
2972
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973static expr_ty
2974ast_for_with_var(struct compiling *c, const node *n)
2975{
2976 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002977 return ast_for_expr(c, CHILD(n, 1));
2978}
2979
2980/* with_stmt: 'with' test [ with_var ] ':' suite */
2981static stmt_ty
2982ast_for_with_stmt(struct compiling *c, const node *n)
2983{
2984 expr_ty context_expr, optional_vars = NULL;
2985 int suite_index = 3; /* skip 'with', test, and ':' */
2986 asdl_seq *suite_seq;
2987
2988 assert(TYPE(n) == with_stmt);
2989 context_expr = ast_for_expr(c, CHILD(n, 1));
2990 if (TYPE(CHILD(n, 2)) == with_var) {
2991 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2992
2993 if (!optional_vars) {
2994 return NULL;
2995 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002996 if (!set_context(optional_vars, Store, n)) {
2997 return NULL;
2998 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002999 suite_index = 4;
3000 }
3001
3002 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
3003 if (!suite_seq) {
3004 return NULL;
3005 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003006 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00003007 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003008}
3009
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010static stmt_ty
3011ast_for_classdef(struct compiling *c, const node *n)
3012{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003013 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
3014 asdl_seq *s;
3015 expr_ty call, dummy;
3016
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 REQ(n, classdef);
3018
3019 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003020 ast_error(n, "assignment to None");
3021 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 }
3023
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003024 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 s = ast_for_suite(c, CHILD(n, 3));
3026 if (!s)
3027 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003028 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
3029 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003031
3032 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003033 s = ast_for_suite(c, CHILD(n,5));
3034 if (!s)
3035 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003036 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
3037 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 }
3039
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003040 /* class NAME '(' arglist ')' ':' suite */
3041 /* build up a fake Call node so we can extract its pieces */
3042 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
3043 call = ast_for_call(c, CHILD(n, 3), dummy);
3044 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003047 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003049
3050 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
3051 call->v.Call.args, call->v.Call.keywords,
3052 call->v.Call.starargs, call->v.Call.kwargs, s,
3053 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054}
3055
3056static stmt_ty
3057ast_for_stmt(struct compiling *c, const node *n)
3058{
3059 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003060 assert(NCH(n) == 1);
3061 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 }
3063 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003064 assert(num_stmts(n) == 1);
3065 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 }
3067 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003068 REQ(n, small_stmt);
3069 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003070 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3071 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003072 */
3073 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 case expr_stmt:
3075 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 case del_stmt:
3077 return ast_for_del_stmt(c, n);
3078 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003079 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 case flow_stmt:
3081 return ast_for_flow_stmt(c, n);
3082 case import_stmt:
3083 return ast_for_import_stmt(c, n);
3084 case global_stmt:
3085 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003086 case nonlocal_stmt:
3087 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 case assert_stmt:
3089 return ast_for_assert_stmt(c, n);
3090 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003091 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3093 TYPE(n), NCH(n));
3094 return NULL;
3095 }
3096 }
3097 else {
3098 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003099 | funcdef | classdef
3100 */
3101 node *ch = CHILD(n, 0);
3102 REQ(n, compound_stmt);
3103 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 case if_stmt:
3105 return ast_for_if_stmt(c, ch);
3106 case while_stmt:
3107 return ast_for_while_stmt(c, ch);
3108 case for_stmt:
3109 return ast_for_for_stmt(c, ch);
3110 case try_stmt:
3111 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003112 case with_stmt:
3113 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 case funcdef:
3115 return ast_for_funcdef(c, ch);
3116 case classdef:
3117 return ast_for_classdef(c, ch);
3118 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003119 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003120 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3121 TYPE(n), NCH(n));
3122 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003123 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 }
3125}
3126
3127static PyObject *
3128parsenumber(const char *s)
3129{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003130 const char *end;
3131 long x;
3132 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003134 Py_complex c;
3135 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136#endif
3137
Thomas Wouters89f507f2006-12-13 04:49:30 +00003138 errno = 0;
3139 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003141 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003143 if (*end == 'l' || *end == 'L')
3144 return PyLong_FromString((char *)s, (char **)0, 0);
3145 if (s[0] == '0') {
3146 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3147 if (x < 0 && errno == 0) {
3148 return PyLong_FromString((char *)s,
3149 (char **)0,
3150 0);
3151 }
3152 }
3153 else
3154 x = PyOS_strtol((char *)s, (char **)&end, 0);
3155 if (*end == '\0') {
3156 if (errno != 0)
3157 return PyLong_FromString((char *)s, (char **)0, 0);
3158 return PyInt_FromLong(x);
3159 }
3160 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003162 if (imflag) {
3163 c.real = 0.;
3164 PyFPE_START_PROTECT("atof", return 0)
3165 c.imag = PyOS_ascii_atof(s);
3166 PyFPE_END_PROTECT(c)
3167 return PyComplex_FromCComplex(c);
3168 }
3169 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003171 {
3172 PyFPE_START_PROTECT("atof", return 0)
3173 dx = PyOS_ascii_atof(s);
3174 PyFPE_END_PROTECT(dx)
3175 return PyFloat_FromDouble(dx);
3176 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177}
3178
3179static PyObject *
3180decode_utf8(const char **sPtr, const char *end, char* encoding)
3181{
3182#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003183 Py_FatalError("decode_utf8 should not be called in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 return NULL;
3185#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003186 PyObject *u, *v;
3187 char *s, *t;
3188 t = s = (char *)*sPtr;
3189 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3190 while (s < end && (*s & 0x80)) s++;
3191 *sPtr = s;
3192 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3193 if (u == NULL)
3194 return NULL;
3195 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3196 Py_DECREF(u);
3197 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198#endif
3199}
3200
3201static PyObject *
3202decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3203{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 PyObject *v, *u;
3205 char *buf;
3206 char *p;
3207 const char *end;
3208 if (encoding == NULL) {
3209 buf = (char *)s;
3210 u = NULL;
3211 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3212 buf = (char *)s;
3213 u = NULL;
3214 } else {
3215 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3216 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3217 if (u == NULL)
3218 return NULL;
3219 p = buf = PyString_AsString(u);
3220 end = s + len;
3221 while (s < end) {
3222 if (*s == '\\') {
3223 *p++ = *s++;
3224 if (*s & 0x80) {
3225 strcpy(p, "u005c");
3226 p += 5;
3227 }
3228 }
3229 if (*s & 0x80) { /* XXX inefficient */
3230 PyObject *w;
3231 char *r;
3232 Py_ssize_t rn, i;
3233 w = decode_utf8(&s, end, "utf-16-be");
3234 if (w == NULL) {
3235 Py_DECREF(u);
3236 return NULL;
3237 }
3238 r = PyString_AsString(w);
3239 rn = PyString_Size(w);
3240 assert(rn % 2 == 0);
3241 for (i = 0; i < rn; i += 2) {
3242 sprintf(p, "\\u%02x%02x",
3243 r[i + 0] & 0xFF,
3244 r[i + 1] & 0xFF);
3245 p += 6;
3246 }
3247 Py_DECREF(w);
3248 } else {
3249 *p++ = *s++;
3250 }
3251 }
3252 len = p - buf;
3253 s = buf;
3254 }
3255 if (rawmode)
3256 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3257 else
3258 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3259 Py_XDECREF(u);
3260 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261}
3262
3263/* s is a Python string literal, including the bracketing quote characters,
3264 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3265 * parsestr parses it, and returns the decoded Python string object.
3266 */
3267static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003268parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003270 size_t len;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003271 const char *s = STR(n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003272 int quote = Py_CHARMASK(*s);
3273 int rawmode = 0;
3274 int need_encoding;
3275 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003276
Thomas Wouters89f507f2006-12-13 04:49:30 +00003277 if (isalpha(quote) || quote == '_') {
3278 if (quote == 'u' || quote == 'U') {
3279 quote = *++s;
3280 unicode = 1;
3281 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003282 if (quote == 'b' || quote == 'B') {
3283 quote = *++s;
3284 *bytesmode = 1;
3285 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003286 if (quote == 'r' || quote == 'R') {
3287 quote = *++s;
3288 rawmode = 1;
3289 }
3290 }
3291 if (quote != '\'' && quote != '\"') {
3292 PyErr_BadInternalCall();
3293 return NULL;
3294 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003295 if (unicode && *bytesmode) {
3296 ast_error(n, "string cannot be both bytes and unicode");
3297 return NULL;
3298 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003299 s++;
3300 len = strlen(s);
3301 if (len > INT_MAX) {
3302 PyErr_SetString(PyExc_OverflowError,
3303 "string to parse is too long");
3304 return NULL;
3305 }
3306 if (s[--len] != quote) {
3307 PyErr_BadInternalCall();
3308 return NULL;
3309 }
3310 if (len >= 4 && s[0] == quote && s[1] == quote) {
3311 s += 2;
3312 len -= 2;
3313 if (s[--len] != quote || s[--len] != quote) {
3314 PyErr_BadInternalCall();
3315 return NULL;
3316 }
3317 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003319 if (unicode || Py_UnicodeFlag) {
3320 return decode_unicode(s, len, rawmode, encoding);
3321 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322#endif
Thomas Wouters00e41de2007-02-23 19:56:57 +00003323 if (*bytesmode) {
3324 /* Disallow non-ascii characters (but not escapes) */
3325 const char *c;
3326 for (c = s; *c; c++) {
3327 if (Py_CHARMASK(*c) >= 0x80) {
3328 ast_error(n, "bytes can only contain ASCII "
3329 "literal characters.");
3330 return NULL;
3331 }
3332 }
3333 }
3334 need_encoding = (!*bytesmode && encoding != NULL &&
Thomas Wouters89f507f2006-12-13 04:49:30 +00003335 strcmp(encoding, "utf-8") != 0 &&
3336 strcmp(encoding, "iso-8859-1") != 0);
3337 if (rawmode || strchr(s, '\\') == NULL) {
3338 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003340 /* This should not happen - we never see any other
3341 encoding. */
3342 Py_FatalError(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003343 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003345 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3346 if (u == NULL)
3347 return NULL;
3348 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3349 Py_DECREF(u);
3350 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003352 } else {
3353 return PyString_FromStringAndSize(s, len);
3354 }
3355 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356
Thomas Wouters89f507f2006-12-13 04:49:30 +00003357 return PyString_DecodeEscape(s, len, NULL, unicode,
3358 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359}
3360
3361/* Build a Python string object out of a STRING atom. This takes care of
3362 * compile-time literal catenation, calling parsestr() on each piece, and
3363 * pasting the intermediate results together.
3364 */
3365static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003366parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003368 PyObject *v;
3369 int i;
3370 REQ(CHILD(n, 0), STRING);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003371 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3372 if (v != NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003373 /* String literal concatenation */
3374 for (i = 1; i < NCH(n); i++) {
3375 PyObject *s;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003376 int subbm = 0;
3377 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003378 if (s == NULL)
3379 goto onError;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003380 if (*bytesmode != subbm) {
3381 ast_error(n, "cannot mix bytes and nonbytes"
3382 "literals");
3383 goto onError;
3384 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003385 if (PyString_Check(v) && PyString_Check(s)) {
3386 PyString_ConcatAndDel(&v, s);
3387 if (v == NULL)
3388 goto onError;
3389 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003391 else {
3392 PyObject *temp = PyUnicode_Concat(v, s);
3393 Py_DECREF(s);
3394 Py_DECREF(v);
3395 v = temp;
3396 if (v == NULL)
3397 goto onError;
3398 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003400 }
3401 }
3402 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403
3404 onError:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003405 Py_XDECREF(v);
3406 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407}