blob: c8357b1b856aa2a9a138401e9ed4e489d8525f8a [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
2095/* like ast_for_testlist() but returns a sequence */
2096static asdl_seq*
2097ast_for_class_bases(struct compiling *c, const node* n)
2098{
2099 /* testlist: test (',' test)* [','] */
2100 assert(NCH(n) > 0);
2101 REQ(n, testlist);
2102 if (NCH(n) == 1) {
2103 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002104 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002105 if (!bases)
2106 return NULL;
2107 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002108 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002109 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002110 asdl_seq_SET(bases, 0, base);
2111 return bases;
2112 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002113
2114 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115}
2116
2117static stmt_ty
2118ast_for_expr_stmt(struct compiling *c, const node *n)
2119{
2120 REQ(n, expr_stmt);
2121 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2122 | ('=' (yield_expr|testlist))*)
2123 testlist: test (',' test)* [',']
2124 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002125 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 test: ... here starts the operator precendence dance
2127 */
2128
2129 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002130 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 if (!e)
2132 return NULL;
2133
Thomas Wouters89f507f2006-12-13 04:49:30 +00002134 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 }
2136 else if (TYPE(CHILD(n, 1)) == augassign) {
2137 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002138 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002139 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140
Thomas Wouters89f507f2006-12-13 04:49:30 +00002141 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 if (!expr1)
2143 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002144 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002145 switch (expr1->kind) {
2146 case GeneratorExp_kind:
2147 ast_error(ch, "augmented assignment to generator "
2148 "expression not possible");
2149 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002150 case Yield_kind:
2151 ast_error(ch, "augmented assignment to yield "
2152 "expression not possible");
2153 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002154 case Name_kind: {
2155 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
2156 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
2157 ast_error(ch, "assignment to None");
2158 return NULL;
2159 }
2160 break;
2161 }
2162 case Attribute_kind:
2163 case Subscript_kind:
2164 break;
2165 default:
2166 ast_error(ch, "illegal expression for augmented "
2167 "assignment");
2168 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002170 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171
Thomas Wouters89f507f2006-12-13 04:49:30 +00002172 ch = CHILD(n, 2);
2173 if (TYPE(ch) == testlist)
2174 expr2 = ast_for_testlist(c, ch);
2175 else
2176 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002177 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178 return NULL;
2179
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002180 newoperator = ast_for_augassign(CHILD(n, 1));
2181 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182 return NULL;
2183
Thomas Wouters89f507f2006-12-13 04:49:30 +00002184 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 }
2186 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002187 int i;
2188 asdl_seq *targets;
2189 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 expr_ty expression;
2191
Thomas Wouters89f507f2006-12-13 04:49:30 +00002192 /* a normal assignment */
2193 REQ(CHILD(n, 1), EQUAL);
2194 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2195 if (!targets)
2196 return NULL;
2197 for (i = 0; i < NCH(n) - 2; i += 2) {
2198 expr_ty e;
2199 node *ch = CHILD(n, i);
2200 if (TYPE(ch) == yield_expr) {
2201 ast_error(ch, "assignment to yield expression not possible");
2202 return NULL;
2203 }
2204 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205
Thomas Wouters89f507f2006-12-13 04:49:30 +00002206 /* set context to assign */
2207 if (!e)
2208 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209
Thomas Wouters89f507f2006-12-13 04:49:30 +00002210 if (!set_context(e, Store, CHILD(n, i)))
2211 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212
Thomas Wouters89f507f2006-12-13 04:49:30 +00002213 asdl_seq_SET(targets, i / 2, e);
2214 }
2215 value = CHILD(n, NCH(n) - 1);
2216 if (TYPE(value) == testlist)
2217 expression = ast_for_testlist(c, value);
2218 else
2219 expression = ast_for_expr(c, value);
2220 if (!expression)
2221 return NULL;
2222 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224}
2225
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002227ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228{
2229 asdl_seq *seq;
2230 int i;
2231 expr_ty e;
2232
2233 REQ(n, exprlist);
2234
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002235 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002237 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002239 e = ast_for_expr(c, CHILD(n, i));
2240 if (!e)
2241 return NULL;
2242 asdl_seq_SET(seq, i / 2, e);
2243 if (context && !set_context(e, context, CHILD(n, i)))
2244 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 }
2246 return seq;
2247}
2248
2249static stmt_ty
2250ast_for_del_stmt(struct compiling *c, const node *n)
2251{
2252 asdl_seq *expr_list;
2253
2254 /* del_stmt: 'del' exprlist */
2255 REQ(n, del_stmt);
2256
2257 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2258 if (!expr_list)
2259 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002260 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261}
2262
2263static stmt_ty
2264ast_for_flow_stmt(struct compiling *c, const node *n)
2265{
2266 /*
2267 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2268 | yield_stmt
2269 break_stmt: 'break'
2270 continue_stmt: 'continue'
2271 return_stmt: 'return' [testlist]
2272 yield_stmt: yield_expr
2273 yield_expr: 'yield' testlist
2274 raise_stmt: 'raise' [test [',' test [',' test]]]
2275 */
2276 node *ch;
2277
2278 REQ(n, flow_stmt);
2279 ch = CHILD(n, 0);
2280 switch (TYPE(ch)) {
2281 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002282 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002284 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002286 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2287 if (!exp)
2288 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002289 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 }
2291 case return_stmt:
2292 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002293 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002295 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 if (!expression)
2297 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002298 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 }
2300 case raise_stmt:
2301 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002302 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 else if (NCH(ch) == 2) {
2304 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2305 if (!expression)
2306 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002307 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 }
2309 else if (NCH(ch) == 4) {
2310 expr_ty expr1, expr2;
2311
2312 expr1 = ast_for_expr(c, CHILD(ch, 1));
2313 if (!expr1)
2314 return NULL;
2315 expr2 = ast_for_expr(c, CHILD(ch, 3));
2316 if (!expr2)
2317 return NULL;
2318
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002319 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 }
2321 else if (NCH(ch) == 6) {
2322 expr_ty expr1, expr2, expr3;
2323
2324 expr1 = ast_for_expr(c, CHILD(ch, 1));
2325 if (!expr1)
2326 return NULL;
2327 expr2 = ast_for_expr(c, CHILD(ch, 3));
2328 if (!expr2)
2329 return NULL;
2330 expr3 = ast_for_expr(c, CHILD(ch, 5));
2331 if (!expr3)
2332 return NULL;
2333
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002334 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 }
2336 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002337 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 "unexpected flow_stmt: %d", TYPE(ch));
2339 return NULL;
2340 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002341
2342 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2343 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344}
2345
2346static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002347alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348{
2349 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002350 import_as_name: NAME ['as' NAME]
2351 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 dotted_name: NAME ('.' NAME)*
2353 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002354 PyObject *str;
2355
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 loop:
2357 switch (TYPE(n)) {
2358 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002359 str = NULL;
2360 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002361 str = NEW_IDENTIFIER(CHILD(n, 2));
2362 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002363 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 case dotted_as_name:
2365 if (NCH(n) == 1) {
2366 n = CHILD(n, 0);
2367 goto loop;
2368 }
2369 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002370 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002371 if (!a)
2372 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 assert(!a->asname);
2374 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2375 return a;
2376 }
2377 break;
2378 case dotted_name:
2379 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002380 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381 else {
2382 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002383 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002384 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 char *s;
2386
2387 len = 0;
2388 for (i = 0; i < NCH(n); i += 2)
2389 /* length of string plus one for the dot */
2390 len += strlen(STR(CHILD(n, i))) + 1;
2391 len--; /* the last name doesn't have a dot */
2392 str = PyString_FromStringAndSize(NULL, len);
2393 if (!str)
2394 return NULL;
2395 s = PyString_AS_STRING(str);
2396 if (!s)
2397 return NULL;
2398 for (i = 0; i < NCH(n); i += 2) {
2399 char *sch = STR(CHILD(n, i));
2400 strcpy(s, STR(CHILD(n, i)));
2401 s += strlen(sch);
2402 *s++ = '.';
2403 }
2404 --s;
2405 *s = '\0';
2406 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002407 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002408 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 }
2410 break;
2411 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 str = PyString_InternFromString("*");
2413 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002414 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002416 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 "unexpected import name: %d", TYPE(n));
2418 return NULL;
2419 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002420
2421 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 return NULL;
2423}
2424
2425static stmt_ty
2426ast_for_import_stmt(struct compiling *c, const node *n)
2427{
2428 /*
2429 import_stmt: import_name | import_from
2430 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002431 import_from: 'from' ('.'* dotted_name | '.') 'import'
2432 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002434 int lineno;
2435 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 int i;
2437 asdl_seq *aliases;
2438
2439 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002440 lineno = LINENO(n);
2441 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002443 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002445 REQ(n, dotted_as_names);
2446 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2447 if (!aliases)
2448 return NULL;
2449 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002450 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002451 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002453 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002455 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002457 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002459 int idx, ndots = 0;
2460 alias_ty mod = NULL;
2461 identifier modname;
2462
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002463 /* Count the number of dots (for relative imports) and check for the
2464 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 for (idx = 1; idx < NCH(n); idx++) {
2466 if (TYPE(CHILD(n, idx)) == dotted_name) {
2467 mod = alias_for_import_name(c, CHILD(n, idx));
2468 idx++;
2469 break;
2470 } else if (TYPE(CHILD(n, idx)) != DOT) {
2471 break;
2472 }
2473 ndots++;
2474 }
2475 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002476 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002477 case STAR:
2478 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 n = CHILD(n, idx);
2480 n_children = 1;
2481 if (ndots) {
2482 ast_error(n, "'import *' not allowed with 'from .'");
2483 return NULL;
2484 }
2485 break;
2486 case LPAR:
2487 /* from ... import (x, y, z) */
2488 n = CHILD(n, idx + 1);
2489 n_children = NCH(n);
2490 break;
2491 case import_as_names:
2492 /* from ... import x, y, z */
2493 n = CHILD(n, idx);
2494 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002495 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 ast_error(n, "trailing comma not allowed without"
2497 " surrounding parentheses");
2498 return NULL;
2499 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002500 break;
2501 default:
2502 ast_error(n, "Unexpected node-type in from-import");
2503 return NULL;
2504 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2507 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509
2510 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002511 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002512 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002513 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002515 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002517 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002519 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2520 if (!import_alias)
2521 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002522 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002523 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002525 if (mod != NULL)
2526 modname = mod->name;
2527 else
2528 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002529 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002530 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 }
Neal Norwitz79792652005-11-14 04:25:03 +00002532 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 "unknown import statement: starts with command '%s'",
2534 STR(CHILD(n, 0)));
2535 return NULL;
2536}
2537
2538static stmt_ty
2539ast_for_global_stmt(struct compiling *c, const node *n)
2540{
2541 /* global_stmt: 'global' NAME (',' NAME)* */
2542 identifier name;
2543 asdl_seq *s;
2544 int i;
2545
2546 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002547 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002549 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002551 name = NEW_IDENTIFIER(CHILD(n, i));
2552 if (!name)
2553 return NULL;
2554 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002556 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557}
2558
2559static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002560ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2561{
2562 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2563 identifier name;
2564 asdl_seq *s;
2565 int i;
2566
2567 REQ(n, nonlocal_stmt);
2568 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2569 if (!s)
2570 return NULL;
2571 for (i = 1; i < NCH(n); i += 2) {
2572 name = NEW_IDENTIFIER(CHILD(n, i));
2573 if (!name)
2574 return NULL;
2575 asdl_seq_SET(s, i / 2, name);
2576 }
2577 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2578}
2579
2580static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581ast_for_assert_stmt(struct compiling *c, const node *n)
2582{
2583 /* assert_stmt: 'assert' test [',' test] */
2584 REQ(n, assert_stmt);
2585 if (NCH(n) == 2) {
2586 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2587 if (!expression)
2588 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 }
2591 else if (NCH(n) == 4) {
2592 expr_ty expr1, expr2;
2593
2594 expr1 = ast_for_expr(c, CHILD(n, 1));
2595 if (!expr1)
2596 return NULL;
2597 expr2 = ast_for_expr(c, CHILD(n, 3));
2598 if (!expr2)
2599 return NULL;
2600
Thomas Wouters89f507f2006-12-13 04:49:30 +00002601 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 }
Neal Norwitz79792652005-11-14 04:25:03 +00002603 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 "improper number of parts to 'assert' statement: %d",
2605 NCH(n));
2606 return NULL;
2607}
2608
2609static asdl_seq *
2610ast_for_suite(struct compiling *c, const node *n)
2611{
2612 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002613 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 stmt_ty s;
2615 int i, total, num, end, pos = 0;
2616 node *ch;
2617
2618 REQ(n, suite);
2619
2620 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002621 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002625 n = CHILD(n, 0);
2626 /* simple_stmt always ends with a NEWLINE,
2627 and may have a trailing SEMI
2628 */
2629 end = NCH(n) - 1;
2630 if (TYPE(CHILD(n, end - 1)) == SEMI)
2631 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 for (i = 0; i < end; i += 2) {
2634 ch = CHILD(n, i);
2635 s = ast_for_stmt(c, ch);
2636 if (!s)
2637 return NULL;
2638 asdl_seq_SET(seq, pos++, s);
2639 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 }
2641 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002642 for (i = 2; i < (NCH(n) - 1); i++) {
2643 ch = CHILD(n, i);
2644 REQ(ch, stmt);
2645 num = num_stmts(ch);
2646 if (num == 1) {
2647 /* small_stmt or compound_stmt with only one child */
2648 s = ast_for_stmt(c, ch);
2649 if (!s)
2650 return NULL;
2651 asdl_seq_SET(seq, pos++, s);
2652 }
2653 else {
2654 int j;
2655 ch = CHILD(ch, 0);
2656 REQ(ch, simple_stmt);
2657 for (j = 0; j < NCH(ch); j += 2) {
2658 /* statement terminates with a semi-colon ';' */
2659 if (NCH(CHILD(ch, j)) == 0) {
2660 assert((j + 1) == NCH(ch));
2661 break;
2662 }
2663 s = ast_for_stmt(c, CHILD(ch, j));
2664 if (!s)
2665 return NULL;
2666 asdl_seq_SET(seq, pos++, s);
2667 }
2668 }
2669 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 }
2671 assert(pos == seq->size);
2672 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673}
2674
2675static stmt_ty
2676ast_for_if_stmt(struct compiling *c, const node *n)
2677{
2678 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2679 ['else' ':' suite]
2680 */
2681 char *s;
2682
2683 REQ(n, if_stmt);
2684
2685 if (NCH(n) == 4) {
2686 expr_ty expression;
2687 asdl_seq *suite_seq;
2688
2689 expression = ast_for_expr(c, CHILD(n, 1));
2690 if (!expression)
2691 return NULL;
2692 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return NULL;
2695
Thomas Wouters89f507f2006-12-13 04:49:30 +00002696 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002698
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 s = STR(CHILD(n, 4));
2700 /* s[2], the third character in the string, will be
2701 's' for el_s_e, or
2702 'i' for el_i_f
2703 */
2704 if (s[2] == 's') {
2705 expr_ty expression;
2706 asdl_seq *seq1, *seq2;
2707
2708 expression = ast_for_expr(c, CHILD(n, 1));
2709 if (!expression)
2710 return NULL;
2711 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002712 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 return NULL;
2714 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002715 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 return NULL;
2717
Thomas Wouters89f507f2006-12-13 04:49:30 +00002718 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 }
2720 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002721 int i, n_elif, has_else = 0;
2722 asdl_seq *orelse = NULL;
2723 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 /* must reference the child n_elif+1 since 'else' token is third,
2725 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2727 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2728 has_else = 1;
2729 n_elif -= 3;
2730 }
2731 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732
Thomas Wouters89f507f2006-12-13 04:49:30 +00002733 if (has_else) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 expr_ty expression;
2735 asdl_seq *seq1, *seq2;
2736
Thomas Wouters89f507f2006-12-13 04:49:30 +00002737 orelse = asdl_seq_new(1, c->c_arena);
2738 if (!orelse)
2739 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002741 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002744 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749
Thomas Wouters89f507f2006-12-13 04:49:30 +00002750 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
2751 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002752 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002753 /* the just-created orelse handled the last elif */
2754 n_elif--;
2755 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756
Thomas Wouters89f507f2006-12-13 04:49:30 +00002757 for (i = 0; i < n_elif; i++) {
2758 int off = 5 + (n_elif - i - 1) * 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 expr_ty expression;
2760 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002761 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2762 if (!newobj)
2763 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002765 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002768 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770
Thomas Wouters89f507f2006-12-13 04:49:30 +00002771 asdl_seq_SET(newobj, 0,
2772 If(expression, suite_seq, orelse,
2773 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
2774 orelse = newobj;
2775 }
2776 return If(ast_for_expr(c, CHILD(n, 1)),
2777 ast_for_suite(c, CHILD(n, 3)),
2778 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002780
2781 PyErr_Format(PyExc_SystemError,
2782 "unexpected token in 'if' statement: %s", s);
2783 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784}
2785
2786static stmt_ty
2787ast_for_while_stmt(struct compiling *c, const node *n)
2788{
2789 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2790 REQ(n, while_stmt);
2791
2792 if (NCH(n) == 4) {
2793 expr_ty expression;
2794 asdl_seq *suite_seq;
2795
2796 expression = ast_for_expr(c, CHILD(n, 1));
2797 if (!expression)
2798 return NULL;
2799 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002800 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002802 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803 }
2804 else if (NCH(n) == 7) {
2805 expr_ty expression;
2806 asdl_seq *seq1, *seq2;
2807
2808 expression = ast_for_expr(c, CHILD(n, 1));
2809 if (!expression)
2810 return NULL;
2811 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002812 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 return NULL;
2814 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002815 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 return NULL;
2817
Thomas Wouters89f507f2006-12-13 04:49:30 +00002818 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002820
2821 PyErr_Format(PyExc_SystemError,
2822 "wrong number of tokens for 'while' statement: %d",
2823 NCH(n));
2824 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825}
2826
2827static stmt_ty
2828ast_for_for_stmt(struct compiling *c, const node *n)
2829{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002830 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 expr_ty expression;
2832 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002833 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2835 REQ(n, for_stmt);
2836
2837 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002838 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839 if (!seq)
2840 return NULL;
2841 }
2842
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002843 node_target = CHILD(n, 1);
2844 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002845 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002847 /* Check the # of children rather than the length of _target, since
2848 for x, in ... has 1 element in _target, but still requires a Tuple. */
2849 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002850 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002852 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002854 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002855 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 return NULL;
2857 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002858 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 return NULL;
2860
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002861 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2862 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863}
2864
2865static excepthandler_ty
2866ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2867{
2868 /* except_clause: 'except' [test [',' test]] */
2869 REQ(exc, except_clause);
2870 REQ(body, suite);
2871
2872 if (NCH(exc) == 1) {
2873 asdl_seq *suite_seq = ast_for_suite(c, body);
2874 if (!suite_seq)
2875 return NULL;
2876
Thomas Wouters89f507f2006-12-13 04:49:30 +00002877 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002878 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 }
2880 else if (NCH(exc) == 2) {
2881 expr_ty expression;
2882 asdl_seq *suite_seq;
2883
2884 expression = ast_for_expr(c, CHILD(exc, 1));
2885 if (!expression)
2886 return NULL;
2887 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002888 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 return NULL;
2890
Thomas Wouters89f507f2006-12-13 04:49:30 +00002891 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002892 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 }
2894 else if (NCH(exc) == 4) {
2895 asdl_seq *suite_seq;
2896 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002897 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002898 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002901 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 return NULL;
2903 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002904 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 return NULL;
2906
Thomas Wouters89f507f2006-12-13 04:49:30 +00002907 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002908 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002910
2911 PyErr_Format(PyExc_SystemError,
2912 "wrong number of children for 'except' clause: %d",
2913 NCH(exc));
2914 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915}
2916
2917static stmt_ty
2918ast_for_try_stmt(struct compiling *c, const node *n)
2919{
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 const int nch = NCH(n);
2921 int n_except = (nch - 3)/3;
2922 asdl_seq *body, *orelse = NULL, *finally = NULL;
2923
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 REQ(n, try_stmt);
2925
Neal Norwitzf599f422005-12-17 21:33:47 +00002926 body = ast_for_suite(c, CHILD(n, 2));
2927 if (body == NULL)
2928 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929
Neal Norwitzf599f422005-12-17 21:33:47 +00002930 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2931 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2932 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2933 /* we can assume it's an "else",
2934 because nch >= 9 for try-else-finally and
2935 it would otherwise have a type of except_clause */
2936 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2937 if (orelse == NULL)
2938 return NULL;
2939 n_except--;
2940 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941
Neal Norwitzf599f422005-12-17 21:33:47 +00002942 finally = ast_for_suite(c, CHILD(n, nch - 1));
2943 if (finally == NULL)
2944 return NULL;
2945 n_except--;
2946 }
2947 else {
2948 /* we can assume it's an "else",
2949 otherwise it would have a type of except_clause */
2950 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2951 if (orelse == NULL)
2952 return NULL;
2953 n_except--;
2954 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002956 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002957 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 return NULL;
2959 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002960
2961 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 int i;
2963 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002964 /* process except statements to create a try ... except */
2965 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2966 if (handlers == NULL)
2967 return NULL;
2968
2969 for (i = 0; i < n_except; i++) {
2970 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2971 CHILD(n, 5 + i * 3));
2972 if (!e)
2973 return NULL;
2974 asdl_seq_SET(handlers, i, e);
2975 }
2976
Thomas Wouters89f507f2006-12-13 04:49:30 +00002977 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002978 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002979 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002980 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002981
2982 /* if a 'finally' is present too, we nest the TryExcept within a
2983 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 body = asdl_seq_new(1, c->c_arena);
2985 if (body == NULL)
2986 return NULL;
2987 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002988 }
2989
2990 /* must be a try ... finally (except clauses are in body, if any exist) */
2991 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002992 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993}
2994
Guido van Rossumc2e20742006-02-27 22:32:47 +00002995static expr_ty
2996ast_for_with_var(struct compiling *c, const node *n)
2997{
2998 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002999 return ast_for_expr(c, CHILD(n, 1));
3000}
3001
3002/* with_stmt: 'with' test [ with_var ] ':' suite */
3003static stmt_ty
3004ast_for_with_stmt(struct compiling *c, const node *n)
3005{
3006 expr_ty context_expr, optional_vars = NULL;
3007 int suite_index = 3; /* skip 'with', test, and ':' */
3008 asdl_seq *suite_seq;
3009
3010 assert(TYPE(n) == with_stmt);
3011 context_expr = ast_for_expr(c, CHILD(n, 1));
3012 if (TYPE(CHILD(n, 2)) == with_var) {
3013 optional_vars = ast_for_with_var(c, CHILD(n, 2));
3014
3015 if (!optional_vars) {
3016 return NULL;
3017 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003018 if (!set_context(optional_vars, Store, n)) {
3019 return NULL;
3020 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003021 suite_index = 4;
3022 }
3023
3024 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
3025 if (!suite_seq) {
3026 return NULL;
3027 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003028 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00003029 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003030}
3031
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032static stmt_ty
3033ast_for_classdef(struct compiling *c, const node *n)
3034{
3035 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036 asdl_seq *bases, *s;
3037
3038 REQ(n, classdef);
3039
3040 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003041 ast_error(n, "assignment to None");
3042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 }
3044
3045 if (NCH(n) == 4) {
3046 s = ast_for_suite(c, CHILD(n, 3));
3047 if (!s)
3048 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003049 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003050 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 }
3052 /* check for empty base list */
3053 if (TYPE(CHILD(n,3)) == RPAR) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003054 s = ast_for_suite(c, CHILD(n,5));
3055 if (!s)
3056 return NULL;
3057 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003058 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059 }
3060
3061 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003062 bases = ast_for_class_bases(c, CHILD(n, 3));
3063 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065
3066 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003067 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003069 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
3070 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071}
3072
3073static stmt_ty
3074ast_for_stmt(struct compiling *c, const node *n)
3075{
3076 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003077 assert(NCH(n) == 1);
3078 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 }
3080 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 assert(num_stmts(n) == 1);
3082 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 }
3084 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003085 REQ(n, small_stmt);
3086 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003087 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3088 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 */
3090 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003091 case expr_stmt:
3092 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093 case del_stmt:
3094 return ast_for_del_stmt(c, n);
3095 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003096 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 case flow_stmt:
3098 return ast_for_flow_stmt(c, n);
3099 case import_stmt:
3100 return ast_for_import_stmt(c, n);
3101 case global_stmt:
3102 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003103 case nonlocal_stmt:
3104 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 case assert_stmt:
3106 return ast_for_assert_stmt(c, n);
3107 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003108 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3110 TYPE(n), NCH(n));
3111 return NULL;
3112 }
3113 }
3114 else {
3115 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003116 | funcdef | classdef
3117 */
3118 node *ch = CHILD(n, 0);
3119 REQ(n, compound_stmt);
3120 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121 case if_stmt:
3122 return ast_for_if_stmt(c, ch);
3123 case while_stmt:
3124 return ast_for_while_stmt(c, ch);
3125 case for_stmt:
3126 return ast_for_for_stmt(c, ch);
3127 case try_stmt:
3128 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003129 case with_stmt:
3130 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003131 case funcdef:
3132 return ast_for_funcdef(c, ch);
3133 case classdef:
3134 return ast_for_classdef(c, ch);
3135 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003136 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3138 TYPE(n), NCH(n));
3139 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003140 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 }
3142}
3143
3144static PyObject *
3145parsenumber(const char *s)
3146{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003147 const char *end;
3148 long x;
3149 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003151 Py_complex c;
3152 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153#endif
3154
Thomas Wouters89f507f2006-12-13 04:49:30 +00003155 errno = 0;
3156 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003158 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003160 if (*end == 'l' || *end == 'L')
3161 return PyLong_FromString((char *)s, (char **)0, 0);
3162 if (s[0] == '0') {
3163 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3164 if (x < 0 && errno == 0) {
3165 return PyLong_FromString((char *)s,
3166 (char **)0,
3167 0);
3168 }
3169 }
3170 else
3171 x = PyOS_strtol((char *)s, (char **)&end, 0);
3172 if (*end == '\0') {
3173 if (errno != 0)
3174 return PyLong_FromString((char *)s, (char **)0, 0);
3175 return PyInt_FromLong(x);
3176 }
3177 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 if (imflag) {
3180 c.real = 0.;
3181 PyFPE_START_PROTECT("atof", return 0)
3182 c.imag = PyOS_ascii_atof(s);
3183 PyFPE_END_PROTECT(c)
3184 return PyComplex_FromCComplex(c);
3185 }
3186 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003188 {
3189 PyFPE_START_PROTECT("atof", return 0)
3190 dx = PyOS_ascii_atof(s);
3191 PyFPE_END_PROTECT(dx)
3192 return PyFloat_FromDouble(dx);
3193 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194}
3195
3196static PyObject *
3197decode_utf8(const char **sPtr, const char *end, char* encoding)
3198{
3199#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003200 Py_FatalError("decode_utf8 should not be called in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 return NULL;
3202#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003203 PyObject *u, *v;
3204 char *s, *t;
3205 t = s = (char *)*sPtr;
3206 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3207 while (s < end && (*s & 0x80)) s++;
3208 *sPtr = s;
3209 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3210 if (u == NULL)
3211 return NULL;
3212 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3213 Py_DECREF(u);
3214 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215#endif
3216}
3217
3218static PyObject *
3219decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3220{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003221 PyObject *v, *u;
3222 char *buf;
3223 char *p;
3224 const char *end;
3225 if (encoding == NULL) {
3226 buf = (char *)s;
3227 u = NULL;
3228 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3229 buf = (char *)s;
3230 u = NULL;
3231 } else {
3232 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3233 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3234 if (u == NULL)
3235 return NULL;
3236 p = buf = PyString_AsString(u);
3237 end = s + len;
3238 while (s < end) {
3239 if (*s == '\\') {
3240 *p++ = *s++;
3241 if (*s & 0x80) {
3242 strcpy(p, "u005c");
3243 p += 5;
3244 }
3245 }
3246 if (*s & 0x80) { /* XXX inefficient */
3247 PyObject *w;
3248 char *r;
3249 Py_ssize_t rn, i;
3250 w = decode_utf8(&s, end, "utf-16-be");
3251 if (w == NULL) {
3252 Py_DECREF(u);
3253 return NULL;
3254 }
3255 r = PyString_AsString(w);
3256 rn = PyString_Size(w);
3257 assert(rn % 2 == 0);
3258 for (i = 0; i < rn; i += 2) {
3259 sprintf(p, "\\u%02x%02x",
3260 r[i + 0] & 0xFF,
3261 r[i + 1] & 0xFF);
3262 p += 6;
3263 }
3264 Py_DECREF(w);
3265 } else {
3266 *p++ = *s++;
3267 }
3268 }
3269 len = p - buf;
3270 s = buf;
3271 }
3272 if (rawmode)
3273 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3274 else
3275 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3276 Py_XDECREF(u);
3277 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278}
3279
3280/* s is a Python string literal, including the bracketing quote characters,
3281 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3282 * parsestr parses it, and returns the decoded Python string object.
3283 */
3284static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003285parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003287 size_t len;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003288 const char *s = STR(n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003289 int quote = Py_CHARMASK(*s);
3290 int rawmode = 0;
3291 int need_encoding;
3292 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293
Thomas Wouters89f507f2006-12-13 04:49:30 +00003294 if (isalpha(quote) || quote == '_') {
3295 if (quote == 'u' || quote == 'U') {
3296 quote = *++s;
3297 unicode = 1;
3298 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003299 if (quote == 'b' || quote == 'B') {
3300 quote = *++s;
3301 *bytesmode = 1;
3302 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 if (quote == 'r' || quote == 'R') {
3304 quote = *++s;
3305 rawmode = 1;
3306 }
3307 }
3308 if (quote != '\'' && quote != '\"') {
3309 PyErr_BadInternalCall();
3310 return NULL;
3311 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003312 if (unicode && *bytesmode) {
3313 ast_error(n, "string cannot be both bytes and unicode");
3314 return NULL;
3315 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003316 s++;
3317 len = strlen(s);
3318 if (len > INT_MAX) {
3319 PyErr_SetString(PyExc_OverflowError,
3320 "string to parse is too long");
3321 return NULL;
3322 }
3323 if (s[--len] != quote) {
3324 PyErr_BadInternalCall();
3325 return NULL;
3326 }
3327 if (len >= 4 && s[0] == quote && s[1] == quote) {
3328 s += 2;
3329 len -= 2;
3330 if (s[--len] != quote || s[--len] != quote) {
3331 PyErr_BadInternalCall();
3332 return NULL;
3333 }
3334 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003336 if (unicode || Py_UnicodeFlag) {
3337 return decode_unicode(s, len, rawmode, encoding);
3338 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339#endif
Thomas Wouters00e41de2007-02-23 19:56:57 +00003340 if (*bytesmode) {
3341 /* Disallow non-ascii characters (but not escapes) */
3342 const char *c;
3343 for (c = s; *c; c++) {
3344 if (Py_CHARMASK(*c) >= 0x80) {
3345 ast_error(n, "bytes can only contain ASCII "
3346 "literal characters.");
3347 return NULL;
3348 }
3349 }
3350 }
3351 need_encoding = (!*bytesmode && encoding != NULL &&
Thomas Wouters89f507f2006-12-13 04:49:30 +00003352 strcmp(encoding, "utf-8") != 0 &&
3353 strcmp(encoding, "iso-8859-1") != 0);
3354 if (rawmode || strchr(s, '\\') == NULL) {
3355 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003357 /* This should not happen - we never see any other
3358 encoding. */
3359 Py_FatalError(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003360 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003362 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3363 if (u == NULL)
3364 return NULL;
3365 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3366 Py_DECREF(u);
3367 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003369 } else {
3370 return PyString_FromStringAndSize(s, len);
3371 }
3372 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373
Thomas Wouters89f507f2006-12-13 04:49:30 +00003374 return PyString_DecodeEscape(s, len, NULL, unicode,
3375 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376}
3377
3378/* Build a Python string object out of a STRING atom. This takes care of
3379 * compile-time literal catenation, calling parsestr() on each piece, and
3380 * pasting the intermediate results together.
3381 */
3382static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003383parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003385 PyObject *v;
3386 int i;
3387 REQ(CHILD(n, 0), STRING);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003388 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3389 if (v != NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003390 /* String literal concatenation */
3391 for (i = 1; i < NCH(n); i++) {
3392 PyObject *s;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003393 int subbm = 0;
3394 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003395 if (s == NULL)
3396 goto onError;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003397 if (*bytesmode != subbm) {
3398 ast_error(n, "cannot mix bytes and nonbytes"
3399 "literals");
3400 goto onError;
3401 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003402 if (PyString_Check(v) && PyString_Check(s)) {
3403 PyString_ConcatAndDel(&v, s);
3404 if (v == NULL)
3405 goto onError;
3406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003408 else {
3409 PyObject *temp = PyUnicode_Concat(v, s);
3410 Py_DECREF(s);
3411 Py_DECREF(v);
3412 v = temp;
3413 if (v == NULL)
3414 goto onError;
3415 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003416#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003417 }
3418 }
3419 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003420
3421 onError:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003422 Py_XDECREF(v);
3423 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424}