blob: c611436f6d51604cffa870c0205f8c4f9cf2adfb [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 *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000031static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
36static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000037static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
38static PyObject *parsestrplus(struct compiling *, const node *n,
39 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000042#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#endif
44
Nick Coghlan650f0d02007-04-15 12:05:43 +000045#define COMP_GENEXP 0
46#define COMP_LISTCOMP 1
47#define COMP_SETCOMP 2
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
Martin v. Löwis5b222132007-06-10 09:51:05 +000051 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
52 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000053 PyArena_AddPyObject(arena, id);
54 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055}
56
Neal Norwitzadb69fc2005-12-17 20:54:49 +000057#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000058
59/* This routine provides an invalid object for the syntax error.
60 The outermost routine must unpack this error and create the
61 proper object. We do this so that we don't have to pass
62 the filename to everything function.
63
64 XXX Maybe we should just pass the filename...
65*/
66
67static int
68ast_error(const node *n, const char *errstr)
69{
70 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
71 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000072 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000073 PyErr_SetObject(PyExc_SyntaxError, u);
74 Py_DECREF(u);
75 return 0;
76}
77
78static void
79ast_error_finish(const char *filename)
80{
81 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000082 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000083
84 assert(PyErr_Occurred());
85 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +000086 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000087
88 PyErr_Fetch(&type, &value, &tback);
89 errstr = PyTuple_GetItem(value, 0);
90 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +000091 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 Py_INCREF(errstr);
93 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000094 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 Py_DECREF(errstr);
96 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000097 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098 Py_DECREF(value);
99
100 loc = PyErr_ProgramText(filename, lineno);
101 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000102 Py_INCREF(Py_None);
103 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000107 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000108 Py_DECREF(errstr);
109 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000110 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112 Py_DECREF(errstr);
113 Py_DECREF(tmp);
114 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000116 PyErr_Restore(type, value, tback);
117}
118
119/* num_stmts() returns number of contained statements.
120
121 Use this routine to determine how big a sequence is needed for
122 the statements in a parse tree. Its raison d'etre is this bit of
123 grammar:
124
125 stmt: simple_stmt | compound_stmt
126 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
127
128 A simple_stmt can contain multiple small_stmt elements joined
129 by semicolons. If the arg is a simple_stmt, the number of
130 small_stmt elements is returned.
131*/
132
133static int
134num_stmts(const node *n)
135{
136 int i, l;
137 node *ch;
138
139 switch (TYPE(n)) {
140 case single_input:
141 if (TYPE(CHILD(n, 0)) == NEWLINE)
142 return 0;
143 else
144 return num_stmts(CHILD(n, 0));
145 case file_input:
146 l = 0;
147 for (i = 0; i < NCH(n); i++) {
148 ch = CHILD(n, i);
149 if (TYPE(ch) == stmt)
150 l += num_stmts(ch);
151 }
152 return l;
153 case stmt:
154 return num_stmts(CHILD(n, 0));
155 case compound_stmt:
156 return 1;
157 case simple_stmt:
158 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
159 case suite:
160 if (NCH(n) == 1)
161 return num_stmts(CHILD(n, 0));
162 else {
163 l = 0;
164 for (i = 2; i < (NCH(n) - 1); i++)
165 l += num_stmts(CHILD(n, i));
166 return l;
167 }
168 default: {
169 char buf[128];
170
171 sprintf(buf, "Non-statement found: %d %d\n",
172 TYPE(n), NCH(n));
173 Py_FatalError(buf);
174 }
175 }
176 assert(0);
177 return 0;
178}
179
180/* Transform the CST rooted at node * to the appropriate AST
181*/
182
183mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000184PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
185 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000187 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188 asdl_seq *stmts = NULL;
189 stmt_ty s;
190 node *ch;
191 struct compiling c;
192
193 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000194 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000195 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000196#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000197 ast_error(n, "encoding declaration in Unicode string");
198 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000199#endif
200 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000202 } else if (TYPE(n) == encoding_decl) {
203 c.c_encoding = STR(n);
204 n = CHILD(n, 0);
205 } else {
206 c.c_encoding = NULL;
207 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000208 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 switch (TYPE(n)) {
212 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000213 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000214 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000215 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216 for (i = 0; i < NCH(n) - 1; i++) {
217 ch = CHILD(n, i);
218 if (TYPE(ch) == NEWLINE)
219 continue;
220 REQ(ch, stmt);
221 num = num_stmts(ch);
222 if (num == 1) {
223 s = ast_for_stmt(&c, ch);
224 if (!s)
225 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000226 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227 }
228 else {
229 ch = CHILD(ch, 0);
230 REQ(ch, simple_stmt);
231 for (j = 0; j < num; j++) {
232 s = ast_for_stmt(&c, CHILD(ch, j * 2));
233 if (!s)
234 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 }
237 }
238 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000239 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000240 case eval_input: {
241 expr_ty testlist_ast;
242
Nick Coghlan650f0d02007-04-15 12:05:43 +0000243 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000244 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245 if (!testlist_ast)
246 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 }
249 case single_input:
250 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000251 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000253 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000254 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
255 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000256 if (!asdl_seq_GET(stmts, 0))
257 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000258 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 }
260 else {
261 n = CHILD(n, 0);
262 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000263 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000265 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000266 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000267 s = ast_for_stmt(&c, n);
268 if (!s)
269 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 asdl_seq_SET(stmts, 0, s);
271 }
272 else {
273 /* Only a simple_stmt can contain multiple statements. */
274 REQ(n, simple_stmt);
275 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000276 if (TYPE(CHILD(n, i)) == NEWLINE)
277 break;
278 s = ast_for_stmt(&c, CHILD(n, i));
279 if (!s)
280 goto error;
281 asdl_seq_SET(stmts, i / 2, s);
282 }
283 }
284
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000285 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 }
287 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000288 PyErr_Format(PyExc_SystemError,
289 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 goto error;
291 }
292 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000293 ast_error_finish(filename);
294 return NULL;
295}
296
297/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
298*/
299
300static operator_ty
301get_operator(const node *n)
302{
303 switch (TYPE(n)) {
304 case VBAR:
305 return BitOr;
306 case CIRCUMFLEX:
307 return BitXor;
308 case AMPER:
309 return BitAnd;
310 case LEFTSHIFT:
311 return LShift;
312 case RIGHTSHIFT:
313 return RShift;
314 case PLUS:
315 return Add;
316 case MINUS:
317 return Sub;
318 case STAR:
319 return Mult;
320 case SLASH:
321 return Div;
322 case DOUBLESLASH:
323 return FloorDiv;
324 case PERCENT:
325 return Mod;
326 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000327 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328 }
329}
330
Guido van Rossume7ba4952007-06-06 23:52:48 +0000331static const char* FORBIDDEN[] = {
332 "None",
333 "True",
334 "False",
335 NULL,
336};
337
338static int
339forbidden_name(expr_ty e, const node *n)
340{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000341 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000342 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000343 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000344 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000345 ast_error(n, "assignment to keyword");
346 return 1;
347 }
348 }
349 return 0;
350}
351
Jeremy Hyltona8293132006-02-28 17:58:27 +0000352/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353
354 Only sets context for expr kinds that "can appear in assignment context"
355 (according to ../Parser/Python.asdl). For other expr kinds, it sets
356 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000357*/
358
359static int
360set_context(expr_ty e, expr_context_ty ctx, const node *n)
361{
362 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000363 /* If a particular expression type can't be used for assign / delete,
364 set expr_name to its name and an error message will be generated.
365 */
366 const char* expr_name = NULL;
367
368 /* The ast defines augmented store and load contexts, but the
369 implementation here doesn't actually use them. The code may be
370 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000371 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000372 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000373 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000374 */
375 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000376
377 switch (e->kind) {
378 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000379 e->v.Attribute.ctx = ctx;
380 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000382 e->v.Subscript.ctx = ctx;
383 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000384 case Starred_kind:
385 e->v.Starred.ctx = ctx;
386 if (!set_context(e->v.Starred.value, ctx, n))
387 return 0;
388 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000390 if (ctx == Store) {
391 if (forbidden_name(e, n))
392 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000393 }
394 e->v.Name.ctx = ctx;
395 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000397 e->v.List.ctx = ctx;
398 s = e->v.List.elts;
399 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000400 case Tuple_kind:
401 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
402 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000403 e->v.Tuple.ctx = ctx;
404 s = e->v.Tuple.elts;
405 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000406 case Lambda_kind:
407 expr_name = "lambda";
408 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000409 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000411 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000412 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000413 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000414 case UnaryOp_kind:
415 expr_name = "operator";
416 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000418 expr_name = "generator expression";
419 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000420 case Yield_kind:
421 expr_name = "yield expression";
422 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000423 case ListComp_kind:
424 expr_name = "list comprehension";
425 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000426 case SetComp_kind:
427 expr_name = "set comprehension";
428 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000429 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000430 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 case Num_kind:
432 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000433 expr_name = "literal";
434 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000435 case Ellipsis_kind:
436 expr_name = "Ellipsis";
437 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000438 case Compare_kind:
439 expr_name = "comparison";
440 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000441 case IfExp_kind:
442 expr_name = "conditional expression";
443 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000444 default:
445 PyErr_Format(PyExc_SystemError,
446 "unexpected expression in assignment %d (line %d)",
447 e->kind, e->lineno);
448 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 /* Check for error string set by switch */
451 if (expr_name) {
452 char buf[300];
453 PyOS_snprintf(buf, sizeof(buf),
454 "can't %s %s",
455 ctx == Store ? "assign to" : "delete",
456 expr_name);
457 return ast_error(n, buf);
458 }
459
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000461 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000462 */
463 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000464 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000465
Thomas Wouters89f507f2006-12-13 04:49:30 +0000466 for (i = 0; i < asdl_seq_LEN(s); i++) {
467 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
468 return 0;
469 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 }
471 return 1;
472}
473
474static operator_ty
475ast_for_augassign(const node *n)
476{
477 REQ(n, augassign);
478 n = CHILD(n, 0);
479 switch (STR(n)[0]) {
480 case '+':
481 return Add;
482 case '-':
483 return Sub;
484 case '/':
485 if (STR(n)[1] == '/')
486 return FloorDiv;
487 else
488 return Div;
489 case '%':
490 return Mod;
491 case '<':
492 return LShift;
493 case '>':
494 return RShift;
495 case '&':
496 return BitAnd;
497 case '^':
498 return BitXor;
499 case '|':
500 return BitOr;
501 case '*':
502 if (STR(n)[1] == '*')
503 return Pow;
504 else
505 return Mult;
506 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000507 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000508 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510}
511
512static cmpop_ty
513ast_for_comp_op(const node *n)
514{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000515 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000516 |'is' 'not'
517 */
518 REQ(n, comp_op);
519 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 n = CHILD(n, 0);
521 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522 case LESS:
523 return Lt;
524 case GREATER:
525 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000526 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527 return Eq;
528 case LESSEQUAL:
529 return LtE;
530 case GREATEREQUAL:
531 return GtE;
532 case NOTEQUAL:
533 return NotEq;
534 case NAME:
535 if (strcmp(STR(n), "in") == 0)
536 return In;
537 if (strcmp(STR(n), "is") == 0)
538 return Is;
539 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000540 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000542 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 }
545 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000546 /* handle "not in" and "is not" */
547 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 case NAME:
549 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
550 return NotIn;
551 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
552 return IsNot;
553 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000554 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000556 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558 }
Neal Norwitz79792652005-11-14 04:25:03 +0000559 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000561 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562}
563
564static asdl_seq *
565seq_for_testlist(struct compiling *c, const node *n)
566{
567 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000568 asdl_seq *seq;
569 expr_ty expression;
570 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000571 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000573 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574 if (!seq)
575 return NULL;
576
577 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000578 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579
580 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000581 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
584 assert(i / 2 < seq->size);
585 asdl_seq_SET(seq, i / 2, expression);
586 }
587 return seq;
588}
589
Neal Norwitzc1505362006-12-28 06:47:50 +0000590static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000591compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000592{
593 identifier name;
594 expr_ty annotation = NULL;
595 node *ch;
596
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000597 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000598 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000599 name = NEW_IDENTIFIER(ch);
600 if (!name)
601 return NULL;
602
603 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
604 annotation = ast_for_expr(c, CHILD(n, 2));
605 if (!annotation)
606 return NULL;
607 }
608
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000609 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610}
611
Guido van Rossum4f72a782006-10-27 23:31:49 +0000612/* returns -1 if failed to handle keyword only arguments
613 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000614 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000615 ^^^
616 start pointing here
617 */
618static int
619handle_keywordonly_args(struct compiling *c, const node *n, int start,
620 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
621{
622 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000623 expr_ty expression, annotation;
624 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000625 int i = start;
626 int j = 0; /* index for kwdefaults and kwonlyargs */
627 assert(kwonlyargs != NULL);
628 assert(kwdefaults != NULL);
629 while (i < NCH(n)) {
630 ch = CHILD(n, i);
631 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000632 case vfpdef:
633 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000634 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000635 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000636 asdl_seq_SET(kwdefaults, j, expression);
637 i += 2; /* '=' and test */
638 }
639 else { /* setting NULL if no default value exists */
640 asdl_seq_SET(kwdefaults, j, NULL);
641 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000642 if (NCH(ch) == 3) {
643 /* ch is NAME ':' test */
644 annotation = ast_for_expr(c, CHILD(ch, 2));
645 if (!annotation) {
646 ast_error(ch, "expected expression");
647 goto error;
648 }
649 }
650 else {
651 annotation = NULL;
652 }
653 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000654 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000655 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000656 ast_error(ch, "expecting name");
657 goto error;
658 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000659 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000660 i += 2; /* the name and the comma */
661 break;
662 case DOUBLESTAR:
663 return i;
664 default:
665 ast_error(ch, "unexpected node");
666 goto error;
667 }
668 }
669 return i;
670 error:
671 return -1;
672}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000673
Jeremy Hyltona8293132006-02-28 17:58:27 +0000674/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000675
676static arguments_ty
677ast_for_arguments(struct compiling *c, const node *n)
678{
Neal Norwitzc1505362006-12-28 06:47:50 +0000679 /* This function handles both typedargslist (function definition)
680 and varargslist (lambda definition).
681
682 parameters: '(' [typedargslist] ')'
683 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000684 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
685 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000686 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000687 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000688 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000689 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
690 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000691 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000692 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000693 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000694 int i, j, k, nposargs = 0, nkwonlyargs = 0;
695 int nposdefaults = 0, found_default = 0;
696 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000697 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000698 arg_ty arg;
699 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700 node *ch;
701
702 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000703 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
705 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000706 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000708 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709
Guido van Rossum4f72a782006-10-27 23:31:49 +0000710 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000712 ch = CHILD(n, i);
713 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000714 /* skip star and possible argument */
715 i++;
716 i += (TYPE(CHILD(n, i)) == tfpdef
717 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000718 break;
719 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000720 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000721 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000722 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000724 /* count the number of keyword only args &
725 defaults for keyword only args */
726 for ( ; i < NCH(n); ++i) {
727 ch = CHILD(n, i);
728 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000729 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000730 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000731 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
732 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000733 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000734 kwonlyargs = (nkwonlyargs ?
735 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
736 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000738 posdefaults = (nposdefaults ?
739 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
740 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000741 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000742 /* The length of kwonlyargs and kwdefaults are same
743 since we set NULL as default for keyword only argument w/o default
744 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000745 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000746 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
747 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000748 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000749
750 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000751 ast_error(n, "more than 255 arguments");
752 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000755 /* tfpdef: NAME [':' test]
756 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 */
758 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000759 j = 0; /* index for defaults */
760 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000762 ch = CHILD(n, i);
763 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000764 case tfpdef:
765 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
767 anything other than EQUAL or a comma? */
768 /* XXX Should NCH(n) check be made a separate check? */
769 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000770 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
771 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000772 goto error;
773 assert(posdefaults != NULL);
774 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 else if (found_default) {
779 ast_error(n,
780 "non-default argument follows default argument");
781 goto error;
782 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000783 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000784 if (!arg)
785 goto error;
786 asdl_seq_SET(posargs, k++, arg);
787
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788 i += 2; /* the name and the comma */
789 break;
790 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 if (i+1 >= NCH(n)) {
792 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000793 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000795 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000796 if (TYPE(ch) == COMMA) {
797 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 i += 2; /* now follows keyword only arguments */
799 res = handle_keywordonly_args(c, n, i,
800 kwonlyargs, kwdefaults);
801 if (res == -1) goto error;
802 i = res; /* res has new position to process */
803 }
804 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000805 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
806 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000807 /* there is an annotation on the vararg */
808 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000811 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
812 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000813 int res = 0;
814 res = handle_keywordonly_args(c, n, i,
815 kwonlyargs, kwdefaults);
816 if (res == -1) goto error;
817 i = res; /* res has new position to process */
818 }
819 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 break;
821 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000822 ch = CHILD(n, i+1); /* tfpdef */
823 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000824 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
825 if (NCH(ch) > 1) {
826 /* there is an annotation on the kwarg */
827 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000829 i += 3;
830 break;
831 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000832 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833 "unexpected node in varargslist: %d @ %d",
834 TYPE(ch), i);
835 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000836 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000838 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
839 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000841 Py_XDECREF(vararg);
842 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843 return NULL;
844}
845
846static expr_ty
847ast_for_dotted_name(struct compiling *c, const node *n)
848{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000849 expr_ty e;
850 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000851 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852 int i;
853
854 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000855
856 lineno = LINENO(n);
857 col_offset = n->n_col_offset;
858
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 id = NEW_IDENTIFIER(CHILD(n, 0));
860 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000861 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000862 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000864 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865
866 for (i = 2; i < NCH(n); i+=2) {
867 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000868 if (!id)
869 return NULL;
870 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
871 if (!e)
872 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 }
874
875 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876}
877
878static expr_ty
879ast_for_decorator(struct compiling *c, const node *n)
880{
881 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
882 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000883 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884
885 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000886 REQ(CHILD(n, 0), AT);
887 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888
889 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
890 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000891 return NULL;
892
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000893 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894 d = name_expr;
895 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000896 }
897 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000899 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000900 if (!d)
901 return NULL;
902 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 }
904 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000905 d = ast_for_call(c, CHILD(n, 3), name_expr);
906 if (!d)
907 return NULL;
908 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909 }
910
911 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912}
913
914static asdl_seq*
915ast_for_decorators(struct compiling *c, const node *n)
916{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000917 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000918 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919 int i;
920
921 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000922 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923 if (!decorator_seq)
924 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000927 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000928 if (!d)
929 return NULL;
930 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931 }
932 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933}
934
935static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000936ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000938 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000939 identifier name;
940 arguments_ty args;
941 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000942 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000943 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944
945 REQ(n, funcdef);
946
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 name = NEW_IDENTIFIER(CHILD(n, name_i));
948 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 args = ast_for_arguments(c, CHILD(n, name_i + 1));
951 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000952 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000953 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
954 returns = ast_for_expr(c, CHILD(n, name_i + 3));
955 if (!returns)
956 return NULL;
957 name_i += 2;
958 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959 body = ast_for_suite(c, CHILD(n, name_i + 3));
960 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000961 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962
Neal Norwitzc1505362006-12-28 06:47:50 +0000963 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000964 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965}
966
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000967static stmt_ty
968ast_for_decorated(struct compiling *c, const node *n)
969{
970 /* decorated: decorators (classdef | funcdef) */
971 stmt_ty thing = NULL;
972 asdl_seq *decorator_seq = NULL;
973
974 REQ(n, decorated);
975
976 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
977 if (!decorator_seq)
978 return NULL;
979
980 assert(TYPE(CHILD(n, 1)) == funcdef ||
981 TYPE(CHILD(n, 1)) == classdef);
982
983 if (TYPE(CHILD(n, 1)) == funcdef) {
984 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
985 } else if (TYPE(CHILD(n, 1)) == classdef) {
986 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
987 }
988 return thing;
989}
990
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991static expr_ty
992ast_for_lambdef(struct compiling *c, const node *n)
993{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000994 /* lambdef: 'lambda' [varargslist] ':' test
995 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 arguments_ty args;
997 expr_ty expression;
998
999 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001000 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1001 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002 if (!args)
1003 return NULL;
1004 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001005 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001006 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 }
1008 else {
1009 args = ast_for_arguments(c, CHILD(n, 1));
1010 if (!args)
1011 return NULL;
1012 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001013 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015 }
1016
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001017 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018}
1019
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001020static expr_ty
1021ast_for_ifexpr(struct compiling *c, const node *n)
1022{
1023 /* test: or_test 'if' or_test 'else' test */
1024 expr_ty expression, body, orelse;
1025
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001026 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001027 body = ast_for_expr(c, CHILD(n, 0));
1028 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001029 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001030 expression = ast_for_expr(c, CHILD(n, 2));
1031 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001032 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001033 orelse = ast_for_expr(c, CHILD(n, 4));
1034 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001035 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001036 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1037 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001038}
1039
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001041 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042
Nick Coghlan650f0d02007-04-15 12:05:43 +00001043 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044*/
1045
1046static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001047count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001049 int n_fors = 0;
1050 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051
Guido van Rossumd8faa362007-04-27 19:54:29 +00001052 count_comp_for:
1053 n_fors++;
1054 REQ(ch, comp_for);
1055 if (NCH(ch) == 5)
1056 ch = CHILD(ch, 4);
1057 else
1058 return n_fors;
1059 count_comp_iter:
1060 REQ(ch, comp_iter);
1061 ch = CHILD(ch, 0);
1062 if (TYPE(ch) == comp_for)
1063 goto count_comp_for;
1064 else if (TYPE(ch) == comp_if) {
1065 if (NCH(ch) == 3) {
1066 ch = CHILD(ch, 2);
1067 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001068 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001069 else
1070 return n_fors;
1071 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001072
Guido van Rossumd8faa362007-04-27 19:54:29 +00001073 /* Should never be reached */
1074 PyErr_SetString(PyExc_SystemError,
1075 "logic error in count_comp_fors");
1076 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077}
1078
Nick Coghlan650f0d02007-04-15 12:05:43 +00001079/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080
Nick Coghlan650f0d02007-04-15 12:05:43 +00001081 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082*/
1083
1084static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001085count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001087 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088
Guido van Rossumd8faa362007-04-27 19:54:29 +00001089 while (1) {
1090 REQ(n, comp_iter);
1091 if (TYPE(CHILD(n, 0)) == comp_for)
1092 return n_ifs;
1093 n = CHILD(n, 0);
1094 REQ(n, comp_if);
1095 n_ifs++;
1096 if (NCH(n) == 2)
1097 return n_ifs;
1098 n = CHILD(n, 2);
1099 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100}
1101
1102static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001103ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001105 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1106 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001108 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 int i, n_fors;
1110 node *ch;
1111
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112 assert(NCH(n) > 1);
1113
1114 elt = ast_for_expr(c, CHILD(n, 0));
1115 if (!elt)
1116 return NULL;
1117
Nick Coghlan650f0d02007-04-15 12:05:43 +00001118 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119 if (n_fors == -1)
1120 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001121
Nick Coghlan650f0d02007-04-15 12:05:43 +00001122 comps = asdl_seq_new(n_fors, c->c_arena);
1123 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001125
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126 ch = CHILD(n, 1);
1127 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001128 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129 asdl_seq *t;
1130 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001131 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132
Nick Coghlan650f0d02007-04-15 12:05:43 +00001133 REQ(ch, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134
Thomas Wouters89f507f2006-12-13 04:49:30 +00001135 for_ch = CHILD(ch, 1);
1136 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001137 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001139 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001140 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001142
Thomas Wouters89f507f2006-12-13 04:49:30 +00001143 /* Check the # of children rather than the length of t, since
1144 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1145 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001146 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1147 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001149 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1150 c->c_arena),
1151 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001152
Nick Coghlan650f0d02007-04-15 12:05:43 +00001153 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001155
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 if (NCH(ch) == 5) {
1157 int j, n_ifs;
1158 asdl_seq *ifs;
1159
1160 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001161 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001162 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001164
1165 ifs = asdl_seq_new(n_ifs, c->c_arena);
1166 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001168
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001170 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001172 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001174 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001175 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001176 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001177 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 if (NCH(ch) == 3)
1179 ch = CHILD(ch, 2);
1180 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001181 /* on exit, must guarantee that ch is a comp_for */
1182 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001184 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001186 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001188
1189 if (type == COMP_GENEXP)
1190 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1191 else if (type == COMP_LISTCOMP)
1192 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1193 else if (type == COMP_SETCOMP)
1194 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1195 else
1196 /* Should never happen */
1197 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198}
1199
1200static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001201ast_for_genexp(struct compiling *c, const node *n)
1202{
1203 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1204 return ast_for_comprehension(c, n, COMP_GENEXP);
1205}
1206
1207static expr_ty
1208ast_for_listcomp(struct compiling *c, const node *n)
1209{
1210 assert(TYPE(n) == (testlist_comp));
1211 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1212}
1213
1214static expr_ty
1215ast_for_setcomp(struct compiling *c, const node *n)
1216{
1217 assert(TYPE(n) == (dictorsetmaker));
1218 return ast_for_comprehension(c, n, COMP_SETCOMP);
1219}
1220
1221
1222static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223ast_for_atom(struct compiling *c, const node *n)
1224{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001225 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1226 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001227 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 */
1229 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001230 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231
1232 switch (TYPE(ch)) {
1233 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001234 /* All names start in Load context, but may later be
1235 changed. */
1236 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001238 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001239 if (!str)
1240 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001241
Thomas Wouters89f507f2006-12-13 04:49:30 +00001242 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001243 if (bytesmode)
1244 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1245 else
1246 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 }
1248 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001249 PyObject *pynum = parsenumber(STR(ch));
1250 if (!pynum)
1251 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001252
Thomas Wouters89f507f2006-12-13 04:49:30 +00001253 PyArena_AddPyObject(c->c_arena, pynum);
1254 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255 }
Georg Brandldde00282007-03-18 19:01:53 +00001256 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001257 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001259 ch = CHILD(n, 1);
1260
1261 if (TYPE(ch) == RPAR)
1262 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1263
1264 if (TYPE(ch) == yield_expr)
1265 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001266
1267 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1268 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001269 return ast_for_genexp(c, ch);
1270
Nick Coghlan650f0d02007-04-15 12:05:43 +00001271 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001273 ch = CHILD(n, 1);
1274
1275 if (TYPE(ch) == RSQB)
1276 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1277
Nick Coghlan650f0d02007-04-15 12:05:43 +00001278 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001279 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1280 asdl_seq *elts = seq_for_testlist(c, ch);
1281 if (!elts)
1282 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001283
Thomas Wouters89f507f2006-12-13 04:49:30 +00001284 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1285 }
1286 else
1287 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001289 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1290 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001291 int i, size;
1292 asdl_seq *keys, *values;
1293
1294 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001295 if (TYPE(ch) == RBRACE) {
1296 /* it's an empty dict */
1297 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1298 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1299 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001300 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001301 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001302 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001303 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001304 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001305 for (i = 0; i < NCH(ch); i += 2) {
1306 expr_ty expression;
1307 expression = ast_for_expr(c, CHILD(ch, i));
1308 if (!expression)
1309 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001310 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001311 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001312 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1313 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1314 /* it's a set comprehension */
1315 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001316 } else {
1317 /* it's a dict */
1318 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1319 keys = asdl_seq_new(size, c->c_arena);
1320 if (!keys)
1321 return NULL;
1322
1323 values = asdl_seq_new(size, c->c_arena);
1324 if (!values)
1325 return NULL;
1326
1327 for (i = 0; i < NCH(ch); i += 4) {
1328 expr_ty expression;
1329
1330 expression = ast_for_expr(c, CHILD(ch, i));
1331 if (!expression)
1332 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001333
Guido van Rossum86e58e22006-08-28 15:27:34 +00001334 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001335
Guido van Rossum86e58e22006-08-28 15:27:34 +00001336 expression = ast_for_expr(c, CHILD(ch, i + 2));
1337 if (!expression)
1338 return NULL;
1339
1340 asdl_seq_SET(values, i / 4, expression);
1341 }
1342 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001345 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001346 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1347 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 }
1349}
1350
1351static slice_ty
1352ast_for_slice(struct compiling *c, const node *n)
1353{
1354 node *ch;
1355 expr_ty lower = NULL, upper = NULL, step = NULL;
1356
1357 REQ(n, subscript);
1358
1359 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001360 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 sliceop: ':' [test]
1362 */
1363 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 if (NCH(n) == 1 && TYPE(ch) == test) {
1365 /* 'step' variable hold no significance in terms of being used over
1366 other vars */
1367 step = ast_for_expr(c, ch);
1368 if (!step)
1369 return NULL;
1370
Thomas Wouters89f507f2006-12-13 04:49:30 +00001371 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 }
1373
1374 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001375 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 if (!lower)
1377 return NULL;
1378 }
1379
1380 /* If there's an upper bound it's in the second or third position. */
1381 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 if (NCH(n) > 1) {
1383 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384
Thomas Wouters89f507f2006-12-13 04:49:30 +00001385 if (TYPE(n2) == test) {
1386 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 if (!upper)
1388 return NULL;
1389 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001392 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393
Thomas Wouters89f507f2006-12-13 04:49:30 +00001394 if (TYPE(n2) == test) {
1395 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 if (!upper)
1397 return NULL;
1398 }
1399 }
1400
1401 ch = CHILD(n, NCH(n) - 1);
1402 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001403 if (NCH(ch) == 1) {
1404 /* No expression, so step is None */
1405 ch = CHILD(ch, 0);
1406 step = Name(new_identifier("None", c->c_arena), Load,
1407 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408 if (!step)
1409 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001410 } else {
1411 ch = CHILD(ch, 1);
1412 if (TYPE(ch) == test) {
1413 step = ast_for_expr(c, ch);
1414 if (!step)
1415 return NULL;
1416 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 }
1418 }
1419
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001420 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421}
1422
1423static expr_ty
1424ast_for_binop(struct compiling *c, const node *n)
1425{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001426 /* Must account for a sequence of expressions.
1427 How should A op B op C by represented?
1428 BinOp(BinOp(A, op, B), op, C).
1429 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430
Guido van Rossumd8faa362007-04-27 19:54:29 +00001431 int i, nops;
1432 expr_ty expr1, expr2, result;
1433 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434
Guido van Rossumd8faa362007-04-27 19:54:29 +00001435 expr1 = ast_for_expr(c, CHILD(n, 0));
1436 if (!expr1)
1437 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438
Guido van Rossumd8faa362007-04-27 19:54:29 +00001439 expr2 = ast_for_expr(c, CHILD(n, 2));
1440 if (!expr2)
1441 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442
Guido van Rossumd8faa362007-04-27 19:54:29 +00001443 newoperator = get_operator(CHILD(n, 1));
1444 if (!newoperator)
1445 return NULL;
1446
1447 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1448 c->c_arena);
1449 if (!result)
1450 return NULL;
1451
1452 nops = (NCH(n) - 1) / 2;
1453 for (i = 1; i < nops; i++) {
1454 expr_ty tmp_result, tmp;
1455 const node* next_oper = CHILD(n, i * 2 + 1);
1456
1457 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001458 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 return NULL;
1460
Guido van Rossumd8faa362007-04-27 19:54:29 +00001461 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1462 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 return NULL;
1464
Guido van Rossumd8faa362007-04-27 19:54:29 +00001465 tmp_result = BinOp(result, newoperator, tmp,
1466 LINENO(next_oper), next_oper->n_col_offset,
1467 c->c_arena);
1468 if (!tmp)
1469 return NULL;
1470 result = tmp_result;
1471 }
1472 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473}
1474
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001475static expr_ty
1476ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1477{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001478 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1479 subscriptlist: subscript (',' subscript)* [',']
1480 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1481 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001482 REQ(n, trailer);
1483 if (TYPE(CHILD(n, 0)) == LPAR) {
1484 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001485 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1486 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001487 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001488 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001489 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001490 else if (TYPE(CHILD(n, 0)) == DOT ) {
1491 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001492 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001493 }
1494 else {
1495 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001496 REQ(CHILD(n, 2), RSQB);
1497 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001498 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001499 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1500 if (!slc)
1501 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001502 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1503 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001504 }
1505 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001506 /* The grammar is ambiguous here. The ambiguity is resolved
1507 by treating the sequence as a tuple literal if there are
1508 no slice features.
1509 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001510 int j;
1511 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001512 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001513 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001514 asdl_seq *slices, *elts;
1515 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001516 if (!slices)
1517 return NULL;
1518 for (j = 0; j < NCH(n); j += 2) {
1519 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001520 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001521 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001522 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001523 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524 asdl_seq_SET(slices, j / 2, slc);
1525 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001526 if (!simple) {
1527 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001528 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001529 }
1530 /* extract Index values and put them in a Tuple */
1531 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001532 if (!elts)
1533 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001534 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1535 slc = (slice_ty)asdl_seq_GET(slices, j);
1536 assert(slc->kind == Index_kind && slc->v.Index.value);
1537 asdl_seq_SET(elts, j, slc->v.Index.value);
1538 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001539 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001540 if (!e)
1541 return NULL;
1542 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001543 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001544 }
1545 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001546}
1547
1548static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001549ast_for_factor(struct compiling *c, const node *n)
1550{
1551 node *pfactor, *ppower, *patom, *pnum;
1552 expr_ty expression;
1553
1554 /* If the unary - operator is applied to a constant, don't generate
1555 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1556 constant. The peephole optimizer already does something like
1557 this but it doesn't handle the case where the constant is
1558 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1559 PyLongObject.
1560 */
1561 if (TYPE(CHILD(n, 0)) == MINUS
1562 && NCH(n) == 2
1563 && TYPE((pfactor = CHILD(n, 1))) == factor
1564 && NCH(pfactor) == 1
1565 && TYPE((ppower = CHILD(pfactor, 0))) == power
1566 && NCH(ppower) == 1
1567 && TYPE((patom = CHILD(ppower, 0))) == atom
1568 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1569 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1570 if (s == NULL)
1571 return NULL;
1572 s[0] = '-';
1573 strcpy(s + 1, STR(pnum));
1574 PyObject_FREE(STR(pnum));
1575 STR(pnum) = s;
1576 return ast_for_atom(c, patom);
1577 }
1578
1579 expression = ast_for_expr(c, CHILD(n, 1));
1580 if (!expression)
1581 return NULL;
1582
1583 switch (TYPE(CHILD(n, 0))) {
1584 case PLUS:
1585 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1586 c->c_arena);
1587 case MINUS:
1588 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1589 c->c_arena);
1590 case TILDE:
1591 return UnaryOp(Invert, expression, LINENO(n),
1592 n->n_col_offset, c->c_arena);
1593 }
1594 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1595 TYPE(CHILD(n, 0)));
1596 return NULL;
1597}
1598
1599static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600ast_for_power(struct compiling *c, const node *n)
1601{
1602 /* power: atom trailer* ('**' factor)*
1603 */
1604 int i;
1605 expr_ty e, tmp;
1606 REQ(n, power);
1607 e = ast_for_atom(c, CHILD(n, 0));
1608 if (!e)
1609 return NULL;
1610 if (NCH(n) == 1)
1611 return e;
1612 for (i = 1; i < NCH(n); i++) {
1613 node *ch = CHILD(n, i);
1614 if (TYPE(ch) != trailer)
1615 break;
1616 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001617 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001618 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001619 tmp->lineno = e->lineno;
1620 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001621 e = tmp;
1622 }
1623 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1624 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001625 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001627 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001628 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001629 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001630 e = tmp;
1631 }
1632 return e;
1633}
1634
Guido van Rossum0368b722007-05-11 16:50:42 +00001635static expr_ty
1636ast_for_starred(struct compiling *c, const node *n)
1637{
1638 expr_ty tmp;
1639 REQ(n, star_expr);
1640
1641 tmp = ast_for_expr(c, CHILD(n, 1));
1642 if (!tmp)
1643 return NULL;
1644
1645 /* The Load context is changed later. */
1646 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1647}
1648
1649
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650/* Do not name a variable 'expr'! Will cause a compile error.
1651*/
1652
1653static expr_ty
1654ast_for_expr(struct compiling *c, const node *n)
1655{
1656 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001657 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001658 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001659 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 and_test: not_test ('and' not_test)*
1661 not_test: 'not' not_test | comparison
1662 comparison: expr (comp_op expr)*
1663 expr: xor_expr ('|' xor_expr)*
1664 xor_expr: and_expr ('^' and_expr)*
1665 and_expr: shift_expr ('&' shift_expr)*
1666 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1667 arith_expr: term (('+'|'-') term)*
1668 term: factor (('*'|'/'|'%'|'//') factor)*
1669 factor: ('+'|'-'|'~') factor | power
1670 power: atom trailer* ('**' factor)*
1671 */
1672
1673 asdl_seq *seq;
1674 int i;
1675
1676 loop:
1677 switch (TYPE(n)) {
1678 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001679 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001680 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001681 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001683 else if (NCH(n) > 1)
1684 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001685 /* Fallthrough */
1686 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687 case and_test:
1688 if (NCH(n) == 1) {
1689 n = CHILD(n, 0);
1690 goto loop;
1691 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001692 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693 if (!seq)
1694 return NULL;
1695 for (i = 0; i < NCH(n); i += 2) {
1696 expr_ty e = ast_for_expr(c, CHILD(n, i));
1697 if (!e)
1698 return NULL;
1699 asdl_seq_SET(seq, i / 2, e);
1700 }
1701 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001702 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1703 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001704 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001705 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 case not_test:
1707 if (NCH(n) == 1) {
1708 n = CHILD(n, 0);
1709 goto loop;
1710 }
1711 else {
1712 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1713 if (!expression)
1714 return NULL;
1715
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001716 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1717 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 }
1719 case comparison:
1720 if (NCH(n) == 1) {
1721 n = CHILD(n, 0);
1722 goto loop;
1723 }
1724 else {
1725 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001726 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001727 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001728 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 if (!ops)
1730 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001733 return NULL;
1734 }
1735 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001736 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001738 newoperator = ast_for_comp_op(CHILD(n, i));
1739 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001741 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001742
1743 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001744 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001746 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001748 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749 asdl_seq_SET(cmps, i / 2, expression);
1750 }
1751 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001752 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001754 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001756 return Compare(expression, ops, cmps, LINENO(n),
1757 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 }
1759 break;
1760
Guido van Rossum0368b722007-05-11 16:50:42 +00001761 case star_expr:
1762 if (TYPE(CHILD(n, 0)) == STAR) {
1763 return ast_for_starred(c, n);
1764 }
1765 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 /* The next five cases all handle BinOps. The main body of code
1767 is the same in each case, but the switch turned inside out to
1768 reuse the code for each type of operator.
1769 */
1770 case expr:
1771 case xor_expr:
1772 case and_expr:
1773 case shift_expr:
1774 case arith_expr:
1775 case term:
1776 if (NCH(n) == 1) {
1777 n = CHILD(n, 0);
1778 goto loop;
1779 }
1780 return ast_for_binop(c, n);
1781 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001782 expr_ty exp = NULL;
1783 if (NCH(n) == 2) {
1784 exp = ast_for_testlist(c, CHILD(n, 1));
1785 if (!exp)
1786 return NULL;
1787 }
1788 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1789 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001790 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 if (NCH(n) == 1) {
1792 n = CHILD(n, 0);
1793 goto loop;
1794 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001795 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001796 case power:
1797 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001799 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 return NULL;
1801 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001802 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 return NULL;
1804}
1805
1806static expr_ty
1807ast_for_call(struct compiling *c, const node *n, expr_ty func)
1808{
1809 /*
1810 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1811 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001812 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813 */
1814
1815 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001816 asdl_seq *args;
1817 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818 expr_ty vararg = NULL, kwarg = NULL;
1819
1820 REQ(n, arglist);
1821
1822 nargs = 0;
1823 nkeywords = 0;
1824 ngens = 0;
1825 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001826 node *ch = CHILD(n, i);
1827 if (TYPE(ch) == argument) {
1828 if (NCH(ch) == 1)
1829 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001830 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001831 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001833 nkeywords++;
1834 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 }
1836 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001837 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001838 "if not sole argument");
1839 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 }
1841
1842 if (nargs + nkeywords + ngens > 255) {
1843 ast_error(n, "more than 255 arguments");
1844 return NULL;
1845 }
1846
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001847 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001849 return NULL;
1850 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001852 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 nargs = 0;
1854 nkeywords = 0;
1855 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001856 node *ch = CHILD(n, i);
1857 if (TYPE(ch) == argument) {
1858 expr_ty e;
1859 if (NCH(ch) == 1) {
1860 if (nkeywords) {
1861 ast_error(CHILD(ch, 0),
1862 "non-keyword arg after keyword arg");
1863 return NULL;
1864 }
1865 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001867 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 asdl_seq_SET(args, nargs++, e);
1869 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001870 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001873 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 else {
1877 keyword_ty kw;
1878 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879
Thomas Wouters89f507f2006-12-13 04:49:30 +00001880 /* CHILD(ch, 0) is test, but must be an identifier? */
1881 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001883 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884 /* f(lambda x: x[0] = 3) ends up getting parsed with
1885 * LHS test = lambda x: x[0], and RHS test = 3.
1886 * SF bug 132313 points out that complaining about a keyword
1887 * then is very confusing.
1888 */
1889 if (e->kind == Lambda_kind) {
1890 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001891 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 } else if (e->kind != Name_kind) {
1893 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001894 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001895 } else if (forbidden_name(e, ch)) {
1896 return NULL;
1897 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 key = e->v.Name.id;
1899 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001901 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001902 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001904 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 asdl_seq_SET(keywords, nkeywords++, kw);
1906 }
1907 }
1908 else if (TYPE(ch) == STAR) {
1909 vararg = ast_for_expr(c, CHILD(n, i+1));
1910 i++;
1911 }
1912 else if (TYPE(ch) == DOUBLESTAR) {
1913 kwarg = ast_for_expr(c, CHILD(n, i+1));
1914 i++;
1915 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 }
1917
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001918 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919}
1920
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001922ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001924 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001925 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001926 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001929 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001930 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001931 }
1932 else {
1933 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001934 TYPE(n) == testlist1);
1935 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001937 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 else {
1939 asdl_seq *tmp = seq_for_testlist(c, n);
1940 if (!tmp)
1941 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001944}
1945
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946static stmt_ty
1947ast_for_expr_stmt(struct compiling *c, const node *n)
1948{
1949 REQ(n, expr_stmt);
1950 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1951 | ('=' (yield_expr|testlist))*)
1952 testlist: test (',' test)* [',']
1953 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001954 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955 test: ... here starts the operator precendence dance
1956 */
1957
1958 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001959 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 if (!e)
1961 return NULL;
1962
Thomas Wouters89f507f2006-12-13 04:49:30 +00001963 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 }
1965 else if (TYPE(CHILD(n, 1)) == augassign) {
1966 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001967 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001968 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969
Thomas Wouters89f507f2006-12-13 04:49:30 +00001970 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 if (!expr1)
1972 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001973 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001974 switch (expr1->kind) {
1975 case GeneratorExp_kind:
1976 ast_error(ch, "augmented assignment to generator "
1977 "expression not possible");
1978 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001979 case Yield_kind:
1980 ast_error(ch, "augmented assignment to yield "
1981 "expression not possible");
1982 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001983 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00001984 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001985 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001986 break;
1987 }
1988 case Attribute_kind:
1989 case Subscript_kind:
1990 break;
1991 default:
1992 ast_error(ch, "illegal expression for augmented "
1993 "assignment");
1994 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001996 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 ch = CHILD(n, 2);
1999 if (TYPE(ch) == testlist)
2000 expr2 = ast_for_testlist(c, ch);
2001 else
2002 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002003 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 return NULL;
2005
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002006 newoperator = ast_for_augassign(CHILD(n, 1));
2007 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 return NULL;
2009
Thomas Wouters89f507f2006-12-13 04:49:30 +00002010 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 }
2012 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 int i;
2014 asdl_seq *targets;
2015 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 expr_ty expression;
2017
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 /* a normal assignment */
2019 REQ(CHILD(n, 1), EQUAL);
2020 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2021 if (!targets)
2022 return NULL;
2023 for (i = 0; i < NCH(n) - 2; i += 2) {
2024 expr_ty e;
2025 node *ch = CHILD(n, i);
2026 if (TYPE(ch) == yield_expr) {
2027 ast_error(ch, "assignment to yield expression not possible");
2028 return NULL;
2029 }
2030 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031
Thomas Wouters89f507f2006-12-13 04:49:30 +00002032 /* set context to assign */
2033 if (!e)
2034 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035
Thomas Wouters89f507f2006-12-13 04:49:30 +00002036 if (!set_context(e, Store, CHILD(n, i)))
2037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 asdl_seq_SET(targets, i / 2, e);
2040 }
2041 value = CHILD(n, NCH(n) - 1);
2042 if (TYPE(value) == testlist)
2043 expression = ast_for_testlist(c, value);
2044 else
2045 expression = ast_for_expr(c, value);
2046 if (!expression)
2047 return NULL;
2048 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050}
2051
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002053ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054{
2055 asdl_seq *seq;
2056 int i;
2057 expr_ty e;
2058
2059 REQ(n, exprlist);
2060
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002061 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002065 e = ast_for_expr(c, CHILD(n, i));
2066 if (!e)
2067 return NULL;
2068 asdl_seq_SET(seq, i / 2, e);
2069 if (context && !set_context(e, context, CHILD(n, i)))
2070 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 }
2072 return seq;
2073}
2074
2075static stmt_ty
2076ast_for_del_stmt(struct compiling *c, const node *n)
2077{
2078 asdl_seq *expr_list;
2079
2080 /* del_stmt: 'del' exprlist */
2081 REQ(n, del_stmt);
2082
2083 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2084 if (!expr_list)
2085 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002086 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087}
2088
2089static stmt_ty
2090ast_for_flow_stmt(struct compiling *c, const node *n)
2091{
2092 /*
2093 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2094 | yield_stmt
2095 break_stmt: 'break'
2096 continue_stmt: 'continue'
2097 return_stmt: 'return' [testlist]
2098 yield_stmt: yield_expr
2099 yield_expr: 'yield' testlist
2100 raise_stmt: 'raise' [test [',' test [',' test]]]
2101 */
2102 node *ch;
2103
2104 REQ(n, flow_stmt);
2105 ch = CHILD(n, 0);
2106 switch (TYPE(ch)) {
2107 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002108 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002110 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2113 if (!exp)
2114 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002115 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 }
2117 case return_stmt:
2118 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002119 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002121 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122 if (!expression)
2123 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002124 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 }
2126 case raise_stmt:
2127 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002128 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 else if (NCH(ch) == 2) {
2130 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2131 if (!expression)
2132 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002133 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 }
2135 else if (NCH(ch) == 4) {
2136 expr_ty expr1, expr2;
2137
2138 expr1 = ast_for_expr(c, CHILD(ch, 1));
2139 if (!expr1)
2140 return NULL;
2141 expr2 = ast_for_expr(c, CHILD(ch, 3));
2142 if (!expr2)
2143 return NULL;
2144
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002145 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146 }
2147 else if (NCH(ch) == 6) {
2148 expr_ty expr1, expr2, expr3;
2149
2150 expr1 = ast_for_expr(c, CHILD(ch, 1));
2151 if (!expr1)
2152 return NULL;
2153 expr2 = ast_for_expr(c, CHILD(ch, 3));
2154 if (!expr2)
2155 return NULL;
2156 expr3 = ast_for_expr(c, CHILD(ch, 5));
2157 if (!expr3)
2158 return NULL;
2159
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002160 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161 }
2162 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002163 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002164 "unexpected flow_stmt: %d", TYPE(ch));
2165 return NULL;
2166 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002167
2168 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2169 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170}
2171
2172static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002173alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174{
2175 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002176 import_as_name: NAME ['as' NAME]
2177 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178 dotted_name: NAME ('.' NAME)*
2179 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002180 PyObject *str;
2181
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182 loop:
2183 switch (TYPE(n)) {
2184 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002185 str = NULL;
2186 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002187 str = NEW_IDENTIFIER(CHILD(n, 2));
2188 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002189 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 case dotted_as_name:
2191 if (NCH(n) == 1) {
2192 n = CHILD(n, 0);
2193 goto loop;
2194 }
2195 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002196 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002197 if (!a)
2198 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199 assert(!a->asname);
2200 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2201 return a;
2202 }
2203 break;
2204 case dotted_name:
2205 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002206 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 else {
2208 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002209 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002210 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002212 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002213
2214 len = 0;
2215 for (i = 0; i < NCH(n); i += 2)
2216 /* length of string plus one for the dot */
2217 len += strlen(STR(CHILD(n, i))) + 1;
2218 len--; /* the last name doesn't have a dot */
2219 str = PyString_FromStringAndSize(NULL, len);
2220 if (!str)
2221 return NULL;
2222 s = PyString_AS_STRING(str);
2223 if (!s)
2224 return NULL;
2225 for (i = 0; i < NCH(n); i += 2) {
2226 char *sch = STR(CHILD(n, i));
2227 strcpy(s, STR(CHILD(n, i)));
2228 s += strlen(sch);
2229 *s++ = '.';
2230 }
2231 --s;
2232 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002233 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2234 PyString_GET_SIZE(str),
2235 NULL);
2236 Py_DECREF(str);
2237 if (!uni)
2238 return NULL;
2239 str = uni;
2240 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002241 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002242 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 }
2244 break;
2245 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002246 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002247 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002248 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002250 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 "unexpected import name: %d", TYPE(n));
2252 return NULL;
2253 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002254
2255 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 return NULL;
2257}
2258
2259static stmt_ty
2260ast_for_import_stmt(struct compiling *c, const node *n)
2261{
2262 /*
2263 import_stmt: import_name | import_from
2264 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002265 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2266 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002268 int lineno;
2269 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 int i;
2271 asdl_seq *aliases;
2272
2273 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002274 lineno = LINENO(n);
2275 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002277 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002279 REQ(n, dotted_as_names);
2280 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2281 if (!aliases)
2282 return NULL;
2283 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002284 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002285 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002287 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002289 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002291 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002293 int idx, ndots = 0;
2294 alias_ty mod = NULL;
2295 identifier modname;
2296
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002297 /* Count the number of dots (for relative imports) and check for the
2298 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002299 for (idx = 1; idx < NCH(n); idx++) {
2300 if (TYPE(CHILD(n, idx)) == dotted_name) {
2301 mod = alias_for_import_name(c, CHILD(n, idx));
2302 idx++;
2303 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002304 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2305 /* three consecutive dots are tokenized as one ELLIPSIS */
2306 ndots += 3;
2307 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002308 } else if (TYPE(CHILD(n, idx)) != DOT) {
2309 break;
2310 }
2311 ndots++;
2312 }
2313 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002314 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002315 case STAR:
2316 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002317 n = CHILD(n, idx);
2318 n_children = 1;
2319 if (ndots) {
2320 ast_error(n, "'import *' not allowed with 'from .'");
2321 return NULL;
2322 }
2323 break;
2324 case LPAR:
2325 /* from ... import (x, y, z) */
2326 n = CHILD(n, idx + 1);
2327 n_children = NCH(n);
2328 break;
2329 case import_as_names:
2330 /* from ... import x, y, z */
2331 n = CHILD(n, idx);
2332 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002333 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 ast_error(n, "trailing comma not allowed without"
2335 " surrounding parentheses");
2336 return NULL;
2337 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 break;
2339 default:
2340 ast_error(n, "Unexpected node-type in from-import");
2341 return NULL;
2342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343
Thomas Wouters89f507f2006-12-13 04:49:30 +00002344 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2345 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347
2348 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002349 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002350 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002351 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002353 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002355 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002356 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002357 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2358 if (!import_alias)
2359 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002360 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002361 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002363 if (mod != NULL)
2364 modname = mod->name;
2365 else
2366 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002367 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002368 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 }
Neal Norwitz79792652005-11-14 04:25:03 +00002370 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 "unknown import statement: starts with command '%s'",
2372 STR(CHILD(n, 0)));
2373 return NULL;
2374}
2375
2376static stmt_ty
2377ast_for_global_stmt(struct compiling *c, const node *n)
2378{
2379 /* global_stmt: 'global' NAME (',' NAME)* */
2380 identifier name;
2381 asdl_seq *s;
2382 int i;
2383
2384 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002385 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002389 name = NEW_IDENTIFIER(CHILD(n, i));
2390 if (!name)
2391 return NULL;
2392 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002394 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395}
2396
2397static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002398ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2399{
2400 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2401 identifier name;
2402 asdl_seq *s;
2403 int i;
2404
2405 REQ(n, nonlocal_stmt);
2406 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2407 if (!s)
2408 return NULL;
2409 for (i = 1; i < NCH(n); i += 2) {
2410 name = NEW_IDENTIFIER(CHILD(n, i));
2411 if (!name)
2412 return NULL;
2413 asdl_seq_SET(s, i / 2, name);
2414 }
2415 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2416}
2417
2418static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419ast_for_assert_stmt(struct compiling *c, const node *n)
2420{
2421 /* assert_stmt: 'assert' test [',' test] */
2422 REQ(n, assert_stmt);
2423 if (NCH(n) == 2) {
2424 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2425 if (!expression)
2426 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 }
2429 else if (NCH(n) == 4) {
2430 expr_ty expr1, expr2;
2431
2432 expr1 = ast_for_expr(c, CHILD(n, 1));
2433 if (!expr1)
2434 return NULL;
2435 expr2 = ast_for_expr(c, CHILD(n, 3));
2436 if (!expr2)
2437 return NULL;
2438
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 }
Neal Norwitz79792652005-11-14 04:25:03 +00002441 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 "improper number of parts to 'assert' statement: %d",
2443 NCH(n));
2444 return NULL;
2445}
2446
2447static asdl_seq *
2448ast_for_suite(struct compiling *c, const node *n)
2449{
2450 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002451 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 stmt_ty s;
2453 int i, total, num, end, pos = 0;
2454 node *ch;
2455
2456 REQ(n, suite);
2457
2458 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002459 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002461 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 n = CHILD(n, 0);
2464 /* simple_stmt always ends with a NEWLINE,
2465 and may have a trailing SEMI
2466 */
2467 end = NCH(n) - 1;
2468 if (TYPE(CHILD(n, end - 1)) == SEMI)
2469 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 for (i = 0; i < end; i += 2) {
2472 ch = CHILD(n, i);
2473 s = ast_for_stmt(c, ch);
2474 if (!s)
2475 return NULL;
2476 asdl_seq_SET(seq, pos++, s);
2477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 }
2479 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 for (i = 2; i < (NCH(n) - 1); i++) {
2481 ch = CHILD(n, i);
2482 REQ(ch, stmt);
2483 num = num_stmts(ch);
2484 if (num == 1) {
2485 /* small_stmt or compound_stmt with only one child */
2486 s = ast_for_stmt(c, ch);
2487 if (!s)
2488 return NULL;
2489 asdl_seq_SET(seq, pos++, s);
2490 }
2491 else {
2492 int j;
2493 ch = CHILD(ch, 0);
2494 REQ(ch, simple_stmt);
2495 for (j = 0; j < NCH(ch); j += 2) {
2496 /* statement terminates with a semi-colon ';' */
2497 if (NCH(CHILD(ch, j)) == 0) {
2498 assert((j + 1) == NCH(ch));
2499 break;
2500 }
2501 s = ast_for_stmt(c, CHILD(ch, j));
2502 if (!s)
2503 return NULL;
2504 asdl_seq_SET(seq, pos++, s);
2505 }
2506 }
2507 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 }
2509 assert(pos == seq->size);
2510 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511}
2512
2513static stmt_ty
2514ast_for_if_stmt(struct compiling *c, const node *n)
2515{
2516 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2517 ['else' ':' suite]
2518 */
2519 char *s;
2520
2521 REQ(n, if_stmt);
2522
2523 if (NCH(n) == 4) {
2524 expr_ty expression;
2525 asdl_seq *suite_seq;
2526
2527 expression = ast_for_expr(c, CHILD(n, 1));
2528 if (!expression)
2529 return NULL;
2530 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002531 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 return NULL;
2533
Guido van Rossumd8faa362007-04-27 19:54:29 +00002534 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2535 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002537
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 s = STR(CHILD(n, 4));
2539 /* s[2], the third character in the string, will be
2540 's' for el_s_e, or
2541 'i' for el_i_f
2542 */
2543 if (s[2] == 's') {
2544 expr_ty expression;
2545 asdl_seq *seq1, *seq2;
2546
2547 expression = ast_for_expr(c, CHILD(n, 1));
2548 if (!expression)
2549 return NULL;
2550 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002551 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 return NULL;
2553 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002554 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 return NULL;
2556
Guido van Rossumd8faa362007-04-27 19:54:29 +00002557 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2558 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 }
2560 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002561 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002562 expr_ty expression;
2563 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 asdl_seq *orelse = NULL;
2565 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 /* must reference the child n_elif+1 since 'else' token is third,
2567 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2569 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2570 has_else = 1;
2571 n_elif -= 3;
2572 }
2573 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574
Thomas Wouters89f507f2006-12-13 04:49:30 +00002575 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002576 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577
Thomas Wouters89f507f2006-12-13 04:49:30 +00002578 orelse = asdl_seq_new(1, c->c_arena);
2579 if (!orelse)
2580 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002582 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002584 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2585 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002587 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2588 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590
Guido van Rossumd8faa362007-04-27 19:54:29 +00002591 asdl_seq_SET(orelse, 0,
2592 If(expression, suite_seq, suite_seq2,
2593 LINENO(CHILD(n, NCH(n) - 6)),
2594 CHILD(n, NCH(n) - 6)->n_col_offset,
2595 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002596 /* the just-created orelse handled the last elif */
2597 n_elif--;
2598 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599
Thomas Wouters89f507f2006-12-13 04:49:30 +00002600 for (i = 0; i < n_elif; i++) {
2601 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002602 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2603 if (!newobj)
2604 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002606 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002609 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 asdl_seq_SET(newobj, 0,
2613 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002614 LINENO(CHILD(n, off)),
2615 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002616 orelse = newobj;
2617 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002618 expression = ast_for_expr(c, CHILD(n, 1));
2619 if (!expression)
2620 return NULL;
2621 suite_seq = ast_for_suite(c, CHILD(n, 3));
2622 if (!suite_seq)
2623 return NULL;
2624 return If(expression, suite_seq, orelse,
2625 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002627
2628 PyErr_Format(PyExc_SystemError,
2629 "unexpected token in 'if' statement: %s", s);
2630 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631}
2632
2633static stmt_ty
2634ast_for_while_stmt(struct compiling *c, const node *n)
2635{
2636 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2637 REQ(n, while_stmt);
2638
2639 if (NCH(n) == 4) {
2640 expr_ty expression;
2641 asdl_seq *suite_seq;
2642
2643 expression = ast_for_expr(c, CHILD(n, 1));
2644 if (!expression)
2645 return NULL;
2646 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002647 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 }
2651 else if (NCH(n) == 7) {
2652 expr_ty expression;
2653 asdl_seq *seq1, *seq2;
2654
2655 expression = ast_for_expr(c, CHILD(n, 1));
2656 if (!expression)
2657 return NULL;
2658 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002659 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 return NULL;
2661 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002662 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 return NULL;
2664
Thomas Wouters89f507f2006-12-13 04:49:30 +00002665 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002667
2668 PyErr_Format(PyExc_SystemError,
2669 "wrong number of tokens for 'while' statement: %d",
2670 NCH(n));
2671 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672}
2673
2674static stmt_ty
2675ast_for_for_stmt(struct compiling *c, const node *n)
2676{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 expr_ty expression;
2679 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002680 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2682 REQ(n, for_stmt);
2683
2684 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 if (!seq)
2687 return NULL;
2688 }
2689
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002690 node_target = CHILD(n, 1);
2691 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002692 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002694 /* Check the # of children rather than the length of _target, since
2695 for x, in ... has 1 element in _target, but still requires a Tuple. */
2696 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002697 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002699 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002701 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002702 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 return NULL;
2704 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002705 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 return NULL;
2707
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002708 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2709 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710}
2711
2712static excepthandler_ty
2713ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2714{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002715 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 REQ(exc, except_clause);
2717 REQ(body, suite);
2718
2719 if (NCH(exc) == 1) {
2720 asdl_seq *suite_seq = ast_for_suite(c, body);
2721 if (!suite_seq)
2722 return NULL;
2723
Thomas Wouters89f507f2006-12-13 04:49:30 +00002724 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002725 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 }
2727 else if (NCH(exc) == 2) {
2728 expr_ty expression;
2729 asdl_seq *suite_seq;
2730
2731 expression = ast_for_expr(c, CHILD(exc, 1));
2732 if (!expression)
2733 return NULL;
2734 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002735 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 return NULL;
2737
Thomas Wouters89f507f2006-12-13 04:49:30 +00002738 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002739 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 }
2741 else if (NCH(exc) == 4) {
2742 asdl_seq *suite_seq;
2743 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002744 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002745 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002748 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 return NULL;
2750 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002751 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 return NULL;
2753
Thomas Wouters89f507f2006-12-13 04:49:30 +00002754 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002755 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002757
2758 PyErr_Format(PyExc_SystemError,
2759 "wrong number of children for 'except' clause: %d",
2760 NCH(exc));
2761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762}
2763
2764static stmt_ty
2765ast_for_try_stmt(struct compiling *c, const node *n)
2766{
Neal Norwitzf599f422005-12-17 21:33:47 +00002767 const int nch = NCH(n);
2768 int n_except = (nch - 3)/3;
2769 asdl_seq *body, *orelse = NULL, *finally = NULL;
2770
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 REQ(n, try_stmt);
2772
Neal Norwitzf599f422005-12-17 21:33:47 +00002773 body = ast_for_suite(c, CHILD(n, 2));
2774 if (body == NULL)
2775 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776
Neal Norwitzf599f422005-12-17 21:33:47 +00002777 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2778 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2779 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2780 /* we can assume it's an "else",
2781 because nch >= 9 for try-else-finally and
2782 it would otherwise have a type of except_clause */
2783 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2784 if (orelse == NULL)
2785 return NULL;
2786 n_except--;
2787 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002788
Neal Norwitzf599f422005-12-17 21:33:47 +00002789 finally = ast_for_suite(c, CHILD(n, nch - 1));
2790 if (finally == NULL)
2791 return NULL;
2792 n_except--;
2793 }
2794 else {
2795 /* we can assume it's an "else",
2796 otherwise it would have a type of except_clause */
2797 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2798 if (orelse == NULL)
2799 return NULL;
2800 n_except--;
2801 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002803 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002804 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 return NULL;
2806 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002807
2808 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002809 int i;
2810 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002811 /* process except statements to create a try ... except */
2812 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2813 if (handlers == NULL)
2814 return NULL;
2815
2816 for (i = 0; i < n_except; i++) {
2817 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2818 CHILD(n, 5 + i * 3));
2819 if (!e)
2820 return NULL;
2821 asdl_seq_SET(handlers, i, e);
2822 }
2823
Thomas Wouters89f507f2006-12-13 04:49:30 +00002824 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002825 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002826 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002827 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002828
2829 /* if a 'finally' is present too, we nest the TryExcept within a
2830 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002831 body = asdl_seq_new(1, c->c_arena);
2832 if (body == NULL)
2833 return NULL;
2834 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002835 }
2836
2837 /* must be a try ... finally (except clauses are in body, if any exist) */
2838 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002839 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840}
2841
Guido van Rossumc2e20742006-02-27 22:32:47 +00002842static expr_ty
2843ast_for_with_var(struct compiling *c, const node *n)
2844{
2845 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002846 return ast_for_expr(c, CHILD(n, 1));
2847}
2848
2849/* with_stmt: 'with' test [ with_var ] ':' suite */
2850static stmt_ty
2851ast_for_with_stmt(struct compiling *c, const node *n)
2852{
2853 expr_ty context_expr, optional_vars = NULL;
2854 int suite_index = 3; /* skip 'with', test, and ':' */
2855 asdl_seq *suite_seq;
2856
2857 assert(TYPE(n) == with_stmt);
2858 context_expr = ast_for_expr(c, CHILD(n, 1));
2859 if (TYPE(CHILD(n, 2)) == with_var) {
2860 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2861
2862 if (!optional_vars) {
2863 return NULL;
2864 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002865 if (!set_context(optional_vars, Store, n)) {
2866 return NULL;
2867 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002868 suite_index = 4;
2869 }
2870
2871 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2872 if (!suite_seq) {
2873 return NULL;
2874 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002875 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002876 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002877}
2878
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002880ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002882 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2883 asdl_seq *s;
2884 expr_ty call, dummy;
2885
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 REQ(n, classdef);
2887
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002888 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 s = ast_for_suite(c, CHILD(n, 3));
2890 if (!s)
2891 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002892 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002893 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002895
2896 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002897 s = ast_for_suite(c, CHILD(n,5));
2898 if (!s)
2899 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002900 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002901 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 }
2903
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002904 /* class NAME '(' arglist ')' ':' suite */
2905 /* build up a fake Call node so we can extract its pieces */
2906 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2907 call = ast_for_call(c, CHILD(n, 3), dummy);
2908 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002911 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002913
2914 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2915 call->v.Call.args, call->v.Call.keywords,
2916 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002917 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002918}
2919
2920static stmt_ty
2921ast_for_stmt(struct compiling *c, const node *n)
2922{
2923 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002924 assert(NCH(n) == 1);
2925 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 }
2927 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002928 assert(num_stmts(n) == 1);
2929 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 }
2931 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002932 REQ(n, small_stmt);
2933 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002934 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2935 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 */
2937 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 case expr_stmt:
2939 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 case del_stmt:
2941 return ast_for_del_stmt(c, n);
2942 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002943 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 case flow_stmt:
2945 return ast_for_flow_stmt(c, n);
2946 case import_stmt:
2947 return ast_for_import_stmt(c, n);
2948 case global_stmt:
2949 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002950 case nonlocal_stmt:
2951 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 case assert_stmt:
2953 return ast_for_assert_stmt(c, n);
2954 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002955 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2957 TYPE(n), NCH(n));
2958 return NULL;
2959 }
2960 }
2961 else {
2962 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002963 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 */
2965 node *ch = CHILD(n, 0);
2966 REQ(n, compound_stmt);
2967 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 case if_stmt:
2969 return ast_for_if_stmt(c, ch);
2970 case while_stmt:
2971 return ast_for_while_stmt(c, ch);
2972 case for_stmt:
2973 return ast_for_for_stmt(c, ch);
2974 case try_stmt:
2975 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002976 case with_stmt:
2977 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002979 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002981 return ast_for_classdef(c, ch, NULL);
2982 case decorated:
2983 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002985 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2987 TYPE(n), NCH(n));
2988 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002989 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 }
2991}
2992
2993static PyObject *
2994parsenumber(const char *s)
2995{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002996 const char *end;
2997 long x;
2998 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003000 Py_complex c;
3001 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002#endif
3003
Guido van Rossumd8faa362007-04-27 19:54:29 +00003004 errno = 0;
3005 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003007 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003009 if (s[0] == '0') {
3010 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3011 if (x < 0 && errno == 0) {
3012 return PyLong_FromString((char *)s,
3013 (char **)0,
3014 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003015 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003016 }
3017 else
3018 x = PyOS_strtol((char *)s, (char **)&end, 0);
3019 if (*end == '\0') {
3020 if (errno != 0)
3021 return PyLong_FromString((char *)s, (char **)0, 0);
3022 return PyInt_FromLong(x);
3023 }
3024 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003026 if (imflag) {
3027 c.real = 0.;
3028 PyFPE_START_PROTECT("atof", return 0)
3029 c.imag = PyOS_ascii_atof(s);
3030 PyFPE_END_PROTECT(c)
3031 return PyComplex_FromCComplex(c);
3032 }
3033 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003035 {
3036 PyFPE_START_PROTECT("atof", return 0)
3037 dx = PyOS_ascii_atof(s);
3038 PyFPE_END_PROTECT(dx)
3039 return PyFloat_FromDouble(dx);
3040 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041}
3042
3043static PyObject *
3044decode_utf8(const char **sPtr, const char *end, char* encoding)
3045{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003046 PyObject *u, *v;
3047 char *s, *t;
3048 t = s = (char *)*sPtr;
3049 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3050 while (s < end && (*s & 0x80)) s++;
3051 *sPtr = s;
3052 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3053 if (u == NULL)
3054 return NULL;
3055 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3056 Py_DECREF(u);
3057 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058}
3059
3060static PyObject *
3061decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3062{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003063 PyObject *v, *u;
3064 char *buf;
3065 char *p;
3066 const char *end;
3067 if (encoding == NULL) {
3068 buf = (char *)s;
3069 u = NULL;
3070 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3071 buf = (char *)s;
3072 u = NULL;
3073 } else {
3074 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3075 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3076 if (u == NULL)
3077 return NULL;
3078 p = buf = PyString_AsString(u);
3079 end = s + len;
3080 while (s < end) {
3081 if (*s == '\\') {
3082 *p++ = *s++;
3083 if (*s & 0x80) {
3084 strcpy(p, "u005c");
3085 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003087 }
3088 if (*s & 0x80) { /* XXX inefficient */
3089 PyObject *w;
3090 char *r;
3091 Py_ssize_t rn, i;
3092 w = decode_utf8(&s, end, "utf-16-be");
3093 if (w == NULL) {
3094 Py_DECREF(u);
3095 return NULL;
3096 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003097 assert(PyBytes_Check(w));
3098 r = PyBytes_AsString(w);
3099 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003100 assert(rn % 2 == 0);
3101 for (i = 0; i < rn; i += 2) {
3102 sprintf(p, "\\u%02x%02x",
3103 r[i + 0] & 0xFF,
3104 r[i + 1] & 0xFF);
3105 p += 6;
3106 }
3107 Py_DECREF(w);
3108 } else {
3109 *p++ = *s++;
3110 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003111 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003112 len = p - buf;
3113 s = buf;
3114 }
3115 if (rawmode)
3116 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3117 else
3118 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3119 Py_XDECREF(u);
3120 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121}
3122
3123/* s is a Python string literal, including the bracketing quote characters,
3124 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3125 * parsestr parses it, and returns the decoded Python string object.
3126 */
3127static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003128parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003130 size_t len;
3131 const char *s = STR(n);
3132 int quote = Py_CHARMASK(*s);
3133 int rawmode = 0;
3134 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135
Guido van Rossumd8faa362007-04-27 19:54:29 +00003136 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003137 if (quote == 'b' || quote == 'B') {
3138 quote = *++s;
3139 *bytesmode = 1;
3140 }
3141 if (quote == 'r' || quote == 'R') {
3142 quote = *++s;
3143 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003144 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003145 }
3146 if (quote != '\'' && quote != '\"') {
3147 PyErr_BadInternalCall();
3148 return NULL;
3149 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003150 s++;
3151 len = strlen(s);
3152 if (len > INT_MAX) {
3153 PyErr_SetString(PyExc_OverflowError,
3154 "string to parse is too long");
3155 return NULL;
3156 }
3157 if (s[--len] != quote) {
3158 PyErr_BadInternalCall();
3159 return NULL;
3160 }
3161 if (len >= 4 && s[0] == quote && s[1] == quote) {
3162 s += 2;
3163 len -= 2;
3164 if (s[--len] != quote || s[--len] != quote) {
3165 PyErr_BadInternalCall();
3166 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003167 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003168 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003169 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 return decode_unicode(s, len, rawmode, encoding);
3171 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 if (*bytesmode) {
3173 /* Disallow non-ascii characters (but not escapes) */
3174 const char *c;
3175 for (c = s; *c; c++) {
3176 if (Py_CHARMASK(*c) >= 0x80) {
3177 ast_error(n, "bytes can only contain ASCII "
3178 "literal characters.");
3179 return NULL;
3180 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003181 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 }
3183 need_encoding = (!*bytesmode && encoding != NULL &&
3184 strcmp(encoding, "utf-8") != 0 &&
3185 strcmp(encoding, "iso-8859-1") != 0);
3186 if (rawmode || strchr(s, '\\') == NULL) {
3187 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003188 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3189 if (u == NULL)
3190 return NULL;
3191 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3192 Py_DECREF(u);
3193 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 } else {
3195 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003196 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198
Guido van Rossumbdde0112007-05-11 16:26:27 +00003199 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003200 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201}
3202
3203/* Build a Python string object out of a STRING atom. This takes care of
3204 * compile-time literal catenation, calling parsestr() on each piece, and
3205 * pasting the intermediate results together.
3206 */
3207static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003208parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 PyObject *v;
3211 int i;
3212 REQ(CHILD(n, 0), STRING);
3213 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3214 if (v != NULL) {
3215 /* String literal concatenation */
3216 for (i = 1; i < NCH(n); i++) {
3217 PyObject *s;
3218 int subbm = 0;
3219 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3220 if (s == NULL)
3221 goto onError;
3222 if (*bytesmode != subbm) {
3223 ast_error(n, "cannot mix bytes and nonbytes"
3224 "literals");
3225 goto onError;
3226 }
3227 if (PyString_Check(v) && PyString_Check(s)) {
3228 PyString_ConcatAndDel(&v, s);
3229 if (v == NULL)
3230 goto onError;
3231 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 else {
3233 PyObject *temp = PyUnicode_Concat(v, s);
3234 Py_DECREF(s);
3235 Py_DECREF(v);
3236 v = temp;
3237 if (v == NULL)
3238 goto onError;
3239 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003240 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003241 }
3242 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243
Guido van Rossumd8faa362007-04-27 19:54:29 +00003244 onError:
3245 Py_XDECREF(v);
3246 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247}