blob: aff340354264ef58c7d78179de0e18e8a2c1491a [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
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000569compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000570{
571 identifier name;
572 expr_ty annotation = NULL;
573 node *ch;
574
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000575 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000576 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
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000591 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592}
593
Guido van Rossum4f72a782006-10-27 23:31:49 +0000594/* returns -1 if failed to handle keyword only arguments
595 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000596 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000597 ^^^
598 start pointing here
599 */
600static int
601handle_keywordonly_args(struct compiling *c, const node *n, int start,
602 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
603{
604 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000605 expr_ty expression, annotation;
606 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000607 int i = start;
608 int j = 0; /* index for kwdefaults and kwonlyargs */
609 assert(kwonlyargs != NULL);
610 assert(kwdefaults != NULL);
611 while (i < NCH(n)) {
612 ch = CHILD(n, i);
613 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000614 case vfpdef:
615 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000616 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000617 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000618 if (!expression) {
619 ast_error(ch, "assignment to None");
620 goto error;
621 }
622 asdl_seq_SET(kwdefaults, j, expression);
623 i += 2; /* '=' and test */
624 }
625 else { /* setting NULL if no default value exists */
626 asdl_seq_SET(kwdefaults, j, NULL);
627 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000628 if (NCH(ch) == 3) {
629 /* ch is NAME ':' test */
630 annotation = ast_for_expr(c, CHILD(ch, 2));
631 if (!annotation) {
632 ast_error(ch, "expected expression");
633 goto error;
634 }
635 }
636 else {
637 annotation = NULL;
638 }
639 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000640 if (!strcmp(STR(ch), "None")) {
641 ast_error(ch, "assignment to None");
642 goto error;
643 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000644 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000645 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000646 ast_error(ch, "expecting name");
647 goto error;
648 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000649 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 i += 2; /* the name and the comma */
651 break;
652 case DOUBLESTAR:
653 return i;
654 default:
655 ast_error(ch, "unexpected node");
656 goto error;
657 }
658 }
659 return i;
660 error:
661 return -1;
662}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000663
Jeremy Hyltona8293132006-02-28 17:58:27 +0000664/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665
666static arguments_ty
667ast_for_arguments(struct compiling *c, const node *n)
668{
Neal Norwitzc1505362006-12-28 06:47:50 +0000669 /* This function handles both typedargslist (function definition)
670 and varargslist (lambda definition).
671
672 parameters: '(' [typedargslist] ')'
673 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000674 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
675 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000676 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000677 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000678 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000679 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
680 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000681 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000682 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000684 int i, j, k, nposargs = 0, nkwonlyargs = 0;
685 int nposdefaults = 0, found_default = 0;
686 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000688 arg_ty arg;
689 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000690 node *ch;
691
692 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000693 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000694 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
695 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000696 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000697 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000698 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000699
Guido van Rossum4f72a782006-10-27 23:31:49 +0000700 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000701 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000702 ch = CHILD(n, i);
703 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000704 /* skip star and possible argument */
705 i++;
706 i += (TYPE(CHILD(n, i)) == tfpdef
707 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000708 break;
709 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000710 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000711 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000712 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000714 /* count the number of keyword only args &
715 defaults for keyword only args */
716 for ( ; i < NCH(n); ++i) {
717 ch = CHILD(n, i);
718 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000719 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000720 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000721 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
722 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000723 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000724 kwonlyargs = (nkwonlyargs ?
725 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
726 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000728 posdefaults = (nposdefaults ?
729 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
730 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000731 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000732 /* The length of kwonlyargs and kwdefaults are same
733 since we set NULL as default for keyword only argument w/o default
734 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000735 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000736 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
737 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000738 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000739
740 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000741 ast_error(n, "more than 255 arguments");
742 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000743 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000745 /* tfpdef: NAME [':' test]
746 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 */
748 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000749 j = 0; /* index for defaults */
750 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000752 ch = CHILD(n, i);
753 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000754 case tfpdef:
755 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
757 anything other than EQUAL or a comma? */
758 /* XXX Should NCH(n) check be made a separate check? */
759 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000760 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
761 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000762 goto error;
763 assert(posdefaults != NULL);
764 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000768 else if (found_default) {
769 ast_error(n,
770 "non-default argument follows default argument");
771 goto error;
772 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000773 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000774 if (!arg)
775 goto error;
776 asdl_seq_SET(posargs, k++, arg);
777
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 i += 2; /* the name and the comma */
779 break;
780 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 if (i+1 >= NCH(n)) {
782 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000783 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000784 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000785 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000786 if (TYPE(ch) == COMMA) {
787 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 i += 2; /* now follows keyword only arguments */
789 res = handle_keywordonly_args(c, n, i,
790 kwonlyargs, kwdefaults);
791 if (res == -1) goto error;
792 i = res; /* res has new position to process */
793 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000794 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
795 ast_error(CHILD(ch, 0), "assignment to None");
796 goto error;
797 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000799 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
800 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000801 /* there is an annotation on the vararg */
802 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000803 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000805 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
806 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 int res = 0;
808 res = handle_keywordonly_args(c, n, i,
809 kwonlyargs, kwdefaults);
810 if (res == -1) goto error;
811 i = res; /* res has new position to process */
812 }
813 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000814 break;
815 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000816 ch = CHILD(n, i+1); /* tfpdef */
817 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000818 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
819 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 goto error;
821 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000822 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
823 if (NCH(ch) > 1) {
824 /* there is an annotation on the kwarg */
825 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 i += 3;
828 break;
829 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000830 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 "unexpected node in varargslist: %d @ %d",
832 TYPE(ch), i);
833 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000834 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000836 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
837 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000839 Py_XDECREF(vararg);
840 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841 return NULL;
842}
843
844static expr_ty
845ast_for_dotted_name(struct compiling *c, const node *n)
846{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000847 expr_ty e;
848 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000849 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000850 int i;
851
852 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000853
854 lineno = LINENO(n);
855 col_offset = n->n_col_offset;
856
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857 id = NEW_IDENTIFIER(CHILD(n, 0));
858 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000859 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000860 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000862 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863
864 for (i = 2; i < NCH(n); i+=2) {
865 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000866 if (!id)
867 return NULL;
868 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
869 if (!e)
870 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871 }
872
873 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000874}
875
876static expr_ty
877ast_for_decorator(struct compiling *c, const node *n)
878{
879 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
880 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000881 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882
883 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000884 REQ(CHILD(n, 0), AT);
885 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886
887 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
888 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000889 return NULL;
890
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000892 d = name_expr;
893 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894 }
895 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000896 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000897 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 if (!d)
899 return NULL;
900 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901 }
902 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000903 d = ast_for_call(c, CHILD(n, 3), name_expr);
904 if (!d)
905 return NULL;
906 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907 }
908
909 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910}
911
912static asdl_seq*
913ast_for_decorators(struct compiling *c, const node *n)
914{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000915 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000916 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917 int i;
918
919 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000920 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 if (!decorator_seq)
922 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000923
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000925 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000926 if (!d)
927 return NULL;
928 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929 }
930 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931}
932
933static stmt_ty
934ast_for_funcdef(struct compiling *c, const node *n)
935{
Neal Norwitzc1505362006-12-28 06:47:50 +0000936 /* funcdef: 'def' [decorators] NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000937 identifier name;
938 arguments_ty args;
939 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 asdl_seq *decorator_seq = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000941 expr_ty returns = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942 int name_i;
943
944 REQ(n, funcdef);
945
Nick Coghlan71011e22007-04-23 11:05:01 +0000946 if (NCH(n) == 6 || NCH(n) == 8) { /* decorators are present */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000947 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
948 if (!decorator_seq)
949 return NULL;
950 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951 }
952 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000953 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 }
955
956 name = NEW_IDENTIFIER(CHILD(n, name_i));
957 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000958 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000960 ast_error(CHILD(n, name_i), "assignment to None");
961 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 }
963 args = ast_for_arguments(c, CHILD(n, name_i + 1));
964 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000965 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000966 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
967 returns = ast_for_expr(c, CHILD(n, name_i + 3));
968 if (!returns)
969 return NULL;
970 name_i += 2;
971 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 body = ast_for_suite(c, CHILD(n, name_i + 3));
973 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000974 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975
Neal Norwitzc1505362006-12-28 06:47:50 +0000976 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000977 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978}
979
980static expr_ty
981ast_for_lambdef(struct compiling *c, const node *n)
982{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000983 /* lambdef: 'lambda' [varargslist] ':' test
984 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 arguments_ty args;
986 expr_ty expression;
987
988 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000989 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
990 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 if (!args)
992 return NULL;
993 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000994 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 }
997 else {
998 args = ast_for_arguments(c, CHILD(n, 1));
999 if (!args)
1000 return NULL;
1001 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001002 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 }
1005
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001006 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007}
1008
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001009static expr_ty
1010ast_for_ifexpr(struct compiling *c, const node *n)
1011{
1012 /* test: or_test 'if' or_test 'else' test */
1013 expr_ty expression, body, orelse;
1014
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001015 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001016 body = ast_for_expr(c, CHILD(n, 0));
1017 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001018 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001019 expression = ast_for_expr(c, CHILD(n, 2));
1020 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001021 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001022 orelse = ast_for_expr(c, CHILD(n, 4));
1023 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001024 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001025 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1026 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001027}
1028
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001030 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031
Nick Coghlan650f0d02007-04-15 12:05:43 +00001032 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033*/
1034
1035static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001036count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001038 int n_fors = 0;
1039 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040
Guido van Rossumd8faa362007-04-27 19:54:29 +00001041 count_comp_for:
1042 n_fors++;
1043 REQ(ch, comp_for);
1044 if (NCH(ch) == 5)
1045 ch = CHILD(ch, 4);
1046 else
1047 return n_fors;
1048 count_comp_iter:
1049 REQ(ch, comp_iter);
1050 ch = CHILD(ch, 0);
1051 if (TYPE(ch) == comp_for)
1052 goto count_comp_for;
1053 else if (TYPE(ch) == comp_if) {
1054 if (NCH(ch) == 3) {
1055 ch = CHILD(ch, 2);
1056 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001057 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001058 else
1059 return n_fors;
1060 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001061
Guido van Rossumd8faa362007-04-27 19:54:29 +00001062 /* Should never be reached */
1063 PyErr_SetString(PyExc_SystemError,
1064 "logic error in count_comp_fors");
1065 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001066}
1067
Nick Coghlan650f0d02007-04-15 12:05:43 +00001068/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069
Nick Coghlan650f0d02007-04-15 12:05:43 +00001070 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071*/
1072
1073static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001074count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001076 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077
Guido van Rossumd8faa362007-04-27 19:54:29 +00001078 while (1) {
1079 REQ(n, comp_iter);
1080 if (TYPE(CHILD(n, 0)) == comp_for)
1081 return n_ifs;
1082 n = CHILD(n, 0);
1083 REQ(n, comp_if);
1084 n_ifs++;
1085 if (NCH(n) == 2)
1086 return n_ifs;
1087 n = CHILD(n, 2);
1088 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089}
1090
1091static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001092ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001094 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1095 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001097 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098 int i, n_fors;
1099 node *ch;
1100
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101 assert(NCH(n) > 1);
1102
1103 elt = ast_for_expr(c, CHILD(n, 0));
1104 if (!elt)
1105 return NULL;
1106
Nick Coghlan650f0d02007-04-15 12:05:43 +00001107 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108 if (n_fors == -1)
1109 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001110
Nick Coghlan650f0d02007-04-15 12:05:43 +00001111 comps = asdl_seq_new(n_fors, c->c_arena);
1112 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001114
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115 ch = CHILD(n, 1);
1116 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001117 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118 asdl_seq *t;
1119 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001120 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121
Nick Coghlan650f0d02007-04-15 12:05:43 +00001122 REQ(ch, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 for_ch = CHILD(ch, 1);
1125 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001126 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001128 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001129 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001131
Thomas Wouters89f507f2006-12-13 04:49:30 +00001132 /* Check the # of children rather than the length of t, since
1133 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1134 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001135 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1136 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001138 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1139 c->c_arena),
1140 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001141
Nick Coghlan650f0d02007-04-15 12:05:43 +00001142 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001144
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 if (NCH(ch) == 5) {
1146 int j, n_ifs;
1147 asdl_seq *ifs;
1148
1149 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001150 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001151 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001153
1154 ifs = asdl_seq_new(n_ifs, c->c_arena);
1155 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001157
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001159 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001161 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001163 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001164 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001165 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001166 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 if (NCH(ch) == 3)
1168 ch = CHILD(ch, 2);
1169 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001170 /* on exit, must guarantee that ch is a comp_for */
1171 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001173 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001175 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001177
1178 if (type == COMP_GENEXP)
1179 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1180 else if (type == COMP_LISTCOMP)
1181 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1182 else if (type == COMP_SETCOMP)
1183 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1184 else
1185 /* Should never happen */
1186 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187}
1188
1189static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001190ast_for_genexp(struct compiling *c, const node *n)
1191{
1192 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1193 return ast_for_comprehension(c, n, COMP_GENEXP);
1194}
1195
1196static expr_ty
1197ast_for_listcomp(struct compiling *c, const node *n)
1198{
1199 assert(TYPE(n) == (testlist_comp));
1200 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1201}
1202
1203static expr_ty
1204ast_for_setcomp(struct compiling *c, const node *n)
1205{
1206 assert(TYPE(n) == (dictorsetmaker));
1207 return ast_for_comprehension(c, n, COMP_SETCOMP);
1208}
1209
1210
1211static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212ast_for_atom(struct compiling *c, const node *n)
1213{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001214 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1215 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 */
1217 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001218 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219
1220 switch (TYPE(ch)) {
1221 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001222 /* All names start in Load context, but may later be
1223 changed. */
1224 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001226 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001227 if (!str)
1228 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001229
Thomas Wouters89f507f2006-12-13 04:49:30 +00001230 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001231 if (bytesmode)
1232 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1233 else
1234 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 }
1236 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001237 PyObject *pynum = parsenumber(STR(ch));
1238 if (!pynum)
1239 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001240
Thomas Wouters89f507f2006-12-13 04:49:30 +00001241 PyArena_AddPyObject(c->c_arena, pynum);
1242 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243 }
Georg Brandldde00282007-03-18 19:01:53 +00001244 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001245 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001247 ch = CHILD(n, 1);
1248
1249 if (TYPE(ch) == RPAR)
1250 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1251
1252 if (TYPE(ch) == yield_expr)
1253 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001254
1255 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1256 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001257 return ast_for_genexp(c, ch);
1258
Nick Coghlan650f0d02007-04-15 12:05:43 +00001259 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001261 ch = CHILD(n, 1);
1262
1263 if (TYPE(ch) == RSQB)
1264 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1265
Nick Coghlan650f0d02007-04-15 12:05:43 +00001266 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001267 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1268 asdl_seq *elts = seq_for_testlist(c, ch);
1269 if (!elts)
1270 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001271
Thomas Wouters89f507f2006-12-13 04:49:30 +00001272 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1273 }
1274 else
1275 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001277 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1278 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001279 int i, size;
1280 asdl_seq *keys, *values;
1281
1282 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001283 if (TYPE(ch) == RBRACE) {
1284 /* it's an empty dict */
1285 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1286 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1287 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001288 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001289 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001290 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001291 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001292 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001293 for (i = 0; i < NCH(ch); i += 2) {
1294 expr_ty expression;
1295 expression = ast_for_expr(c, CHILD(ch, i));
1296 if (!expression)
1297 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001298 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001299 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001300 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1301 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1302 /* it's a set comprehension */
1303 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001304 } else {
1305 /* it's a dict */
1306 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1307 keys = asdl_seq_new(size, c->c_arena);
1308 if (!keys)
1309 return NULL;
1310
1311 values = asdl_seq_new(size, c->c_arena);
1312 if (!values)
1313 return NULL;
1314
1315 for (i = 0; i < NCH(ch); i += 4) {
1316 expr_ty expression;
1317
1318 expression = ast_for_expr(c, CHILD(ch, i));
1319 if (!expression)
1320 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001321
Guido van Rossum86e58e22006-08-28 15:27:34 +00001322 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001323
Guido van Rossum86e58e22006-08-28 15:27:34 +00001324 expression = ast_for_expr(c, CHILD(ch, i + 2));
1325 if (!expression)
1326 return NULL;
1327
1328 asdl_seq_SET(values, i / 4, expression);
1329 }
1330 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1331 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001334 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1335 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336 }
1337}
1338
1339static slice_ty
1340ast_for_slice(struct compiling *c, const node *n)
1341{
1342 node *ch;
1343 expr_ty lower = NULL, upper = NULL, step = NULL;
1344
1345 REQ(n, subscript);
1346
1347 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001348 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349 sliceop: ':' [test]
1350 */
1351 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 if (NCH(n) == 1 && TYPE(ch) == test) {
1353 /* 'step' variable hold no significance in terms of being used over
1354 other vars */
1355 step = ast_for_expr(c, ch);
1356 if (!step)
1357 return NULL;
1358
Thomas Wouters89f507f2006-12-13 04:49:30 +00001359 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360 }
1361
1362 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001363 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 if (!lower)
1365 return NULL;
1366 }
1367
1368 /* If there's an upper bound it's in the second or third position. */
1369 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001370 if (NCH(n) > 1) {
1371 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372
Thomas Wouters89f507f2006-12-13 04:49:30 +00001373 if (TYPE(n2) == test) {
1374 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375 if (!upper)
1376 return NULL;
1377 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001378 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001380 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 if (TYPE(n2) == test) {
1383 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384 if (!upper)
1385 return NULL;
1386 }
1387 }
1388
1389 ch = CHILD(n, NCH(n) - 1);
1390 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001391 if (NCH(ch) == 1) {
1392 /* No expression, so step is None */
1393 ch = CHILD(ch, 0);
1394 step = Name(new_identifier("None", c->c_arena), Load,
1395 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 if (!step)
1397 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001398 } else {
1399 ch = CHILD(ch, 1);
1400 if (TYPE(ch) == test) {
1401 step = ast_for_expr(c, ch);
1402 if (!step)
1403 return NULL;
1404 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001405 }
1406 }
1407
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001408 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409}
1410
1411static expr_ty
1412ast_for_binop(struct compiling *c, const node *n)
1413{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001414 /* Must account for a sequence of expressions.
1415 How should A op B op C by represented?
1416 BinOp(BinOp(A, op, B), op, C).
1417 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418
Guido van Rossumd8faa362007-04-27 19:54:29 +00001419 int i, nops;
1420 expr_ty expr1, expr2, result;
1421 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422
Guido van Rossumd8faa362007-04-27 19:54:29 +00001423 expr1 = ast_for_expr(c, CHILD(n, 0));
1424 if (!expr1)
1425 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426
Guido van Rossumd8faa362007-04-27 19:54:29 +00001427 expr2 = ast_for_expr(c, CHILD(n, 2));
1428 if (!expr2)
1429 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430
Guido van Rossumd8faa362007-04-27 19:54:29 +00001431 newoperator = get_operator(CHILD(n, 1));
1432 if (!newoperator)
1433 return NULL;
1434
1435 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1436 c->c_arena);
1437 if (!result)
1438 return NULL;
1439
1440 nops = (NCH(n) - 1) / 2;
1441 for (i = 1; i < nops; i++) {
1442 expr_ty tmp_result, tmp;
1443 const node* next_oper = CHILD(n, i * 2 + 1);
1444
1445 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001446 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 return NULL;
1448
Guido van Rossumd8faa362007-04-27 19:54:29 +00001449 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1450 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451 return NULL;
1452
Guido van Rossumd8faa362007-04-27 19:54:29 +00001453 tmp_result = BinOp(result, newoperator, tmp,
1454 LINENO(next_oper), next_oper->n_col_offset,
1455 c->c_arena);
1456 if (!tmp)
1457 return NULL;
1458 result = tmp_result;
1459 }
1460 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461}
1462
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001463static expr_ty
1464ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1465{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001466 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1467 subscriptlist: subscript (',' subscript)* [',']
1468 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1469 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001470 REQ(n, trailer);
1471 if (TYPE(CHILD(n, 0)) == LPAR) {
1472 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001473 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1474 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001475 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001476 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001477 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001478 else if (TYPE(CHILD(n, 0)) == DOT ) {
1479 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001480 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001481 }
1482 else {
1483 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001484 REQ(CHILD(n, 2), RSQB);
1485 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001486 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001487 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1488 if (!slc)
1489 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001490 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1491 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001492 }
1493 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001494 /* The grammar is ambiguous here. The ambiguity is resolved
1495 by treating the sequence as a tuple literal if there are
1496 no slice features.
1497 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001498 int j;
1499 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001500 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001501 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001502 asdl_seq *slices, *elts;
1503 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001504 if (!slices)
1505 return NULL;
1506 for (j = 0; j < NCH(n); j += 2) {
1507 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001508 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001509 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001510 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001511 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001512 asdl_seq_SET(slices, j / 2, slc);
1513 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001514 if (!simple) {
1515 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001516 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001517 }
1518 /* extract Index values and put them in a Tuple */
1519 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001520 if (!elts)
1521 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001522 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1523 slc = (slice_ty)asdl_seq_GET(slices, j);
1524 assert(slc->kind == Index_kind && slc->v.Index.value);
1525 asdl_seq_SET(elts, j, slc->v.Index.value);
1526 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001527 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001528 if (!e)
1529 return NULL;
1530 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001531 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001532 }
1533 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001534}
1535
1536static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001537ast_for_factor(struct compiling *c, const node *n)
1538{
1539 node *pfactor, *ppower, *patom, *pnum;
1540 expr_ty expression;
1541
1542 /* If the unary - operator is applied to a constant, don't generate
1543 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1544 constant. The peephole optimizer already does something like
1545 this but it doesn't handle the case where the constant is
1546 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1547 PyLongObject.
1548 */
1549 if (TYPE(CHILD(n, 0)) == MINUS
1550 && NCH(n) == 2
1551 && TYPE((pfactor = CHILD(n, 1))) == factor
1552 && NCH(pfactor) == 1
1553 && TYPE((ppower = CHILD(pfactor, 0))) == power
1554 && NCH(ppower) == 1
1555 && TYPE((patom = CHILD(ppower, 0))) == atom
1556 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1557 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1558 if (s == NULL)
1559 return NULL;
1560 s[0] = '-';
1561 strcpy(s + 1, STR(pnum));
1562 PyObject_FREE(STR(pnum));
1563 STR(pnum) = s;
1564 return ast_for_atom(c, patom);
1565 }
1566
1567 expression = ast_for_expr(c, CHILD(n, 1));
1568 if (!expression)
1569 return NULL;
1570
1571 switch (TYPE(CHILD(n, 0))) {
1572 case PLUS:
1573 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1574 c->c_arena);
1575 case MINUS:
1576 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1577 c->c_arena);
1578 case TILDE:
1579 return UnaryOp(Invert, expression, LINENO(n),
1580 n->n_col_offset, c->c_arena);
1581 }
1582 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1583 TYPE(CHILD(n, 0)));
1584 return NULL;
1585}
1586
1587static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001588ast_for_power(struct compiling *c, const node *n)
1589{
1590 /* power: atom trailer* ('**' factor)*
1591 */
1592 int i;
1593 expr_ty e, tmp;
1594 REQ(n, power);
1595 e = ast_for_atom(c, CHILD(n, 0));
1596 if (!e)
1597 return NULL;
1598 if (NCH(n) == 1)
1599 return e;
1600 for (i = 1; i < NCH(n); i++) {
1601 node *ch = CHILD(n, i);
1602 if (TYPE(ch) != trailer)
1603 break;
1604 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001605 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001606 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001607 tmp->lineno = e->lineno;
1608 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 e = tmp;
1610 }
1611 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1612 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001613 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001614 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001615 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001616 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001617 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001618 e = tmp;
1619 }
1620 return e;
1621}
1622
Guido van Rossum0368b722007-05-11 16:50:42 +00001623static expr_ty
1624ast_for_starred(struct compiling *c, const node *n)
1625{
1626 expr_ty tmp;
1627 REQ(n, star_expr);
1628
1629 tmp = ast_for_expr(c, CHILD(n, 1));
1630 if (!tmp)
1631 return NULL;
1632
1633 /* The Load context is changed later. */
1634 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1635}
1636
1637
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638/* Do not name a variable 'expr'! Will cause a compile error.
1639*/
1640
1641static expr_ty
1642ast_for_expr(struct compiling *c, const node *n)
1643{
1644 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001645 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001646 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001647 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648 and_test: not_test ('and' not_test)*
1649 not_test: 'not' not_test | comparison
1650 comparison: expr (comp_op expr)*
1651 expr: xor_expr ('|' xor_expr)*
1652 xor_expr: and_expr ('^' and_expr)*
1653 and_expr: shift_expr ('&' shift_expr)*
1654 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1655 arith_expr: term (('+'|'-') term)*
1656 term: factor (('*'|'/'|'%'|'//') factor)*
1657 factor: ('+'|'-'|'~') factor | power
1658 power: atom trailer* ('**' factor)*
1659 */
1660
1661 asdl_seq *seq;
1662 int i;
1663
1664 loop:
1665 switch (TYPE(n)) {
1666 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001667 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001668 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001669 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001671 else if (NCH(n) > 1)
1672 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001673 /* Fallthrough */
1674 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675 case and_test:
1676 if (NCH(n) == 1) {
1677 n = CHILD(n, 0);
1678 goto loop;
1679 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001680 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 if (!seq)
1682 return NULL;
1683 for (i = 0; i < NCH(n); i += 2) {
1684 expr_ty e = ast_for_expr(c, CHILD(n, i));
1685 if (!e)
1686 return NULL;
1687 asdl_seq_SET(seq, i / 2, e);
1688 }
1689 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001690 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1691 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001692 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001693 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694 case not_test:
1695 if (NCH(n) == 1) {
1696 n = CHILD(n, 0);
1697 goto loop;
1698 }
1699 else {
1700 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1701 if (!expression)
1702 return NULL;
1703
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001704 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1705 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 }
1707 case comparison:
1708 if (NCH(n) == 1) {
1709 n = CHILD(n, 0);
1710 goto loop;
1711 }
1712 else {
1713 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001714 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001715 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001716 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 if (!ops)
1718 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001719 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721 return NULL;
1722 }
1723 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001724 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001726 newoperator = ast_for_comp_op(CHILD(n, i));
1727 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001729 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730
1731 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001732 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001733 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001734 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001736 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737 asdl_seq_SET(cmps, i / 2, expression);
1738 }
1739 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001740 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001742 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001744 return Compare(expression, ops, cmps, LINENO(n),
1745 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 }
1747 break;
1748
Guido van Rossum0368b722007-05-11 16:50:42 +00001749 case star_expr:
1750 if (TYPE(CHILD(n, 0)) == STAR) {
1751 return ast_for_starred(c, n);
1752 }
1753 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754 /* The next five cases all handle BinOps. The main body of code
1755 is the same in each case, but the switch turned inside out to
1756 reuse the code for each type of operator.
1757 */
1758 case expr:
1759 case xor_expr:
1760 case and_expr:
1761 case shift_expr:
1762 case arith_expr:
1763 case term:
1764 if (NCH(n) == 1) {
1765 n = CHILD(n, 0);
1766 goto loop;
1767 }
1768 return ast_for_binop(c, n);
1769 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001770 expr_ty exp = NULL;
1771 if (NCH(n) == 2) {
1772 exp = ast_for_testlist(c, CHILD(n, 1));
1773 if (!exp)
1774 return NULL;
1775 }
1776 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1777 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001778 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779 if (NCH(n) == 1) {
1780 n = CHILD(n, 0);
1781 goto loop;
1782 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001783 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001784 case power:
1785 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001787 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001788 return NULL;
1789 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001790 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 return NULL;
1792}
1793
1794static expr_ty
1795ast_for_call(struct compiling *c, const node *n, expr_ty func)
1796{
1797 /*
1798 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1799 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801 */
1802
1803 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001804 asdl_seq *args;
1805 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 expr_ty vararg = NULL, kwarg = NULL;
1807
1808 REQ(n, arglist);
1809
1810 nargs = 0;
1811 nkeywords = 0;
1812 ngens = 0;
1813 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001814 node *ch = CHILD(n, i);
1815 if (TYPE(ch) == argument) {
1816 if (NCH(ch) == 1)
1817 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001818 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001819 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001821 nkeywords++;
1822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 }
1824 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001825 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001826 "if not sole argument");
1827 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 }
1829
1830 if (nargs + nkeywords + ngens > 255) {
1831 ast_error(n, "more than 255 arguments");
1832 return NULL;
1833 }
1834
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001835 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001837 return NULL;
1838 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001840 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 nargs = 0;
1842 nkeywords = 0;
1843 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001844 node *ch = CHILD(n, i);
1845 if (TYPE(ch) == argument) {
1846 expr_ty e;
1847 if (NCH(ch) == 1) {
1848 if (nkeywords) {
1849 ast_error(CHILD(ch, 0),
1850 "non-keyword arg after keyword arg");
1851 return NULL;
1852 }
1853 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001855 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001856 asdl_seq_SET(args, nargs++, e);
1857 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001858 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001859 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001861 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 else {
1865 keyword_ty kw;
1866 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 /* CHILD(ch, 0) is test, but must be an identifier? */
1869 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001871 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 /* f(lambda x: x[0] = 3) ends up getting parsed with
1873 * LHS test = lambda x: x[0], and RHS test = 3.
1874 * SF bug 132313 points out that complaining about a keyword
1875 * then is very confusing.
1876 */
1877 if (e->kind == Lambda_kind) {
1878 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001879 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 } else if (e->kind != Name_kind) {
1881 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001882 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 key = e->v.Name.id;
1885 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001887 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001888 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001890 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001891 asdl_seq_SET(keywords, nkeywords++, kw);
1892 }
1893 }
1894 else if (TYPE(ch) == STAR) {
1895 vararg = ast_for_expr(c, CHILD(n, i+1));
1896 i++;
1897 }
1898 else if (TYPE(ch) == DOUBLESTAR) {
1899 kwarg = ast_for_expr(c, CHILD(n, i+1));
1900 i++;
1901 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 }
1903
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001904 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905}
1906
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001908ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001910 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001911 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001912 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001914 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001915 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001916 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001917 }
1918 else {
1919 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001920 TYPE(n) == testlist1);
1921 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001923 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924 else {
1925 asdl_seq *tmp = seq_for_testlist(c, n);
1926 if (!tmp)
1927 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001928 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001930}
1931
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932static stmt_ty
1933ast_for_expr_stmt(struct compiling *c, const node *n)
1934{
1935 REQ(n, expr_stmt);
1936 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1937 | ('=' (yield_expr|testlist))*)
1938 testlist: test (',' test)* [',']
1939 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001940 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 test: ... here starts the operator precendence dance
1942 */
1943
1944 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001945 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 if (!e)
1947 return NULL;
1948
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001950 }
1951 else if (TYPE(CHILD(n, 1)) == augassign) {
1952 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001953 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001954 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955
Thomas Wouters89f507f2006-12-13 04:49:30 +00001956 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957 if (!expr1)
1958 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001959 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001960 switch (expr1->kind) {
1961 case GeneratorExp_kind:
1962 ast_error(ch, "augmented assignment to generator "
1963 "expression not possible");
1964 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001965 case Yield_kind:
1966 ast_error(ch, "augmented assignment to yield "
1967 "expression not possible");
1968 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001969 case Name_kind: {
1970 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1971 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1972 ast_error(ch, "assignment to None");
1973 return NULL;
1974 }
1975 break;
1976 }
1977 case Attribute_kind:
1978 case Subscript_kind:
1979 break;
1980 default:
1981 ast_error(ch, "illegal expression for augmented "
1982 "assignment");
1983 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 ch = CHILD(n, 2);
1988 if (TYPE(ch) == testlist)
1989 expr2 = ast_for_testlist(c, ch);
1990 else
1991 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001992 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 return NULL;
1994
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001995 newoperator = ast_for_augassign(CHILD(n, 1));
1996 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 return NULL;
1998
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 }
2001 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 int i;
2003 asdl_seq *targets;
2004 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 expr_ty expression;
2006
Thomas Wouters89f507f2006-12-13 04:49:30 +00002007 /* a normal assignment */
2008 REQ(CHILD(n, 1), EQUAL);
2009 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2010 if (!targets)
2011 return NULL;
2012 for (i = 0; i < NCH(n) - 2; i += 2) {
2013 expr_ty e;
2014 node *ch = CHILD(n, i);
2015 if (TYPE(ch) == yield_expr) {
2016 ast_error(ch, "assignment to yield expression not possible");
2017 return NULL;
2018 }
2019 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 /* set context to assign */
2022 if (!e)
2023 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024
Thomas Wouters89f507f2006-12-13 04:49:30 +00002025 if (!set_context(e, Store, CHILD(n, i)))
2026 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 asdl_seq_SET(targets, i / 2, e);
2029 }
2030 value = CHILD(n, NCH(n) - 1);
2031 if (TYPE(value) == testlist)
2032 expression = ast_for_testlist(c, value);
2033 else
2034 expression = ast_for_expr(c, value);
2035 if (!expression)
2036 return NULL;
2037 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039}
2040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002042ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043{
2044 asdl_seq *seq;
2045 int i;
2046 expr_ty e;
2047
2048 REQ(n, exprlist);
2049
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002050 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002052 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002054 e = ast_for_expr(c, CHILD(n, i));
2055 if (!e)
2056 return NULL;
2057 asdl_seq_SET(seq, i / 2, e);
2058 if (context && !set_context(e, context, CHILD(n, i)))
2059 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 }
2061 return seq;
2062}
2063
2064static stmt_ty
2065ast_for_del_stmt(struct compiling *c, const node *n)
2066{
2067 asdl_seq *expr_list;
2068
2069 /* del_stmt: 'del' exprlist */
2070 REQ(n, del_stmt);
2071
2072 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2073 if (!expr_list)
2074 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002075 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076}
2077
2078static stmt_ty
2079ast_for_flow_stmt(struct compiling *c, const node *n)
2080{
2081 /*
2082 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2083 | yield_stmt
2084 break_stmt: 'break'
2085 continue_stmt: 'continue'
2086 return_stmt: 'return' [testlist]
2087 yield_stmt: yield_expr
2088 yield_expr: 'yield' testlist
2089 raise_stmt: 'raise' [test [',' test [',' test]]]
2090 */
2091 node *ch;
2092
2093 REQ(n, flow_stmt);
2094 ch = CHILD(n, 0);
2095 switch (TYPE(ch)) {
2096 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002097 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002099 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002101 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2102 if (!exp)
2103 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002104 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002105 }
2106 case return_stmt:
2107 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002108 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002110 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 if (!expression)
2112 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002113 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 }
2115 case raise_stmt:
2116 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002117 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 else if (NCH(ch) == 2) {
2119 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2120 if (!expression)
2121 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002122 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 }
2124 else if (NCH(ch) == 4) {
2125 expr_ty expr1, expr2;
2126
2127 expr1 = ast_for_expr(c, CHILD(ch, 1));
2128 if (!expr1)
2129 return NULL;
2130 expr2 = ast_for_expr(c, CHILD(ch, 3));
2131 if (!expr2)
2132 return NULL;
2133
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002134 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 }
2136 else if (NCH(ch) == 6) {
2137 expr_ty expr1, expr2, expr3;
2138
2139 expr1 = ast_for_expr(c, CHILD(ch, 1));
2140 if (!expr1)
2141 return NULL;
2142 expr2 = ast_for_expr(c, CHILD(ch, 3));
2143 if (!expr2)
2144 return NULL;
2145 expr3 = ast_for_expr(c, CHILD(ch, 5));
2146 if (!expr3)
2147 return NULL;
2148
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002149 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150 }
2151 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002152 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 "unexpected flow_stmt: %d", TYPE(ch));
2154 return NULL;
2155 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002156
2157 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2158 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159}
2160
2161static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002162alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163{
2164 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002165 import_as_name: NAME ['as' NAME]
2166 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 dotted_name: NAME ('.' NAME)*
2168 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002169 PyObject *str;
2170
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 loop:
2172 switch (TYPE(n)) {
2173 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002174 str = NULL;
2175 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002176 str = NEW_IDENTIFIER(CHILD(n, 2));
2177 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002178 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179 case dotted_as_name:
2180 if (NCH(n) == 1) {
2181 n = CHILD(n, 0);
2182 goto loop;
2183 }
2184 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002185 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002186 if (!a)
2187 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 assert(!a->asname);
2189 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2190 return a;
2191 }
2192 break;
2193 case dotted_name:
2194 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002195 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 else {
2197 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002198 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002199 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200 char *s;
2201
2202 len = 0;
2203 for (i = 0; i < NCH(n); i += 2)
2204 /* length of string plus one for the dot */
2205 len += strlen(STR(CHILD(n, i))) + 1;
2206 len--; /* the last name doesn't have a dot */
2207 str = PyString_FromStringAndSize(NULL, len);
2208 if (!str)
2209 return NULL;
2210 s = PyString_AS_STRING(str);
2211 if (!s)
2212 return NULL;
2213 for (i = 0; i < NCH(n); i += 2) {
2214 char *sch = STR(CHILD(n, i));
2215 strcpy(s, STR(CHILD(n, i)));
2216 s += strlen(sch);
2217 *s++ = '.';
2218 }
2219 --s;
2220 *s = '\0';
2221 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002222 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002223 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 }
2225 break;
2226 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002227 str = PyString_InternFromString("*");
2228 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002229 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002231 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 "unexpected import name: %d", TYPE(n));
2233 return NULL;
2234 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002235
2236 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 return NULL;
2238}
2239
2240static stmt_ty
2241ast_for_import_stmt(struct compiling *c, const node *n)
2242{
2243 /*
2244 import_stmt: import_name | import_from
2245 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002246 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2247 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002249 int lineno;
2250 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 int i;
2252 asdl_seq *aliases;
2253
2254 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002255 lineno = LINENO(n);
2256 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002258 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002260 REQ(n, dotted_as_names);
2261 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2262 if (!aliases)
2263 return NULL;
2264 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002265 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002266 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002268 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002270 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002272 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002274 int idx, ndots = 0;
2275 alias_ty mod = NULL;
2276 identifier modname;
2277
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002278 /* Count the number of dots (for relative imports) and check for the
2279 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002280 for (idx = 1; idx < NCH(n); idx++) {
2281 if (TYPE(CHILD(n, idx)) == dotted_name) {
2282 mod = alias_for_import_name(c, CHILD(n, idx));
2283 idx++;
2284 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002285 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2286 /* three consecutive dots are tokenized as one ELLIPSIS */
2287 ndots += 3;
2288 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002289 } else if (TYPE(CHILD(n, idx)) != DOT) {
2290 break;
2291 }
2292 ndots++;
2293 }
2294 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002295 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002296 case STAR:
2297 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002298 n = CHILD(n, idx);
2299 n_children = 1;
2300 if (ndots) {
2301 ast_error(n, "'import *' not allowed with 'from .'");
2302 return NULL;
2303 }
2304 break;
2305 case LPAR:
2306 /* from ... import (x, y, z) */
2307 n = CHILD(n, idx + 1);
2308 n_children = NCH(n);
2309 break;
2310 case import_as_names:
2311 /* from ... import x, y, z */
2312 n = CHILD(n, idx);
2313 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002314 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 ast_error(n, "trailing comma not allowed without"
2316 " surrounding parentheses");
2317 return NULL;
2318 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002319 break;
2320 default:
2321 ast_error(n, "Unexpected node-type in from-import");
2322 return NULL;
2323 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324
Thomas Wouters89f507f2006-12-13 04:49:30 +00002325 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2326 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328
2329 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002330 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002331 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002332 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002334 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002336 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002337 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002338 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2339 if (!import_alias)
2340 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002341 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002344 if (mod != NULL)
2345 modname = mod->name;
2346 else
2347 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002348 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002349 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 }
Neal Norwitz79792652005-11-14 04:25:03 +00002351 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 "unknown import statement: starts with command '%s'",
2353 STR(CHILD(n, 0)));
2354 return NULL;
2355}
2356
2357static stmt_ty
2358ast_for_global_stmt(struct compiling *c, const node *n)
2359{
2360 /* global_stmt: 'global' NAME (',' NAME)* */
2361 identifier name;
2362 asdl_seq *s;
2363 int i;
2364
2365 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002366 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002368 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002370 name = NEW_IDENTIFIER(CHILD(n, i));
2371 if (!name)
2372 return NULL;
2373 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002375 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376}
2377
2378static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002379ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2380{
2381 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2382 identifier name;
2383 asdl_seq *s;
2384 int i;
2385
2386 REQ(n, nonlocal_stmt);
2387 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2388 if (!s)
2389 return NULL;
2390 for (i = 1; i < NCH(n); i += 2) {
2391 name = NEW_IDENTIFIER(CHILD(n, i));
2392 if (!name)
2393 return NULL;
2394 asdl_seq_SET(s, i / 2, name);
2395 }
2396 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2397}
2398
2399static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400ast_for_assert_stmt(struct compiling *c, const node *n)
2401{
2402 /* assert_stmt: 'assert' test [',' test] */
2403 REQ(n, assert_stmt);
2404 if (NCH(n) == 2) {
2405 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2406 if (!expression)
2407 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002408 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 }
2410 else if (NCH(n) == 4) {
2411 expr_ty expr1, expr2;
2412
2413 expr1 = ast_for_expr(c, CHILD(n, 1));
2414 if (!expr1)
2415 return NULL;
2416 expr2 = ast_for_expr(c, CHILD(n, 3));
2417 if (!expr2)
2418 return NULL;
2419
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 }
Neal Norwitz79792652005-11-14 04:25:03 +00002422 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423 "improper number of parts to 'assert' statement: %d",
2424 NCH(n));
2425 return NULL;
2426}
2427
2428static asdl_seq *
2429ast_for_suite(struct compiling *c, const node *n)
2430{
2431 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002432 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433 stmt_ty s;
2434 int i, total, num, end, pos = 0;
2435 node *ch;
2436
2437 REQ(n, suite);
2438
2439 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002440 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002444 n = CHILD(n, 0);
2445 /* simple_stmt always ends with a NEWLINE,
2446 and may have a trailing SEMI
2447 */
2448 end = NCH(n) - 1;
2449 if (TYPE(CHILD(n, end - 1)) == SEMI)
2450 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002452 for (i = 0; i < end; i += 2) {
2453 ch = CHILD(n, i);
2454 s = ast_for_stmt(c, ch);
2455 if (!s)
2456 return NULL;
2457 asdl_seq_SET(seq, pos++, s);
2458 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459 }
2460 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002461 for (i = 2; i < (NCH(n) - 1); i++) {
2462 ch = CHILD(n, i);
2463 REQ(ch, stmt);
2464 num = num_stmts(ch);
2465 if (num == 1) {
2466 /* small_stmt or compound_stmt with only one child */
2467 s = ast_for_stmt(c, ch);
2468 if (!s)
2469 return NULL;
2470 asdl_seq_SET(seq, pos++, s);
2471 }
2472 else {
2473 int j;
2474 ch = CHILD(ch, 0);
2475 REQ(ch, simple_stmt);
2476 for (j = 0; j < NCH(ch); j += 2) {
2477 /* statement terminates with a semi-colon ';' */
2478 if (NCH(CHILD(ch, j)) == 0) {
2479 assert((j + 1) == NCH(ch));
2480 break;
2481 }
2482 s = ast_for_stmt(c, CHILD(ch, j));
2483 if (!s)
2484 return NULL;
2485 asdl_seq_SET(seq, pos++, s);
2486 }
2487 }
2488 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 }
2490 assert(pos == seq->size);
2491 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492}
2493
2494static stmt_ty
2495ast_for_if_stmt(struct compiling *c, const node *n)
2496{
2497 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2498 ['else' ':' suite]
2499 */
2500 char *s;
2501
2502 REQ(n, if_stmt);
2503
2504 if (NCH(n) == 4) {
2505 expr_ty expression;
2506 asdl_seq *suite_seq;
2507
2508 expression = ast_for_expr(c, CHILD(n, 1));
2509 if (!expression)
2510 return NULL;
2511 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002512 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 return NULL;
2514
Guido van Rossumd8faa362007-04-27 19:54:29 +00002515 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2516 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002518
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 s = STR(CHILD(n, 4));
2520 /* s[2], the third character in the string, will be
2521 's' for el_s_e, or
2522 'i' for el_i_f
2523 */
2524 if (s[2] == 's') {
2525 expr_ty expression;
2526 asdl_seq *seq1, *seq2;
2527
2528 expression = ast_for_expr(c, CHILD(n, 1));
2529 if (!expression)
2530 return NULL;
2531 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002532 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 return NULL;
2534 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002535 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 return NULL;
2537
Guido van Rossumd8faa362007-04-27 19:54:29 +00002538 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2539 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 }
2541 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002542 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002543 expr_ty expression;
2544 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 asdl_seq *orelse = NULL;
2546 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 /* must reference the child n_elif+1 since 'else' token is third,
2548 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002549 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2550 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2551 has_else = 1;
2552 n_elif -= 3;
2553 }
2554 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555
Thomas Wouters89f507f2006-12-13 04:49:30 +00002556 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002557 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 orelse = asdl_seq_new(1, c->c_arena);
2560 if (!orelse)
2561 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002563 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002565 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2566 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002568 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2569 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571
Guido van Rossumd8faa362007-04-27 19:54:29 +00002572 asdl_seq_SET(orelse, 0,
2573 If(expression, suite_seq, suite_seq2,
2574 LINENO(CHILD(n, NCH(n) - 6)),
2575 CHILD(n, NCH(n) - 6)->n_col_offset,
2576 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002577 /* the just-created orelse handled the last elif */
2578 n_elif--;
2579 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 for (i = 0; i < n_elif; i++) {
2582 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002583 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2584 if (!newobj)
2585 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002587 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002590 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592
Thomas Wouters89f507f2006-12-13 04:49:30 +00002593 asdl_seq_SET(newobj, 0,
2594 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002595 LINENO(CHILD(n, off)),
2596 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002597 orelse = newobj;
2598 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002599 expression = ast_for_expr(c, CHILD(n, 1));
2600 if (!expression)
2601 return NULL;
2602 suite_seq = ast_for_suite(c, CHILD(n, 3));
2603 if (!suite_seq)
2604 return NULL;
2605 return If(expression, suite_seq, orelse,
2606 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002608
2609 PyErr_Format(PyExc_SystemError,
2610 "unexpected token in 'if' statement: %s", s);
2611 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612}
2613
2614static stmt_ty
2615ast_for_while_stmt(struct compiling *c, const node *n)
2616{
2617 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2618 REQ(n, while_stmt);
2619
2620 if (NCH(n) == 4) {
2621 expr_ty expression;
2622 asdl_seq *suite_seq;
2623
2624 expression = ast_for_expr(c, CHILD(n, 1));
2625 if (!expression)
2626 return NULL;
2627 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002628 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631 }
2632 else if (NCH(n) == 7) {
2633 expr_ty expression;
2634 asdl_seq *seq1, *seq2;
2635
2636 expression = ast_for_expr(c, CHILD(n, 1));
2637 if (!expression)
2638 return NULL;
2639 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002640 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 return NULL;
2642 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002643 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 return NULL;
2645
Thomas Wouters89f507f2006-12-13 04:49:30 +00002646 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002648
2649 PyErr_Format(PyExc_SystemError,
2650 "wrong number of tokens for 'while' statement: %d",
2651 NCH(n));
2652 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653}
2654
2655static stmt_ty
2656ast_for_for_stmt(struct compiling *c, const node *n)
2657{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002658 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 expr_ty expression;
2660 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002661 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2663 REQ(n, for_stmt);
2664
2665 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002666 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 if (!seq)
2668 return NULL;
2669 }
2670
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002671 node_target = CHILD(n, 1);
2672 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002673 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002675 /* Check the # of children rather than the length of _target, since
2676 for x, in ... has 1 element in _target, but still requires a Tuple. */
2677 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002682 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002683 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 return NULL;
2685 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002686 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687 return NULL;
2688
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002689 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2690 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691}
2692
2693static excepthandler_ty
2694ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2695{
2696 /* except_clause: 'except' [test [',' test]] */
2697 REQ(exc, except_clause);
2698 REQ(body, suite);
2699
2700 if (NCH(exc) == 1) {
2701 asdl_seq *suite_seq = ast_for_suite(c, body);
2702 if (!suite_seq)
2703 return NULL;
2704
Thomas Wouters89f507f2006-12-13 04:49:30 +00002705 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002706 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 }
2708 else if (NCH(exc) == 2) {
2709 expr_ty expression;
2710 asdl_seq *suite_seq;
2711
2712 expression = ast_for_expr(c, CHILD(exc, 1));
2713 if (!expression)
2714 return NULL;
2715 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002716 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 return NULL;
2718
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002720 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 }
2722 else if (NCH(exc) == 4) {
2723 asdl_seq *suite_seq;
2724 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002725 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002729 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return NULL;
2731 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002732 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 return NULL;
2734
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002736 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002738
2739 PyErr_Format(PyExc_SystemError,
2740 "wrong number of children for 'except' clause: %d",
2741 NCH(exc));
2742 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743}
2744
2745static stmt_ty
2746ast_for_try_stmt(struct compiling *c, const node *n)
2747{
Neal Norwitzf599f422005-12-17 21:33:47 +00002748 const int nch = NCH(n);
2749 int n_except = (nch - 3)/3;
2750 asdl_seq *body, *orelse = NULL, *finally = NULL;
2751
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 REQ(n, try_stmt);
2753
Neal Norwitzf599f422005-12-17 21:33:47 +00002754 body = ast_for_suite(c, CHILD(n, 2));
2755 if (body == NULL)
2756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757
Neal Norwitzf599f422005-12-17 21:33:47 +00002758 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2759 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2760 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2761 /* we can assume it's an "else",
2762 because nch >= 9 for try-else-finally and
2763 it would otherwise have a type of except_clause */
2764 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2765 if (orelse == NULL)
2766 return NULL;
2767 n_except--;
2768 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769
Neal Norwitzf599f422005-12-17 21:33:47 +00002770 finally = ast_for_suite(c, CHILD(n, nch - 1));
2771 if (finally == NULL)
2772 return NULL;
2773 n_except--;
2774 }
2775 else {
2776 /* we can assume it's an "else",
2777 otherwise it would have a type of except_clause */
2778 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2779 if (orelse == NULL)
2780 return NULL;
2781 n_except--;
2782 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002784 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002785 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 return NULL;
2787 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002788
2789 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002790 int i;
2791 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002792 /* process except statements to create a try ... except */
2793 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2794 if (handlers == NULL)
2795 return NULL;
2796
2797 for (i = 0; i < n_except; i++) {
2798 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2799 CHILD(n, 5 + i * 3));
2800 if (!e)
2801 return NULL;
2802 asdl_seq_SET(handlers, i, e);
2803 }
2804
Thomas Wouters89f507f2006-12-13 04:49:30 +00002805 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002806 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002807 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002808 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002809
2810 /* if a 'finally' is present too, we nest the TryExcept within a
2811 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002812 body = asdl_seq_new(1, c->c_arena);
2813 if (body == NULL)
2814 return NULL;
2815 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002816 }
2817
2818 /* must be a try ... finally (except clauses are in body, if any exist) */
2819 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002820 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821}
2822
Guido van Rossumc2e20742006-02-27 22:32:47 +00002823static expr_ty
2824ast_for_with_var(struct compiling *c, const node *n)
2825{
2826 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002827 return ast_for_expr(c, CHILD(n, 1));
2828}
2829
2830/* with_stmt: 'with' test [ with_var ] ':' suite */
2831static stmt_ty
2832ast_for_with_stmt(struct compiling *c, const node *n)
2833{
2834 expr_ty context_expr, optional_vars = NULL;
2835 int suite_index = 3; /* skip 'with', test, and ':' */
2836 asdl_seq *suite_seq;
2837
2838 assert(TYPE(n) == with_stmt);
2839 context_expr = ast_for_expr(c, CHILD(n, 1));
2840 if (TYPE(CHILD(n, 2)) == with_var) {
2841 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2842
2843 if (!optional_vars) {
2844 return NULL;
2845 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002846 if (!set_context(optional_vars, Store, n)) {
2847 return NULL;
2848 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002849 suite_index = 4;
2850 }
2851
2852 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2853 if (!suite_seq) {
2854 return NULL;
2855 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002856 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002857 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002858}
2859
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860static stmt_ty
2861ast_for_classdef(struct compiling *c, const node *n)
2862{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002863 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2864 asdl_seq *s;
2865 expr_ty call, dummy;
2866
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 REQ(n, classdef);
2868
2869 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002870 ast_error(n, "assignment to None");
2871 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 }
2873
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002874 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 s = ast_for_suite(c, CHILD(n, 3));
2876 if (!s)
2877 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002878 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2879 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002881
2882 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002883 s = ast_for_suite(c, CHILD(n,5));
2884 if (!s)
2885 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002886 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2887 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 }
2889
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002890 /* class NAME '(' arglist ')' ':' suite */
2891 /* build up a fake Call node so we can extract its pieces */
2892 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2893 call = ast_for_call(c, CHILD(n, 3), dummy);
2894 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002897 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002899
2900 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2901 call->v.Call.args, call->v.Call.keywords,
2902 call->v.Call.starargs, call->v.Call.kwargs, s,
2903 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002904}
2905
2906static stmt_ty
2907ast_for_stmt(struct compiling *c, const node *n)
2908{
2909 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002910 assert(NCH(n) == 1);
2911 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 }
2913 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002914 assert(num_stmts(n) == 1);
2915 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 }
2917 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002918 REQ(n, small_stmt);
2919 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002920 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2921 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002922 */
2923 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 case expr_stmt:
2925 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 case del_stmt:
2927 return ast_for_del_stmt(c, n);
2928 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002929 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 case flow_stmt:
2931 return ast_for_flow_stmt(c, n);
2932 case import_stmt:
2933 return ast_for_import_stmt(c, n);
2934 case global_stmt:
2935 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002936 case nonlocal_stmt:
2937 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 case assert_stmt:
2939 return ast_for_assert_stmt(c, n);
2940 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002941 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2943 TYPE(n), NCH(n));
2944 return NULL;
2945 }
2946 }
2947 else {
2948 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002949 | funcdef | classdef
2950 */
2951 node *ch = CHILD(n, 0);
2952 REQ(n, compound_stmt);
2953 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 case if_stmt:
2955 return ast_for_if_stmt(c, ch);
2956 case while_stmt:
2957 return ast_for_while_stmt(c, ch);
2958 case for_stmt:
2959 return ast_for_for_stmt(c, ch);
2960 case try_stmt:
2961 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002962 case with_stmt:
2963 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 case funcdef:
2965 return ast_for_funcdef(c, ch);
2966 case classdef:
2967 return ast_for_classdef(c, ch);
2968 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002969 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2971 TYPE(n), NCH(n));
2972 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 }
2975}
2976
2977static PyObject *
2978parsenumber(const char *s)
2979{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002980 const char *end;
2981 long x;
2982 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00002984 Py_complex c;
2985 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986#endif
2987
Guido van Rossumd8faa362007-04-27 19:54:29 +00002988 errno = 0;
2989 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00002991 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002993 if (*end == 'l' || *end == 'L')
2994 return PyLong_FromString((char *)s, (char **)0, 0);
2995 if (s[0] == '0') {
2996 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
2997 if (x < 0 && errno == 0) {
2998 return PyLong_FromString((char *)s,
2999 (char **)0,
3000 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003001 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003002 }
3003 else
3004 x = PyOS_strtol((char *)s, (char **)&end, 0);
3005 if (*end == '\0') {
3006 if (errno != 0)
3007 return PyLong_FromString((char *)s, (char **)0, 0);
3008 return PyInt_FromLong(x);
3009 }
3010 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003012 if (imflag) {
3013 c.real = 0.;
3014 PyFPE_START_PROTECT("atof", return 0)
3015 c.imag = PyOS_ascii_atof(s);
3016 PyFPE_END_PROTECT(c)
3017 return PyComplex_FromCComplex(c);
3018 }
3019 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003021 {
3022 PyFPE_START_PROTECT("atof", return 0)
3023 dx = PyOS_ascii_atof(s);
3024 PyFPE_END_PROTECT(dx)
3025 return PyFloat_FromDouble(dx);
3026 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027}
3028
3029static PyObject *
3030decode_utf8(const char **sPtr, const char *end, char* encoding)
3031{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003032 PyObject *u, *v;
3033 char *s, *t;
3034 t = s = (char *)*sPtr;
3035 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3036 while (s < end && (*s & 0x80)) s++;
3037 *sPtr = s;
3038 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3039 if (u == NULL)
3040 return NULL;
3041 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3042 Py_DECREF(u);
3043 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044}
3045
3046static PyObject *
3047decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3048{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003049 PyObject *v, *u;
3050 char *buf;
3051 char *p;
3052 const char *end;
3053 if (encoding == NULL) {
3054 buf = (char *)s;
3055 u = NULL;
3056 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3057 buf = (char *)s;
3058 u = NULL;
3059 } else {
3060 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3061 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3062 if (u == NULL)
3063 return NULL;
3064 p = buf = PyString_AsString(u);
3065 end = s + len;
3066 while (s < end) {
3067 if (*s == '\\') {
3068 *p++ = *s++;
3069 if (*s & 0x80) {
3070 strcpy(p, "u005c");
3071 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003072 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003073 }
3074 if (*s & 0x80) { /* XXX inefficient */
3075 PyObject *w;
3076 char *r;
3077 Py_ssize_t rn, i;
3078 w = decode_utf8(&s, end, "utf-16-be");
3079 if (w == NULL) {
3080 Py_DECREF(u);
3081 return NULL;
3082 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003083 assert(PyBytes_Check(w));
3084 r = PyBytes_AsString(w);
3085 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003086 assert(rn % 2 == 0);
3087 for (i = 0; i < rn; i += 2) {
3088 sprintf(p, "\\u%02x%02x",
3089 r[i + 0] & 0xFF,
3090 r[i + 1] & 0xFF);
3091 p += 6;
3092 }
3093 Py_DECREF(w);
3094 } else {
3095 *p++ = *s++;
3096 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003097 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003098 len = p - buf;
3099 s = buf;
3100 }
3101 if (rawmode)
3102 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3103 else
3104 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3105 Py_XDECREF(u);
3106 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107}
3108
3109/* s is a Python string literal, including the bracketing quote characters,
3110 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3111 * parsestr parses it, and returns the decoded Python string object.
3112 */
3113static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003114parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003116 size_t len;
3117 const char *s = STR(n);
3118 int quote = Py_CHARMASK(*s);
3119 int rawmode = 0;
3120 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121
Guido van Rossumd8faa362007-04-27 19:54:29 +00003122 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003123 if (quote == 'b' || quote == 'B') {
3124 quote = *++s;
3125 *bytesmode = 1;
3126 }
3127 if (quote == 'r' || quote == 'R') {
3128 quote = *++s;
3129 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003130 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003131 }
3132 if (quote != '\'' && quote != '\"') {
3133 PyErr_BadInternalCall();
3134 return NULL;
3135 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003136 s++;
3137 len = strlen(s);
3138 if (len > INT_MAX) {
3139 PyErr_SetString(PyExc_OverflowError,
3140 "string to parse is too long");
3141 return NULL;
3142 }
3143 if (s[--len] != quote) {
3144 PyErr_BadInternalCall();
3145 return NULL;
3146 }
3147 if (len >= 4 && s[0] == quote && s[1] == quote) {
3148 s += 2;
3149 len -= 2;
3150 if (s[--len] != quote || s[--len] != quote) {
3151 PyErr_BadInternalCall();
3152 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003153 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003154 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003155 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003156 return decode_unicode(s, len, rawmode, encoding);
3157 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003158 if (*bytesmode) {
3159 /* Disallow non-ascii characters (but not escapes) */
3160 const char *c;
3161 for (c = s; *c; c++) {
3162 if (Py_CHARMASK(*c) >= 0x80) {
3163 ast_error(n, "bytes can only contain ASCII "
3164 "literal characters.");
3165 return NULL;
3166 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003167 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003168 }
3169 need_encoding = (!*bytesmode && encoding != NULL &&
3170 strcmp(encoding, "utf-8") != 0 &&
3171 strcmp(encoding, "iso-8859-1") != 0);
3172 if (rawmode || strchr(s, '\\') == NULL) {
3173 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3175 if (u == NULL)
3176 return NULL;
3177 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3178 Py_DECREF(u);
3179 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 } else {
3181 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003182 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003183 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184
Guido van Rossumbdde0112007-05-11 16:26:27 +00003185 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187}
3188
3189/* Build a Python string object out of a STRING atom. This takes care of
3190 * compile-time literal catenation, calling parsestr() on each piece, and
3191 * pasting the intermediate results together.
3192 */
3193static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003194parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 PyObject *v;
3197 int i;
3198 REQ(CHILD(n, 0), STRING);
3199 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3200 if (v != NULL) {
3201 /* String literal concatenation */
3202 for (i = 1; i < NCH(n); i++) {
3203 PyObject *s;
3204 int subbm = 0;
3205 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3206 if (s == NULL)
3207 goto onError;
3208 if (*bytesmode != subbm) {
3209 ast_error(n, "cannot mix bytes and nonbytes"
3210 "literals");
3211 goto onError;
3212 }
3213 if (PyString_Check(v) && PyString_Check(s)) {
3214 PyString_ConcatAndDel(&v, s);
3215 if (v == NULL)
3216 goto onError;
3217 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218 else {
3219 PyObject *temp = PyUnicode_Concat(v, s);
3220 Py_DECREF(s);
3221 Py_DECREF(v);
3222 v = temp;
3223 if (v == NULL)
3224 goto onError;
3225 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003226 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003227 }
3228 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230 onError:
3231 Py_XDECREF(v);
3232 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233}