blob: 777c00ec0b60330337b529b792afdbbc15265d25 [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 }
Georg Brandldde00282007-03-18 19:01:53 +00001413 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001414 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 ch = CHILD(n, 1);
1417
1418 if (TYPE(ch) == RPAR)
1419 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1420
1421 if (TYPE(ch) == yield_expr)
1422 return ast_for_expr(c, ch);
1423
1424 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1425 return ast_for_genexp(c, ch);
1426
1427 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 ch = CHILD(n, 1);
1430
1431 if (TYPE(ch) == RSQB)
1432 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1433
1434 REQ(ch, listmaker);
1435 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1436 asdl_seq *elts = seq_for_testlist(c, ch);
1437 if (!elts)
1438 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001439
Thomas Wouters89f507f2006-12-13 04:49:30 +00001440 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1441 }
1442 else
1443 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444 case LBRACE: {
Neal Norwitzc1505362006-12-28 06:47:50 +00001445 /* dictsetmaker: test ':' test (',' test ':' test)* [','] |
1446 * test (',' test)* [','] */
1447 int i, size;
1448 asdl_seq *keys, *values;
1449
1450 ch = CHILD(n, 1);
1451 if (NCH(ch) == 1 || (NCH(ch) > 0 && STR(CHILD(ch, 1))[0] == ',')) {
Guido van Rossum86e58e22006-08-28 15:27:34 +00001452 /* it's a set */
1453 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
1454 keys = asdl_seq_new(size, c->c_arena);
1455 if (!keys)
1456 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001457
Guido van Rossum86e58e22006-08-28 15:27:34 +00001458 for (i = 0; i < NCH(ch); i += 2) {
1459 expr_ty expression;
1460 expression = ast_for_expr(c, CHILD(ch, i));
1461 if (!expression)
1462 return NULL;
1463 asdl_seq_SET(keys, i / 2, expression);
1464 }
1465 return Set(keys, LINENO(n), n->n_col_offset, c->c_arena);
1466 } else {
1467 /* it's a dict */
1468 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1469 keys = asdl_seq_new(size, c->c_arena);
1470 if (!keys)
1471 return NULL;
1472
1473 values = asdl_seq_new(size, c->c_arena);
1474 if (!values)
1475 return NULL;
1476
1477 for (i = 0; i < NCH(ch); i += 4) {
1478 expr_ty expression;
1479
1480 expression = ast_for_expr(c, CHILD(ch, i));
1481 if (!expression)
1482 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001483
Guido van Rossum86e58e22006-08-28 15:27:34 +00001484 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001485
Guido van Rossum86e58e22006-08-28 15:27:34 +00001486 expression = ast_for_expr(c, CHILD(ch, i + 2));
1487 if (!expression)
1488 return NULL;
1489
1490 asdl_seq_SET(values, i / 4, expression);
1491 }
1492 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1493 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1497 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 }
1499}
1500
1501static slice_ty
1502ast_for_slice(struct compiling *c, const node *n)
1503{
1504 node *ch;
1505 expr_ty lower = NULL, upper = NULL, step = NULL;
1506
1507 REQ(n, subscript);
1508
1509 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001510 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 sliceop: ':' [test]
1512 */
1513 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514 if (NCH(n) == 1 && TYPE(ch) == test) {
1515 /* 'step' variable hold no significance in terms of being used over
1516 other vars */
1517 step = ast_for_expr(c, ch);
1518 if (!step)
1519 return NULL;
1520
Thomas Wouters89f507f2006-12-13 04:49:30 +00001521 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522 }
1523
1524 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526 if (!lower)
1527 return NULL;
1528 }
1529
1530 /* If there's an upper bound it's in the second or third position. */
1531 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001532 if (NCH(n) > 1) {
1533 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534
Thomas Wouters89f507f2006-12-13 04:49:30 +00001535 if (TYPE(n2) == test) {
1536 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537 if (!upper)
1538 return NULL;
1539 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001542 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Thomas Wouters89f507f2006-12-13 04:49:30 +00001544 if (TYPE(n2) == test) {
1545 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546 if (!upper)
1547 return NULL;
1548 }
1549 }
1550
1551 ch = CHILD(n, NCH(n) - 1);
1552 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001553 if (NCH(ch) == 1) {
1554 /* No expression, so step is None */
1555 ch = CHILD(ch, 0);
1556 step = Name(new_identifier("None", c->c_arena), Load,
1557 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 if (!step)
1559 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001560 } else {
1561 ch = CHILD(ch, 1);
1562 if (TYPE(ch) == test) {
1563 step = ast_for_expr(c, ch);
1564 if (!step)
1565 return NULL;
1566 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001567 }
1568 }
1569
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001570 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571}
1572
1573static expr_ty
1574ast_for_binop(struct compiling *c, const node *n)
1575{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001576 /* Must account for a sequence of expressions.
1577 How should A op B op C by represented?
1578 BinOp(BinOp(A, op, B), op, C).
1579 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580
Thomas Wouters89f507f2006-12-13 04:49:30 +00001581 int i, nops;
1582 expr_ty expr1, expr2, result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001583 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584
1585 expr1 = ast_for_expr(c, CHILD(n, 0));
1586 if (!expr1)
1587 return NULL;
1588
1589 expr2 = ast_for_expr(c, CHILD(n, 2));
1590 if (!expr2)
1591 return NULL;
1592
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001593 newoperator = get_operator(CHILD(n, 1));
1594 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595 return NULL;
1596
Thomas Wouters89f507f2006-12-13 04:49:30 +00001597 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001598 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001599 if (!result)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600 return NULL;
1601
Thomas Wouters89f507f2006-12-13 04:49:30 +00001602 nops = (NCH(n) - 1) / 2;
1603 for (i = 1; i < nops; i++) {
1604 expr_ty tmp_result, tmp;
1605 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606
Thomas Wouters89f507f2006-12-13 04:49:30 +00001607 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001608 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609 return NULL;
1610
1611 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1612 if (!tmp)
1613 return NULL;
1614
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001615 tmp_result = BinOp(result, newoperator, tmp,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001616 LINENO(next_oper), next_oper->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001617 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001618 if (!tmp)
1619 return NULL;
1620 result = tmp_result;
1621 }
1622 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623}
1624
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625static expr_ty
1626ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1627{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1629 subscriptlist: subscript (',' subscript)* [',']
1630 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1631 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001632 REQ(n, trailer);
1633 if (TYPE(CHILD(n, 0)) == LPAR) {
1634 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001635 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1636 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001638 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001639 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001640 else if (TYPE(CHILD(n, 0)) == DOT ) {
1641 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001642 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001643 }
1644 else {
1645 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 REQ(CHILD(n, 2), RSQB);
1647 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001648 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001649 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1650 if (!slc)
1651 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001652 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1653 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 }
1655 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 /* The grammar is ambiguous here. The ambiguity is resolved
1657 by treating the sequence as a tuple literal if there are
1658 no slice features.
1659 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660 int j;
1661 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001662 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001663 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001664 asdl_seq *slices, *elts;
1665 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001666 if (!slices)
1667 return NULL;
1668 for (j = 0; j < NCH(n); j += 2) {
1669 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001670 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001671 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001672 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001673 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001674 asdl_seq_SET(slices, j / 2, slc);
1675 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001676 if (!simple) {
1677 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001678 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001679 }
1680 /* extract Index values and put them in a Tuple */
1681 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001682 if (!elts)
1683 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001684 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1685 slc = (slice_ty)asdl_seq_GET(slices, j);
1686 assert(slc->kind == Index_kind && slc->v.Index.value);
1687 asdl_seq_SET(elts, j, slc->v.Index.value);
1688 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001689 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001690 if (!e)
1691 return NULL;
1692 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001693 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001694 }
1695 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001696}
1697
1698static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001699ast_for_factor(struct compiling *c, const node *n)
1700{
1701 node *pfactor, *ppower, *patom, *pnum;
1702 expr_ty expression;
1703
1704 /* If the unary - operator is applied to a constant, don't generate
1705 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1706 constant. The peephole optimizer already does something like
1707 this but it doesn't handle the case where the constant is
1708 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1709 PyLongObject.
1710 */
1711 if (TYPE(CHILD(n, 0)) == MINUS
1712 && NCH(n) == 2
1713 && TYPE((pfactor = CHILD(n, 1))) == factor
1714 && NCH(pfactor) == 1
1715 && TYPE((ppower = CHILD(pfactor, 0))) == power
1716 && NCH(ppower) == 1
1717 && TYPE((patom = CHILD(ppower, 0))) == atom
1718 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1719 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1720 if (s == NULL)
1721 return NULL;
1722 s[0] = '-';
1723 strcpy(s + 1, STR(pnum));
1724 PyObject_FREE(STR(pnum));
1725 STR(pnum) = s;
1726 return ast_for_atom(c, patom);
1727 }
1728
1729 expression = ast_for_expr(c, CHILD(n, 1));
1730 if (!expression)
1731 return NULL;
1732
1733 switch (TYPE(CHILD(n, 0))) {
1734 case PLUS:
1735 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1736 c->c_arena);
1737 case MINUS:
1738 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1739 c->c_arena);
1740 case TILDE:
1741 return UnaryOp(Invert, expression, LINENO(n),
1742 n->n_col_offset, c->c_arena);
1743 }
1744 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1745 TYPE(CHILD(n, 0)));
1746 return NULL;
1747}
1748
1749static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001750ast_for_power(struct compiling *c, const node *n)
1751{
1752 /* power: atom trailer* ('**' factor)*
1753 */
1754 int i;
1755 expr_ty e, tmp;
1756 REQ(n, power);
1757 e = ast_for_atom(c, CHILD(n, 0));
1758 if (!e)
1759 return NULL;
1760 if (NCH(n) == 1)
1761 return e;
1762 for (i = 1; i < NCH(n); i++) {
1763 node *ch = CHILD(n, i);
1764 if (TYPE(ch) != trailer)
1765 break;
1766 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001767 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001768 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001769 tmp->lineno = e->lineno;
1770 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001771 e = tmp;
1772 }
1773 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1774 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001775 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001776 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001777 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001778 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001779 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001780 e = tmp;
1781 }
1782 return e;
1783}
1784
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785/* Do not name a variable 'expr'! Will cause a compile error.
1786*/
1787
1788static expr_ty
1789ast_for_expr(struct compiling *c, const node *n)
1790{
1791 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001792 test: or_test ['if' or_test 'else' test] | lambdef
1793 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 and_test: not_test ('and' not_test)*
1795 not_test: 'not' not_test | comparison
1796 comparison: expr (comp_op expr)*
1797 expr: xor_expr ('|' xor_expr)*
1798 xor_expr: and_expr ('^' and_expr)*
1799 and_expr: shift_expr ('&' shift_expr)*
1800 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1801 arith_expr: term (('+'|'-') term)*
1802 term: factor (('*'|'/'|'%'|'//') factor)*
1803 factor: ('+'|'-'|'~') factor | power
1804 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001805
1806 As well as modified versions that exist for backward compatibility,
1807 to explicitly allow:
1808 [ x for x in lambda: 0, lambda: 1 ]
1809 (which would be ambiguous without these extra rules)
1810
1811 old_test: or_test | old_lambdef
1812 old_lambdef: 'lambda' [vararglist] ':' old_test
1813
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 */
1815
1816 asdl_seq *seq;
1817 int i;
1818
1819 loop:
1820 switch (TYPE(n)) {
1821 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001822 case old_test:
1823 if (TYPE(CHILD(n, 0)) == lambdef ||
1824 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001826 else if (NCH(n) > 1)
1827 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001828 /* Fallthrough */
1829 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 case and_test:
1831 if (NCH(n) == 1) {
1832 n = CHILD(n, 0);
1833 goto loop;
1834 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001835 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 if (!seq)
1837 return NULL;
1838 for (i = 0; i < NCH(n); i += 2) {
1839 expr_ty e = ast_for_expr(c, CHILD(n, i));
1840 if (!e)
1841 return NULL;
1842 asdl_seq_SET(seq, i / 2, e);
1843 }
1844 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1846 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001847 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001848 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 case not_test:
1850 if (NCH(n) == 1) {
1851 n = CHILD(n, 0);
1852 goto loop;
1853 }
1854 else {
1855 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1856 if (!expression)
1857 return NULL;
1858
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001859 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1860 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 }
1862 case comparison:
1863 if (NCH(n) == 1) {
1864 n = CHILD(n, 0);
1865 goto loop;
1866 }
1867 else {
1868 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001871 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 if (!ops)
1873 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001874 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 return NULL;
1877 }
1878 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001879 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001881 newoperator = ast_for_comp_op(CHILD(n, i));
1882 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885
1886 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001887 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001891 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 asdl_seq_SET(cmps, i / 2, expression);
1893 }
1894 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001895 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001899 return Compare(expression, ops, cmps, LINENO(n),
1900 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 }
1902 break;
1903
1904 /* The next five cases all handle BinOps. The main body of code
1905 is the same in each case, but the switch turned inside out to
1906 reuse the code for each type of operator.
1907 */
1908 case expr:
1909 case xor_expr:
1910 case and_expr:
1911 case shift_expr:
1912 case arith_expr:
1913 case term:
1914 if (NCH(n) == 1) {
1915 n = CHILD(n, 0);
1916 goto loop;
1917 }
1918 return ast_for_binop(c, n);
1919 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001920 expr_ty exp = NULL;
1921 if (NCH(n) == 2) {
1922 exp = ast_for_testlist(c, CHILD(n, 1));
1923 if (!exp)
1924 return NULL;
1925 }
1926 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1927 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001928 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 if (NCH(n) == 1) {
1930 n = CHILD(n, 0);
1931 goto loop;
1932 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001934 case power:
1935 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001937 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 return NULL;
1939 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001940 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 return NULL;
1942}
1943
1944static expr_ty
1945ast_for_call(struct compiling *c, const node *n, expr_ty func)
1946{
1947 /*
1948 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1949 | '**' test)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001950 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 */
1952
1953 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001954 asdl_seq *args;
1955 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 expr_ty vararg = NULL, kwarg = NULL;
1957
1958 REQ(n, arglist);
1959
1960 nargs = 0;
1961 nkeywords = 0;
1962 ngens = 0;
1963 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001964 node *ch = CHILD(n, i);
1965 if (TYPE(ch) == argument) {
1966 if (NCH(ch) == 1)
1967 nargs++;
1968 else if (TYPE(CHILD(ch, 1)) == gen_for)
1969 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001971 nkeywords++;
1972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 }
1974 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001975 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 "if not sole argument");
1977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
1979
1980 if (nargs + nkeywords + ngens > 255) {
1981 ast_error(n, "more than 255 arguments");
1982 return NULL;
1983 }
1984
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001985 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001987 return NULL;
1988 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 nargs = 0;
1992 nkeywords = 0;
1993 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 node *ch = CHILD(n, i);
1995 if (TYPE(ch) == argument) {
1996 expr_ty e;
1997 if (NCH(ch) == 1) {
1998 if (nkeywords) {
1999 ast_error(CHILD(ch, 0),
2000 "non-keyword arg after keyword arg");
2001 return NULL;
2002 }
2003 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 asdl_seq_SET(args, nargs++, e);
2007 }
2008 else if (TYPE(CHILD(ch, 1)) == gen_for) {
2009 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002011 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 else {
2015 keyword_ty kw;
2016 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 /* CHILD(ch, 0) is test, but must be an identifier? */
2019 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002021 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 /* f(lambda x: x[0] = 3) ends up getting parsed with
2023 * LHS test = lambda x: x[0], and RHS test = 3.
2024 * SF bug 132313 points out that complaining about a keyword
2025 * then is very confusing.
2026 */
2027 if (e->kind == Lambda_kind) {
2028 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002029 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 } else if (e->kind != Name_kind) {
2031 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 key = e->v.Name.id;
2035 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002037 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 asdl_seq_SET(keywords, nkeywords++, kw);
2042 }
2043 }
2044 else if (TYPE(ch) == STAR) {
2045 vararg = ast_for_expr(c, CHILD(n, i+1));
2046 i++;
2047 }
2048 else if (TYPE(ch) == DOUBLESTAR) {
2049 kwarg = ast_for_expr(c, CHILD(n, i+1));
2050 i++;
2051 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052 }
2053
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002054 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055}
2056
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002058ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002060 /* testlist_gexp: test (',' test)* [','] */
2061 /* testlist: test (',' test)* [','] */
2062 /* testlist_safe: test (',' test)+ [','] */
2063 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002065 if (TYPE(n) == testlist_gexp) {
2066 if (NCH(n) > 1)
2067 assert(TYPE(CHILD(n, 1)) != gen_for);
2068 }
2069 else {
2070 assert(TYPE(n) == testlist ||
2071 TYPE(n) == testlist_safe ||
2072 TYPE(n) == testlist1);
2073 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002075 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 else {
2077 asdl_seq *tmp = seq_for_testlist(c, n);
2078 if (!tmp)
2079 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002082}
2083
2084static expr_ty
2085ast_for_testlist_gexp(struct compiling *c, const node* n)
2086{
2087 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2088 /* argument: test [ gen_for ] */
2089 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002090 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002092 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002093}
2094
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095static stmt_ty
2096ast_for_expr_stmt(struct compiling *c, const node *n)
2097{
2098 REQ(n, expr_stmt);
2099 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2100 | ('=' (yield_expr|testlist))*)
2101 testlist: test (',' test)* [',']
2102 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002103 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 test: ... here starts the operator precendence dance
2105 */
2106
2107 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002108 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 if (!e)
2110 return NULL;
2111
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 }
2114 else if (TYPE(CHILD(n, 1)) == augassign) {
2115 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002116 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002117 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118
Thomas Wouters89f507f2006-12-13 04:49:30 +00002119 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 if (!expr1)
2121 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002122 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002123 switch (expr1->kind) {
2124 case GeneratorExp_kind:
2125 ast_error(ch, "augmented assignment to generator "
2126 "expression not possible");
2127 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002128 case Yield_kind:
2129 ast_error(ch, "augmented assignment to yield "
2130 "expression not possible");
2131 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002132 case Name_kind: {
2133 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
2134 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
2135 ast_error(ch, "assignment to None");
2136 return NULL;
2137 }
2138 break;
2139 }
2140 case Attribute_kind:
2141 case Subscript_kind:
2142 break;
2143 default:
2144 ast_error(ch, "illegal expression for augmented "
2145 "assignment");
2146 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002148 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 ch = CHILD(n, 2);
2151 if (TYPE(ch) == testlist)
2152 expr2 = ast_for_testlist(c, ch);
2153 else
2154 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002155 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 return NULL;
2157
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002158 newoperator = ast_for_augassign(CHILD(n, 1));
2159 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 return NULL;
2161
Thomas Wouters89f507f2006-12-13 04:49:30 +00002162 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 }
2164 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002165 int i;
2166 asdl_seq *targets;
2167 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 expr_ty expression;
2169
Thomas Wouters89f507f2006-12-13 04:49:30 +00002170 /* a normal assignment */
2171 REQ(CHILD(n, 1), EQUAL);
2172 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2173 if (!targets)
2174 return NULL;
2175 for (i = 0; i < NCH(n) - 2; i += 2) {
2176 expr_ty e;
2177 node *ch = CHILD(n, i);
2178 if (TYPE(ch) == yield_expr) {
2179 ast_error(ch, "assignment to yield expression not possible");
2180 return NULL;
2181 }
2182 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183
Thomas Wouters89f507f2006-12-13 04:49:30 +00002184 /* set context to assign */
2185 if (!e)
2186 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 if (!set_context(e, Store, CHILD(n, i)))
2189 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190
Thomas Wouters89f507f2006-12-13 04:49:30 +00002191 asdl_seq_SET(targets, i / 2, e);
2192 }
2193 value = CHILD(n, NCH(n) - 1);
2194 if (TYPE(value) == testlist)
2195 expression = ast_for_testlist(c, value);
2196 else
2197 expression = ast_for_expr(c, value);
2198 if (!expression)
2199 return NULL;
2200 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202}
2203
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002205ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206{
2207 asdl_seq *seq;
2208 int i;
2209 expr_ty e;
2210
2211 REQ(n, exprlist);
2212
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002213 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002215 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002217 e = ast_for_expr(c, CHILD(n, i));
2218 if (!e)
2219 return NULL;
2220 asdl_seq_SET(seq, i / 2, e);
2221 if (context && !set_context(e, context, CHILD(n, i)))
2222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 }
2224 return seq;
2225}
2226
2227static stmt_ty
2228ast_for_del_stmt(struct compiling *c, const node *n)
2229{
2230 asdl_seq *expr_list;
2231
2232 /* del_stmt: 'del' exprlist */
2233 REQ(n, del_stmt);
2234
2235 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2236 if (!expr_list)
2237 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002238 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239}
2240
2241static stmt_ty
2242ast_for_flow_stmt(struct compiling *c, const node *n)
2243{
2244 /*
2245 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2246 | yield_stmt
2247 break_stmt: 'break'
2248 continue_stmt: 'continue'
2249 return_stmt: 'return' [testlist]
2250 yield_stmt: yield_expr
2251 yield_expr: 'yield' testlist
2252 raise_stmt: 'raise' [test [',' test [',' test]]]
2253 */
2254 node *ch;
2255
2256 REQ(n, flow_stmt);
2257 ch = CHILD(n, 0);
2258 switch (TYPE(ch)) {
2259 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002260 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002262 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002264 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2265 if (!exp)
2266 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002267 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 }
2269 case return_stmt:
2270 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002271 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002273 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 if (!expression)
2275 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002276 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 }
2278 case raise_stmt:
2279 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002280 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 else if (NCH(ch) == 2) {
2282 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2283 if (!expression)
2284 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002285 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 }
2287 else if (NCH(ch) == 4) {
2288 expr_ty expr1, expr2;
2289
2290 expr1 = ast_for_expr(c, CHILD(ch, 1));
2291 if (!expr1)
2292 return NULL;
2293 expr2 = ast_for_expr(c, CHILD(ch, 3));
2294 if (!expr2)
2295 return NULL;
2296
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002297 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 }
2299 else if (NCH(ch) == 6) {
2300 expr_ty expr1, expr2, expr3;
2301
2302 expr1 = ast_for_expr(c, CHILD(ch, 1));
2303 if (!expr1)
2304 return NULL;
2305 expr2 = ast_for_expr(c, CHILD(ch, 3));
2306 if (!expr2)
2307 return NULL;
2308 expr3 = ast_for_expr(c, CHILD(ch, 5));
2309 if (!expr3)
2310 return NULL;
2311
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002312 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 }
2314 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002315 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 "unexpected flow_stmt: %d", TYPE(ch));
2317 return NULL;
2318 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002319
2320 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2321 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322}
2323
2324static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002325alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326{
2327 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002328 import_as_name: NAME ['as' NAME]
2329 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 dotted_name: NAME ('.' NAME)*
2331 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002332 PyObject *str;
2333
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 loop:
2335 switch (TYPE(n)) {
2336 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002337 str = NULL;
2338 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002339 str = NEW_IDENTIFIER(CHILD(n, 2));
2340 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002341 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 case dotted_as_name:
2343 if (NCH(n) == 1) {
2344 n = CHILD(n, 0);
2345 goto loop;
2346 }
2347 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002348 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002349 if (!a)
2350 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351 assert(!a->asname);
2352 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2353 return a;
2354 }
2355 break;
2356 case dotted_name:
2357 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002358 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 else {
2360 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002361 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002362 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 char *s;
2364
2365 len = 0;
2366 for (i = 0; i < NCH(n); i += 2)
2367 /* length of string plus one for the dot */
2368 len += strlen(STR(CHILD(n, i))) + 1;
2369 len--; /* the last name doesn't have a dot */
2370 str = PyString_FromStringAndSize(NULL, len);
2371 if (!str)
2372 return NULL;
2373 s = PyString_AS_STRING(str);
2374 if (!s)
2375 return NULL;
2376 for (i = 0; i < NCH(n); i += 2) {
2377 char *sch = STR(CHILD(n, i));
2378 strcpy(s, STR(CHILD(n, i)));
2379 s += strlen(sch);
2380 *s++ = '.';
2381 }
2382 --s;
2383 *s = '\0';
2384 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002385 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002386 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 }
2388 break;
2389 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 str = PyString_InternFromString("*");
2391 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002392 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002394 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 "unexpected import name: %d", TYPE(n));
2396 return NULL;
2397 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002398
2399 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 return NULL;
2401}
2402
2403static stmt_ty
2404ast_for_import_stmt(struct compiling *c, const node *n)
2405{
2406 /*
2407 import_stmt: import_name | import_from
2408 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002409 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2410 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002412 int lineno;
2413 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 int i;
2415 asdl_seq *aliases;
2416
2417 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002418 lineno = LINENO(n);
2419 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002421 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 REQ(n, dotted_as_names);
2424 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2425 if (!aliases)
2426 return NULL;
2427 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002428 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002429 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002433 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002435 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 int idx, ndots = 0;
2438 alias_ty mod = NULL;
2439 identifier modname;
2440
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002441 /* Count the number of dots (for relative imports) and check for the
2442 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002443 for (idx = 1; idx < NCH(n); idx++) {
2444 if (TYPE(CHILD(n, idx)) == dotted_name) {
2445 mod = alias_for_import_name(c, CHILD(n, idx));
2446 idx++;
2447 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002448 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2449 /* three consecutive dots are tokenized as one ELLIPSIS */
2450 ndots += 3;
2451 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002452 } else if (TYPE(CHILD(n, idx)) != DOT) {
2453 break;
2454 }
2455 ndots++;
2456 }
2457 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002458 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002459 case STAR:
2460 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002461 n = CHILD(n, idx);
2462 n_children = 1;
2463 if (ndots) {
2464 ast_error(n, "'import *' not allowed with 'from .'");
2465 return NULL;
2466 }
2467 break;
2468 case LPAR:
2469 /* from ... import (x, y, z) */
2470 n = CHILD(n, idx + 1);
2471 n_children = NCH(n);
2472 break;
2473 case import_as_names:
2474 /* from ... import x, y, z */
2475 n = CHILD(n, idx);
2476 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002477 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 ast_error(n, "trailing comma not allowed without"
2479 " surrounding parentheses");
2480 return NULL;
2481 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 break;
2483 default:
2484 ast_error(n, "Unexpected node-type in from-import");
2485 return NULL;
2486 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2489 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491
2492 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002493 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002494 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002495 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002499 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002500 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002501 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2502 if (!import_alias)
2503 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002504 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002507 if (mod != NULL)
2508 modname = mod->name;
2509 else
2510 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002511 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002512 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 }
Neal Norwitz79792652005-11-14 04:25:03 +00002514 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 "unknown import statement: starts with command '%s'",
2516 STR(CHILD(n, 0)));
2517 return NULL;
2518}
2519
2520static stmt_ty
2521ast_for_global_stmt(struct compiling *c, const node *n)
2522{
2523 /* global_stmt: 'global' NAME (',' NAME)* */
2524 identifier name;
2525 asdl_seq *s;
2526 int i;
2527
2528 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002529 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002531 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002533 name = NEW_IDENTIFIER(CHILD(n, i));
2534 if (!name)
2535 return NULL;
2536 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002538 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539}
2540
2541static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002542ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2543{
2544 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2545 identifier name;
2546 asdl_seq *s;
2547 int i;
2548
2549 REQ(n, nonlocal_stmt);
2550 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2551 if (!s)
2552 return NULL;
2553 for (i = 1; i < NCH(n); i += 2) {
2554 name = NEW_IDENTIFIER(CHILD(n, i));
2555 if (!name)
2556 return NULL;
2557 asdl_seq_SET(s, i / 2, name);
2558 }
2559 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2560}
2561
2562static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563ast_for_assert_stmt(struct compiling *c, const node *n)
2564{
2565 /* assert_stmt: 'assert' test [',' test] */
2566 REQ(n, assert_stmt);
2567 if (NCH(n) == 2) {
2568 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2569 if (!expression)
2570 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002571 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 }
2573 else if (NCH(n) == 4) {
2574 expr_ty expr1, expr2;
2575
2576 expr1 = ast_for_expr(c, CHILD(n, 1));
2577 if (!expr1)
2578 return NULL;
2579 expr2 = ast_for_expr(c, CHILD(n, 3));
2580 if (!expr2)
2581 return NULL;
2582
Thomas Wouters89f507f2006-12-13 04:49:30 +00002583 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 }
Neal Norwitz79792652005-11-14 04:25:03 +00002585 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 "improper number of parts to 'assert' statement: %d",
2587 NCH(n));
2588 return NULL;
2589}
2590
2591static asdl_seq *
2592ast_for_suite(struct compiling *c, const node *n)
2593{
2594 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002595 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 stmt_ty s;
2597 int i, total, num, end, pos = 0;
2598 node *ch;
2599
2600 REQ(n, suite);
2601
2602 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002603 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002605 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002607 n = CHILD(n, 0);
2608 /* simple_stmt always ends with a NEWLINE,
2609 and may have a trailing SEMI
2610 */
2611 end = NCH(n) - 1;
2612 if (TYPE(CHILD(n, end - 1)) == SEMI)
2613 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 for (i = 0; i < end; i += 2) {
2616 ch = CHILD(n, i);
2617 s = ast_for_stmt(c, ch);
2618 if (!s)
2619 return NULL;
2620 asdl_seq_SET(seq, pos++, s);
2621 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 }
2623 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002624 for (i = 2; i < (NCH(n) - 1); i++) {
2625 ch = CHILD(n, i);
2626 REQ(ch, stmt);
2627 num = num_stmts(ch);
2628 if (num == 1) {
2629 /* small_stmt or compound_stmt with only one child */
2630 s = ast_for_stmt(c, ch);
2631 if (!s)
2632 return NULL;
2633 asdl_seq_SET(seq, pos++, s);
2634 }
2635 else {
2636 int j;
2637 ch = CHILD(ch, 0);
2638 REQ(ch, simple_stmt);
2639 for (j = 0; j < NCH(ch); j += 2) {
2640 /* statement terminates with a semi-colon ';' */
2641 if (NCH(CHILD(ch, j)) == 0) {
2642 assert((j + 1) == NCH(ch));
2643 break;
2644 }
2645 s = ast_for_stmt(c, CHILD(ch, j));
2646 if (!s)
2647 return NULL;
2648 asdl_seq_SET(seq, pos++, s);
2649 }
2650 }
2651 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 }
2653 assert(pos == seq->size);
2654 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655}
2656
2657static stmt_ty
2658ast_for_if_stmt(struct compiling *c, const node *n)
2659{
2660 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2661 ['else' ':' suite]
2662 */
2663 char *s;
2664
2665 REQ(n, if_stmt);
2666
2667 if (NCH(n) == 4) {
2668 expr_ty expression;
2669 asdl_seq *suite_seq;
2670
2671 expression = ast_for_expr(c, CHILD(n, 1));
2672 if (!expression)
2673 return NULL;
2674 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002675 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 return NULL;
2677
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002680
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 s = STR(CHILD(n, 4));
2682 /* s[2], the third character in the string, will be
2683 's' for el_s_e, or
2684 'i' for el_i_f
2685 */
2686 if (s[2] == 's') {
2687 expr_ty expression;
2688 asdl_seq *seq1, *seq2;
2689
2690 expression = ast_for_expr(c, CHILD(n, 1));
2691 if (!expression)
2692 return NULL;
2693 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002694 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
2696 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002697 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return NULL;
2699
Thomas Wouters89f507f2006-12-13 04:49:30 +00002700 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 }
2702 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002703 int i, n_elif, has_else = 0;
2704 asdl_seq *orelse = NULL;
2705 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 /* must reference the child n_elif+1 since 'else' token is third,
2707 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002708 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2709 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2710 has_else = 1;
2711 n_elif -= 3;
2712 }
2713 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 if (has_else) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 expr_ty expression;
2717 asdl_seq *seq1, *seq2;
2718
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 orelse = asdl_seq_new(1, c->c_arena);
2720 if (!orelse)
2721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002723 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002726 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002729 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731
Thomas Wouters89f507f2006-12-13 04:49:30 +00002732 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
2733 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002734 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 /* the just-created orelse handled the last elif */
2736 n_elif--;
2737 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738
Thomas Wouters89f507f2006-12-13 04:49:30 +00002739 for (i = 0; i < n_elif; i++) {
2740 int off = 5 + (n_elif - i - 1) * 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 expr_ty expression;
2742 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002743 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2744 if (!newobj)
2745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002750 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752
Thomas Wouters89f507f2006-12-13 04:49:30 +00002753 asdl_seq_SET(newobj, 0,
2754 If(expression, suite_seq, orelse,
2755 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
2756 orelse = newobj;
2757 }
2758 return If(ast_for_expr(c, CHILD(n, 1)),
2759 ast_for_suite(c, CHILD(n, 3)),
2760 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002762
2763 PyErr_Format(PyExc_SystemError,
2764 "unexpected token in 'if' statement: %s", s);
2765 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766}
2767
2768static stmt_ty
2769ast_for_while_stmt(struct compiling *c, const node *n)
2770{
2771 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2772 REQ(n, while_stmt);
2773
2774 if (NCH(n) == 4) {
2775 expr_ty expression;
2776 asdl_seq *suite_seq;
2777
2778 expression = ast_for_expr(c, CHILD(n, 1));
2779 if (!expression)
2780 return NULL;
2781 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002782 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002784 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785 }
2786 else if (NCH(n) == 7) {
2787 expr_ty expression;
2788 asdl_seq *seq1, *seq2;
2789
2790 expression = ast_for_expr(c, CHILD(n, 1));
2791 if (!expression)
2792 return NULL;
2793 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002794 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 return NULL;
2796 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002797 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 return NULL;
2799
Thomas Wouters89f507f2006-12-13 04:49:30 +00002800 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002802
2803 PyErr_Format(PyExc_SystemError,
2804 "wrong number of tokens for 'while' statement: %d",
2805 NCH(n));
2806 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807}
2808
2809static stmt_ty
2810ast_for_for_stmt(struct compiling *c, const node *n)
2811{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002812 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 expr_ty expression;
2814 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002815 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2817 REQ(n, for_stmt);
2818
2819 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002820 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 if (!seq)
2822 return NULL;
2823 }
2824
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002825 node_target = CHILD(n, 1);
2826 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002827 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002829 /* Check the # of children rather than the length of _target, since
2830 for x, in ... has 1 element in _target, but still requires a Tuple. */
2831 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002832 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002834 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002836 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002837 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838 return NULL;
2839 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002840 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 return NULL;
2842
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002843 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2844 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845}
2846
2847static excepthandler_ty
2848ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2849{
2850 /* except_clause: 'except' [test [',' test]] */
2851 REQ(exc, except_clause);
2852 REQ(body, suite);
2853
2854 if (NCH(exc) == 1) {
2855 asdl_seq *suite_seq = ast_for_suite(c, body);
2856 if (!suite_seq)
2857 return NULL;
2858
Thomas Wouters89f507f2006-12-13 04:49:30 +00002859 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002860 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 }
2862 else if (NCH(exc) == 2) {
2863 expr_ty expression;
2864 asdl_seq *suite_seq;
2865
2866 expression = ast_for_expr(c, CHILD(exc, 1));
2867 if (!expression)
2868 return NULL;
2869 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002870 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 return NULL;
2872
Thomas Wouters89f507f2006-12-13 04:49:30 +00002873 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002874 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 }
2876 else if (NCH(exc) == 4) {
2877 asdl_seq *suite_seq;
2878 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002879 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002880 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002883 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 return NULL;
2885 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002886 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887 return NULL;
2888
Thomas Wouters89f507f2006-12-13 04:49:30 +00002889 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002890 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002892
2893 PyErr_Format(PyExc_SystemError,
2894 "wrong number of children for 'except' clause: %d",
2895 NCH(exc));
2896 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897}
2898
2899static stmt_ty
2900ast_for_try_stmt(struct compiling *c, const node *n)
2901{
Neal Norwitzf599f422005-12-17 21:33:47 +00002902 const int nch = NCH(n);
2903 int n_except = (nch - 3)/3;
2904 asdl_seq *body, *orelse = NULL, *finally = NULL;
2905
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 REQ(n, try_stmt);
2907
Neal Norwitzf599f422005-12-17 21:33:47 +00002908 body = ast_for_suite(c, CHILD(n, 2));
2909 if (body == NULL)
2910 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911
Neal Norwitzf599f422005-12-17 21:33:47 +00002912 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2913 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2914 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2915 /* we can assume it's an "else",
2916 because nch >= 9 for try-else-finally and
2917 it would otherwise have a type of except_clause */
2918 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2919 if (orelse == NULL)
2920 return NULL;
2921 n_except--;
2922 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923
Neal Norwitzf599f422005-12-17 21:33:47 +00002924 finally = ast_for_suite(c, CHILD(n, nch - 1));
2925 if (finally == NULL)
2926 return NULL;
2927 n_except--;
2928 }
2929 else {
2930 /* we can assume it's an "else",
2931 otherwise it would have a type of except_clause */
2932 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2933 if (orelse == NULL)
2934 return NULL;
2935 n_except--;
2936 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002938 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002939 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 return NULL;
2941 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002942
2943 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 int i;
2945 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002946 /* process except statements to create a try ... except */
2947 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2948 if (handlers == NULL)
2949 return NULL;
2950
2951 for (i = 0; i < n_except; i++) {
2952 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2953 CHILD(n, 5 + i * 3));
2954 if (!e)
2955 return NULL;
2956 asdl_seq_SET(handlers, i, e);
2957 }
2958
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002960 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002961 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002963
2964 /* if a 'finally' is present too, we nest the TryExcept within a
2965 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002966 body = asdl_seq_new(1, c->c_arena);
2967 if (body == NULL)
2968 return NULL;
2969 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002970 }
2971
2972 /* must be a try ... finally (except clauses are in body, if any exist) */
2973 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002974 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975}
2976
Guido van Rossumc2e20742006-02-27 22:32:47 +00002977static expr_ty
2978ast_for_with_var(struct compiling *c, const node *n)
2979{
2980 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002981 return ast_for_expr(c, CHILD(n, 1));
2982}
2983
2984/* with_stmt: 'with' test [ with_var ] ':' suite */
2985static stmt_ty
2986ast_for_with_stmt(struct compiling *c, const node *n)
2987{
2988 expr_ty context_expr, optional_vars = NULL;
2989 int suite_index = 3; /* skip 'with', test, and ':' */
2990 asdl_seq *suite_seq;
2991
2992 assert(TYPE(n) == with_stmt);
2993 context_expr = ast_for_expr(c, CHILD(n, 1));
2994 if (TYPE(CHILD(n, 2)) == with_var) {
2995 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2996
2997 if (!optional_vars) {
2998 return NULL;
2999 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003000 if (!set_context(optional_vars, Store, n)) {
3001 return NULL;
3002 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003003 suite_index = 4;
3004 }
3005
3006 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
3007 if (!suite_seq) {
3008 return NULL;
3009 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003010 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00003011 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003012}
3013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014static stmt_ty
3015ast_for_classdef(struct compiling *c, const node *n)
3016{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003017 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
3018 asdl_seq *s;
3019 expr_ty call, dummy;
3020
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 REQ(n, classdef);
3022
3023 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003024 ast_error(n, "assignment to None");
3025 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026 }
3027
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003028 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029 s = ast_for_suite(c, CHILD(n, 3));
3030 if (!s)
3031 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003032 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
3033 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003035
3036 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003037 s = ast_for_suite(c, CHILD(n,5));
3038 if (!s)
3039 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003040 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
3041 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 }
3043
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003044 /* class NAME '(' arglist ')' ':' suite */
3045 /* build up a fake Call node so we can extract its pieces */
3046 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
3047 call = ast_for_call(c, CHILD(n, 3), dummy);
3048 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003051 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003053
3054 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
3055 call->v.Call.args, call->v.Call.keywords,
3056 call->v.Call.starargs, call->v.Call.kwargs, s,
3057 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058}
3059
3060static stmt_ty
3061ast_for_stmt(struct compiling *c, const node *n)
3062{
3063 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003064 assert(NCH(n) == 1);
3065 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 }
3067 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 assert(num_stmts(n) == 1);
3069 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 }
3071 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003072 REQ(n, small_stmt);
3073 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003074 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3075 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003076 */
3077 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 case expr_stmt:
3079 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 case del_stmt:
3081 return ast_for_del_stmt(c, n);
3082 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003083 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 case flow_stmt:
3085 return ast_for_flow_stmt(c, n);
3086 case import_stmt:
3087 return ast_for_import_stmt(c, n);
3088 case global_stmt:
3089 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003090 case nonlocal_stmt:
3091 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 case assert_stmt:
3093 return ast_for_assert_stmt(c, n);
3094 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003095 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3097 TYPE(n), NCH(n));
3098 return NULL;
3099 }
3100 }
3101 else {
3102 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003103 | funcdef | classdef
3104 */
3105 node *ch = CHILD(n, 0);
3106 REQ(n, compound_stmt);
3107 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 case if_stmt:
3109 return ast_for_if_stmt(c, ch);
3110 case while_stmt:
3111 return ast_for_while_stmt(c, ch);
3112 case for_stmt:
3113 return ast_for_for_stmt(c, ch);
3114 case try_stmt:
3115 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003116 case with_stmt:
3117 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118 case funcdef:
3119 return ast_for_funcdef(c, ch);
3120 case classdef:
3121 return ast_for_classdef(c, ch);
3122 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003123 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3125 TYPE(n), NCH(n));
3126 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003127 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 }
3129}
3130
3131static PyObject *
3132parsenumber(const char *s)
3133{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003134 const char *end;
3135 long x;
3136 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003138 Py_complex c;
3139 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140#endif
3141
Thomas Wouters89f507f2006-12-13 04:49:30 +00003142 errno = 0;
3143 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003145 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003147 if (*end == 'l' || *end == 'L')
3148 return PyLong_FromString((char *)s, (char **)0, 0);
3149 if (s[0] == '0') {
3150 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3151 if (x < 0 && errno == 0) {
3152 return PyLong_FromString((char *)s,
3153 (char **)0,
3154 0);
3155 }
3156 }
3157 else
3158 x = PyOS_strtol((char *)s, (char **)&end, 0);
3159 if (*end == '\0') {
3160 if (errno != 0)
3161 return PyLong_FromString((char *)s, (char **)0, 0);
3162 return PyInt_FromLong(x);
3163 }
3164 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003165#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003166 if (imflag) {
3167 c.real = 0.;
3168 PyFPE_START_PROTECT("atof", return 0)
3169 c.imag = PyOS_ascii_atof(s);
3170 PyFPE_END_PROTECT(c)
3171 return PyComplex_FromCComplex(c);
3172 }
3173 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003174#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003175 {
3176 PyFPE_START_PROTECT("atof", return 0)
3177 dx = PyOS_ascii_atof(s);
3178 PyFPE_END_PROTECT(dx)
3179 return PyFloat_FromDouble(dx);
3180 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181}
3182
3183static PyObject *
3184decode_utf8(const char **sPtr, const char *end, char* encoding)
3185{
3186#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003187 Py_FatalError("decode_utf8 should not be called in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188 return NULL;
3189#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003190 PyObject *u, *v;
3191 char *s, *t;
3192 t = s = (char *)*sPtr;
3193 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3194 while (s < end && (*s & 0x80)) s++;
3195 *sPtr = s;
3196 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3197 if (u == NULL)
3198 return NULL;
3199 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3200 Py_DECREF(u);
3201 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202#endif
3203}
3204
3205static PyObject *
3206decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3207{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003208 PyObject *v, *u;
3209 char *buf;
3210 char *p;
3211 const char *end;
3212 if (encoding == NULL) {
3213 buf = (char *)s;
3214 u = NULL;
3215 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3216 buf = (char *)s;
3217 u = NULL;
3218 } else {
3219 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3220 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3221 if (u == NULL)
3222 return NULL;
3223 p = buf = PyString_AsString(u);
3224 end = s + len;
3225 while (s < end) {
3226 if (*s == '\\') {
3227 *p++ = *s++;
3228 if (*s & 0x80) {
3229 strcpy(p, "u005c");
3230 p += 5;
3231 }
3232 }
3233 if (*s & 0x80) { /* XXX inefficient */
3234 PyObject *w;
3235 char *r;
3236 Py_ssize_t rn, i;
3237 w = decode_utf8(&s, end, "utf-16-be");
3238 if (w == NULL) {
3239 Py_DECREF(u);
3240 return NULL;
3241 }
3242 r = PyString_AsString(w);
3243 rn = PyString_Size(w);
3244 assert(rn % 2 == 0);
3245 for (i = 0; i < rn; i += 2) {
3246 sprintf(p, "\\u%02x%02x",
3247 r[i + 0] & 0xFF,
3248 r[i + 1] & 0xFF);
3249 p += 6;
3250 }
3251 Py_DECREF(w);
3252 } else {
3253 *p++ = *s++;
3254 }
3255 }
3256 len = p - buf;
3257 s = buf;
3258 }
3259 if (rawmode)
3260 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3261 else
3262 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3263 Py_XDECREF(u);
3264 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265}
3266
3267/* s is a Python string literal, including the bracketing quote characters,
3268 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3269 * parsestr parses it, and returns the decoded Python string object.
3270 */
3271static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003272parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003274 size_t len;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003275 const char *s = STR(n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003276 int quote = Py_CHARMASK(*s);
3277 int rawmode = 0;
3278 int need_encoding;
3279 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280
Thomas Wouters89f507f2006-12-13 04:49:30 +00003281 if (isalpha(quote) || quote == '_') {
3282 if (quote == 'u' || quote == 'U') {
3283 quote = *++s;
3284 unicode = 1;
3285 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003286 if (quote == 'b' || quote == 'B') {
3287 quote = *++s;
3288 *bytesmode = 1;
3289 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003290 if (quote == 'r' || quote == 'R') {
3291 quote = *++s;
3292 rawmode = 1;
3293 }
3294 }
3295 if (quote != '\'' && quote != '\"') {
3296 PyErr_BadInternalCall();
3297 return NULL;
3298 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003299 if (unicode && *bytesmode) {
3300 ast_error(n, "string cannot be both bytes and unicode");
3301 return NULL;
3302 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 s++;
3304 len = strlen(s);
3305 if (len > INT_MAX) {
3306 PyErr_SetString(PyExc_OverflowError,
3307 "string to parse is too long");
3308 return NULL;
3309 }
3310 if (s[--len] != quote) {
3311 PyErr_BadInternalCall();
3312 return NULL;
3313 }
3314 if (len >= 4 && s[0] == quote && s[1] == quote) {
3315 s += 2;
3316 len -= 2;
3317 if (s[--len] != quote || s[--len] != quote) {
3318 PyErr_BadInternalCall();
3319 return NULL;
3320 }
3321 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003323 if (unicode || Py_UnicodeFlag) {
3324 return decode_unicode(s, len, rawmode, encoding);
3325 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326#endif
Thomas Wouters00e41de2007-02-23 19:56:57 +00003327 if (*bytesmode) {
3328 /* Disallow non-ascii characters (but not escapes) */
3329 const char *c;
3330 for (c = s; *c; c++) {
3331 if (Py_CHARMASK(*c) >= 0x80) {
3332 ast_error(n, "bytes can only contain ASCII "
3333 "literal characters.");
3334 return NULL;
3335 }
3336 }
3337 }
3338 need_encoding = (!*bytesmode && encoding != NULL &&
Thomas Wouters89f507f2006-12-13 04:49:30 +00003339 strcmp(encoding, "utf-8") != 0 &&
3340 strcmp(encoding, "iso-8859-1") != 0);
3341 if (rawmode || strchr(s, '\\') == NULL) {
3342 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003344 /* This should not happen - we never see any other
3345 encoding. */
3346 Py_FatalError(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003347 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003349 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3350 if (u == NULL)
3351 return NULL;
3352 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3353 Py_DECREF(u);
3354 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003356 } else {
3357 return PyString_FromStringAndSize(s, len);
3358 }
3359 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003360
Thomas Wouters89f507f2006-12-13 04:49:30 +00003361 return PyString_DecodeEscape(s, len, NULL, unicode,
3362 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363}
3364
3365/* Build a Python string object out of a STRING atom. This takes care of
3366 * compile-time literal catenation, calling parsestr() on each piece, and
3367 * pasting the intermediate results together.
3368 */
3369static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003370parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003372 PyObject *v;
3373 int i;
3374 REQ(CHILD(n, 0), STRING);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003375 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3376 if (v != NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003377 /* String literal concatenation */
3378 for (i = 1; i < NCH(n); i++) {
3379 PyObject *s;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003380 int subbm = 0;
3381 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003382 if (s == NULL)
3383 goto onError;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003384 if (*bytesmode != subbm) {
3385 ast_error(n, "cannot mix bytes and nonbytes"
3386 "literals");
3387 goto onError;
3388 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003389 if (PyString_Check(v) && PyString_Check(s)) {
3390 PyString_ConcatAndDel(&v, s);
3391 if (v == NULL)
3392 goto onError;
3393 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003395 else {
3396 PyObject *temp = PyUnicode_Concat(v, s);
3397 Py_DECREF(s);
3398 Py_DECREF(v);
3399 v = temp;
3400 if (v == NULL)
3401 goto onError;
3402 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003404 }
3405 }
3406 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407
3408 onError:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003409 Py_XDECREF(v);
3410 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411}