blob: 9d5caf87e4dc10b5172e79b4785c7339df814d65 [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;
Thomas Wouters65b3dab2006-03-01 22:06:23 +00001663 bool simple = true;
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)
1673 simple = false;
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 Hylton3e0055f2005-10-20 19:59:25 +00002560ast_for_assert_stmt(struct compiling *c, const node *n)
2561{
2562 /* assert_stmt: 'assert' test [',' test] */
2563 REQ(n, assert_stmt);
2564 if (NCH(n) == 2) {
2565 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2566 if (!expression)
2567 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 }
2570 else if (NCH(n) == 4) {
2571 expr_ty expr1, expr2;
2572
2573 expr1 = ast_for_expr(c, CHILD(n, 1));
2574 if (!expr1)
2575 return NULL;
2576 expr2 = ast_for_expr(c, CHILD(n, 3));
2577 if (!expr2)
2578 return NULL;
2579
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 }
Neal Norwitz79792652005-11-14 04:25:03 +00002582 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 "improper number of parts to 'assert' statement: %d",
2584 NCH(n));
2585 return NULL;
2586}
2587
2588static asdl_seq *
2589ast_for_suite(struct compiling *c, const node *n)
2590{
2591 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002592 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 stmt_ty s;
2594 int i, total, num, end, pos = 0;
2595 node *ch;
2596
2597 REQ(n, suite);
2598
2599 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002600 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002602 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002604 n = CHILD(n, 0);
2605 /* simple_stmt always ends with a NEWLINE,
2606 and may have a trailing SEMI
2607 */
2608 end = NCH(n) - 1;
2609 if (TYPE(CHILD(n, end - 1)) == SEMI)
2610 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 for (i = 0; i < end; i += 2) {
2613 ch = CHILD(n, i);
2614 s = ast_for_stmt(c, ch);
2615 if (!s)
2616 return NULL;
2617 asdl_seq_SET(seq, pos++, s);
2618 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 }
2620 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 for (i = 2; i < (NCH(n) - 1); i++) {
2622 ch = CHILD(n, i);
2623 REQ(ch, stmt);
2624 num = num_stmts(ch);
2625 if (num == 1) {
2626 /* small_stmt or compound_stmt with only one child */
2627 s = ast_for_stmt(c, ch);
2628 if (!s)
2629 return NULL;
2630 asdl_seq_SET(seq, pos++, s);
2631 }
2632 else {
2633 int j;
2634 ch = CHILD(ch, 0);
2635 REQ(ch, simple_stmt);
2636 for (j = 0; j < NCH(ch); j += 2) {
2637 /* statement terminates with a semi-colon ';' */
2638 if (NCH(CHILD(ch, j)) == 0) {
2639 assert((j + 1) == NCH(ch));
2640 break;
2641 }
2642 s = ast_for_stmt(c, CHILD(ch, j));
2643 if (!s)
2644 return NULL;
2645 asdl_seq_SET(seq, pos++, s);
2646 }
2647 }
2648 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 }
2650 assert(pos == seq->size);
2651 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652}
2653
2654static stmt_ty
2655ast_for_if_stmt(struct compiling *c, const node *n)
2656{
2657 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2658 ['else' ':' suite]
2659 */
2660 char *s;
2661
2662 REQ(n, if_stmt);
2663
2664 if (NCH(n) == 4) {
2665 expr_ty expression;
2666 asdl_seq *suite_seq;
2667
2668 expression = ast_for_expr(c, CHILD(n, 1));
2669 if (!expression)
2670 return NULL;
2671 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002672 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 return NULL;
2674
Thomas Wouters89f507f2006-12-13 04:49:30 +00002675 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 s = STR(CHILD(n, 4));
2679 /* s[2], the third character in the string, will be
2680 's' for el_s_e, or
2681 'i' for el_i_f
2682 */
2683 if (s[2] == 's') {
2684 expr_ty expression;
2685 asdl_seq *seq1, *seq2;
2686
2687 expression = ast_for_expr(c, CHILD(n, 1));
2688 if (!expression)
2689 return NULL;
2690 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002691 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return NULL;
2693 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002694 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
2696
Thomas Wouters89f507f2006-12-13 04:49:30 +00002697 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 }
2699 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002700 int i, n_elif, has_else = 0;
2701 asdl_seq *orelse = NULL;
2702 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 /* must reference the child n_elif+1 since 'else' token is third,
2704 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002705 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2706 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2707 has_else = 1;
2708 n_elif -= 3;
2709 }
2710 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711
Thomas Wouters89f507f2006-12-13 04:49:30 +00002712 if (has_else) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 expr_ty expression;
2714 asdl_seq *seq1, *seq2;
2715
Thomas Wouters89f507f2006-12-13 04:49:30 +00002716 orelse = asdl_seq_new(1, c->c_arena);
2717 if (!orelse)
2718 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002720 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002723 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002726 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728
Thomas Wouters89f507f2006-12-13 04:49:30 +00002729 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
2730 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002731 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002732 /* the just-created orelse handled the last elif */
2733 n_elif--;
2734 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735
Thomas Wouters89f507f2006-12-13 04:49:30 +00002736 for (i = 0; i < n_elif; i++) {
2737 int off = 5 + (n_elif - i - 1) * 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 expr_ty expression;
2739 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002740 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2741 if (!newobj)
2742 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002744 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747 if (!suite_seq)
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(newobj, 0,
2751 If(expression, suite_seq, orelse,
2752 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
2753 orelse = newobj;
2754 }
2755 return If(ast_for_expr(c, CHILD(n, 1)),
2756 ast_for_suite(c, CHILD(n, 3)),
2757 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002759
2760 PyErr_Format(PyExc_SystemError,
2761 "unexpected token in 'if' statement: %s", s);
2762 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763}
2764
2765static stmt_ty
2766ast_for_while_stmt(struct compiling *c, const node *n)
2767{
2768 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2769 REQ(n, while_stmt);
2770
2771 if (NCH(n) == 4) {
2772 expr_ty expression;
2773 asdl_seq *suite_seq;
2774
2775 expression = ast_for_expr(c, CHILD(n, 1));
2776 if (!expression)
2777 return NULL;
2778 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002779 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002781 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 }
2783 else if (NCH(n) == 7) {
2784 expr_ty expression;
2785 asdl_seq *seq1, *seq2;
2786
2787 expression = ast_for_expr(c, CHILD(n, 1));
2788 if (!expression)
2789 return NULL;
2790 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002791 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 return NULL;
2793 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002794 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 return NULL;
2796
Thomas Wouters89f507f2006-12-13 04:49:30 +00002797 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002799
2800 PyErr_Format(PyExc_SystemError,
2801 "wrong number of tokens for 'while' statement: %d",
2802 NCH(n));
2803 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804}
2805
2806static stmt_ty
2807ast_for_for_stmt(struct compiling *c, const node *n)
2808{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002809 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 expr_ty expression;
2811 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002812 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2814 REQ(n, for_stmt);
2815
2816 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002817 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 if (!seq)
2819 return NULL;
2820 }
2821
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002822 node_target = CHILD(n, 1);
2823 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002824 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002826 /* Check the # of children rather than the length of _target, since
2827 for x, in ... has 1 element in _target, but still requires a Tuple. */
2828 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002829 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002831 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002833 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002834 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835 return NULL;
2836 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002837 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838 return NULL;
2839
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002840 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2841 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842}
2843
2844static excepthandler_ty
2845ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2846{
2847 /* except_clause: 'except' [test [',' test]] */
2848 REQ(exc, except_clause);
2849 REQ(body, suite);
2850
2851 if (NCH(exc) == 1) {
2852 asdl_seq *suite_seq = ast_for_suite(c, body);
2853 if (!suite_seq)
2854 return NULL;
2855
Thomas Wouters89f507f2006-12-13 04:49:30 +00002856 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002857 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 }
2859 else if (NCH(exc) == 2) {
2860 expr_ty expression;
2861 asdl_seq *suite_seq;
2862
2863 expression = ast_for_expr(c, CHILD(exc, 1));
2864 if (!expression)
2865 return NULL;
2866 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002867 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 return NULL;
2869
Thomas Wouters89f507f2006-12-13 04:49:30 +00002870 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002871 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 }
2873 else if (NCH(exc) == 4) {
2874 asdl_seq *suite_seq;
2875 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002876 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002877 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002880 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 return NULL;
2882 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002883 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 return NULL;
2885
Thomas Wouters89f507f2006-12-13 04:49:30 +00002886 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002887 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002889
2890 PyErr_Format(PyExc_SystemError,
2891 "wrong number of children for 'except' clause: %d",
2892 NCH(exc));
2893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894}
2895
2896static stmt_ty
2897ast_for_try_stmt(struct compiling *c, const node *n)
2898{
Neal Norwitzf599f422005-12-17 21:33:47 +00002899 const int nch = NCH(n);
2900 int n_except = (nch - 3)/3;
2901 asdl_seq *body, *orelse = NULL, *finally = NULL;
2902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 REQ(n, try_stmt);
2904
Neal Norwitzf599f422005-12-17 21:33:47 +00002905 body = ast_for_suite(c, CHILD(n, 2));
2906 if (body == NULL)
2907 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908
Neal Norwitzf599f422005-12-17 21:33:47 +00002909 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2910 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2911 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2912 /* we can assume it's an "else",
2913 because nch >= 9 for try-else-finally and
2914 it would otherwise have a type of except_clause */
2915 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2916 if (orelse == NULL)
2917 return NULL;
2918 n_except--;
2919 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920
Neal Norwitzf599f422005-12-17 21:33:47 +00002921 finally = ast_for_suite(c, CHILD(n, nch - 1));
2922 if (finally == NULL)
2923 return NULL;
2924 n_except--;
2925 }
2926 else {
2927 /* we can assume it's an "else",
2928 otherwise it would have a type of except_clause */
2929 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2930 if (orelse == NULL)
2931 return NULL;
2932 n_except--;
2933 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002935 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002936 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 return NULL;
2938 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002939
2940 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 int i;
2942 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002943 /* process except statements to create a try ... except */
2944 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2945 if (handlers == NULL)
2946 return NULL;
2947
2948 for (i = 0; i < n_except; i++) {
2949 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2950 CHILD(n, 5 + i * 3));
2951 if (!e)
2952 return NULL;
2953 asdl_seq_SET(handlers, i, e);
2954 }
2955
Thomas Wouters89f507f2006-12-13 04:49:30 +00002956 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002957 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002958 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002960
2961 /* if a 'finally' is present too, we nest the TryExcept within a
2962 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 body = asdl_seq_new(1, c->c_arena);
2964 if (body == NULL)
2965 return NULL;
2966 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002967 }
2968
2969 /* must be a try ... finally (except clauses are in body, if any exist) */
2970 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002971 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972}
2973
Guido van Rossumc2e20742006-02-27 22:32:47 +00002974static expr_ty
2975ast_for_with_var(struct compiling *c, const node *n)
2976{
2977 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002978 return ast_for_expr(c, CHILD(n, 1));
2979}
2980
2981/* with_stmt: 'with' test [ with_var ] ':' suite */
2982static stmt_ty
2983ast_for_with_stmt(struct compiling *c, const node *n)
2984{
2985 expr_ty context_expr, optional_vars = NULL;
2986 int suite_index = 3; /* skip 'with', test, and ':' */
2987 asdl_seq *suite_seq;
2988
2989 assert(TYPE(n) == with_stmt);
2990 context_expr = ast_for_expr(c, CHILD(n, 1));
2991 if (TYPE(CHILD(n, 2)) == with_var) {
2992 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2993
2994 if (!optional_vars) {
2995 return NULL;
2996 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002997 if (!set_context(optional_vars, Store, n)) {
2998 return NULL;
2999 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003000 suite_index = 4;
3001 }
3002
3003 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
3004 if (!suite_seq) {
3005 return NULL;
3006 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003007 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00003008 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003009}
3010
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011static stmt_ty
3012ast_for_classdef(struct compiling *c, const node *n)
3013{
3014 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 asdl_seq *bases, *s;
3016
3017 REQ(n, classdef);
3018
3019 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003020 ast_error(n, "assignment to None");
3021 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 }
3023
3024 if (NCH(n) == 4) {
3025 s = ast_for_suite(c, CHILD(n, 3));
3026 if (!s)
3027 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003028 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003029 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 }
3031 /* check for empty base list */
3032 if (TYPE(CHILD(n,3)) == RPAR) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003033 s = ast_for_suite(c, CHILD(n,5));
3034 if (!s)
3035 return NULL;
3036 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003037 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 }
3039
3040 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003041 bases = ast_for_class_bases(c, CHILD(n, 3));
3042 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044
3045 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003046 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003048 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
3049 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050}
3051
3052static stmt_ty
3053ast_for_stmt(struct compiling *c, const node *n)
3054{
3055 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003056 assert(NCH(n) == 1);
3057 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 }
3059 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003060 assert(num_stmts(n) == 1);
3061 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 }
3063 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003064 REQ(n, small_stmt);
3065 n = CHILD(n, 0);
Guido van Rossum452bf512007-02-09 05:32:43 +00003066 /* small_stmt: expr_stmt | del_stmt | pass_stmt
Neal Norwitzc1505362006-12-28 06:47:50 +00003067 | flow_stmt | import_stmt | global_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 */
3069 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 case expr_stmt:
3071 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 case del_stmt:
3073 return ast_for_del_stmt(c, n);
3074 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003075 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 case flow_stmt:
3077 return ast_for_flow_stmt(c, n);
3078 case import_stmt:
3079 return ast_for_import_stmt(c, n);
3080 case global_stmt:
3081 return ast_for_global_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082 case assert_stmt:
3083 return ast_for_assert_stmt(c, n);
3084 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003085 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3087 TYPE(n), NCH(n));
3088 return NULL;
3089 }
3090 }
3091 else {
3092 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003093 | funcdef | classdef
3094 */
3095 node *ch = CHILD(n, 0);
3096 REQ(n, compound_stmt);
3097 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098 case if_stmt:
3099 return ast_for_if_stmt(c, ch);
3100 case while_stmt:
3101 return ast_for_while_stmt(c, ch);
3102 case for_stmt:
3103 return ast_for_for_stmt(c, ch);
3104 case try_stmt:
3105 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003106 case with_stmt:
3107 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 case funcdef:
3109 return ast_for_funcdef(c, ch);
3110 case classdef:
3111 return ast_for_classdef(c, ch);
3112 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003113 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3115 TYPE(n), NCH(n));
3116 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003117 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118 }
3119}
3120
3121static PyObject *
3122parsenumber(const char *s)
3123{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003124 const char *end;
3125 long x;
3126 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003128 Py_complex c;
3129 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130#endif
3131
Thomas Wouters89f507f2006-12-13 04:49:30 +00003132 errno = 0;
3133 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003135 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003137 if (*end == 'l' || *end == 'L')
3138 return PyLong_FromString((char *)s, (char **)0, 0);
3139 if (s[0] == '0') {
3140 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3141 if (x < 0 && errno == 0) {
3142 return PyLong_FromString((char *)s,
3143 (char **)0,
3144 0);
3145 }
3146 }
3147 else
3148 x = PyOS_strtol((char *)s, (char **)&end, 0);
3149 if (*end == '\0') {
3150 if (errno != 0)
3151 return PyLong_FromString((char *)s, (char **)0, 0);
3152 return PyInt_FromLong(x);
3153 }
3154 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003156 if (imflag) {
3157 c.real = 0.;
3158 PyFPE_START_PROTECT("atof", return 0)
3159 c.imag = PyOS_ascii_atof(s);
3160 PyFPE_END_PROTECT(c)
3161 return PyComplex_FromCComplex(c);
3162 }
3163 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003165 {
3166 PyFPE_START_PROTECT("atof", return 0)
3167 dx = PyOS_ascii_atof(s);
3168 PyFPE_END_PROTECT(dx)
3169 return PyFloat_FromDouble(dx);
3170 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171}
3172
3173static PyObject *
3174decode_utf8(const char **sPtr, const char *end, char* encoding)
3175{
3176#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003177 Py_FatalError("decode_utf8 should not be called in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178 return NULL;
3179#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003180 PyObject *u, *v;
3181 char *s, *t;
3182 t = s = (char *)*sPtr;
3183 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3184 while (s < end && (*s & 0x80)) s++;
3185 *sPtr = s;
3186 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3187 if (u == NULL)
3188 return NULL;
3189 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3190 Py_DECREF(u);
3191 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192#endif
3193}
3194
3195static PyObject *
3196decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3197{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003198 PyObject *v, *u;
3199 char *buf;
3200 char *p;
3201 const char *end;
3202 if (encoding == NULL) {
3203 buf = (char *)s;
3204 u = NULL;
3205 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3206 buf = (char *)s;
3207 u = NULL;
3208 } else {
3209 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3210 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3211 if (u == NULL)
3212 return NULL;
3213 p = buf = PyString_AsString(u);
3214 end = s + len;
3215 while (s < end) {
3216 if (*s == '\\') {
3217 *p++ = *s++;
3218 if (*s & 0x80) {
3219 strcpy(p, "u005c");
3220 p += 5;
3221 }
3222 }
3223 if (*s & 0x80) { /* XXX inefficient */
3224 PyObject *w;
3225 char *r;
3226 Py_ssize_t rn, i;
3227 w = decode_utf8(&s, end, "utf-16-be");
3228 if (w == NULL) {
3229 Py_DECREF(u);
3230 return NULL;
3231 }
3232 r = PyString_AsString(w);
3233 rn = PyString_Size(w);
3234 assert(rn % 2 == 0);
3235 for (i = 0; i < rn; i += 2) {
3236 sprintf(p, "\\u%02x%02x",
3237 r[i + 0] & 0xFF,
3238 r[i + 1] & 0xFF);
3239 p += 6;
3240 }
3241 Py_DECREF(w);
3242 } else {
3243 *p++ = *s++;
3244 }
3245 }
3246 len = p - buf;
3247 s = buf;
3248 }
3249 if (rawmode)
3250 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3251 else
3252 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3253 Py_XDECREF(u);
3254 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255}
3256
3257/* s is a Python string literal, including the bracketing quote characters,
3258 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3259 * parsestr parses it, and returns the decoded Python string object.
3260 */
3261static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003262parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003264 size_t len;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003265 const char *s = STR(n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003266 int quote = Py_CHARMASK(*s);
3267 int rawmode = 0;
3268 int need_encoding;
3269 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270
Thomas Wouters89f507f2006-12-13 04:49:30 +00003271 if (isalpha(quote) || quote == '_') {
3272 if (quote == 'u' || quote == 'U') {
3273 quote = *++s;
3274 unicode = 1;
3275 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003276 if (quote == 'b' || quote == 'B') {
3277 quote = *++s;
3278 *bytesmode = 1;
3279 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003280 if (quote == 'r' || quote == 'R') {
3281 quote = *++s;
3282 rawmode = 1;
3283 }
3284 }
3285 if (quote != '\'' && quote != '\"') {
3286 PyErr_BadInternalCall();
3287 return NULL;
3288 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003289 if (unicode && *bytesmode) {
3290 ast_error(n, "string cannot be both bytes and unicode");
3291 return NULL;
3292 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003293 s++;
3294 len = strlen(s);
3295 if (len > INT_MAX) {
3296 PyErr_SetString(PyExc_OverflowError,
3297 "string to parse is too long");
3298 return NULL;
3299 }
3300 if (s[--len] != quote) {
3301 PyErr_BadInternalCall();
3302 return NULL;
3303 }
3304 if (len >= 4 && s[0] == quote && s[1] == quote) {
3305 s += 2;
3306 len -= 2;
3307 if (s[--len] != quote || s[--len] != quote) {
3308 PyErr_BadInternalCall();
3309 return NULL;
3310 }
3311 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003313 if (unicode || Py_UnicodeFlag) {
3314 return decode_unicode(s, len, rawmode, encoding);
3315 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316#endif
Thomas Wouters00e41de2007-02-23 19:56:57 +00003317 if (*bytesmode) {
3318 /* Disallow non-ascii characters (but not escapes) */
3319 const char *c;
3320 for (c = s; *c; c++) {
3321 if (Py_CHARMASK(*c) >= 0x80) {
3322 ast_error(n, "bytes can only contain ASCII "
3323 "literal characters.");
3324 return NULL;
3325 }
3326 }
3327 }
3328 need_encoding = (!*bytesmode && encoding != NULL &&
Thomas Wouters89f507f2006-12-13 04:49:30 +00003329 strcmp(encoding, "utf-8") != 0 &&
3330 strcmp(encoding, "iso-8859-1") != 0);
3331 if (rawmode || strchr(s, '\\') == NULL) {
3332 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003333#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003334 /* This should not happen - we never see any other
3335 encoding. */
3336 Py_FatalError(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003337 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003339 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3340 if (u == NULL)
3341 return NULL;
3342 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3343 Py_DECREF(u);
3344 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003345#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003346 } else {
3347 return PyString_FromStringAndSize(s, len);
3348 }
3349 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350
Thomas Wouters89f507f2006-12-13 04:49:30 +00003351 return PyString_DecodeEscape(s, len, NULL, unicode,
3352 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353}
3354
3355/* Build a Python string object out of a STRING atom. This takes care of
3356 * compile-time literal catenation, calling parsestr() on each piece, and
3357 * pasting the intermediate results together.
3358 */
3359static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003360parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003362 PyObject *v;
3363 int i;
3364 REQ(CHILD(n, 0), STRING);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003365 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3366 if (v != NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003367 /* String literal concatenation */
3368 for (i = 1; i < NCH(n); i++) {
3369 PyObject *s;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003370 int subbm = 0;
3371 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003372 if (s == NULL)
3373 goto onError;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003374 if (*bytesmode != subbm) {
3375 ast_error(n, "cannot mix bytes and nonbytes"
3376 "literals");
3377 goto onError;
3378 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003379 if (PyString_Check(v) && PyString_Check(s)) {
3380 PyString_ConcatAndDel(&v, s);
3381 if (v == NULL)
3382 goto onError;
3383 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003385 else {
3386 PyObject *temp = PyUnicode_Concat(v, s);
3387 Py_DECREF(s);
3388 Py_DECREF(v);
3389 v = temp;
3390 if (v == NULL)
3391 goto onError;
3392 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003394 }
3395 }
3396 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397
3398 onError:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003399 Py_XDECREF(v);
3400 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003401}