blob: 6f62b6c99e0dade8ec8220551900ef535d9aff6d [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 *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
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
Nick Coghlan650f0d02007-04-15 12:05:43 +000044#define COMP_GENEXP 0
45#define COMP_LISTCOMP 1
46#define COMP_SETCOMP 2
47
Neal Norwitzadb69fc2005-12-17 20:54:49 +000048static identifier
49new_identifier(const char* n, PyArena *arena) {
50 PyObject* id = PyString_InternFromString(n);
51 PyArena_AddPyObject(arena, id);
52 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000053}
54
Neal Norwitzadb69fc2005-12-17 20:54:49 +000055#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056
57/* This routine provides an invalid object for the syntax error.
58 The outermost routine must unpack this error and create the
59 proper object. We do this so that we don't have to pass
60 the filename to everything function.
61
62 XXX Maybe we should just pass the filename...
63*/
64
65static int
66ast_error(const node *n, const char *errstr)
67{
68 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
69 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000070 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000071 PyErr_SetObject(PyExc_SyntaxError, u);
72 Py_DECREF(u);
73 return 0;
74}
75
76static void
77ast_error_finish(const char *filename)
78{
79 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000080 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82 assert(PyErr_Occurred());
83 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +000084 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085
86 PyErr_Fetch(&type, &value, &tback);
87 errstr = PyTuple_GetItem(value, 0);
88 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +000089 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000090 Py_INCREF(errstr);
91 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000092 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000093 Py_DECREF(errstr);
94 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000095 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 Py_DECREF(value);
97
98 loc = PyErr_ProgramText(filename, lineno);
99 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000100 Py_INCREF(Py_None);
101 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000102 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000103 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000105 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000106 Py_DECREF(errstr);
107 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000108 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110 Py_DECREF(errstr);
111 Py_DECREF(tmp);
112 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000113 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114 PyErr_Restore(type, value, tback);
115}
116
117/* num_stmts() returns number of contained statements.
118
119 Use this routine to determine how big a sequence is needed for
120 the statements in a parse tree. Its raison d'etre is this bit of
121 grammar:
122
123 stmt: simple_stmt | compound_stmt
124 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
125
126 A simple_stmt can contain multiple small_stmt elements joined
127 by semicolons. If the arg is a simple_stmt, the number of
128 small_stmt elements is returned.
129*/
130
131static int
132num_stmts(const node *n)
133{
134 int i, l;
135 node *ch;
136
137 switch (TYPE(n)) {
138 case single_input:
139 if (TYPE(CHILD(n, 0)) == NEWLINE)
140 return 0;
141 else
142 return num_stmts(CHILD(n, 0));
143 case file_input:
144 l = 0;
145 for (i = 0; i < NCH(n); i++) {
146 ch = CHILD(n, i);
147 if (TYPE(ch) == stmt)
148 l += num_stmts(ch);
149 }
150 return l;
151 case stmt:
152 return num_stmts(CHILD(n, 0));
153 case compound_stmt:
154 return 1;
155 case simple_stmt:
156 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
157 case suite:
158 if (NCH(n) == 1)
159 return num_stmts(CHILD(n, 0));
160 else {
161 l = 0;
162 for (i = 2; i < (NCH(n) - 1); i++)
163 l += num_stmts(CHILD(n, i));
164 return l;
165 }
166 default: {
167 char buf[128];
168
169 sprintf(buf, "Non-statement found: %d %d\n",
170 TYPE(n), NCH(n));
171 Py_FatalError(buf);
172 }
173 }
174 assert(0);
175 return 0;
176}
177
178/* Transform the CST rooted at node * to the appropriate AST
179*/
180
181mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000182PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
183 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000184{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000185 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186 asdl_seq *stmts = NULL;
187 stmt_ty s;
188 node *ch;
189 struct compiling c;
190
191 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000192 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000193 if (TYPE(n) == encoding_decl) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000194 ast_error(n, "encoding declaration in Unicode string");
195 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000196 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000197 } else if (TYPE(n) == encoding_decl) {
198 c.c_encoding = STR(n);
199 n = CHILD(n, 0);
200 } else {
201 c.c_encoding = NULL;
202 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000203 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000204
Jeremy Hyltona8293132006-02-28 17:58:27 +0000205 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206 switch (TYPE(n)) {
207 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000208 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000210 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 for (i = 0; i < NCH(n) - 1; i++) {
212 ch = CHILD(n, i);
213 if (TYPE(ch) == NEWLINE)
214 continue;
215 REQ(ch, stmt);
216 num = num_stmts(ch);
217 if (num == 1) {
218 s = ast_for_stmt(&c, ch);
219 if (!s)
220 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000221 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222 }
223 else {
224 ch = CHILD(ch, 0);
225 REQ(ch, simple_stmt);
226 for (j = 0; j < num; j++) {
227 s = ast_for_stmt(&c, CHILD(ch, j * 2));
228 if (!s)
229 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000230 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
232 }
233 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000234 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000235 case eval_input: {
236 expr_ty testlist_ast;
237
Nick Coghlan650f0d02007-04-15 12:05:43 +0000238 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000239 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000240 if (!testlist_ast)
241 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000242 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000243 }
244 case single_input:
245 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000246 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000247 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000248 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000249 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
250 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000251 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 n = CHILD(n, 0);
255 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000256 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000257 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 s = ast_for_stmt(&c, n);
261 if (!s)
262 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000263 asdl_seq_SET(stmts, 0, s);
264 }
265 else {
266 /* Only a simple_stmt can contain multiple statements. */
267 REQ(n, simple_stmt);
268 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000269 if (TYPE(CHILD(n, i)) == NEWLINE)
270 break;
271 s = ast_for_stmt(&c, CHILD(n, i));
272 if (!s)
273 goto error;
274 asdl_seq_SET(stmts, i / 2, s);
275 }
276 }
277
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000278 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 }
280 default:
281 goto error;
282 }
283 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 ast_error_finish(filename);
285 return NULL;
286}
287
288/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
289*/
290
291static operator_ty
292get_operator(const node *n)
293{
294 switch (TYPE(n)) {
295 case VBAR:
296 return BitOr;
297 case CIRCUMFLEX:
298 return BitXor;
299 case AMPER:
300 return BitAnd;
301 case LEFTSHIFT:
302 return LShift;
303 case RIGHTSHIFT:
304 return RShift;
305 case PLUS:
306 return Add;
307 case MINUS:
308 return Sub;
309 case STAR:
310 return Mult;
311 case SLASH:
312 return Div;
313 case DOUBLESLASH:
314 return FloorDiv;
315 case PERCENT:
316 return Mod;
317 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000318 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319 }
320}
321
Jeremy Hyltona8293132006-02-28 17:58:27 +0000322/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323
324 Only sets context for expr kinds that "can appear in assignment context"
325 (according to ../Parser/Python.asdl). For other expr kinds, it sets
326 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327*/
328
329static int
330set_context(expr_ty e, expr_context_ty ctx, const node *n)
331{
332 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000333 /* If a particular expression type can't be used for assign / delete,
334 set expr_name to its name and an error message will be generated.
335 */
336 const char* expr_name = NULL;
337
338 /* The ast defines augmented store and load contexts, but the
339 implementation here doesn't actually use them. The code may be
340 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000341 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000342 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000343 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000344 */
345 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000346
347 switch (e->kind) {
348 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000349 if (ctx == Store &&
Guido van Rossumd8faa362007-04-27 19:54:29 +0000350 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
351 return ast_error(n, "assignment to None");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000352 }
353 e->v.Attribute.ctx = ctx;
354 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000355 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000356 e->v.Subscript.ctx = ctx;
357 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000358 case Starred_kind:
359 e->v.Starred.ctx = ctx;
360 if (!set_context(e->v.Starred.value, ctx, n))
361 return 0;
362 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363 case Name_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000364 if (ctx == Store &&
365 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
366 return ast_error(n, "assignment to None");
367 }
368 e->v.Name.ctx = ctx;
369 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000370 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000371 e->v.List.ctx = ctx;
372 s = e->v.List.elts;
373 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000374 case Tuple_kind:
375 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
376 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000377 e->v.Tuple.ctx = ctx;
378 s = e->v.Tuple.elts;
379 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 case Lambda_kind:
381 expr_name = "lambda";
382 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000384 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000385 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000386 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 case UnaryOp_kind:
389 expr_name = "operator";
390 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000391 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000392 expr_name = "generator expression";
393 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394 case Yield_kind:
395 expr_name = "yield expression";
396 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000397 case ListComp_kind:
398 expr_name = "list comprehension";
399 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000400 case SetComp_kind:
401 expr_name = "set comprehension";
402 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000404 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000405 case Num_kind:
406 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000407 expr_name = "literal";
408 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000409 case Ellipsis_kind:
410 expr_name = "Ellipsis";
411 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000412 case Compare_kind:
413 expr_name = "comparison";
414 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000415 case IfExp_kind:
416 expr_name = "conditional expression";
417 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000418 default:
419 PyErr_Format(PyExc_SystemError,
420 "unexpected expression in assignment %d (line %d)",
421 e->kind, e->lineno);
422 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000424 /* Check for error string set by switch */
425 if (expr_name) {
426 char buf[300];
427 PyOS_snprintf(buf, sizeof(buf),
428 "can't %s %s",
429 ctx == Store ? "assign to" : "delete",
430 expr_name);
431 return ast_error(n, buf);
432 }
433
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000435 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 */
437 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000438 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440 for (i = 0; i < asdl_seq_LEN(s); i++) {
441 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
442 return 0;
443 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000444 }
445 return 1;
446}
447
448static operator_ty
449ast_for_augassign(const node *n)
450{
451 REQ(n, augassign);
452 n = CHILD(n, 0);
453 switch (STR(n)[0]) {
454 case '+':
455 return Add;
456 case '-':
457 return Sub;
458 case '/':
459 if (STR(n)[1] == '/')
460 return FloorDiv;
461 else
462 return Div;
463 case '%':
464 return Mod;
465 case '<':
466 return LShift;
467 case '>':
468 return RShift;
469 case '&':
470 return BitAnd;
471 case '^':
472 return BitXor;
473 case '|':
474 return BitOr;
475 case '*':
476 if (STR(n)[1] == '*')
477 return Pow;
478 else
479 return Mult;
480 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000481 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000482 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000483 }
484}
485
486static cmpop_ty
487ast_for_comp_op(const node *n)
488{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000489 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490 |'is' 'not'
491 */
492 REQ(n, comp_op);
493 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000494 n = CHILD(n, 0);
495 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000496 case LESS:
497 return Lt;
498 case GREATER:
499 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000500 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501 return Eq;
502 case LESSEQUAL:
503 return LtE;
504 case GREATEREQUAL:
505 return GtE;
506 case NOTEQUAL:
507 return NotEq;
508 case NAME:
509 if (strcmp(STR(n), "in") == 0)
510 return In;
511 if (strcmp(STR(n), "is") == 0)
512 return Is;
513 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000514 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000516 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000517 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518 }
519 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 /* handle "not in" and "is not" */
521 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522 case NAME:
523 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
524 return NotIn;
525 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
526 return IsNot;
527 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000528 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000530 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000531 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000532 }
Neal Norwitz79792652005-11-14 04:25:03 +0000533 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000535 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000536}
537
538static asdl_seq *
539seq_for_testlist(struct compiling *c, const node *n)
540{
541 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000542 asdl_seq *seq;
543 expr_ty expression;
544 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000545 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000547 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 if (!seq)
549 return NULL;
550
551 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000552 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553
554 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000555 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000557
558 assert(i / 2 < seq->size);
559 asdl_seq_SET(seq, i / 2, expression);
560 }
561 return seq;
562}
563
Neal Norwitzc1505362006-12-28 06:47:50 +0000564static arg_ty
565compiler_simple_arg(struct compiling *c, const node *n)
566{
567 identifier name;
568 expr_ty annotation = NULL;
569 node *ch;
570
571 assert(TYPE(n) == tname || TYPE(n) == vname);
572 ch = CHILD(n, 0);
573 if (!strcmp(STR(ch), "None")) {
574 ast_error(ch, "assignment to None");
575 return NULL;
576 }
577 name = NEW_IDENTIFIER(ch);
578 if (!name)
579 return NULL;
580
581 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
582 annotation = ast_for_expr(c, CHILD(n, 2));
583 if (!annotation)
584 return NULL;
585 }
586
587 return SimpleArg(name, annotation, c->c_arena);
588}
589
590static arg_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000591compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592{
593 int i, len = (NCH(n) + 1) / 2;
Neal Norwitzc1505362006-12-28 06:47:50 +0000594 arg_ty arg;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000595 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000596 if (!args)
597 return NULL;
598
Neal Norwitzc1505362006-12-28 06:47:50 +0000599 assert(TYPE(n) == tfplist || TYPE(n) == vfplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 for (i = 0; i < len; i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000601 const node *child = CHILD(n, 2*i);
602 /* def foo(((x), y)): -- x is not nested complex, special case. */
603 while (NCH(child) == 3 && NCH(CHILD(child, 1)) == 1)
604 child = CHILD(CHILD(child, 1), 0);
605
606 /* child either holds a tname or '(', a tfplist, ')' */
607 switch (TYPE(CHILD(child, 0))) {
608 case tname:
609 case vname:
610 arg = compiler_simple_arg(c, CHILD(child, 0));
611 break;
612 case LPAR:
613 arg = compiler_complex_args(c, CHILD(child, 1));
614 break;
615 default:
616 PyErr_Format(PyExc_SystemError,
617 "unexpected node in args: %d @ %d",
618 TYPE(CHILD(child, 0)), i);
619 arg = NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000620 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000621 if (!arg)
622 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623 asdl_seq_SET(args, i, arg);
624 }
625
Neal Norwitzc1505362006-12-28 06:47:50 +0000626 return NestedArgs(args, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627}
628
Guido van Rossum4f72a782006-10-27 23:31:49 +0000629/* returns -1 if failed to handle keyword only arguments
630 returns new position to keep processing if successful
Neal Norwitzc1505362006-12-28 06:47:50 +0000631 (',' tname ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000632 ^^^
633 start pointing here
634 */
635static int
636handle_keywordonly_args(struct compiling *c, const node *n, int start,
637 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
638{
639 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000640 expr_ty expression, annotation;
641 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000642 int i = start;
643 int j = 0; /* index for kwdefaults and kwonlyargs */
644 assert(kwonlyargs != NULL);
645 assert(kwdefaults != NULL);
646 while (i < NCH(n)) {
647 ch = CHILD(n, i);
648 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000649 case vname:
650 case tname:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000651 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000652 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000653 if (!expression) {
654 ast_error(ch, "assignment to None");
655 goto error;
656 }
657 asdl_seq_SET(kwdefaults, j, expression);
658 i += 2; /* '=' and test */
659 }
660 else { /* setting NULL if no default value exists */
661 asdl_seq_SET(kwdefaults, j, NULL);
662 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000663 if (NCH(ch) == 3) {
664 /* ch is NAME ':' test */
665 annotation = ast_for_expr(c, CHILD(ch, 2));
666 if (!annotation) {
667 ast_error(ch, "expected expression");
668 goto error;
669 }
670 }
671 else {
672 annotation = NULL;
673 }
674 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000675 if (!strcmp(STR(ch), "None")) {
676 ast_error(ch, "assignment to None");
677 goto error;
678 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000679 arg = SimpleArg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
680 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000681 ast_error(ch, "expecting name");
682 goto error;
683 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000684 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000685 i += 2; /* the name and the comma */
686 break;
687 case DOUBLESTAR:
688 return i;
689 default:
690 ast_error(ch, "unexpected node");
691 goto error;
692 }
693 }
694 return i;
695 error:
696 return -1;
697}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698
Jeremy Hyltona8293132006-02-28 17:58:27 +0000699/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700
701static arguments_ty
702ast_for_arguments(struct compiling *c, const node *n)
703{
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 /* This function handles both typedargslist (function definition)
705 and varargslist (lambda definition).
706
707 parameters: '(' [typedargslist] ')'
708 typedargslist: ((tfpdef ['=' test] ',')*
709 ('*' [tname] (',' tname ['=' test])* [',' '**' tname]
710 | '**' tname)
711 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
712 varargslist: ((vfpdef ['=' test] ',')*
713 ('*' [vname] (',' vname ['=' test])* [',' '**' vname]
714 | '**' vname)
715 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000717 int i, j, k, nposargs = 0, nkwonlyargs = 0;
718 int nposdefaults = 0, found_default = 0;
719 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000721 arg_ty arg;
722 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 node *ch;
724
725 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000726 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
728 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000729 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000731 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732
Guido van Rossum4f72a782006-10-27 23:31:49 +0000733 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 ch = CHILD(n, i);
736 if (TYPE(ch) == STAR) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 if (TYPE(CHILD(n, i+1)) == tname
738 || TYPE(CHILD(n, i+1)) == vname) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000739 /* skip NAME of vararg */
740 /* so that following can count only keyword only args */
741 i += 2;
742 }
743 else {
744 i++;
745 }
746 break;
747 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000748 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000749 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000751 /* count the number of keyword only args &
752 defaults for keyword only args */
753 for ( ; i < NCH(n); ++i) {
754 ch = CHILD(n, i);
755 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 if (TYPE(ch) == tname || TYPE(ch) == vname) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000757 }
758
759 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
760 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000761 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000762 kwonlyargs = (nkwonlyargs ?
763 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
764 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000765 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 posdefaults = (nposdefaults ?
767 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
768 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000769 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000770 /* The length of kwonlyargs and kwdefaults are same
771 since we set NULL as default for keyword only argument w/o default
772 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000773 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000774 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
775 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000776 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000777
778 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000779 ast_error(n, "more than 255 arguments");
780 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782
Neal Norwitzc1505362006-12-28 06:47:50 +0000783 /* tname: NAME [':' test]
784 tfpdef: tname | '(' tfplist ')'
785 tfplist: tfpdef (',' tfpdef)* [',']
786 vname: NAME
787 vfpdef: NAME | '(' vfplist ')'
788 vfplist: vfpdef (',' vfpdef)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 */
790 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000791 j = 0; /* index for defaults */
792 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 ch = CHILD(n, i);
795 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000796 case tfpdef:
797 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
799 anything other than EQUAL or a comma? */
800 /* XXX Should NCH(n) check be made a separate check? */
801 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000802 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
803 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 goto error;
805 assert(posdefaults != NULL);
806 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000808 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810 else if (found_default) {
811 ast_error(n,
812 "non-default argument follows default argument");
813 goto error;
814 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000815 /* def foo((x)): is not complex, special case. */
816 while (NCH(ch) == 3 && NCH(CHILD(ch, 1)) == 1)
817 ch = CHILD(CHILD(ch, 1), 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000818
Neal Norwitzc1505362006-12-28 06:47:50 +0000819 if (NCH(ch) != 1)
820 arg = compiler_complex_args(c, CHILD(ch, 1));
821 else
822 arg = compiler_simple_arg(c, CHILD(ch, 0));
823 if (!arg)
824 goto error;
825 asdl_seq_SET(posargs, k++, arg);
826
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 i += 2; /* the name and the comma */
828 break;
829 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000830 if (i+1 >= NCH(n)) {
831 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000832 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000833 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000834 ch = CHILD(n, i+1); /* tname or COMMA */
835 if (TYPE(ch) == COMMA) {
836 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 i += 2; /* now follows keyword only arguments */
838 res = handle_keywordonly_args(c, n, i,
839 kwonlyargs, kwdefaults);
840 if (res == -1) goto error;
841 i = res; /* res has new position to process */
842 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000843 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
844 ast_error(CHILD(ch, 0), "assignment to None");
845 goto error;
846 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000847 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000848 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
849 if (NCH(ch) > 1) {
850 /* there is an annotation on the vararg */
851 varargannotation = ast_for_expr(c, CHILD(ch, 2));
852 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000853 i += 3;
Neal Norwitzc1505362006-12-28 06:47:50 +0000854 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tname
855 || TYPE(CHILD(n, i)) == vname)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000856 int res = 0;
857 res = handle_keywordonly_args(c, n, i,
858 kwonlyargs, kwdefaults);
859 if (res == -1) goto error;
860 i = res; /* res has new position to process */
861 }
862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863 break;
864 case DOUBLESTAR:
Neal Norwitzc1505362006-12-28 06:47:50 +0000865 ch = CHILD(n, i+1); /* tname */
866 assert(TYPE(ch) == tname || TYPE(ch) == vname);
867 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
868 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000869 goto error;
870 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000871 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
872 if (NCH(ch) > 1) {
873 /* there is an annotation on the kwarg */
874 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 i += 3;
877 break;
878 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000879 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 "unexpected node in varargslist: %d @ %d",
881 TYPE(ch), i);
882 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000883 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000885 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
886 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000888 Py_XDECREF(vararg);
889 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890 return NULL;
891}
892
893static expr_ty
894ast_for_dotted_name(struct compiling *c, const node *n)
895{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000896 expr_ty e;
897 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000898 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 int i;
900
901 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000902
903 lineno = LINENO(n);
904 col_offset = n->n_col_offset;
905
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 id = NEW_IDENTIFIER(CHILD(n, 0));
907 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000908 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000909 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000911 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912
913 for (i = 2; i < NCH(n); i+=2) {
914 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 if (!id)
916 return NULL;
917 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
918 if (!e)
919 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 }
921
922 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923}
924
925static expr_ty
926ast_for_decorator(struct compiling *c, const node *n)
927{
928 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
929 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000930 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931
932 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 REQ(CHILD(n, 0), AT);
934 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935
936 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
937 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000938 return NULL;
939
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000941 d = name_expr;
942 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 }
944 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000946 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000947 if (!d)
948 return NULL;
949 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 }
951 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000952 d = ast_for_call(c, CHILD(n, 3), name_expr);
953 if (!d)
954 return NULL;
955 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956 }
957
958 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959}
960
961static asdl_seq*
962ast_for_decorators(struct compiling *c, const node *n)
963{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000964 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000965 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 int i;
967
968 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000969 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 if (!decorator_seq)
971 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000972
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000974 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000975 if (!d)
976 return NULL;
977 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978 }
979 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980}
981
982static stmt_ty
983ast_for_funcdef(struct compiling *c, const node *n)
984{
Neal Norwitzc1505362006-12-28 06:47:50 +0000985 /* funcdef: 'def' [decorators] NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000986 identifier name;
987 arguments_ty args;
988 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 asdl_seq *decorator_seq = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000990 expr_ty returns = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 int name_i;
992
993 REQ(n, funcdef);
994
Nick Coghlan71011e22007-04-23 11:05:01 +0000995 if (NCH(n) == 6 || NCH(n) == 8) { /* decorators are present */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000996 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
997 if (!decorator_seq)
998 return NULL;
999 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 }
1001 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001002 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 }
1004
1005 name = NEW_IDENTIFIER(CHILD(n, name_i));
1006 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001007 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001009 ast_error(CHILD(n, name_i), "assignment to None");
1010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 }
1012 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1013 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001014 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001015 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1016 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1017 if (!returns)
1018 return NULL;
1019 name_i += 2;
1020 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 body = ast_for_suite(c, CHILD(n, name_i + 3));
1022 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001023 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024
Neal Norwitzc1505362006-12-28 06:47:50 +00001025 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001026 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027}
1028
1029static expr_ty
1030ast_for_lambdef(struct compiling *c, const node *n)
1031{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001032 /* lambdef: 'lambda' [varargslist] ':' test
1033 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 arguments_ty args;
1035 expr_ty expression;
1036
1037 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001038 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1039 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 if (!args)
1041 return NULL;
1042 expression = ast_for_expr(c, CHILD(n, 2));
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 else {
1047 args = ast_for_arguments(c, CHILD(n, 1));
1048 if (!args)
1049 return NULL;
1050 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001051 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 }
1054
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001055 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056}
1057
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001058static expr_ty
1059ast_for_ifexpr(struct compiling *c, const node *n)
1060{
1061 /* test: or_test 'if' or_test 'else' test */
1062 expr_ty expression, body, orelse;
1063
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001064 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001065 body = ast_for_expr(c, CHILD(n, 0));
1066 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001067 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001068 expression = ast_for_expr(c, CHILD(n, 2));
1069 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001071 orelse = ast_for_expr(c, CHILD(n, 4));
1072 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1075 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001076}
1077
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001079 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080
Nick Coghlan650f0d02007-04-15 12:05:43 +00001081 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082*/
1083
1084static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001085count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001087 int n_fors = 0;
1088 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089
Guido van Rossumd8faa362007-04-27 19:54:29 +00001090 count_comp_for:
1091 n_fors++;
1092 REQ(ch, comp_for);
1093 if (NCH(ch) == 5)
1094 ch = CHILD(ch, 4);
1095 else
1096 return n_fors;
1097 count_comp_iter:
1098 REQ(ch, comp_iter);
1099 ch = CHILD(ch, 0);
1100 if (TYPE(ch) == comp_for)
1101 goto count_comp_for;
1102 else if (TYPE(ch) == comp_if) {
1103 if (NCH(ch) == 3) {
1104 ch = CHILD(ch, 2);
1105 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001106 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001107 else
1108 return n_fors;
1109 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001110
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111 /* Should never be reached */
1112 PyErr_SetString(PyExc_SystemError,
1113 "logic error in count_comp_fors");
1114 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115}
1116
Nick Coghlan650f0d02007-04-15 12:05:43 +00001117/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118
Nick Coghlan650f0d02007-04-15 12:05:43 +00001119 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120*/
1121
1122static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001123count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001125 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126
Guido van Rossumd8faa362007-04-27 19:54:29 +00001127 while (1) {
1128 REQ(n, comp_iter);
1129 if (TYPE(CHILD(n, 0)) == comp_for)
1130 return n_ifs;
1131 n = CHILD(n, 0);
1132 REQ(n, comp_if);
1133 n_ifs++;
1134 if (NCH(n) == 2)
1135 return n_ifs;
1136 n = CHILD(n, 2);
1137 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138}
1139
1140static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001141ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001143 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1144 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001146 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 int i, n_fors;
1148 node *ch;
1149
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150 assert(NCH(n) > 1);
1151
1152 elt = ast_for_expr(c, CHILD(n, 0));
1153 if (!elt)
1154 return NULL;
1155
Nick Coghlan650f0d02007-04-15 12:05:43 +00001156 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 if (n_fors == -1)
1158 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001159
Nick Coghlan650f0d02007-04-15 12:05:43 +00001160 comps = asdl_seq_new(n_fors, c->c_arena);
1161 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +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++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001166 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 asdl_seq *t;
1168 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001169 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170
Nick Coghlan650f0d02007-04-15 12:05:43 +00001171 REQ(ch, comp_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_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001178 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +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)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001184 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1185 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001187 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1188 c->c_arena),
1189 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190
Nick Coghlan650f0d02007-04-15 12:05:43 +00001191 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001193
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 if (NCH(ch) == 5) {
1195 int j, n_ifs;
1196 asdl_seq *ifs;
1197
1198 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001199 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001201 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202
1203 ifs = asdl_seq_new(n_ifs, c->c_arena);
1204 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001206
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001208 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001210 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001212 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001213 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001214 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001215 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 if (NCH(ch) == 3)
1217 ch = CHILD(ch, 2);
1218 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001219 /* on exit, must guarantee that ch is a comp_for */
1220 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001222 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001224 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001226
1227 if (type == COMP_GENEXP)
1228 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1229 else if (type == COMP_LISTCOMP)
1230 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1231 else if (type == COMP_SETCOMP)
1232 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1233 else
1234 /* Should never happen */
1235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236}
1237
1238static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001239ast_for_genexp(struct compiling *c, const node *n)
1240{
1241 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1242 return ast_for_comprehension(c, n, COMP_GENEXP);
1243}
1244
1245static expr_ty
1246ast_for_listcomp(struct compiling *c, const node *n)
1247{
1248 assert(TYPE(n) == (testlist_comp));
1249 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1250}
1251
1252static expr_ty
1253ast_for_setcomp(struct compiling *c, const node *n)
1254{
1255 assert(TYPE(n) == (dictorsetmaker));
1256 return ast_for_comprehension(c, n, COMP_SETCOMP);
1257}
1258
1259
1260static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261ast_for_atom(struct compiling *c, const node *n)
1262{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001263 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1264 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 */
1266 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001267 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268
1269 switch (TYPE(ch)) {
1270 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001271 /* All names start in Load context, but may later be
1272 changed. */
1273 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001275 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001276 if (!str)
1277 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001278
Thomas Wouters89f507f2006-12-13 04:49:30 +00001279 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001280 if (bytesmode)
1281 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1282 else
1283 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 }
1285 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001286 PyObject *pynum = parsenumber(STR(ch));
1287 if (!pynum)
1288 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001289
Thomas Wouters89f507f2006-12-13 04:49:30 +00001290 PyArena_AddPyObject(c->c_arena, pynum);
1291 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001292 }
Georg Brandldde00282007-03-18 19:01:53 +00001293 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001294 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001295 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001296 ch = CHILD(n, 1);
1297
1298 if (TYPE(ch) == RPAR)
1299 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1300
1301 if (TYPE(ch) == yield_expr)
1302 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001303
1304 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1305 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001306 return ast_for_genexp(c, ch);
1307
Nick Coghlan650f0d02007-04-15 12:05:43 +00001308 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001310 ch = CHILD(n, 1);
1311
1312 if (TYPE(ch) == RSQB)
1313 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1314
Nick Coghlan650f0d02007-04-15 12:05:43 +00001315 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001316 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1317 asdl_seq *elts = seq_for_testlist(c, ch);
1318 if (!elts)
1319 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001320
Thomas Wouters89f507f2006-12-13 04:49:30 +00001321 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1322 }
1323 else
1324 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001325 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001326 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1327 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001328 int i, size;
1329 asdl_seq *keys, *values;
1330
1331 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001332 if (TYPE(ch) == RBRACE) {
1333 /* it's an empty dict */
1334 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1335 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1336 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001337 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001338 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001339 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001340 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001341 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001342 for (i = 0; i < NCH(ch); i += 2) {
1343 expr_ty expression;
1344 expression = ast_for_expr(c, CHILD(ch, i));
1345 if (!expression)
1346 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001347 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001348 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001349 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1350 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1351 /* it's a set comprehension */
1352 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001353 } else {
1354 /* it's a dict */
1355 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1356 keys = asdl_seq_new(size, c->c_arena);
1357 if (!keys)
1358 return NULL;
1359
1360 values = asdl_seq_new(size, c->c_arena);
1361 if (!values)
1362 return NULL;
1363
1364 for (i = 0; i < NCH(ch); i += 4) {
1365 expr_ty expression;
1366
1367 expression = ast_for_expr(c, CHILD(ch, i));
1368 if (!expression)
1369 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001370
Guido van Rossum86e58e22006-08-28 15:27:34 +00001371 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001372
Guido van Rossum86e58e22006-08-28 15:27:34 +00001373 expression = ast_for_expr(c, CHILD(ch, i + 2));
1374 if (!expression)
1375 return NULL;
1376
1377 asdl_seq_SET(values, i / 4, expression);
1378 }
1379 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1380 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001383 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1384 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 }
1386}
1387
1388static slice_ty
1389ast_for_slice(struct compiling *c, const node *n)
1390{
1391 node *ch;
1392 expr_ty lower = NULL, upper = NULL, step = NULL;
1393
1394 REQ(n, subscript);
1395
1396 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001397 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 sliceop: ':' [test]
1399 */
1400 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 if (NCH(n) == 1 && TYPE(ch) == test) {
1402 /* 'step' variable hold no significance in terms of being used over
1403 other vars */
1404 step = ast_for_expr(c, ch);
1405 if (!step)
1406 return NULL;
1407
Thomas Wouters89f507f2006-12-13 04:49:30 +00001408 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 }
1410
1411 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001412 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 if (!lower)
1414 return NULL;
1415 }
1416
1417 /* If there's an upper bound it's in the second or third position. */
1418 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001419 if (NCH(n) > 1) {
1420 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 if (TYPE(n2) == test) {
1423 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 if (!upper)
1425 return NULL;
1426 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001427 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430
Thomas Wouters89f507f2006-12-13 04:49:30 +00001431 if (TYPE(n2) == test) {
1432 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433 if (!upper)
1434 return NULL;
1435 }
1436 }
1437
1438 ch = CHILD(n, NCH(n) - 1);
1439 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001440 if (NCH(ch) == 1) {
1441 /* No expression, so step is None */
1442 ch = CHILD(ch, 0);
1443 step = Name(new_identifier("None", c->c_arena), Load,
1444 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 if (!step)
1446 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001447 } else {
1448 ch = CHILD(ch, 1);
1449 if (TYPE(ch) == test) {
1450 step = ast_for_expr(c, ch);
1451 if (!step)
1452 return NULL;
1453 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 }
1455 }
1456
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001457 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458}
1459
1460static expr_ty
1461ast_for_binop(struct compiling *c, const node *n)
1462{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001463 /* Must account for a sequence of expressions.
1464 How should A op B op C by represented?
1465 BinOp(BinOp(A, op, B), op, C).
1466 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467
Guido van Rossumd8faa362007-04-27 19:54:29 +00001468 int i, nops;
1469 expr_ty expr1, expr2, result;
1470 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471
Guido van Rossumd8faa362007-04-27 19:54:29 +00001472 expr1 = ast_for_expr(c, CHILD(n, 0));
1473 if (!expr1)
1474 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475
Guido van Rossumd8faa362007-04-27 19:54:29 +00001476 expr2 = ast_for_expr(c, CHILD(n, 2));
1477 if (!expr2)
1478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479
Guido van Rossumd8faa362007-04-27 19:54:29 +00001480 newoperator = get_operator(CHILD(n, 1));
1481 if (!newoperator)
1482 return NULL;
1483
1484 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1485 c->c_arena);
1486 if (!result)
1487 return NULL;
1488
1489 nops = (NCH(n) - 1) / 2;
1490 for (i = 1; i < nops; i++) {
1491 expr_ty tmp_result, tmp;
1492 const node* next_oper = CHILD(n, i * 2 + 1);
1493
1494 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001495 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 return NULL;
1497
Guido van Rossumd8faa362007-04-27 19:54:29 +00001498 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1499 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 return NULL;
1501
Guido van Rossumd8faa362007-04-27 19:54:29 +00001502 tmp_result = BinOp(result, newoperator, tmp,
1503 LINENO(next_oper), next_oper->n_col_offset,
1504 c->c_arena);
1505 if (!tmp)
1506 return NULL;
1507 result = tmp_result;
1508 }
1509 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510}
1511
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001512static expr_ty
1513ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1514{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001515 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1516 subscriptlist: subscript (',' subscript)* [',']
1517 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1518 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001519 REQ(n, trailer);
1520 if (TYPE(CHILD(n, 0)) == LPAR) {
1521 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001522 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1523 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001525 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001526 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001527 else if (TYPE(CHILD(n, 0)) == DOT ) {
1528 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001529 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001530 }
1531 else {
1532 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001533 REQ(CHILD(n, 2), RSQB);
1534 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001535 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001536 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1537 if (!slc)
1538 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001539 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1540 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001541 }
1542 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001543 /* The grammar is ambiguous here. The ambiguity is resolved
1544 by treating the sequence as a tuple literal if there are
1545 no slice features.
1546 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001547 int j;
1548 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001549 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001550 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001551 asdl_seq *slices, *elts;
1552 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001553 if (!slices)
1554 return NULL;
1555 for (j = 0; j < NCH(n); j += 2) {
1556 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001557 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001558 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001559 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001560 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001561 asdl_seq_SET(slices, j / 2, slc);
1562 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001563 if (!simple) {
1564 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001565 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001566 }
1567 /* extract Index values and put them in a Tuple */
1568 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001569 if (!elts)
1570 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001571 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1572 slc = (slice_ty)asdl_seq_GET(slices, j);
1573 assert(slc->kind == Index_kind && slc->v.Index.value);
1574 asdl_seq_SET(elts, j, slc->v.Index.value);
1575 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001576 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001577 if (!e)
1578 return NULL;
1579 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001580 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001581 }
1582 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001583}
1584
1585static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001586ast_for_factor(struct compiling *c, const node *n)
1587{
1588 node *pfactor, *ppower, *patom, *pnum;
1589 expr_ty expression;
1590
1591 /* If the unary - operator is applied to a constant, don't generate
1592 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1593 constant. The peephole optimizer already does something like
1594 this but it doesn't handle the case where the constant is
1595 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1596 PyLongObject.
1597 */
1598 if (TYPE(CHILD(n, 0)) == MINUS
1599 && NCH(n) == 2
1600 && TYPE((pfactor = CHILD(n, 1))) == factor
1601 && NCH(pfactor) == 1
1602 && TYPE((ppower = CHILD(pfactor, 0))) == power
1603 && NCH(ppower) == 1
1604 && TYPE((patom = CHILD(ppower, 0))) == atom
1605 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1606 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1607 if (s == NULL)
1608 return NULL;
1609 s[0] = '-';
1610 strcpy(s + 1, STR(pnum));
1611 PyObject_FREE(STR(pnum));
1612 STR(pnum) = s;
1613 return ast_for_atom(c, patom);
1614 }
1615
1616 expression = ast_for_expr(c, CHILD(n, 1));
1617 if (!expression)
1618 return NULL;
1619
1620 switch (TYPE(CHILD(n, 0))) {
1621 case PLUS:
1622 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1623 c->c_arena);
1624 case MINUS:
1625 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1626 c->c_arena);
1627 case TILDE:
1628 return UnaryOp(Invert, expression, LINENO(n),
1629 n->n_col_offset, c->c_arena);
1630 }
1631 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1632 TYPE(CHILD(n, 0)));
1633 return NULL;
1634}
1635
1636static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637ast_for_power(struct compiling *c, const node *n)
1638{
1639 /* power: atom trailer* ('**' factor)*
1640 */
1641 int i;
1642 expr_ty e, tmp;
1643 REQ(n, power);
1644 e = ast_for_atom(c, CHILD(n, 0));
1645 if (!e)
1646 return NULL;
1647 if (NCH(n) == 1)
1648 return e;
1649 for (i = 1; i < NCH(n); i++) {
1650 node *ch = CHILD(n, i);
1651 if (TYPE(ch) != trailer)
1652 break;
1653 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001654 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001655 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001656 tmp->lineno = e->lineno;
1657 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001658 e = tmp;
1659 }
1660 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1661 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001662 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001663 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001664 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001665 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001666 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001667 e = tmp;
1668 }
1669 return e;
1670}
1671
Guido van Rossum0368b722007-05-11 16:50:42 +00001672static expr_ty
1673ast_for_starred(struct compiling *c, const node *n)
1674{
1675 expr_ty tmp;
1676 REQ(n, star_expr);
1677
1678 tmp = ast_for_expr(c, CHILD(n, 1));
1679 if (!tmp)
1680 return NULL;
1681
1682 /* The Load context is changed later. */
1683 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1684}
1685
1686
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687/* Do not name a variable 'expr'! Will cause a compile error.
1688*/
1689
1690static expr_ty
1691ast_for_expr(struct compiling *c, const node *n)
1692{
1693 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001694 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001695 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001696 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 and_test: not_test ('and' not_test)*
1698 not_test: 'not' not_test | comparison
1699 comparison: expr (comp_op expr)*
1700 expr: xor_expr ('|' xor_expr)*
1701 xor_expr: and_expr ('^' and_expr)*
1702 and_expr: shift_expr ('&' shift_expr)*
1703 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1704 arith_expr: term (('+'|'-') term)*
1705 term: factor (('*'|'/'|'%'|'//') factor)*
1706 factor: ('+'|'-'|'~') factor | power
1707 power: atom trailer* ('**' factor)*
1708 */
1709
1710 asdl_seq *seq;
1711 int i;
1712
1713 loop:
1714 switch (TYPE(n)) {
1715 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001716 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001717 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001718 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001720 else if (NCH(n) > 1)
1721 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001722 /* Fallthrough */
1723 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 case and_test:
1725 if (NCH(n) == 1) {
1726 n = CHILD(n, 0);
1727 goto loop;
1728 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001729 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 if (!seq)
1731 return NULL;
1732 for (i = 0; i < NCH(n); i += 2) {
1733 expr_ty e = ast_for_expr(c, CHILD(n, i));
1734 if (!e)
1735 return NULL;
1736 asdl_seq_SET(seq, i / 2, e);
1737 }
1738 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001739 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1740 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001741 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001742 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 case not_test:
1744 if (NCH(n) == 1) {
1745 n = CHILD(n, 0);
1746 goto loop;
1747 }
1748 else {
1749 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1750 if (!expression)
1751 return NULL;
1752
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001753 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1754 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755 }
1756 case comparison:
1757 if (NCH(n) == 1) {
1758 n = CHILD(n, 0);
1759 goto loop;
1760 }
1761 else {
1762 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001763 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001764 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001765 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 if (!ops)
1767 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001768 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770 return NULL;
1771 }
1772 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001773 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001775 newoperator = ast_for_comp_op(CHILD(n, i));
1776 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001778 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779
1780 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001781 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001783 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001785 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 asdl_seq_SET(cmps, i / 2, expression);
1787 }
1788 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001789 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001791 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001793 return Compare(expression, ops, cmps, LINENO(n),
1794 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795 }
1796 break;
1797
Guido van Rossum0368b722007-05-11 16:50:42 +00001798 case star_expr:
1799 if (TYPE(CHILD(n, 0)) == STAR) {
1800 return ast_for_starred(c, n);
1801 }
1802 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 /* The next five cases all handle BinOps. The main body of code
1804 is the same in each case, but the switch turned inside out to
1805 reuse the code for each type of operator.
1806 */
1807 case expr:
1808 case xor_expr:
1809 case and_expr:
1810 case shift_expr:
1811 case arith_expr:
1812 case term:
1813 if (NCH(n) == 1) {
1814 n = CHILD(n, 0);
1815 goto loop;
1816 }
1817 return ast_for_binop(c, n);
1818 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001819 expr_ty exp = NULL;
1820 if (NCH(n) == 2) {
1821 exp = ast_for_testlist(c, CHILD(n, 1));
1822 if (!exp)
1823 return NULL;
1824 }
1825 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1826 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001827 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 if (NCH(n) == 1) {
1829 n = CHILD(n, 0);
1830 goto loop;
1831 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001832 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001833 case power:
1834 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001836 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 return NULL;
1838 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001839 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 return NULL;
1841}
1842
1843static expr_ty
1844ast_for_call(struct compiling *c, const node *n, expr_ty func)
1845{
1846 /*
1847 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1848 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001849 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850 */
1851
1852 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001853 asdl_seq *args;
1854 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 expr_ty vararg = NULL, kwarg = NULL;
1856
1857 REQ(n, arglist);
1858
1859 nargs = 0;
1860 nkeywords = 0;
1861 ngens = 0;
1862 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 node *ch = CHILD(n, i);
1864 if (TYPE(ch) == argument) {
1865 if (NCH(ch) == 1)
1866 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001867 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 nkeywords++;
1871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001874 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 "if not sole argument");
1876 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 }
1878
1879 if (nargs + nkeywords + ngens > 255) {
1880 ast_error(n, "more than 255 arguments");
1881 return NULL;
1882 }
1883
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001884 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001886 return NULL;
1887 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 nargs = 0;
1891 nkeywords = 0;
1892 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 node *ch = CHILD(n, i);
1894 if (TYPE(ch) == argument) {
1895 expr_ty e;
1896 if (NCH(ch) == 1) {
1897 if (nkeywords) {
1898 ast_error(CHILD(ch, 0),
1899 "non-keyword arg after keyword arg");
1900 return NULL;
1901 }
1902 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001904 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 asdl_seq_SET(args, nargs++, e);
1906 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001907 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001910 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001913 else {
1914 keyword_ty kw;
1915 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916
Thomas Wouters89f507f2006-12-13 04:49:30 +00001917 /* CHILD(ch, 0) is test, but must be an identifier? */
1918 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001920 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 /* f(lambda x: x[0] = 3) ends up getting parsed with
1922 * LHS test = lambda x: x[0], and RHS test = 3.
1923 * SF bug 132313 points out that complaining about a keyword
1924 * then is very confusing.
1925 */
1926 if (e->kind == Lambda_kind) {
1927 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001928 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 } else if (e->kind != Name_kind) {
1930 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001931 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 key = e->v.Name.id;
1934 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001935 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001936 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001937 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001939 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001940 asdl_seq_SET(keywords, nkeywords++, kw);
1941 }
1942 }
1943 else if (TYPE(ch) == STAR) {
1944 vararg = ast_for_expr(c, CHILD(n, i+1));
1945 i++;
1946 }
1947 else if (TYPE(ch) == DOUBLESTAR) {
1948 kwarg = ast_for_expr(c, CHILD(n, i+1));
1949 i++;
1950 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 }
1952
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001953 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954}
1955
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001957ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001959 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001960 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001961 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001963 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001964 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001965 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001966 }
1967 else {
1968 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001969 TYPE(n) == testlist1);
1970 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001972 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 else {
1974 asdl_seq *tmp = seq_for_testlist(c, n);
1975 if (!tmp)
1976 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001977 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001979}
1980
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981static stmt_ty
1982ast_for_expr_stmt(struct compiling *c, const node *n)
1983{
1984 REQ(n, expr_stmt);
1985 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1986 | ('=' (yield_expr|testlist))*)
1987 testlist: test (',' test)* [',']
1988 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 test: ... here starts the operator precendence dance
1991 */
1992
1993 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 if (!e)
1996 return NULL;
1997
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 }
2000 else if (TYPE(CHILD(n, 1)) == augassign) {
2001 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002002 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!expr1)
2007 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002008 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002009 switch (expr1->kind) {
2010 case GeneratorExp_kind:
2011 ast_error(ch, "augmented assignment to generator "
2012 "expression not possible");
2013 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002014 case Yield_kind:
2015 ast_error(ch, "augmented assignment to yield "
2016 "expression not possible");
2017 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002018 case Name_kind: {
2019 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
2020 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
2021 ast_error(ch, "assignment to None");
2022 return NULL;
2023 }
2024 break;
2025 }
2026 case Attribute_kind:
2027 case Subscript_kind:
2028 break;
2029 default:
2030 ast_error(ch, "illegal expression for augmented "
2031 "assignment");
2032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035
Thomas Wouters89f507f2006-12-13 04:49:30 +00002036 ch = CHILD(n, 2);
2037 if (TYPE(ch) == testlist)
2038 expr2 = ast_for_testlist(c, ch);
2039 else
2040 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002041 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 return NULL;
2043
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002044 newoperator = ast_for_augassign(CHILD(n, 1));
2045 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 return NULL;
2047
Thomas Wouters89f507f2006-12-13 04:49:30 +00002048 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 }
2050 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002051 int i;
2052 asdl_seq *targets;
2053 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 expr_ty expression;
2055
Thomas Wouters89f507f2006-12-13 04:49:30 +00002056 /* a normal assignment */
2057 REQ(CHILD(n, 1), EQUAL);
2058 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2059 if (!targets)
2060 return NULL;
2061 for (i = 0; i < NCH(n) - 2; i += 2) {
2062 expr_ty e;
2063 node *ch = CHILD(n, i);
2064 if (TYPE(ch) == yield_expr) {
2065 ast_error(ch, "assignment to yield expression not possible");
2066 return NULL;
2067 }
2068 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069
Thomas Wouters89f507f2006-12-13 04:49:30 +00002070 /* set context to assign */
2071 if (!e)
2072 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073
Thomas Wouters89f507f2006-12-13 04:49:30 +00002074 if (!set_context(e, Store, CHILD(n, i)))
2075 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076
Thomas Wouters89f507f2006-12-13 04:49:30 +00002077 asdl_seq_SET(targets, i / 2, e);
2078 }
2079 value = CHILD(n, NCH(n) - 1);
2080 if (TYPE(value) == testlist)
2081 expression = ast_for_testlist(c, value);
2082 else
2083 expression = ast_for_expr(c, value);
2084 if (!expression)
2085 return NULL;
2086 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088}
2089
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002091ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092{
2093 asdl_seq *seq;
2094 int i;
2095 expr_ty e;
2096
2097 REQ(n, exprlist);
2098
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002099 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002101 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002103 e = ast_for_expr(c, CHILD(n, i));
2104 if (!e)
2105 return NULL;
2106 asdl_seq_SET(seq, i / 2, e);
2107 if (context && !set_context(e, context, CHILD(n, i)))
2108 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 }
2110 return seq;
2111}
2112
2113static stmt_ty
2114ast_for_del_stmt(struct compiling *c, const node *n)
2115{
2116 asdl_seq *expr_list;
2117
2118 /* del_stmt: 'del' exprlist */
2119 REQ(n, del_stmt);
2120
2121 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2122 if (!expr_list)
2123 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002124 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125}
2126
2127static stmt_ty
2128ast_for_flow_stmt(struct compiling *c, const node *n)
2129{
2130 /*
2131 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2132 | yield_stmt
2133 break_stmt: 'break'
2134 continue_stmt: 'continue'
2135 return_stmt: 'return' [testlist]
2136 yield_stmt: yield_expr
2137 yield_expr: 'yield' testlist
2138 raise_stmt: 'raise' [test [',' test [',' test]]]
2139 */
2140 node *ch;
2141
2142 REQ(n, flow_stmt);
2143 ch = CHILD(n, 0);
2144 switch (TYPE(ch)) {
2145 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002146 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002148 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2151 if (!exp)
2152 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002153 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 }
2155 case return_stmt:
2156 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002157 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002159 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 if (!expression)
2161 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002162 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 }
2164 case raise_stmt:
2165 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002166 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 else if (NCH(ch) == 2) {
2168 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2169 if (!expression)
2170 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002171 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 }
2173 else if (NCH(ch) == 4) {
2174 expr_ty expr1, expr2;
2175
2176 expr1 = ast_for_expr(c, CHILD(ch, 1));
2177 if (!expr1)
2178 return NULL;
2179 expr2 = ast_for_expr(c, CHILD(ch, 3));
2180 if (!expr2)
2181 return NULL;
2182
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002183 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184 }
2185 else if (NCH(ch) == 6) {
2186 expr_ty expr1, expr2, expr3;
2187
2188 expr1 = ast_for_expr(c, CHILD(ch, 1));
2189 if (!expr1)
2190 return NULL;
2191 expr2 = ast_for_expr(c, CHILD(ch, 3));
2192 if (!expr2)
2193 return NULL;
2194 expr3 = ast_for_expr(c, CHILD(ch, 5));
2195 if (!expr3)
2196 return NULL;
2197
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002198 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199 }
2200 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002201 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202 "unexpected flow_stmt: %d", TYPE(ch));
2203 return NULL;
2204 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002205
2206 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208}
2209
2210static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002211alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212{
2213 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002214 import_as_name: NAME ['as' NAME]
2215 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 dotted_name: NAME ('.' NAME)*
2217 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002218 PyObject *str;
2219
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 loop:
2221 switch (TYPE(n)) {
2222 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002223 str = NULL;
2224 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002225 str = NEW_IDENTIFIER(CHILD(n, 2));
2226 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002227 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 case dotted_as_name:
2229 if (NCH(n) == 1) {
2230 n = CHILD(n, 0);
2231 goto loop;
2232 }
2233 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002234 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002235 if (!a)
2236 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 assert(!a->asname);
2238 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2239 return a;
2240 }
2241 break;
2242 case dotted_name:
2243 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002244 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 else {
2246 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002247 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002248 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 char *s;
2250
2251 len = 0;
2252 for (i = 0; i < NCH(n); i += 2)
2253 /* length of string plus one for the dot */
2254 len += strlen(STR(CHILD(n, i))) + 1;
2255 len--; /* the last name doesn't have a dot */
2256 str = PyString_FromStringAndSize(NULL, len);
2257 if (!str)
2258 return NULL;
2259 s = PyString_AS_STRING(str);
2260 if (!s)
2261 return NULL;
2262 for (i = 0; i < NCH(n); i += 2) {
2263 char *sch = STR(CHILD(n, i));
2264 strcpy(s, STR(CHILD(n, i)));
2265 s += strlen(sch);
2266 *s++ = '.';
2267 }
2268 --s;
2269 *s = '\0';
2270 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002271 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002272 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 }
2274 break;
2275 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002276 str = PyString_InternFromString("*");
2277 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002278 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002280 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 "unexpected import name: %d", TYPE(n));
2282 return NULL;
2283 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002284
2285 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 return NULL;
2287}
2288
2289static stmt_ty
2290ast_for_import_stmt(struct compiling *c, const node *n)
2291{
2292 /*
2293 import_stmt: import_name | import_from
2294 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002295 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2296 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002298 int lineno;
2299 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300 int i;
2301 asdl_seq *aliases;
2302
2303 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002304 lineno = LINENO(n);
2305 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002307 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002309 REQ(n, dotted_as_names);
2310 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2311 if (!aliases)
2312 return NULL;
2313 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002314 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002315 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002317 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002319 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002321 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002323 int idx, ndots = 0;
2324 alias_ty mod = NULL;
2325 identifier modname;
2326
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002327 /* Count the number of dots (for relative imports) and check for the
2328 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002329 for (idx = 1; idx < NCH(n); idx++) {
2330 if (TYPE(CHILD(n, idx)) == dotted_name) {
2331 mod = alias_for_import_name(c, CHILD(n, idx));
2332 idx++;
2333 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002334 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2335 /* three consecutive dots are tokenized as one ELLIPSIS */
2336 ndots += 3;
2337 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 } else if (TYPE(CHILD(n, idx)) != DOT) {
2339 break;
2340 }
2341 ndots++;
2342 }
2343 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002344 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002345 case STAR:
2346 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002347 n = CHILD(n, idx);
2348 n_children = 1;
2349 if (ndots) {
2350 ast_error(n, "'import *' not allowed with 'from .'");
2351 return NULL;
2352 }
2353 break;
2354 case LPAR:
2355 /* from ... import (x, y, z) */
2356 n = CHILD(n, idx + 1);
2357 n_children = NCH(n);
2358 break;
2359 case import_as_names:
2360 /* from ... import x, y, z */
2361 n = CHILD(n, idx);
2362 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002363 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 ast_error(n, "trailing comma not allowed without"
2365 " surrounding parentheses");
2366 return NULL;
2367 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002368 break;
2369 default:
2370 ast_error(n, "Unexpected node-type in from-import");
2371 return NULL;
2372 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373
Thomas Wouters89f507f2006-12-13 04:49:30 +00002374 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2375 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377
2378 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002379 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002380 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002381 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002382 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002383 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002385 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002386 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002387 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2388 if (!import_alias)
2389 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002391 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002393 if (mod != NULL)
2394 modname = mod->name;
2395 else
2396 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002397 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002398 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 }
Neal Norwitz79792652005-11-14 04:25:03 +00002400 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 "unknown import statement: starts with command '%s'",
2402 STR(CHILD(n, 0)));
2403 return NULL;
2404}
2405
2406static stmt_ty
2407ast_for_global_stmt(struct compiling *c, const node *n)
2408{
2409 /* global_stmt: 'global' NAME (',' NAME)* */
2410 identifier name;
2411 asdl_seq *s;
2412 int i;
2413
2414 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002415 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002419 name = NEW_IDENTIFIER(CHILD(n, i));
2420 if (!name)
2421 return NULL;
2422 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002424 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425}
2426
2427static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002428ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2429{
2430 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2431 identifier name;
2432 asdl_seq *s;
2433 int i;
2434
2435 REQ(n, nonlocal_stmt);
2436 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2437 if (!s)
2438 return NULL;
2439 for (i = 1; i < NCH(n); i += 2) {
2440 name = NEW_IDENTIFIER(CHILD(n, i));
2441 if (!name)
2442 return NULL;
2443 asdl_seq_SET(s, i / 2, name);
2444 }
2445 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2446}
2447
2448static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449ast_for_assert_stmt(struct compiling *c, const node *n)
2450{
2451 /* assert_stmt: 'assert' test [',' test] */
2452 REQ(n, assert_stmt);
2453 if (NCH(n) == 2) {
2454 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2455 if (!expression)
2456 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 }
2459 else if (NCH(n) == 4) {
2460 expr_ty expr1, expr2;
2461
2462 expr1 = ast_for_expr(c, CHILD(n, 1));
2463 if (!expr1)
2464 return NULL;
2465 expr2 = ast_for_expr(c, CHILD(n, 3));
2466 if (!expr2)
2467 return NULL;
2468
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 }
Neal Norwitz79792652005-11-14 04:25:03 +00002471 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 "improper number of parts to 'assert' statement: %d",
2473 NCH(n));
2474 return NULL;
2475}
2476
2477static asdl_seq *
2478ast_for_suite(struct compiling *c, const node *n)
2479{
2480 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002481 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 stmt_ty s;
2483 int i, total, num, end, pos = 0;
2484 node *ch;
2485
2486 REQ(n, suite);
2487
2488 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002489 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002491 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493 n = CHILD(n, 0);
2494 /* simple_stmt always ends with a NEWLINE,
2495 and may have a trailing SEMI
2496 */
2497 end = NCH(n) - 1;
2498 if (TYPE(CHILD(n, end - 1)) == SEMI)
2499 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002501 for (i = 0; i < end; i += 2) {
2502 ch = CHILD(n, i);
2503 s = ast_for_stmt(c, ch);
2504 if (!s)
2505 return NULL;
2506 asdl_seq_SET(seq, pos++, s);
2507 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 }
2509 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 for (i = 2; i < (NCH(n) - 1); i++) {
2511 ch = CHILD(n, i);
2512 REQ(ch, stmt);
2513 num = num_stmts(ch);
2514 if (num == 1) {
2515 /* small_stmt or compound_stmt with only one child */
2516 s = ast_for_stmt(c, ch);
2517 if (!s)
2518 return NULL;
2519 asdl_seq_SET(seq, pos++, s);
2520 }
2521 else {
2522 int j;
2523 ch = CHILD(ch, 0);
2524 REQ(ch, simple_stmt);
2525 for (j = 0; j < NCH(ch); j += 2) {
2526 /* statement terminates with a semi-colon ';' */
2527 if (NCH(CHILD(ch, j)) == 0) {
2528 assert((j + 1) == NCH(ch));
2529 break;
2530 }
2531 s = ast_for_stmt(c, CHILD(ch, j));
2532 if (!s)
2533 return NULL;
2534 asdl_seq_SET(seq, pos++, s);
2535 }
2536 }
2537 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 }
2539 assert(pos == seq->size);
2540 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541}
2542
2543static stmt_ty
2544ast_for_if_stmt(struct compiling *c, const node *n)
2545{
2546 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2547 ['else' ':' suite]
2548 */
2549 char *s;
2550
2551 REQ(n, if_stmt);
2552
2553 if (NCH(n) == 4) {
2554 expr_ty expression;
2555 asdl_seq *suite_seq;
2556
2557 expression = ast_for_expr(c, CHILD(n, 1));
2558 if (!expression)
2559 return NULL;
2560 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002561 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 return NULL;
2563
Guido van Rossumd8faa362007-04-27 19:54:29 +00002564 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2565 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002567
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 s = STR(CHILD(n, 4));
2569 /* s[2], the third character in the string, will be
2570 's' for el_s_e, or
2571 'i' for el_i_f
2572 */
2573 if (s[2] == 's') {
2574 expr_ty expression;
2575 asdl_seq *seq1, *seq2;
2576
2577 expression = ast_for_expr(c, CHILD(n, 1));
2578 if (!expression)
2579 return NULL;
2580 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002581 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 return NULL;
2583 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002584 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585 return NULL;
2586
Guido van Rossumd8faa362007-04-27 19:54:29 +00002587 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2588 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 }
2590 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002591 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002592 expr_ty expression;
2593 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 asdl_seq *orelse = NULL;
2595 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 /* must reference the child n_elif+1 since 'else' token is third,
2597 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2599 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2600 has_else = 1;
2601 n_elif -= 3;
2602 }
2603 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604
Thomas Wouters89f507f2006-12-13 04:49:30 +00002605 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002606 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607
Thomas Wouters89f507f2006-12-13 04:49:30 +00002608 orelse = asdl_seq_new(1, c->c_arena);
2609 if (!orelse)
2610 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002612 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002614 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2615 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002617 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2618 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620
Guido van Rossumd8faa362007-04-27 19:54:29 +00002621 asdl_seq_SET(orelse, 0,
2622 If(expression, suite_seq, suite_seq2,
2623 LINENO(CHILD(n, NCH(n) - 6)),
2624 CHILD(n, NCH(n) - 6)->n_col_offset,
2625 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626 /* the just-created orelse handled the last elif */
2627 n_elif--;
2628 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 for (i = 0; i < n_elif; i++) {
2631 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002632 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2633 if (!newobj)
2634 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002636 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002639 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641
Thomas Wouters89f507f2006-12-13 04:49:30 +00002642 asdl_seq_SET(newobj, 0,
2643 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002644 LINENO(CHILD(n, off)),
2645 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002646 orelse = newobj;
2647 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002648 expression = ast_for_expr(c, CHILD(n, 1));
2649 if (!expression)
2650 return NULL;
2651 suite_seq = ast_for_suite(c, CHILD(n, 3));
2652 if (!suite_seq)
2653 return NULL;
2654 return If(expression, suite_seq, orelse,
2655 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002657
2658 PyErr_Format(PyExc_SystemError,
2659 "unexpected token in 'if' statement: %s", s);
2660 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661}
2662
2663static stmt_ty
2664ast_for_while_stmt(struct compiling *c, const node *n)
2665{
2666 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2667 REQ(n, while_stmt);
2668
2669 if (NCH(n) == 4) {
2670 expr_ty expression;
2671 asdl_seq *suite_seq;
2672
2673 expression = ast_for_expr(c, CHILD(n, 1));
2674 if (!expression)
2675 return NULL;
2676 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002679 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 }
2681 else if (NCH(n) == 7) {
2682 expr_ty expression;
2683 asdl_seq *seq1, *seq2;
2684
2685 expression = ast_for_expr(c, CHILD(n, 1));
2686 if (!expression)
2687 return NULL;
2688 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002689 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 return NULL;
2691 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002692 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 return NULL;
2694
Thomas Wouters89f507f2006-12-13 04:49:30 +00002695 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002697
2698 PyErr_Format(PyExc_SystemError,
2699 "wrong number of tokens for 'while' statement: %d",
2700 NCH(n));
2701 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702}
2703
2704static stmt_ty
2705ast_for_for_stmt(struct compiling *c, const node *n)
2706{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002707 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 expr_ty expression;
2709 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002710 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2712 REQ(n, for_stmt);
2713
2714 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 if (!seq)
2717 return NULL;
2718 }
2719
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002720 node_target = CHILD(n, 1);
2721 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002722 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002724 /* Check the # of children rather than the length of _target, since
2725 for x, in ... has 1 element in _target, but still requires a Tuple. */
2726 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002727 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002729 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002731 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002732 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 return NULL;
2734 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002735 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 return NULL;
2737
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002738 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2739 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740}
2741
2742static excepthandler_ty
2743ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2744{
2745 /* except_clause: 'except' [test [',' test]] */
2746 REQ(exc, except_clause);
2747 REQ(body, suite);
2748
2749 if (NCH(exc) == 1) {
2750 asdl_seq *suite_seq = ast_for_suite(c, body);
2751 if (!suite_seq)
2752 return NULL;
2753
Thomas Wouters89f507f2006-12-13 04:49:30 +00002754 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002755 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 }
2757 else if (NCH(exc) == 2) {
2758 expr_ty expression;
2759 asdl_seq *suite_seq;
2760
2761 expression = ast_for_expr(c, CHILD(exc, 1));
2762 if (!expression)
2763 return NULL;
2764 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002765 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 return NULL;
2767
Thomas Wouters89f507f2006-12-13 04:49:30 +00002768 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002769 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 }
2771 else if (NCH(exc) == 4) {
2772 asdl_seq *suite_seq;
2773 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002774 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002775 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002778 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 return NULL;
2780 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002781 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 return NULL;
2783
Thomas Wouters89f507f2006-12-13 04:49:30 +00002784 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002785 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002787
2788 PyErr_Format(PyExc_SystemError,
2789 "wrong number of children for 'except' clause: %d",
2790 NCH(exc));
2791 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792}
2793
2794static stmt_ty
2795ast_for_try_stmt(struct compiling *c, const node *n)
2796{
Neal Norwitzf599f422005-12-17 21:33:47 +00002797 const int nch = NCH(n);
2798 int n_except = (nch - 3)/3;
2799 asdl_seq *body, *orelse = NULL, *finally = NULL;
2800
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 REQ(n, try_stmt);
2802
Neal Norwitzf599f422005-12-17 21:33:47 +00002803 body = ast_for_suite(c, CHILD(n, 2));
2804 if (body == NULL)
2805 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806
Neal Norwitzf599f422005-12-17 21:33:47 +00002807 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2808 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2809 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2810 /* we can assume it's an "else",
2811 because nch >= 9 for try-else-finally and
2812 it would otherwise have a type of except_clause */
2813 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2814 if (orelse == NULL)
2815 return NULL;
2816 n_except--;
2817 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818
Neal Norwitzf599f422005-12-17 21:33:47 +00002819 finally = ast_for_suite(c, CHILD(n, nch - 1));
2820 if (finally == NULL)
2821 return NULL;
2822 n_except--;
2823 }
2824 else {
2825 /* we can assume it's an "else",
2826 otherwise it would have a type of except_clause */
2827 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2828 if (orelse == NULL)
2829 return NULL;
2830 n_except--;
2831 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002833 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002834 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835 return NULL;
2836 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002837
2838 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002839 int i;
2840 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002841 /* process except statements to create a try ... except */
2842 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2843 if (handlers == NULL)
2844 return NULL;
2845
2846 for (i = 0; i < n_except; i++) {
2847 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2848 CHILD(n, 5 + i * 3));
2849 if (!e)
2850 return NULL;
2851 asdl_seq_SET(handlers, i, e);
2852 }
2853
Thomas Wouters89f507f2006-12-13 04:49:30 +00002854 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002855 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002856 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002857 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002858
2859 /* if a 'finally' is present too, we nest the TryExcept within a
2860 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002861 body = asdl_seq_new(1, c->c_arena);
2862 if (body == NULL)
2863 return NULL;
2864 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002865 }
2866
2867 /* must be a try ... finally (except clauses are in body, if any exist) */
2868 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002869 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870}
2871
Guido van Rossumc2e20742006-02-27 22:32:47 +00002872static expr_ty
2873ast_for_with_var(struct compiling *c, const node *n)
2874{
2875 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002876 return ast_for_expr(c, CHILD(n, 1));
2877}
2878
2879/* with_stmt: 'with' test [ with_var ] ':' suite */
2880static stmt_ty
2881ast_for_with_stmt(struct compiling *c, const node *n)
2882{
2883 expr_ty context_expr, optional_vars = NULL;
2884 int suite_index = 3; /* skip 'with', test, and ':' */
2885 asdl_seq *suite_seq;
2886
2887 assert(TYPE(n) == with_stmt);
2888 context_expr = ast_for_expr(c, CHILD(n, 1));
2889 if (TYPE(CHILD(n, 2)) == with_var) {
2890 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2891
2892 if (!optional_vars) {
2893 return NULL;
2894 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002895 if (!set_context(optional_vars, Store, n)) {
2896 return NULL;
2897 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002898 suite_index = 4;
2899 }
2900
2901 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2902 if (!suite_seq) {
2903 return NULL;
2904 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002905 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002906 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002907}
2908
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909static stmt_ty
2910ast_for_classdef(struct compiling *c, const node *n)
2911{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002912 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2913 asdl_seq *s;
2914 expr_ty call, dummy;
2915
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 REQ(n, classdef);
2917
2918 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002919 ast_error(n, "assignment to None");
2920 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 }
2922
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002923 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 s = ast_for_suite(c, CHILD(n, 3));
2925 if (!s)
2926 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002927 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2928 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002930
2931 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 s = ast_for_suite(c, CHILD(n,5));
2933 if (!s)
2934 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002935 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2936 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 }
2938
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002939 /* class NAME '(' arglist ')' ':' suite */
2940 /* build up a fake Call node so we can extract its pieces */
2941 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2942 call = ast_for_call(c, CHILD(n, 3), dummy);
2943 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002946 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002948
2949 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2950 call->v.Call.args, call->v.Call.keywords,
2951 call->v.Call.starargs, call->v.Call.kwargs, s,
2952 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953}
2954
2955static stmt_ty
2956ast_for_stmt(struct compiling *c, const node *n)
2957{
2958 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 assert(NCH(n) == 1);
2960 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961 }
2962 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 assert(num_stmts(n) == 1);
2964 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 }
2966 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002967 REQ(n, small_stmt);
2968 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002969 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2970 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002971 */
2972 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 case expr_stmt:
2974 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 case del_stmt:
2976 return ast_for_del_stmt(c, n);
2977 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002978 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 case flow_stmt:
2980 return ast_for_flow_stmt(c, n);
2981 case import_stmt:
2982 return ast_for_import_stmt(c, n);
2983 case global_stmt:
2984 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002985 case nonlocal_stmt:
2986 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 case assert_stmt:
2988 return ast_for_assert_stmt(c, n);
2989 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002990 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2992 TYPE(n), NCH(n));
2993 return NULL;
2994 }
2995 }
2996 else {
2997 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002998 | funcdef | classdef
2999 */
3000 node *ch = CHILD(n, 0);
3001 REQ(n, compound_stmt);
3002 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 case if_stmt:
3004 return ast_for_if_stmt(c, ch);
3005 case while_stmt:
3006 return ast_for_while_stmt(c, ch);
3007 case for_stmt:
3008 return ast_for_for_stmt(c, ch);
3009 case try_stmt:
3010 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003011 case with_stmt:
3012 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 case funcdef:
3014 return ast_for_funcdef(c, ch);
3015 case classdef:
3016 return ast_for_classdef(c, ch);
3017 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003018 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3020 TYPE(n), NCH(n));
3021 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003022 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 }
3024}
3025
3026static PyObject *
3027parsenumber(const char *s)
3028{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003029 const char *end;
3030 long x;
3031 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003033 Py_complex c;
3034 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035#endif
3036
Guido van Rossumd8faa362007-04-27 19:54:29 +00003037 errno = 0;
3038 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003040 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003042 if (*end == 'l' || *end == 'L')
3043 return PyLong_FromString((char *)s, (char **)0, 0);
3044 if (s[0] == '0') {
3045 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3046 if (x < 0 && errno == 0) {
3047 return PyLong_FromString((char *)s,
3048 (char **)0,
3049 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003050 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003051 }
3052 else
3053 x = PyOS_strtol((char *)s, (char **)&end, 0);
3054 if (*end == '\0') {
3055 if (errno != 0)
3056 return PyLong_FromString((char *)s, (char **)0, 0);
3057 return PyInt_FromLong(x);
3058 }
3059 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003061 if (imflag) {
3062 c.real = 0.;
3063 PyFPE_START_PROTECT("atof", return 0)
3064 c.imag = PyOS_ascii_atof(s);
3065 PyFPE_END_PROTECT(c)
3066 return PyComplex_FromCComplex(c);
3067 }
3068 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003070 {
3071 PyFPE_START_PROTECT("atof", return 0)
3072 dx = PyOS_ascii_atof(s);
3073 PyFPE_END_PROTECT(dx)
3074 return PyFloat_FromDouble(dx);
3075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076}
3077
3078static PyObject *
3079decode_utf8(const char **sPtr, const char *end, char* encoding)
3080{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003081 PyObject *u, *v;
3082 char *s, *t;
3083 t = s = (char *)*sPtr;
3084 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3085 while (s < end && (*s & 0x80)) s++;
3086 *sPtr = s;
3087 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3088 if (u == NULL)
3089 return NULL;
3090 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3091 Py_DECREF(u);
3092 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093}
3094
3095static PyObject *
3096decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3097{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003098 PyObject *v, *u;
3099 char *buf;
3100 char *p;
3101 const char *end;
3102 if (encoding == NULL) {
3103 buf = (char *)s;
3104 u = NULL;
3105 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3106 buf = (char *)s;
3107 u = NULL;
3108 } else {
3109 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3110 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3111 if (u == NULL)
3112 return NULL;
3113 p = buf = PyString_AsString(u);
3114 end = s + len;
3115 while (s < end) {
3116 if (*s == '\\') {
3117 *p++ = *s++;
3118 if (*s & 0x80) {
3119 strcpy(p, "u005c");
3120 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003121 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003122 }
3123 if (*s & 0x80) { /* XXX inefficient */
3124 PyObject *w;
3125 char *r;
3126 Py_ssize_t rn, i;
3127 w = decode_utf8(&s, end, "utf-16-be");
3128 if (w == NULL) {
3129 Py_DECREF(u);
3130 return NULL;
3131 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003132 assert(PyBytes_Check(w));
3133 r = PyBytes_AsString(w);
3134 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003135 assert(rn % 2 == 0);
3136 for (i = 0; i < rn; i += 2) {
3137 sprintf(p, "\\u%02x%02x",
3138 r[i + 0] & 0xFF,
3139 r[i + 1] & 0xFF);
3140 p += 6;
3141 }
3142 Py_DECREF(w);
3143 } else {
3144 *p++ = *s++;
3145 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003146 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003147 len = p - buf;
3148 s = buf;
3149 }
3150 if (rawmode)
3151 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3152 else
3153 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3154 Py_XDECREF(u);
3155 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156}
3157
3158/* s is a Python string literal, including the bracketing quote characters,
3159 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3160 * parsestr parses it, and returns the decoded Python string object.
3161 */
3162static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003163parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 size_t len;
3166 const char *s = STR(n);
3167 int quote = Py_CHARMASK(*s);
3168 int rawmode = 0;
3169 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 if (quote == 'b' || quote == 'B') {
3173 quote = *++s;
3174 *bytesmode = 1;
3175 }
3176 if (quote == 'r' || quote == 'R') {
3177 quote = *++s;
3178 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 }
3181 if (quote != '\'' && quote != '\"') {
3182 PyErr_BadInternalCall();
3183 return NULL;
3184 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 s++;
3186 len = strlen(s);
3187 if (len > INT_MAX) {
3188 PyErr_SetString(PyExc_OverflowError,
3189 "string to parse is too long");
3190 return NULL;
3191 }
3192 if (s[--len] != quote) {
3193 PyErr_BadInternalCall();
3194 return NULL;
3195 }
3196 if (len >= 4 && s[0] == quote && s[1] == quote) {
3197 s += 2;
3198 len -= 2;
3199 if (s[--len] != quote || s[--len] != quote) {
3200 PyErr_BadInternalCall();
3201 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003202 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003204 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 return decode_unicode(s, len, rawmode, encoding);
3206 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 if (*bytesmode) {
3208 /* Disallow non-ascii characters (but not escapes) */
3209 const char *c;
3210 for (c = s; *c; c++) {
3211 if (Py_CHARMASK(*c) >= 0x80) {
3212 ast_error(n, "bytes can only contain ASCII "
3213 "literal characters.");
3214 return NULL;
3215 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003216 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003217 }
3218 need_encoding = (!*bytesmode && encoding != NULL &&
3219 strcmp(encoding, "utf-8") != 0 &&
3220 strcmp(encoding, "iso-8859-1") != 0);
3221 if (rawmode || strchr(s, '\\') == NULL) {
3222 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3224 if (u == NULL)
3225 return NULL;
3226 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3227 Py_DECREF(u);
3228 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 } else {
3230 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003231 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233
Guido van Rossumbdde0112007-05-11 16:26:27 +00003234 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003235 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236}
3237
3238/* Build a Python string object out of a STRING atom. This takes care of
3239 * compile-time literal catenation, calling parsestr() on each piece, and
3240 * pasting the intermediate results together.
3241 */
3242static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003243parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003245 PyObject *v;
3246 int i;
3247 REQ(CHILD(n, 0), STRING);
3248 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3249 if (v != NULL) {
3250 /* String literal concatenation */
3251 for (i = 1; i < NCH(n); i++) {
3252 PyObject *s;
3253 int subbm = 0;
3254 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3255 if (s == NULL)
3256 goto onError;
3257 if (*bytesmode != subbm) {
3258 ast_error(n, "cannot mix bytes and nonbytes"
3259 "literals");
3260 goto onError;
3261 }
3262 if (PyString_Check(v) && PyString_Check(s)) {
3263 PyString_ConcatAndDel(&v, s);
3264 if (v == NULL)
3265 goto onError;
3266 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003267 else {
3268 PyObject *temp = PyUnicode_Concat(v, s);
3269 Py_DECREF(s);
3270 Py_DECREF(v);
3271 v = temp;
3272 if (v == NULL)
3273 goto onError;
3274 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003275 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003276 }
3277 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278
Guido van Rossumd8faa362007-04-27 19:54:29 +00003279 onError:
3280 Py_XDECREF(v);
3281 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282}