blob: 82eaeff7a6812ecca4aa100ecaf5408f4de1b7f6 [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));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000251 if (!asdl_seq_GET(stmts, 0))
252 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000253 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000254 }
255 else {
256 n = CHILD(n, 0);
257 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000258 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000262 s = ast_for_stmt(&c, n);
263 if (!s)
264 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 asdl_seq_SET(stmts, 0, s);
266 }
267 else {
268 /* Only a simple_stmt can contain multiple statements. */
269 REQ(n, simple_stmt);
270 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271 if (TYPE(CHILD(n, i)) == NEWLINE)
272 break;
273 s = ast_for_stmt(&c, CHILD(n, i));
274 if (!s)
275 goto error;
276 asdl_seq_SET(stmts, i / 2, s);
277 }
278 }
279
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000280 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281 }
282 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000283 PyErr_Format(PyExc_SystemError,
284 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 goto error;
286 }
287 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288 ast_error_finish(filename);
289 return NULL;
290}
291
292/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
293*/
294
295static operator_ty
296get_operator(const node *n)
297{
298 switch (TYPE(n)) {
299 case VBAR:
300 return BitOr;
301 case CIRCUMFLEX:
302 return BitXor;
303 case AMPER:
304 return BitAnd;
305 case LEFTSHIFT:
306 return LShift;
307 case RIGHTSHIFT:
308 return RShift;
309 case PLUS:
310 return Add;
311 case MINUS:
312 return Sub;
313 case STAR:
314 return Mult;
315 case SLASH:
316 return Div;
317 case DOUBLESLASH:
318 return FloorDiv;
319 case PERCENT:
320 return Mod;
321 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000322 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323 }
324}
325
Jeremy Hyltona8293132006-02-28 17:58:27 +0000326/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327
328 Only sets context for expr kinds that "can appear in assignment context"
329 (according to ../Parser/Python.asdl). For other expr kinds, it sets
330 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000331*/
332
333static int
334set_context(expr_ty e, expr_context_ty ctx, const node *n)
335{
336 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000337 /* If a particular expression type can't be used for assign / delete,
338 set expr_name to its name and an error message will be generated.
339 */
340 const char* expr_name = NULL;
341
342 /* The ast defines augmented store and load contexts, but the
343 implementation here doesn't actually use them. The code may be
344 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000345 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000346 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000347 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000348 */
349 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350
351 switch (e->kind) {
352 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000353 if (ctx == Store &&
Guido van Rossumd8faa362007-04-27 19:54:29 +0000354 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
355 return ast_error(n, "assignment to None");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000356 }
357 e->v.Attribute.ctx = ctx;
358 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000359 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000360 e->v.Subscript.ctx = ctx;
361 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000362 case Starred_kind:
363 e->v.Starred.ctx = ctx;
364 if (!set_context(e->v.Starred.value, ctx, n))
365 return 0;
366 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367 case Name_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000368 if (ctx == Store &&
369 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
370 return ast_error(n, "assignment to None");
371 }
372 e->v.Name.ctx = ctx;
373 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000374 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000375 e->v.List.ctx = ctx;
376 s = e->v.List.elts;
377 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000378 case Tuple_kind:
379 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
380 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000381 e->v.Tuple.ctx = ctx;
382 s = e->v.Tuple.elts;
383 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000384 case Lambda_kind:
385 expr_name = "lambda";
386 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000389 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000390 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000391 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000392 case UnaryOp_kind:
393 expr_name = "operator";
394 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000395 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000396 expr_name = "generator expression";
397 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000398 case Yield_kind:
399 expr_name = "yield expression";
400 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000401 case ListComp_kind:
402 expr_name = "list comprehension";
403 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000404 case SetComp_kind:
405 expr_name = "set comprehension";
406 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000407 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000408 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000409 case Num_kind:
410 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000411 expr_name = "literal";
412 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000413 case Ellipsis_kind:
414 expr_name = "Ellipsis";
415 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 case Compare_kind:
417 expr_name = "comparison";
418 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000419 case IfExp_kind:
420 expr_name = "conditional expression";
421 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000422 default:
423 PyErr_Format(PyExc_SystemError,
424 "unexpected expression in assignment %d (line %d)",
425 e->kind, e->lineno);
426 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000428 /* Check for error string set by switch */
429 if (expr_name) {
430 char buf[300];
431 PyOS_snprintf(buf, sizeof(buf),
432 "can't %s %s",
433 ctx == Store ? "assign to" : "delete",
434 expr_name);
435 return ast_error(n, buf);
436 }
437
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000438 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000439 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000440 */
441 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000442 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443
Thomas Wouters89f507f2006-12-13 04:49:30 +0000444 for (i = 0; i < asdl_seq_LEN(s); i++) {
445 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
446 return 0;
447 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000448 }
449 return 1;
450}
451
452static operator_ty
453ast_for_augassign(const node *n)
454{
455 REQ(n, augassign);
456 n = CHILD(n, 0);
457 switch (STR(n)[0]) {
458 case '+':
459 return Add;
460 case '-':
461 return Sub;
462 case '/':
463 if (STR(n)[1] == '/')
464 return FloorDiv;
465 else
466 return Div;
467 case '%':
468 return Mod;
469 case '<':
470 return LShift;
471 case '>':
472 return RShift;
473 case '&':
474 return BitAnd;
475 case '^':
476 return BitXor;
477 case '|':
478 return BitOr;
479 case '*':
480 if (STR(n)[1] == '*')
481 return Pow;
482 else
483 return Mult;
484 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000485 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000486 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487 }
488}
489
490static cmpop_ty
491ast_for_comp_op(const node *n)
492{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000493 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494 |'is' 'not'
495 */
496 REQ(n, comp_op);
497 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000498 n = CHILD(n, 0);
499 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500 case LESS:
501 return Lt;
502 case GREATER:
503 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000504 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505 return Eq;
506 case LESSEQUAL:
507 return LtE;
508 case GREATEREQUAL:
509 return GtE;
510 case NOTEQUAL:
511 return NotEq;
512 case NAME:
513 if (strcmp(STR(n), "in") == 0)
514 return In;
515 if (strcmp(STR(n), "is") == 0)
516 return Is;
517 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000518 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000520 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000521 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522 }
523 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000524 /* handle "not in" and "is not" */
525 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526 case NAME:
527 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
528 return NotIn;
529 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
530 return IsNot;
531 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000532 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000533 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000534 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000535 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000536 }
Neal Norwitz79792652005-11-14 04:25:03 +0000537 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000539 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000540}
541
542static asdl_seq *
543seq_for_testlist(struct compiling *c, const node *n)
544{
545 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000546 asdl_seq *seq;
547 expr_ty expression;
548 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000549 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000551 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 if (!seq)
553 return NULL;
554
555 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000556 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000557
558 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000559 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561
562 assert(i / 2 < seq->size);
563 asdl_seq_SET(seq, i / 2, expression);
564 }
565 return seq;
566}
567
Neal Norwitzc1505362006-12-28 06:47:50 +0000568static arg_ty
569compiler_simple_arg(struct compiling *c, const node *n)
570{
571 identifier name;
572 expr_ty annotation = NULL;
573 node *ch;
574
575 assert(TYPE(n) == tname || TYPE(n) == vname);
576 ch = CHILD(n, 0);
577 if (!strcmp(STR(ch), "None")) {
578 ast_error(ch, "assignment to None");
579 return NULL;
580 }
581 name = NEW_IDENTIFIER(ch);
582 if (!name)
583 return NULL;
584
585 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
586 annotation = ast_for_expr(c, CHILD(n, 2));
587 if (!annotation)
588 return NULL;
589 }
590
591 return SimpleArg(name, annotation, c->c_arena);
592}
593
594static arg_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000595compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000596{
597 int i, len = (NCH(n) + 1) / 2;
Neal Norwitzc1505362006-12-28 06:47:50 +0000598 arg_ty arg;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000599 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 if (!args)
601 return NULL;
602
Neal Norwitzc1505362006-12-28 06:47:50 +0000603 assert(TYPE(n) == tfplist || TYPE(n) == vfplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 for (i = 0; i < len; i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000605 const node *child = CHILD(n, 2*i);
606 /* def foo(((x), y)): -- x is not nested complex, special case. */
607 while (NCH(child) == 3 && NCH(CHILD(child, 1)) == 1)
608 child = CHILD(CHILD(child, 1), 0);
609
610 /* child either holds a tname or '(', a tfplist, ')' */
611 switch (TYPE(CHILD(child, 0))) {
612 case tname:
613 case vname:
614 arg = compiler_simple_arg(c, CHILD(child, 0));
615 break;
616 case LPAR:
617 arg = compiler_complex_args(c, CHILD(child, 1));
618 break;
619 default:
620 PyErr_Format(PyExc_SystemError,
621 "unexpected node in args: %d @ %d",
622 TYPE(CHILD(child, 0)), i);
623 arg = NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000624 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000625 if (!arg)
626 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 asdl_seq_SET(args, i, arg);
628 }
629
Neal Norwitzc1505362006-12-28 06:47:50 +0000630 return NestedArgs(args, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631}
632
Guido van Rossum4f72a782006-10-27 23:31:49 +0000633/* returns -1 if failed to handle keyword only arguments
634 returns new position to keep processing if successful
Neal Norwitzc1505362006-12-28 06:47:50 +0000635 (',' tname ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000636 ^^^
637 start pointing here
638 */
639static int
640handle_keywordonly_args(struct compiling *c, const node *n, int start,
641 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
642{
643 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000644 expr_ty expression, annotation;
645 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000646 int i = start;
647 int j = 0; /* index for kwdefaults and kwonlyargs */
648 assert(kwonlyargs != NULL);
649 assert(kwdefaults != NULL);
650 while (i < NCH(n)) {
651 ch = CHILD(n, i);
652 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000653 case vname:
654 case tname:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000655 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000656 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000657 if (!expression) {
658 ast_error(ch, "assignment to None");
659 goto error;
660 }
661 asdl_seq_SET(kwdefaults, j, expression);
662 i += 2; /* '=' and test */
663 }
664 else { /* setting NULL if no default value exists */
665 asdl_seq_SET(kwdefaults, j, NULL);
666 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000667 if (NCH(ch) == 3) {
668 /* ch is NAME ':' test */
669 annotation = ast_for_expr(c, CHILD(ch, 2));
670 if (!annotation) {
671 ast_error(ch, "expected expression");
672 goto error;
673 }
674 }
675 else {
676 annotation = NULL;
677 }
678 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000679 if (!strcmp(STR(ch), "None")) {
680 ast_error(ch, "assignment to None");
681 goto error;
682 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000683 arg = SimpleArg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
684 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000685 ast_error(ch, "expecting name");
686 goto error;
687 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000688 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 i += 2; /* the name and the comma */
690 break;
691 case DOUBLESTAR:
692 return i;
693 default:
694 ast_error(ch, "unexpected node");
695 goto error;
696 }
697 }
698 return i;
699 error:
700 return -1;
701}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702
Jeremy Hyltona8293132006-02-28 17:58:27 +0000703/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704
705static arguments_ty
706ast_for_arguments(struct compiling *c, const node *n)
707{
Neal Norwitzc1505362006-12-28 06:47:50 +0000708 /* This function handles both typedargslist (function definition)
709 and varargslist (lambda definition).
710
711 parameters: '(' [typedargslist] ')'
712 typedargslist: ((tfpdef ['=' test] ',')*
713 ('*' [tname] (',' tname ['=' test])* [',' '**' tname]
714 | '**' tname)
715 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
716 varargslist: ((vfpdef ['=' test] ',')*
717 ('*' [vname] (',' vname ['=' test])* [',' '**' vname]
718 | '**' vname)
719 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000721 int i, j, k, nposargs = 0, nkwonlyargs = 0;
722 int nposdefaults = 0, found_default = 0;
723 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000724 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000725 arg_ty arg;
726 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 node *ch;
728
729 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000730 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000731 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
732 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000733 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000735 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736
Guido van Rossum4f72a782006-10-27 23:31:49 +0000737 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000739 ch = CHILD(n, i);
740 if (TYPE(ch) == STAR) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000741 if (TYPE(CHILD(n, i+1)) == tname
742 || TYPE(CHILD(n, i+1)) == vname) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000743 /* skip NAME of vararg */
744 /* so that following can count only keyword only args */
745 i += 2;
746 }
747 else {
748 i++;
749 }
750 break;
751 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000752 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000755 /* count the number of keyword only args &
756 defaults for keyword only args */
757 for ( ; i < NCH(n); ++i) {
758 ch = CHILD(n, i);
759 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000760 if (TYPE(ch) == tname || TYPE(ch) == vname) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 }
762
763 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
764 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000765 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 kwonlyargs = (nkwonlyargs ?
767 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
768 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000769 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000770 posdefaults = (nposdefaults ?
771 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
772 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000773 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000774 /* The length of kwonlyargs and kwdefaults are same
775 since we set NULL as default for keyword only argument w/o default
776 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000777 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
779 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781
782 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000783 ast_error(n, "more than 255 arguments");
784 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000785 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786
Neal Norwitzc1505362006-12-28 06:47:50 +0000787 /* tname: NAME [':' test]
788 tfpdef: tname | '(' tfplist ')'
789 tfplist: tfpdef (',' tfpdef)* [',']
790 vname: NAME
791 vfpdef: NAME | '(' vfplist ')'
792 vfplist: vfpdef (',' vfpdef)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 */
794 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000795 j = 0; /* index for defaults */
796 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000797 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 ch = CHILD(n, i);
799 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000800 case tfpdef:
801 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
803 anything other than EQUAL or a comma? */
804 /* XXX Should NCH(n) check be made a separate check? */
805 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000806 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
807 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000808 goto error;
809 assert(posdefaults != NULL);
810 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000812 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000814 else if (found_default) {
815 ast_error(n,
816 "non-default argument follows default argument");
817 goto error;
818 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000819 /* def foo((x)): is not complex, special case. */
820 while (NCH(ch) == 3 && NCH(CHILD(ch, 1)) == 1)
821 ch = CHILD(CHILD(ch, 1), 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000822
Neal Norwitzc1505362006-12-28 06:47:50 +0000823 if (NCH(ch) != 1)
824 arg = compiler_complex_args(c, CHILD(ch, 1));
825 else
826 arg = compiler_simple_arg(c, CHILD(ch, 0));
827 if (!arg)
828 goto error;
829 asdl_seq_SET(posargs, k++, arg);
830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 i += 2; /* the name and the comma */
832 break;
833 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000834 if (i+1 >= NCH(n)) {
835 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000836 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000838 ch = CHILD(n, i+1); /* tname or COMMA */
839 if (TYPE(ch) == COMMA) {
840 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000841 i += 2; /* now follows keyword only arguments */
842 res = handle_keywordonly_args(c, n, i,
843 kwonlyargs, kwdefaults);
844 if (res == -1) goto error;
845 i = res; /* res has new position to process */
846 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000847 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
848 ast_error(CHILD(ch, 0), "assignment to None");
849 goto error;
850 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000851 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000852 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
853 if (NCH(ch) > 1) {
854 /* there is an annotation on the vararg */
855 varargannotation = ast_for_expr(c, CHILD(ch, 2));
856 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000857 i += 3;
Neal Norwitzc1505362006-12-28 06:47:50 +0000858 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tname
859 || TYPE(CHILD(n, i)) == vname)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000860 int res = 0;
861 res = handle_keywordonly_args(c, n, i,
862 kwonlyargs, kwdefaults);
863 if (res == -1) goto error;
864 i = res; /* res has new position to process */
865 }
866 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 break;
868 case DOUBLESTAR:
Neal Norwitzc1505362006-12-28 06:47:50 +0000869 ch = CHILD(n, i+1); /* tname */
870 assert(TYPE(ch) == tname || TYPE(ch) == vname);
871 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
872 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000873 goto error;
874 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000875 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
876 if (NCH(ch) > 1) {
877 /* there is an annotation on the kwarg */
878 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
879 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 i += 3;
881 break;
882 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000883 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884 "unexpected node in varargslist: %d @ %d",
885 TYPE(ch), i);
886 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000887 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
890 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000892 Py_XDECREF(vararg);
893 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894 return NULL;
895}
896
897static expr_ty
898ast_for_dotted_name(struct compiling *c, const node *n)
899{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000900 expr_ty e;
901 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000902 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 int i;
904
905 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000906
907 lineno = LINENO(n);
908 col_offset = n->n_col_offset;
909
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 id = NEW_IDENTIFIER(CHILD(n, 0));
911 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000912 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000913 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916
917 for (i = 2; i < NCH(n); i+=2) {
918 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 if (!id)
920 return NULL;
921 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
922 if (!e)
923 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 }
925
926 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927}
928
929static expr_ty
930ast_for_decorator(struct compiling *c, const node *n)
931{
932 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
933 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000934 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935
936 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 REQ(CHILD(n, 0), AT);
938 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939
940 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
941 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 return NULL;
943
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 d = name_expr;
946 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 }
948 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000950 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 if (!d)
952 return NULL;
953 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 }
955 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000956 d = ast_for_call(c, CHILD(n, 3), name_expr);
957 if (!d)
958 return NULL;
959 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960 }
961
962 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static asdl_seq*
966ast_for_decorators(struct compiling *c, const node *n)
967{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000968 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000969 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 int i;
971
972 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000973 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 if (!decorator_seq)
975 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000976
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000978 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979 if (!d)
980 return NULL;
981 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 }
983 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984}
985
986static stmt_ty
987ast_for_funcdef(struct compiling *c, const node *n)
988{
Neal Norwitzc1505362006-12-28 06:47:50 +0000989 /* funcdef: 'def' [decorators] NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000990 identifier name;
991 arguments_ty args;
992 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 asdl_seq *decorator_seq = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000994 expr_ty returns = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 int name_i;
996
997 REQ(n, funcdef);
998
Nick Coghlan71011e22007-04-23 11:05:01 +0000999 if (NCH(n) == 6 || NCH(n) == 8) { /* decorators are present */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1001 if (!decorator_seq)
1002 return NULL;
1003 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 }
1005 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001006 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 }
1008
1009 name = NEW_IDENTIFIER(CHILD(n, name_i));
1010 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001011 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001013 ast_error(CHILD(n, name_i), "assignment to None");
1014 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015 }
1016 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1017 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001018 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001019 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1020 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1021 if (!returns)
1022 return NULL;
1023 name_i += 2;
1024 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 body = ast_for_suite(c, CHILD(n, name_i + 3));
1026 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001027 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001028
Neal Norwitzc1505362006-12-28 06:47:50 +00001029 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001030 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031}
1032
1033static expr_ty
1034ast_for_lambdef(struct compiling *c, const node *n)
1035{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001036 /* lambdef: 'lambda' [varargslist] ':' test
1037 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 arguments_ty args;
1039 expr_ty expression;
1040
1041 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001042 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1043 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 if (!args)
1045 return NULL;
1046 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001047 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 }
1050 else {
1051 args = ast_for_arguments(c, CHILD(n, 1));
1052 if (!args)
1053 return NULL;
1054 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001055 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057 }
1058
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001059 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060}
1061
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001062static expr_ty
1063ast_for_ifexpr(struct compiling *c, const node *n)
1064{
1065 /* test: or_test 'if' or_test 'else' test */
1066 expr_ty expression, body, orelse;
1067
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001068 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001069 body = ast_for_expr(c, CHILD(n, 0));
1070 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001071 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001072 expression = ast_for_expr(c, CHILD(n, 2));
1073 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001074 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001075 orelse = ast_for_expr(c, CHILD(n, 4));
1076 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001077 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001078 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1079 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001080}
1081
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001083 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084
Nick Coghlan650f0d02007-04-15 12:05:43 +00001085 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086*/
1087
1088static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001089count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001091 int n_fors = 0;
1092 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093
Guido van Rossumd8faa362007-04-27 19:54:29 +00001094 count_comp_for:
1095 n_fors++;
1096 REQ(ch, comp_for);
1097 if (NCH(ch) == 5)
1098 ch = CHILD(ch, 4);
1099 else
1100 return n_fors;
1101 count_comp_iter:
1102 REQ(ch, comp_iter);
1103 ch = CHILD(ch, 0);
1104 if (TYPE(ch) == comp_for)
1105 goto count_comp_for;
1106 else if (TYPE(ch) == comp_if) {
1107 if (NCH(ch) == 3) {
1108 ch = CHILD(ch, 2);
1109 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001110 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111 else
1112 return n_fors;
1113 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001114
Guido van Rossumd8faa362007-04-27 19:54:29 +00001115 /* Should never be reached */
1116 PyErr_SetString(PyExc_SystemError,
1117 "logic error in count_comp_fors");
1118 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119}
1120
Nick Coghlan650f0d02007-04-15 12:05:43 +00001121/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122
Nick Coghlan650f0d02007-04-15 12:05:43 +00001123 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124*/
1125
1126static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001127count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130
Guido van Rossumd8faa362007-04-27 19:54:29 +00001131 while (1) {
1132 REQ(n, comp_iter);
1133 if (TYPE(CHILD(n, 0)) == comp_for)
1134 return n_ifs;
1135 n = CHILD(n, 0);
1136 REQ(n, comp_if);
1137 n_ifs++;
1138 if (NCH(n) == 2)
1139 return n_ifs;
1140 n = CHILD(n, 2);
1141 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142}
1143
1144static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001145ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001147 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1148 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001150 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 int i, n_fors;
1152 node *ch;
1153
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 assert(NCH(n) > 1);
1155
1156 elt = ast_for_expr(c, CHILD(n, 0));
1157 if (!elt)
1158 return NULL;
1159
Nick Coghlan650f0d02007-04-15 12:05:43 +00001160 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 if (n_fors == -1)
1162 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001163
Nick Coghlan650f0d02007-04-15 12:05:43 +00001164 comps = asdl_seq_new(n_fors, c->c_arena);
1165 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 ch = CHILD(n, 1);
1169 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001170 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 asdl_seq *t;
1172 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001173 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174
Nick Coghlan650f0d02007-04-15 12:05:43 +00001175 REQ(ch, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176
Thomas Wouters89f507f2006-12-13 04:49:30 +00001177 for_ch = CHILD(ch, 1);
1178 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001179 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001181 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001184
Thomas Wouters89f507f2006-12-13 04:49:30 +00001185 /* Check the # of children rather than the length of t, since
1186 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1187 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001188 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1189 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001191 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1192 c->c_arena),
1193 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194
Nick Coghlan650f0d02007-04-15 12:05:43 +00001195 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 if (NCH(ch) == 5) {
1199 int j, n_ifs;
1200 asdl_seq *ifs;
1201
1202 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001203 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001204 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001206
1207 ifs = asdl_seq_new(n_ifs, c->c_arena);
1208 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001212 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001214 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001216 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001218 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001219 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220 if (NCH(ch) == 3)
1221 ch = CHILD(ch, 2);
1222 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001223 /* on exit, must guarantee that ch is a comp_for */
1224 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001226 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001228 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001230
1231 if (type == COMP_GENEXP)
1232 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1233 else if (type == COMP_LISTCOMP)
1234 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1235 else if (type == COMP_SETCOMP)
1236 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1237 else
1238 /* Should never happen */
1239 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240}
1241
1242static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001243ast_for_genexp(struct compiling *c, const node *n)
1244{
1245 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1246 return ast_for_comprehension(c, n, COMP_GENEXP);
1247}
1248
1249static expr_ty
1250ast_for_listcomp(struct compiling *c, const node *n)
1251{
1252 assert(TYPE(n) == (testlist_comp));
1253 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1254}
1255
1256static expr_ty
1257ast_for_setcomp(struct compiling *c, const node *n)
1258{
1259 assert(TYPE(n) == (dictorsetmaker));
1260 return ast_for_comprehension(c, n, COMP_SETCOMP);
1261}
1262
1263
1264static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265ast_for_atom(struct compiling *c, const node *n)
1266{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001267 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1268 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 */
1270 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001271 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272
1273 switch (TYPE(ch)) {
1274 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001275 /* All names start in Load context, but may later be
1276 changed. */
1277 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001279 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001280 if (!str)
1281 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001282
Thomas Wouters89f507f2006-12-13 04:49:30 +00001283 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001284 if (bytesmode)
1285 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1286 else
1287 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288 }
1289 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001290 PyObject *pynum = parsenumber(STR(ch));
1291 if (!pynum)
1292 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001293
Thomas Wouters89f507f2006-12-13 04:49:30 +00001294 PyArena_AddPyObject(c->c_arena, pynum);
1295 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 }
Georg Brandldde00282007-03-18 19:01:53 +00001297 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001298 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001300 ch = CHILD(n, 1);
1301
1302 if (TYPE(ch) == RPAR)
1303 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1304
1305 if (TYPE(ch) == yield_expr)
1306 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001307
1308 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1309 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001310 return ast_for_genexp(c, ch);
1311
Nick Coghlan650f0d02007-04-15 12:05:43 +00001312 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001314 ch = CHILD(n, 1);
1315
1316 if (TYPE(ch) == RSQB)
1317 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1318
Nick Coghlan650f0d02007-04-15 12:05:43 +00001319 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001320 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1321 asdl_seq *elts = seq_for_testlist(c, ch);
1322 if (!elts)
1323 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001324
Thomas Wouters89f507f2006-12-13 04:49:30 +00001325 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1326 }
1327 else
1328 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001330 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1331 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001332 int i, size;
1333 asdl_seq *keys, *values;
1334
1335 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001336 if (TYPE(ch) == RBRACE) {
1337 /* it's an empty dict */
1338 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1339 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1340 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001341 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001342 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001343 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001344 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001345 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001346 for (i = 0; i < NCH(ch); i += 2) {
1347 expr_ty expression;
1348 expression = ast_for_expr(c, CHILD(ch, i));
1349 if (!expression)
1350 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001351 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001352 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001353 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1354 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1355 /* it's a set comprehension */
1356 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001357 } else {
1358 /* it's a dict */
1359 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1360 keys = asdl_seq_new(size, c->c_arena);
1361 if (!keys)
1362 return NULL;
1363
1364 values = asdl_seq_new(size, c->c_arena);
1365 if (!values)
1366 return NULL;
1367
1368 for (i = 0; i < NCH(ch); i += 4) {
1369 expr_ty expression;
1370
1371 expression = ast_for_expr(c, CHILD(ch, i));
1372 if (!expression)
1373 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001374
Guido van Rossum86e58e22006-08-28 15:27:34 +00001375 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001376
Guido van Rossum86e58e22006-08-28 15:27:34 +00001377 expression = ast_for_expr(c, CHILD(ch, i + 2));
1378 if (!expression)
1379 return NULL;
1380
1381 asdl_seq_SET(values, i / 4, expression);
1382 }
1383 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1384 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1388 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 }
1390}
1391
1392static slice_ty
1393ast_for_slice(struct compiling *c, const node *n)
1394{
1395 node *ch;
1396 expr_ty lower = NULL, upper = NULL, step = NULL;
1397
1398 REQ(n, subscript);
1399
1400 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001401 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 sliceop: ':' [test]
1403 */
1404 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001405 if (NCH(n) == 1 && TYPE(ch) == test) {
1406 /* 'step' variable hold no significance in terms of being used over
1407 other vars */
1408 step = ast_for_expr(c, ch);
1409 if (!step)
1410 return NULL;
1411
Thomas Wouters89f507f2006-12-13 04:49:30 +00001412 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 }
1414
1415 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 if (!lower)
1418 return NULL;
1419 }
1420
1421 /* If there's an upper bound it's in the second or third position. */
1422 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001423 if (NCH(n) > 1) {
1424 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425
Thomas Wouters89f507f2006-12-13 04:49:30 +00001426 if (TYPE(n2) == test) {
1427 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 if (!upper)
1429 return NULL;
1430 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001431 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434
Thomas Wouters89f507f2006-12-13 04:49:30 +00001435 if (TYPE(n2) == test) {
1436 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 if (!upper)
1438 return NULL;
1439 }
1440 }
1441
1442 ch = CHILD(n, NCH(n) - 1);
1443 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001444 if (NCH(ch) == 1) {
1445 /* No expression, so step is None */
1446 ch = CHILD(ch, 0);
1447 step = Name(new_identifier("None", c->c_arena), Load,
1448 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 if (!step)
1450 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001451 } else {
1452 ch = CHILD(ch, 1);
1453 if (TYPE(ch) == test) {
1454 step = ast_for_expr(c, ch);
1455 if (!step)
1456 return NULL;
1457 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 }
1459 }
1460
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001461 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462}
1463
1464static expr_ty
1465ast_for_binop(struct compiling *c, const node *n)
1466{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001467 /* Must account for a sequence of expressions.
1468 How should A op B op C by represented?
1469 BinOp(BinOp(A, op, B), op, C).
1470 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471
Guido van Rossumd8faa362007-04-27 19:54:29 +00001472 int i, nops;
1473 expr_ty expr1, expr2, result;
1474 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475
Guido van Rossumd8faa362007-04-27 19:54:29 +00001476 expr1 = ast_for_expr(c, CHILD(n, 0));
1477 if (!expr1)
1478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479
Guido van Rossumd8faa362007-04-27 19:54:29 +00001480 expr2 = ast_for_expr(c, CHILD(n, 2));
1481 if (!expr2)
1482 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483
Guido van Rossumd8faa362007-04-27 19:54:29 +00001484 newoperator = get_operator(CHILD(n, 1));
1485 if (!newoperator)
1486 return NULL;
1487
1488 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1489 c->c_arena);
1490 if (!result)
1491 return NULL;
1492
1493 nops = (NCH(n) - 1) / 2;
1494 for (i = 1; i < nops; i++) {
1495 expr_ty tmp_result, tmp;
1496 const node* next_oper = CHILD(n, i * 2 + 1);
1497
1498 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001499 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 return NULL;
1501
Guido van Rossumd8faa362007-04-27 19:54:29 +00001502 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1503 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 return NULL;
1505
Guido van Rossumd8faa362007-04-27 19:54:29 +00001506 tmp_result = BinOp(result, newoperator, tmp,
1507 LINENO(next_oper), next_oper->n_col_offset,
1508 c->c_arena);
1509 if (!tmp)
1510 return NULL;
1511 result = tmp_result;
1512 }
1513 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514}
1515
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001516static expr_ty
1517ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1518{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001519 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1520 subscriptlist: subscript (',' subscript)* [',']
1521 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1522 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001523 REQ(n, trailer);
1524 if (TYPE(CHILD(n, 0)) == LPAR) {
1525 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001526 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1527 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001528 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001529 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001530 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001531 else if (TYPE(CHILD(n, 0)) == DOT ) {
1532 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001533 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001534 }
1535 else {
1536 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001537 REQ(CHILD(n, 2), RSQB);
1538 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001539 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001540 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1541 if (!slc)
1542 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001543 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1544 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001545 }
1546 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001547 /* The grammar is ambiguous here. The ambiguity is resolved
1548 by treating the sequence as a tuple literal if there are
1549 no slice features.
1550 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001551 int j;
1552 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001553 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001554 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001555 asdl_seq *slices, *elts;
1556 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001557 if (!slices)
1558 return NULL;
1559 for (j = 0; j < NCH(n); j += 2) {
1560 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001561 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001562 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001563 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001564 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001565 asdl_seq_SET(slices, j / 2, slc);
1566 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001567 if (!simple) {
1568 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001569 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001570 }
1571 /* extract Index values and put them in a Tuple */
1572 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001573 if (!elts)
1574 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001575 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1576 slc = (slice_ty)asdl_seq_GET(slices, j);
1577 assert(slc->kind == Index_kind && slc->v.Index.value);
1578 asdl_seq_SET(elts, j, slc->v.Index.value);
1579 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001580 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001581 if (!e)
1582 return NULL;
1583 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001584 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001585 }
1586 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001587}
1588
1589static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001590ast_for_factor(struct compiling *c, const node *n)
1591{
1592 node *pfactor, *ppower, *patom, *pnum;
1593 expr_ty expression;
1594
1595 /* If the unary - operator is applied to a constant, don't generate
1596 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1597 constant. The peephole optimizer already does something like
1598 this but it doesn't handle the case where the constant is
1599 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1600 PyLongObject.
1601 */
1602 if (TYPE(CHILD(n, 0)) == MINUS
1603 && NCH(n) == 2
1604 && TYPE((pfactor = CHILD(n, 1))) == factor
1605 && NCH(pfactor) == 1
1606 && TYPE((ppower = CHILD(pfactor, 0))) == power
1607 && NCH(ppower) == 1
1608 && TYPE((patom = CHILD(ppower, 0))) == atom
1609 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1610 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1611 if (s == NULL)
1612 return NULL;
1613 s[0] = '-';
1614 strcpy(s + 1, STR(pnum));
1615 PyObject_FREE(STR(pnum));
1616 STR(pnum) = s;
1617 return ast_for_atom(c, patom);
1618 }
1619
1620 expression = ast_for_expr(c, CHILD(n, 1));
1621 if (!expression)
1622 return NULL;
1623
1624 switch (TYPE(CHILD(n, 0))) {
1625 case PLUS:
1626 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1627 c->c_arena);
1628 case MINUS:
1629 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1630 c->c_arena);
1631 case TILDE:
1632 return UnaryOp(Invert, expression, LINENO(n),
1633 n->n_col_offset, c->c_arena);
1634 }
1635 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1636 TYPE(CHILD(n, 0)));
1637 return NULL;
1638}
1639
1640static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001641ast_for_power(struct compiling *c, const node *n)
1642{
1643 /* power: atom trailer* ('**' factor)*
1644 */
1645 int i;
1646 expr_ty e, tmp;
1647 REQ(n, power);
1648 e = ast_for_atom(c, CHILD(n, 0));
1649 if (!e)
1650 return NULL;
1651 if (NCH(n) == 1)
1652 return e;
1653 for (i = 1; i < NCH(n); i++) {
1654 node *ch = CHILD(n, i);
1655 if (TYPE(ch) != trailer)
1656 break;
1657 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001658 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001659 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001660 tmp->lineno = e->lineno;
1661 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001662 e = tmp;
1663 }
1664 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1665 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001666 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001667 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001668 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001669 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001670 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001671 e = tmp;
1672 }
1673 return e;
1674}
1675
Guido van Rossum0368b722007-05-11 16:50:42 +00001676static expr_ty
1677ast_for_starred(struct compiling *c, const node *n)
1678{
1679 expr_ty tmp;
1680 REQ(n, star_expr);
1681
1682 tmp = ast_for_expr(c, CHILD(n, 1));
1683 if (!tmp)
1684 return NULL;
1685
1686 /* The Load context is changed later. */
1687 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1688}
1689
1690
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691/* Do not name a variable 'expr'! Will cause a compile error.
1692*/
1693
1694static expr_ty
1695ast_for_expr(struct compiling *c, const node *n)
1696{
1697 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001698 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001699 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001700 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701 and_test: not_test ('and' not_test)*
1702 not_test: 'not' not_test | comparison
1703 comparison: expr (comp_op expr)*
1704 expr: xor_expr ('|' xor_expr)*
1705 xor_expr: and_expr ('^' and_expr)*
1706 and_expr: shift_expr ('&' shift_expr)*
1707 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1708 arith_expr: term (('+'|'-') term)*
1709 term: factor (('*'|'/'|'%'|'//') factor)*
1710 factor: ('+'|'-'|'~') factor | power
1711 power: atom trailer* ('**' factor)*
1712 */
1713
1714 asdl_seq *seq;
1715 int i;
1716
1717 loop:
1718 switch (TYPE(n)) {
1719 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001720 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001721 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001722 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001724 else if (NCH(n) > 1)
1725 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001726 /* Fallthrough */
1727 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 case and_test:
1729 if (NCH(n) == 1) {
1730 n = CHILD(n, 0);
1731 goto loop;
1732 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001733 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734 if (!seq)
1735 return NULL;
1736 for (i = 0; i < NCH(n); i += 2) {
1737 expr_ty e = ast_for_expr(c, CHILD(n, i));
1738 if (!e)
1739 return NULL;
1740 asdl_seq_SET(seq, i / 2, e);
1741 }
1742 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001743 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1744 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001745 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001746 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 case not_test:
1748 if (NCH(n) == 1) {
1749 n = CHILD(n, 0);
1750 goto loop;
1751 }
1752 else {
1753 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1754 if (!expression)
1755 return NULL;
1756
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001757 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1758 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 }
1760 case comparison:
1761 if (NCH(n) == 1) {
1762 n = CHILD(n, 0);
1763 goto loop;
1764 }
1765 else {
1766 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001767 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001768 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001769 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770 if (!ops)
1771 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001772 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 return NULL;
1775 }
1776 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001777 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779 newoperator = ast_for_comp_op(CHILD(n, i));
1780 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001782 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783
1784 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001785 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001787 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001788
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001789 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790 asdl_seq_SET(cmps, i / 2, expression);
1791 }
1792 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001793 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001795 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001797 return Compare(expression, ops, cmps, LINENO(n),
1798 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799 }
1800 break;
1801
Guido van Rossum0368b722007-05-11 16:50:42 +00001802 case star_expr:
1803 if (TYPE(CHILD(n, 0)) == STAR) {
1804 return ast_for_starred(c, n);
1805 }
1806 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 /* The next five cases all handle BinOps. The main body of code
1808 is the same in each case, but the switch turned inside out to
1809 reuse the code for each type of operator.
1810 */
1811 case expr:
1812 case xor_expr:
1813 case and_expr:
1814 case shift_expr:
1815 case arith_expr:
1816 case term:
1817 if (NCH(n) == 1) {
1818 n = CHILD(n, 0);
1819 goto loop;
1820 }
1821 return ast_for_binop(c, n);
1822 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001823 expr_ty exp = NULL;
1824 if (NCH(n) == 2) {
1825 exp = ast_for_testlist(c, CHILD(n, 1));
1826 if (!exp)
1827 return NULL;
1828 }
1829 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1830 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001831 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 if (NCH(n) == 1) {
1833 n = CHILD(n, 0);
1834 goto loop;
1835 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001836 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001837 case power:
1838 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001840 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 return NULL;
1842 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001843 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 return NULL;
1845}
1846
1847static expr_ty
1848ast_for_call(struct compiling *c, const node *n, expr_ty func)
1849{
1850 /*
1851 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1852 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001853 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 */
1855
1856 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001857 asdl_seq *args;
1858 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 expr_ty vararg = NULL, kwarg = NULL;
1860
1861 REQ(n, arglist);
1862
1863 nargs = 0;
1864 nkeywords = 0;
1865 ngens = 0;
1866 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 node *ch = CHILD(n, i);
1868 if (TYPE(ch) == argument) {
1869 if (NCH(ch) == 1)
1870 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001871 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 nkeywords++;
1875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 }
1877 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001878 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001879 "if not sole argument");
1880 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 }
1882
1883 if (nargs + nkeywords + ngens > 255) {
1884 ast_error(n, "more than 255 arguments");
1885 return NULL;
1886 }
1887
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001888 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001890 return NULL;
1891 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894 nargs = 0;
1895 nkeywords = 0;
1896 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 node *ch = CHILD(n, i);
1898 if (TYPE(ch) == argument) {
1899 expr_ty e;
1900 if (NCH(ch) == 1) {
1901 if (nkeywords) {
1902 ast_error(CHILD(ch, 0),
1903 "non-keyword arg after keyword arg");
1904 return NULL;
1905 }
1906 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001908 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 asdl_seq_SET(args, nargs++, e);
1910 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001911 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001912 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001914 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001915 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001917 else {
1918 keyword_ty kw;
1919 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001920
Thomas Wouters89f507f2006-12-13 04:49:30 +00001921 /* CHILD(ch, 0) is test, but must be an identifier? */
1922 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001924 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 /* f(lambda x: x[0] = 3) ends up getting parsed with
1926 * LHS test = lambda x: x[0], and RHS test = 3.
1927 * SF bug 132313 points out that complaining about a keyword
1928 * then is very confusing.
1929 */
1930 if (e->kind == Lambda_kind) {
1931 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001932 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 } else if (e->kind != Name_kind) {
1934 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001935 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001937 key = e->v.Name.id;
1938 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001940 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001941 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001943 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001944 asdl_seq_SET(keywords, nkeywords++, kw);
1945 }
1946 }
1947 else if (TYPE(ch) == STAR) {
1948 vararg = ast_for_expr(c, CHILD(n, i+1));
1949 i++;
1950 }
1951 else if (TYPE(ch) == DOUBLESTAR) {
1952 kwarg = ast_for_expr(c, CHILD(n, i+1));
1953 i++;
1954 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955 }
1956
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001957 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958}
1959
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001961ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001963 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001964 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001965 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001967 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001968 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001969 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001970 }
1971 else {
1972 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001973 TYPE(n) == testlist1);
1974 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 else {
1978 asdl_seq *tmp = seq_for_testlist(c, n);
1979 if (!tmp)
1980 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001981 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001983}
1984
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985static stmt_ty
1986ast_for_expr_stmt(struct compiling *c, const node *n)
1987{
1988 REQ(n, expr_stmt);
1989 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1990 | ('=' (yield_expr|testlist))*)
1991 testlist: test (',' test)* [',']
1992 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001993 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 test: ... here starts the operator precendence dance
1995 */
1996
1997 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 if (!e)
2000 return NULL;
2001
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 }
2004 else if (TYPE(CHILD(n, 1)) == augassign) {
2005 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002006 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002007 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008
Thomas Wouters89f507f2006-12-13 04:49:30 +00002009 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 if (!expr1)
2011 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002012 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002013 switch (expr1->kind) {
2014 case GeneratorExp_kind:
2015 ast_error(ch, "augmented assignment to generator "
2016 "expression not possible");
2017 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002018 case Yield_kind:
2019 ast_error(ch, "augmented assignment to yield "
2020 "expression not possible");
2021 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002022 case Name_kind: {
2023 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
2024 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
2025 ast_error(ch, "assignment to None");
2026 return NULL;
2027 }
2028 break;
2029 }
2030 case Attribute_kind:
2031 case Subscript_kind:
2032 break;
2033 default:
2034 ast_error(ch, "illegal expression for augmented "
2035 "assignment");
2036 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039
Thomas Wouters89f507f2006-12-13 04:49:30 +00002040 ch = CHILD(n, 2);
2041 if (TYPE(ch) == testlist)
2042 expr2 = ast_for_testlist(c, ch);
2043 else
2044 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002045 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 return NULL;
2047
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002048 newoperator = ast_for_augassign(CHILD(n, 1));
2049 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 return NULL;
2051
Thomas Wouters89f507f2006-12-13 04:49:30 +00002052 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 }
2054 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002055 int i;
2056 asdl_seq *targets;
2057 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 expr_ty expression;
2059
Thomas Wouters89f507f2006-12-13 04:49:30 +00002060 /* a normal assignment */
2061 REQ(CHILD(n, 1), EQUAL);
2062 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2063 if (!targets)
2064 return NULL;
2065 for (i = 0; i < NCH(n) - 2; i += 2) {
2066 expr_ty e;
2067 node *ch = CHILD(n, i);
2068 if (TYPE(ch) == yield_expr) {
2069 ast_error(ch, "assignment to yield expression not possible");
2070 return NULL;
2071 }
2072 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073
Thomas Wouters89f507f2006-12-13 04:49:30 +00002074 /* set context to assign */
2075 if (!e)
2076 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077
Thomas Wouters89f507f2006-12-13 04:49:30 +00002078 if (!set_context(e, Store, CHILD(n, i)))
2079 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 asdl_seq_SET(targets, i / 2, e);
2082 }
2083 value = CHILD(n, NCH(n) - 1);
2084 if (TYPE(value) == testlist)
2085 expression = ast_for_testlist(c, value);
2086 else
2087 expression = ast_for_expr(c, value);
2088 if (!expression)
2089 return NULL;
2090 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092}
2093
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002095ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096{
2097 asdl_seq *seq;
2098 int i;
2099 expr_ty e;
2100
2101 REQ(n, exprlist);
2102
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002103 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002105 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002107 e = ast_for_expr(c, CHILD(n, i));
2108 if (!e)
2109 return NULL;
2110 asdl_seq_SET(seq, i / 2, e);
2111 if (context && !set_context(e, context, CHILD(n, i)))
2112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 }
2114 return seq;
2115}
2116
2117static stmt_ty
2118ast_for_del_stmt(struct compiling *c, const node *n)
2119{
2120 asdl_seq *expr_list;
2121
2122 /* del_stmt: 'del' exprlist */
2123 REQ(n, del_stmt);
2124
2125 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2126 if (!expr_list)
2127 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002128 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129}
2130
2131static stmt_ty
2132ast_for_flow_stmt(struct compiling *c, const node *n)
2133{
2134 /*
2135 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2136 | yield_stmt
2137 break_stmt: 'break'
2138 continue_stmt: 'continue'
2139 return_stmt: 'return' [testlist]
2140 yield_stmt: yield_expr
2141 yield_expr: 'yield' testlist
2142 raise_stmt: 'raise' [test [',' test [',' test]]]
2143 */
2144 node *ch;
2145
2146 REQ(n, flow_stmt);
2147 ch = CHILD(n, 0);
2148 switch (TYPE(ch)) {
2149 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002150 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002152 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2155 if (!exp)
2156 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002157 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 }
2159 case return_stmt:
2160 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002163 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002164 if (!expression)
2165 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002166 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 }
2168 case raise_stmt:
2169 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002170 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 else if (NCH(ch) == 2) {
2172 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2173 if (!expression)
2174 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002175 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176 }
2177 else if (NCH(ch) == 4) {
2178 expr_ty expr1, expr2;
2179
2180 expr1 = ast_for_expr(c, CHILD(ch, 1));
2181 if (!expr1)
2182 return NULL;
2183 expr2 = ast_for_expr(c, CHILD(ch, 3));
2184 if (!expr2)
2185 return NULL;
2186
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002187 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 }
2189 else if (NCH(ch) == 6) {
2190 expr_ty expr1, expr2, expr3;
2191
2192 expr1 = ast_for_expr(c, CHILD(ch, 1));
2193 if (!expr1)
2194 return NULL;
2195 expr2 = ast_for_expr(c, CHILD(ch, 3));
2196 if (!expr2)
2197 return NULL;
2198 expr3 = ast_for_expr(c, CHILD(ch, 5));
2199 if (!expr3)
2200 return NULL;
2201
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002202 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 }
2204 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002205 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206 "unexpected flow_stmt: %d", TYPE(ch));
2207 return NULL;
2208 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002209
2210 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2211 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212}
2213
2214static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002215alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216{
2217 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002218 import_as_name: NAME ['as' NAME]
2219 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 dotted_name: NAME ('.' NAME)*
2221 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002222 PyObject *str;
2223
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 loop:
2225 switch (TYPE(n)) {
2226 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002227 str = NULL;
2228 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002229 str = NEW_IDENTIFIER(CHILD(n, 2));
2230 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002231 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 case dotted_as_name:
2233 if (NCH(n) == 1) {
2234 n = CHILD(n, 0);
2235 goto loop;
2236 }
2237 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002238 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002239 if (!a)
2240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 assert(!a->asname);
2242 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2243 return a;
2244 }
2245 break;
2246 case dotted_name:
2247 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002248 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 else {
2250 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002251 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002252 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 char *s;
2254
2255 len = 0;
2256 for (i = 0; i < NCH(n); i += 2)
2257 /* length of string plus one for the dot */
2258 len += strlen(STR(CHILD(n, i))) + 1;
2259 len--; /* the last name doesn't have a dot */
2260 str = PyString_FromStringAndSize(NULL, len);
2261 if (!str)
2262 return NULL;
2263 s = PyString_AS_STRING(str);
2264 if (!s)
2265 return NULL;
2266 for (i = 0; i < NCH(n); i += 2) {
2267 char *sch = STR(CHILD(n, i));
2268 strcpy(s, STR(CHILD(n, i)));
2269 s += strlen(sch);
2270 *s++ = '.';
2271 }
2272 --s;
2273 *s = '\0';
2274 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002275 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002276 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 }
2278 break;
2279 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002280 str = PyString_InternFromString("*");
2281 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002282 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002284 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 "unexpected import name: %d", TYPE(n));
2286 return NULL;
2287 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002288
2289 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 return NULL;
2291}
2292
2293static stmt_ty
2294ast_for_import_stmt(struct compiling *c, const node *n)
2295{
2296 /*
2297 import_stmt: import_name | import_from
2298 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002299 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2300 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002302 int lineno;
2303 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 int i;
2305 asdl_seq *aliases;
2306
2307 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002308 lineno = LINENO(n);
2309 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002311 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002313 REQ(n, dotted_as_names);
2314 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2315 if (!aliases)
2316 return NULL;
2317 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002318 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002319 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002321 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002323 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002325 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002327 int idx, ndots = 0;
2328 alias_ty mod = NULL;
2329 identifier modname;
2330
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002331 /* Count the number of dots (for relative imports) and check for the
2332 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002333 for (idx = 1; idx < NCH(n); idx++) {
2334 if (TYPE(CHILD(n, idx)) == dotted_name) {
2335 mod = alias_for_import_name(c, CHILD(n, idx));
2336 idx++;
2337 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002338 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2339 /* three consecutive dots are tokenized as one ELLIPSIS */
2340 ndots += 3;
2341 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 } else if (TYPE(CHILD(n, idx)) != DOT) {
2343 break;
2344 }
2345 ndots++;
2346 }
2347 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002348 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002349 case STAR:
2350 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002351 n = CHILD(n, idx);
2352 n_children = 1;
2353 if (ndots) {
2354 ast_error(n, "'import *' not allowed with 'from .'");
2355 return NULL;
2356 }
2357 break;
2358 case LPAR:
2359 /* from ... import (x, y, z) */
2360 n = CHILD(n, idx + 1);
2361 n_children = NCH(n);
2362 break;
2363 case import_as_names:
2364 /* from ... import x, y, z */
2365 n = CHILD(n, idx);
2366 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002367 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368 ast_error(n, "trailing comma not allowed without"
2369 " surrounding parentheses");
2370 return NULL;
2371 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002372 break;
2373 default:
2374 ast_error(n, "Unexpected node-type in from-import");
2375 return NULL;
2376 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2379 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381
2382 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002383 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002384 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002385 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002389 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002391 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2392 if (!import_alias)
2393 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002394 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002395 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002397 if (mod != NULL)
2398 modname = mod->name;
2399 else
2400 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002401 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002402 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 }
Neal Norwitz79792652005-11-14 04:25:03 +00002404 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 "unknown import statement: starts with command '%s'",
2406 STR(CHILD(n, 0)));
2407 return NULL;
2408}
2409
2410static stmt_ty
2411ast_for_global_stmt(struct compiling *c, const node *n)
2412{
2413 /* global_stmt: 'global' NAME (',' NAME)* */
2414 identifier name;
2415 asdl_seq *s;
2416 int i;
2417
2418 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002419 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 name = NEW_IDENTIFIER(CHILD(n, i));
2424 if (!name)
2425 return NULL;
2426 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002428 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429}
2430
2431static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002432ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2433{
2434 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2435 identifier name;
2436 asdl_seq *s;
2437 int i;
2438
2439 REQ(n, nonlocal_stmt);
2440 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2441 if (!s)
2442 return NULL;
2443 for (i = 1; i < NCH(n); i += 2) {
2444 name = NEW_IDENTIFIER(CHILD(n, i));
2445 if (!name)
2446 return NULL;
2447 asdl_seq_SET(s, i / 2, name);
2448 }
2449 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2450}
2451
2452static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453ast_for_assert_stmt(struct compiling *c, const node *n)
2454{
2455 /* assert_stmt: 'assert' test [',' test] */
2456 REQ(n, assert_stmt);
2457 if (NCH(n) == 2) {
2458 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2459 if (!expression)
2460 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002461 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 }
2463 else if (NCH(n) == 4) {
2464 expr_ty expr1, expr2;
2465
2466 expr1 = ast_for_expr(c, CHILD(n, 1));
2467 if (!expr1)
2468 return NULL;
2469 expr2 = ast_for_expr(c, CHILD(n, 3));
2470 if (!expr2)
2471 return NULL;
2472
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
Neal Norwitz79792652005-11-14 04:25:03 +00002475 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002476 "improper number of parts to 'assert' statement: %d",
2477 NCH(n));
2478 return NULL;
2479}
2480
2481static asdl_seq *
2482ast_for_suite(struct compiling *c, const node *n)
2483{
2484 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002485 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 stmt_ty s;
2487 int i, total, num, end, pos = 0;
2488 node *ch;
2489
2490 REQ(n, suite);
2491
2492 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002493 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002495 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 n = CHILD(n, 0);
2498 /* simple_stmt always ends with a NEWLINE,
2499 and may have a trailing SEMI
2500 */
2501 end = NCH(n) - 1;
2502 if (TYPE(CHILD(n, end - 1)) == SEMI)
2503 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 for (i = 0; i < end; i += 2) {
2506 ch = CHILD(n, i);
2507 s = ast_for_stmt(c, ch);
2508 if (!s)
2509 return NULL;
2510 asdl_seq_SET(seq, pos++, s);
2511 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 }
2513 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002514 for (i = 2; i < (NCH(n) - 1); i++) {
2515 ch = CHILD(n, i);
2516 REQ(ch, stmt);
2517 num = num_stmts(ch);
2518 if (num == 1) {
2519 /* small_stmt or compound_stmt with only one child */
2520 s = ast_for_stmt(c, ch);
2521 if (!s)
2522 return NULL;
2523 asdl_seq_SET(seq, pos++, s);
2524 }
2525 else {
2526 int j;
2527 ch = CHILD(ch, 0);
2528 REQ(ch, simple_stmt);
2529 for (j = 0; j < NCH(ch); j += 2) {
2530 /* statement terminates with a semi-colon ';' */
2531 if (NCH(CHILD(ch, j)) == 0) {
2532 assert((j + 1) == NCH(ch));
2533 break;
2534 }
2535 s = ast_for_stmt(c, CHILD(ch, j));
2536 if (!s)
2537 return NULL;
2538 asdl_seq_SET(seq, pos++, s);
2539 }
2540 }
2541 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 }
2543 assert(pos == seq->size);
2544 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545}
2546
2547static stmt_ty
2548ast_for_if_stmt(struct compiling *c, const node *n)
2549{
2550 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2551 ['else' ':' suite]
2552 */
2553 char *s;
2554
2555 REQ(n, if_stmt);
2556
2557 if (NCH(n) == 4) {
2558 expr_ty expression;
2559 asdl_seq *suite_seq;
2560
2561 expression = ast_for_expr(c, CHILD(n, 1));
2562 if (!expression)
2563 return NULL;
2564 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002565 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 return NULL;
2567
Guido van Rossumd8faa362007-04-27 19:54:29 +00002568 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2569 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002571
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 s = STR(CHILD(n, 4));
2573 /* s[2], the third character in the string, will be
2574 's' for el_s_e, or
2575 'i' for el_i_f
2576 */
2577 if (s[2] == 's') {
2578 expr_ty expression;
2579 asdl_seq *seq1, *seq2;
2580
2581 expression = ast_for_expr(c, CHILD(n, 1));
2582 if (!expression)
2583 return NULL;
2584 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002585 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 return NULL;
2587 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002588 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 return NULL;
2590
Guido van Rossumd8faa362007-04-27 19:54:29 +00002591 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2592 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 }
2594 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002596 expr_ty expression;
2597 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 asdl_seq *orelse = NULL;
2599 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 /* must reference the child n_elif+1 since 'else' token is third,
2601 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002602 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2603 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2604 has_else = 1;
2605 n_elif -= 3;
2606 }
2607 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608
Thomas Wouters89f507f2006-12-13 04:49:30 +00002609 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002610 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 orelse = asdl_seq_new(1, c->c_arena);
2613 if (!orelse)
2614 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002616 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002618 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2619 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002621 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2622 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624
Guido van Rossumd8faa362007-04-27 19:54:29 +00002625 asdl_seq_SET(orelse, 0,
2626 If(expression, suite_seq, suite_seq2,
2627 LINENO(CHILD(n, NCH(n) - 6)),
2628 CHILD(n, NCH(n) - 6)->n_col_offset,
2629 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 /* the just-created orelse handled the last elif */
2631 n_elif--;
2632 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 for (i = 0; i < n_elif; i++) {
2635 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002636 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2637 if (!newobj)
2638 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002640 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002643 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645
Thomas Wouters89f507f2006-12-13 04:49:30 +00002646 asdl_seq_SET(newobj, 0,
2647 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002648 LINENO(CHILD(n, off)),
2649 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002650 orelse = newobj;
2651 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002652 expression = ast_for_expr(c, CHILD(n, 1));
2653 if (!expression)
2654 return NULL;
2655 suite_seq = ast_for_suite(c, CHILD(n, 3));
2656 if (!suite_seq)
2657 return NULL;
2658 return If(expression, suite_seq, orelse,
2659 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002661
2662 PyErr_Format(PyExc_SystemError,
2663 "unexpected token in 'if' statement: %s", s);
2664 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665}
2666
2667static stmt_ty
2668ast_for_while_stmt(struct compiling *c, const node *n)
2669{
2670 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2671 REQ(n, while_stmt);
2672
2673 if (NCH(n) == 4) {
2674 expr_ty expression;
2675 asdl_seq *suite_seq;
2676
2677 expression = ast_for_expr(c, CHILD(n, 1));
2678 if (!expression)
2679 return NULL;
2680 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002681 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 }
2685 else if (NCH(n) == 7) {
2686 expr_ty expression;
2687 asdl_seq *seq1, *seq2;
2688
2689 expression = ast_for_expr(c, CHILD(n, 1));
2690 if (!expression)
2691 return NULL;
2692 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return NULL;
2695 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002696 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return NULL;
2698
Thomas Wouters89f507f2006-12-13 04:49:30 +00002699 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002701
2702 PyErr_Format(PyExc_SystemError,
2703 "wrong number of tokens for 'while' statement: %d",
2704 NCH(n));
2705 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706}
2707
2708static stmt_ty
2709ast_for_for_stmt(struct compiling *c, const node *n)
2710{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002711 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 expr_ty expression;
2713 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002714 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2716 REQ(n, for_stmt);
2717
2718 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 if (!seq)
2721 return NULL;
2722 }
2723
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002724 node_target = CHILD(n, 1);
2725 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002726 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002728 /* Check the # of children rather than the length of _target, since
2729 for x, in ... has 1 element in _target, but still requires a Tuple. */
2730 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002731 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002733 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002735 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002736 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 return NULL;
2738 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002739 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 return NULL;
2741
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002742 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2743 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744}
2745
2746static excepthandler_ty
2747ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2748{
2749 /* except_clause: 'except' [test [',' test]] */
2750 REQ(exc, except_clause);
2751 REQ(body, suite);
2752
2753 if (NCH(exc) == 1) {
2754 asdl_seq *suite_seq = ast_for_suite(c, body);
2755 if (!suite_seq)
2756 return NULL;
2757
Thomas Wouters89f507f2006-12-13 04:49:30 +00002758 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002759 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 }
2761 else if (NCH(exc) == 2) {
2762 expr_ty expression;
2763 asdl_seq *suite_seq;
2764
2765 expression = ast_for_expr(c, CHILD(exc, 1));
2766 if (!expression)
2767 return NULL;
2768 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002769 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 return NULL;
2771
Thomas Wouters89f507f2006-12-13 04:49:30 +00002772 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002773 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 }
2775 else if (NCH(exc) == 4) {
2776 asdl_seq *suite_seq;
2777 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002778 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002779 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002782 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 return NULL;
2784 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 return NULL;
2787
Thomas Wouters89f507f2006-12-13 04:49:30 +00002788 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002789 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002791
2792 PyErr_Format(PyExc_SystemError,
2793 "wrong number of children for 'except' clause: %d",
2794 NCH(exc));
2795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796}
2797
2798static stmt_ty
2799ast_for_try_stmt(struct compiling *c, const node *n)
2800{
Neal Norwitzf599f422005-12-17 21:33:47 +00002801 const int nch = NCH(n);
2802 int n_except = (nch - 3)/3;
2803 asdl_seq *body, *orelse = NULL, *finally = NULL;
2804
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 REQ(n, try_stmt);
2806
Neal Norwitzf599f422005-12-17 21:33:47 +00002807 body = ast_for_suite(c, CHILD(n, 2));
2808 if (body == NULL)
2809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810
Neal Norwitzf599f422005-12-17 21:33:47 +00002811 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2812 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2813 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2814 /* we can assume it's an "else",
2815 because nch >= 9 for try-else-finally and
2816 it would otherwise have a type of except_clause */
2817 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2818 if (orelse == NULL)
2819 return NULL;
2820 n_except--;
2821 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822
Neal Norwitzf599f422005-12-17 21:33:47 +00002823 finally = ast_for_suite(c, CHILD(n, nch - 1));
2824 if (finally == NULL)
2825 return NULL;
2826 n_except--;
2827 }
2828 else {
2829 /* we can assume it's an "else",
2830 otherwise it would have a type of except_clause */
2831 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2832 if (orelse == NULL)
2833 return NULL;
2834 n_except--;
2835 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002837 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002838 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839 return NULL;
2840 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002841
2842 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002843 int i;
2844 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002845 /* process except statements to create a try ... except */
2846 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2847 if (handlers == NULL)
2848 return NULL;
2849
2850 for (i = 0; i < n_except; i++) {
2851 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2852 CHILD(n, 5 + i * 3));
2853 if (!e)
2854 return NULL;
2855 asdl_seq_SET(handlers, i, e);
2856 }
2857
Thomas Wouters89f507f2006-12-13 04:49:30 +00002858 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002859 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002860 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002861 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002862
2863 /* if a 'finally' is present too, we nest the TryExcept within a
2864 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002865 body = asdl_seq_new(1, c->c_arena);
2866 if (body == NULL)
2867 return NULL;
2868 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002869 }
2870
2871 /* must be a try ... finally (except clauses are in body, if any exist) */
2872 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002873 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874}
2875
Guido van Rossumc2e20742006-02-27 22:32:47 +00002876static expr_ty
2877ast_for_with_var(struct compiling *c, const node *n)
2878{
2879 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002880 return ast_for_expr(c, CHILD(n, 1));
2881}
2882
2883/* with_stmt: 'with' test [ with_var ] ':' suite */
2884static stmt_ty
2885ast_for_with_stmt(struct compiling *c, const node *n)
2886{
2887 expr_ty context_expr, optional_vars = NULL;
2888 int suite_index = 3; /* skip 'with', test, and ':' */
2889 asdl_seq *suite_seq;
2890
2891 assert(TYPE(n) == with_stmt);
2892 context_expr = ast_for_expr(c, CHILD(n, 1));
2893 if (TYPE(CHILD(n, 2)) == with_var) {
2894 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2895
2896 if (!optional_vars) {
2897 return NULL;
2898 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002899 if (!set_context(optional_vars, Store, n)) {
2900 return NULL;
2901 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002902 suite_index = 4;
2903 }
2904
2905 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2906 if (!suite_seq) {
2907 return NULL;
2908 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002909 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002910 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002911}
2912
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913static stmt_ty
2914ast_for_classdef(struct compiling *c, const node *n)
2915{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002916 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2917 asdl_seq *s;
2918 expr_ty call, dummy;
2919
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920 REQ(n, classdef);
2921
2922 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002923 ast_error(n, "assignment to None");
2924 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 }
2926
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002927 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928 s = ast_for_suite(c, CHILD(n, 3));
2929 if (!s)
2930 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002931 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2932 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002934
2935 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 s = ast_for_suite(c, CHILD(n,5));
2937 if (!s)
2938 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002939 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2940 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 }
2942
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002943 /* class NAME '(' arglist ')' ':' suite */
2944 /* build up a fake Call node so we can extract its pieces */
2945 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2946 call = ast_for_call(c, CHILD(n, 3), dummy);
2947 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002950 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002952
2953 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2954 call->v.Call.args, call->v.Call.keywords,
2955 call->v.Call.starargs, call->v.Call.kwargs, s,
2956 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957}
2958
2959static stmt_ty
2960ast_for_stmt(struct compiling *c, const node *n)
2961{
2962 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 assert(NCH(n) == 1);
2964 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 }
2966 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002967 assert(num_stmts(n) == 1);
2968 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 }
2970 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002971 REQ(n, small_stmt);
2972 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002973 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2974 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002975 */
2976 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977 case expr_stmt:
2978 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 case del_stmt:
2980 return ast_for_del_stmt(c, n);
2981 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002982 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 case flow_stmt:
2984 return ast_for_flow_stmt(c, n);
2985 case import_stmt:
2986 return ast_for_import_stmt(c, n);
2987 case global_stmt:
2988 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002989 case nonlocal_stmt:
2990 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 case assert_stmt:
2992 return ast_for_assert_stmt(c, n);
2993 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002994 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2996 TYPE(n), NCH(n));
2997 return NULL;
2998 }
2999 }
3000 else {
3001 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003002 | funcdef | classdef
3003 */
3004 node *ch = CHILD(n, 0);
3005 REQ(n, compound_stmt);
3006 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 case if_stmt:
3008 return ast_for_if_stmt(c, ch);
3009 case while_stmt:
3010 return ast_for_while_stmt(c, ch);
3011 case for_stmt:
3012 return ast_for_for_stmt(c, ch);
3013 case try_stmt:
3014 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003015 case with_stmt:
3016 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 case funcdef:
3018 return ast_for_funcdef(c, ch);
3019 case classdef:
3020 return ast_for_classdef(c, ch);
3021 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003022 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3024 TYPE(n), NCH(n));
3025 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003026 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 }
3028}
3029
3030static PyObject *
3031parsenumber(const char *s)
3032{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003033 const char *end;
3034 long x;
3035 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003037 Py_complex c;
3038 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039#endif
3040
Guido van Rossumd8faa362007-04-27 19:54:29 +00003041 errno = 0;
3042 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003044 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003046 if (*end == 'l' || *end == 'L')
3047 return PyLong_FromString((char *)s, (char **)0, 0);
3048 if (s[0] == '0') {
3049 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3050 if (x < 0 && errno == 0) {
3051 return PyLong_FromString((char *)s,
3052 (char **)0,
3053 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003054 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003055 }
3056 else
3057 x = PyOS_strtol((char *)s, (char **)&end, 0);
3058 if (*end == '\0') {
3059 if (errno != 0)
3060 return PyLong_FromString((char *)s, (char **)0, 0);
3061 return PyInt_FromLong(x);
3062 }
3063 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003065 if (imflag) {
3066 c.real = 0.;
3067 PyFPE_START_PROTECT("atof", return 0)
3068 c.imag = PyOS_ascii_atof(s);
3069 PyFPE_END_PROTECT(c)
3070 return PyComplex_FromCComplex(c);
3071 }
3072 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003074 {
3075 PyFPE_START_PROTECT("atof", return 0)
3076 dx = PyOS_ascii_atof(s);
3077 PyFPE_END_PROTECT(dx)
3078 return PyFloat_FromDouble(dx);
3079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080}
3081
3082static PyObject *
3083decode_utf8(const char **sPtr, const char *end, char* encoding)
3084{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003085 PyObject *u, *v;
3086 char *s, *t;
3087 t = s = (char *)*sPtr;
3088 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3089 while (s < end && (*s & 0x80)) s++;
3090 *sPtr = s;
3091 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3092 if (u == NULL)
3093 return NULL;
3094 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3095 Py_DECREF(u);
3096 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097}
3098
3099static PyObject *
3100decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3101{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003102 PyObject *v, *u;
3103 char *buf;
3104 char *p;
3105 const char *end;
3106 if (encoding == NULL) {
3107 buf = (char *)s;
3108 u = NULL;
3109 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3110 buf = (char *)s;
3111 u = NULL;
3112 } else {
3113 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3114 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3115 if (u == NULL)
3116 return NULL;
3117 p = buf = PyString_AsString(u);
3118 end = s + len;
3119 while (s < end) {
3120 if (*s == '\\') {
3121 *p++ = *s++;
3122 if (*s & 0x80) {
3123 strcpy(p, "u005c");
3124 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003125 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003126 }
3127 if (*s & 0x80) { /* XXX inefficient */
3128 PyObject *w;
3129 char *r;
3130 Py_ssize_t rn, i;
3131 w = decode_utf8(&s, end, "utf-16-be");
3132 if (w == NULL) {
3133 Py_DECREF(u);
3134 return NULL;
3135 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003136 assert(PyBytes_Check(w));
3137 r = PyBytes_AsString(w);
3138 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003139 assert(rn % 2 == 0);
3140 for (i = 0; i < rn; i += 2) {
3141 sprintf(p, "\\u%02x%02x",
3142 r[i + 0] & 0xFF,
3143 r[i + 1] & 0xFF);
3144 p += 6;
3145 }
3146 Py_DECREF(w);
3147 } else {
3148 *p++ = *s++;
3149 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003150 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003151 len = p - buf;
3152 s = buf;
3153 }
3154 if (rawmode)
3155 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3156 else
3157 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3158 Py_XDECREF(u);
3159 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160}
3161
3162/* s is a Python string literal, including the bracketing quote characters,
3163 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3164 * parsestr parses it, and returns the decoded Python string object.
3165 */
3166static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003167parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 size_t len;
3170 const char *s = STR(n);
3171 int quote = Py_CHARMASK(*s);
3172 int rawmode = 0;
3173 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003174
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 if (quote == 'b' || quote == 'B') {
3177 quote = *++s;
3178 *bytesmode = 1;
3179 }
3180 if (quote == 'r' || quote == 'R') {
3181 quote = *++s;
3182 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003183 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003184 }
3185 if (quote != '\'' && quote != '\"') {
3186 PyErr_BadInternalCall();
3187 return NULL;
3188 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003189 s++;
3190 len = strlen(s);
3191 if (len > INT_MAX) {
3192 PyErr_SetString(PyExc_OverflowError,
3193 "string to parse is too long");
3194 return NULL;
3195 }
3196 if (s[--len] != quote) {
3197 PyErr_BadInternalCall();
3198 return NULL;
3199 }
3200 if (len >= 4 && s[0] == quote && s[1] == quote) {
3201 s += 2;
3202 len -= 2;
3203 if (s[--len] != quote || s[--len] != quote) {
3204 PyErr_BadInternalCall();
3205 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003206 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003208 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 return decode_unicode(s, len, rawmode, encoding);
3210 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 if (*bytesmode) {
3212 /* Disallow non-ascii characters (but not escapes) */
3213 const char *c;
3214 for (c = s; *c; c++) {
3215 if (Py_CHARMASK(*c) >= 0x80) {
3216 ast_error(n, "bytes can only contain ASCII "
3217 "literal characters.");
3218 return NULL;
3219 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003220 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 }
3222 need_encoding = (!*bytesmode && encoding != NULL &&
3223 strcmp(encoding, "utf-8") != 0 &&
3224 strcmp(encoding, "iso-8859-1") != 0);
3225 if (rawmode || strchr(s, '\\') == NULL) {
3226 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003227 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3228 if (u == NULL)
3229 return NULL;
3230 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3231 Py_DECREF(u);
3232 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003233 } else {
3234 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003235 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237
Guido van Rossumbdde0112007-05-11 16:26:27 +00003238 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240}
3241
3242/* Build a Python string object out of a STRING atom. This takes care of
3243 * compile-time literal catenation, calling parsestr() on each piece, and
3244 * pasting the intermediate results together.
3245 */
3246static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003247parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003249 PyObject *v;
3250 int i;
3251 REQ(CHILD(n, 0), STRING);
3252 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3253 if (v != NULL) {
3254 /* String literal concatenation */
3255 for (i = 1; i < NCH(n); i++) {
3256 PyObject *s;
3257 int subbm = 0;
3258 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3259 if (s == NULL)
3260 goto onError;
3261 if (*bytesmode != subbm) {
3262 ast_error(n, "cannot mix bytes and nonbytes"
3263 "literals");
3264 goto onError;
3265 }
3266 if (PyString_Check(v) && PyString_Check(s)) {
3267 PyString_ConcatAndDel(&v, s);
3268 if (v == NULL)
3269 goto onError;
3270 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 else {
3272 PyObject *temp = PyUnicode_Concat(v, s);
3273 Py_DECREF(s);
3274 Py_DECREF(v);
3275 v = temp;
3276 if (v == NULL)
3277 goto onError;
3278 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003279 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003280 }
3281 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282
Guido van Rossumd8faa362007-04-27 19:54:29 +00003283 onError:
3284 Py_XDECREF(v);
3285 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286}