blob: c13d093a29155ee97dec78206857545e9ee39b66 [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
Martin v. Löwis47383402007-08-15 07:32:56 +000050new_identifier(const char* n, PyArena *arena)
51{
Martin v. Löwis5b222132007-06-10 09:51:05 +000052 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Martin v. Löwis47383402007-08-15 07:32:56 +000053 Py_UNICODE *u = PyUnicode_AS_UNICODE(id);
54 /* Check whether there are non-ASCII characters in the
55 identifier; if so, normalize to NFKC. */
56 for (; *u; u++) {
57 if (*u >= 128) {
58 PyObject *m = PyImport_ImportModule("unicodedata");
59 PyObject *id2;
60 if (!m)
61 return NULL;
62 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
63 Py_DECREF(m);
64 if (!id2)
65 return NULL;
66 Py_DECREF(id);
67 id = id2;
68 break;
69 }
70 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000071 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000072 PyArena_AddPyObject(arena, id);
73 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000074}
75
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077
78/* This routine provides an invalid object for the syntax error.
79 The outermost routine must unpack this error and create the
80 proper object. We do this so that we don't have to pass
81 the filename to everything function.
82
83 XXX Maybe we should just pass the filename...
84*/
85
86static int
87ast_error(const node *n, const char *errstr)
88{
89 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
90 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000091 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 PyErr_SetObject(PyExc_SyntaxError, u);
93 Py_DECREF(u);
94 return 0;
95}
96
97static void
98ast_error_finish(const char *filename)
99{
100 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000101 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000102
103 assert(PyErr_Occurred());
104 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000105 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 PyErr_Fetch(&type, &value, &tback);
108 errstr = PyTuple_GetItem(value, 0);
109 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000110 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111 Py_INCREF(errstr);
112 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000113 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 Py_DECREF(errstr);
115 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000116 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000117 Py_DECREF(value);
118
119 loc = PyErr_ProgramText(filename, lineno);
120 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000121 Py_INCREF(Py_None);
122 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000123 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000124 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000125 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000126 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000127 Py_DECREF(errstr);
128 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000129 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000130 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000131 Py_DECREF(errstr);
132 Py_DECREF(tmp);
133 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000134 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 PyErr_Restore(type, value, tback);
136}
137
138/* num_stmts() returns number of contained statements.
139
140 Use this routine to determine how big a sequence is needed for
141 the statements in a parse tree. Its raison d'etre is this bit of
142 grammar:
143
144 stmt: simple_stmt | compound_stmt
145 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
146
147 A simple_stmt can contain multiple small_stmt elements joined
148 by semicolons. If the arg is a simple_stmt, the number of
149 small_stmt elements is returned.
150*/
151
152static int
153num_stmts(const node *n)
154{
155 int i, l;
156 node *ch;
157
158 switch (TYPE(n)) {
159 case single_input:
160 if (TYPE(CHILD(n, 0)) == NEWLINE)
161 return 0;
162 else
163 return num_stmts(CHILD(n, 0));
164 case file_input:
165 l = 0;
166 for (i = 0; i < NCH(n); i++) {
167 ch = CHILD(n, i);
168 if (TYPE(ch) == stmt)
169 l += num_stmts(ch);
170 }
171 return l;
172 case stmt:
173 return num_stmts(CHILD(n, 0));
174 case compound_stmt:
175 return 1;
176 case simple_stmt:
177 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
178 case suite:
179 if (NCH(n) == 1)
180 return num_stmts(CHILD(n, 0));
181 else {
182 l = 0;
183 for (i = 2; i < (NCH(n) - 1); i++)
184 l += num_stmts(CHILD(n, i));
185 return l;
186 }
187 default: {
188 char buf[128];
189
190 sprintf(buf, "Non-statement found: %d %d\n",
191 TYPE(n), NCH(n));
192 Py_FatalError(buf);
193 }
194 }
195 assert(0);
196 return 0;
197}
198
199/* Transform the CST rooted at node * to the appropriate AST
200*/
201
202mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000203PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
204 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000206 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207 asdl_seq *stmts = NULL;
208 stmt_ty s;
209 node *ch;
210 struct compiling c;
211
212 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000213 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000214 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000215#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000216 ast_error(n, "encoding declaration in Unicode string");
217 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000218#endif
219 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000220 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000221 } else if (TYPE(n) == encoding_decl) {
222 c.c_encoding = STR(n);
223 n = CHILD(n, 0);
224 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000225 /* PEP 3120 */
226 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000228 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000229
Jeremy Hyltona8293132006-02-28 17:58:27 +0000230 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 switch (TYPE(n)) {
232 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000233 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 for (i = 0; i < NCH(n) - 1; i++) {
237 ch = CHILD(n, i);
238 if (TYPE(ch) == NEWLINE)
239 continue;
240 REQ(ch, stmt);
241 num = num_stmts(ch);
242 if (num == 1) {
243 s = ast_for_stmt(&c, ch);
244 if (!s)
245 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000246 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000247 }
248 else {
249 ch = CHILD(ch, 0);
250 REQ(ch, simple_stmt);
251 for (j = 0; j < num; j++) {
252 s = ast_for_stmt(&c, CHILD(ch, j * 2));
253 if (!s)
254 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000255 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256 }
257 }
258 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000259 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000260 case eval_input: {
261 expr_ty testlist_ast;
262
Nick Coghlan650f0d02007-04-15 12:05:43 +0000263 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000264 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 if (!testlist_ast)
266 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000267 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000268 }
269 case single_input:
270 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000271 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000272 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000273 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000274 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
275 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000276 if (!asdl_seq_GET(stmts, 0))
277 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000278 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 }
280 else {
281 n = CHILD(n, 0);
282 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000285 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000287 s = ast_for_stmt(&c, n);
288 if (!s)
289 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 asdl_seq_SET(stmts, 0, s);
291 }
292 else {
293 /* Only a simple_stmt can contain multiple statements. */
294 REQ(n, simple_stmt);
295 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000296 if (TYPE(CHILD(n, i)) == NEWLINE)
297 break;
298 s = ast_for_stmt(&c, CHILD(n, i));
299 if (!s)
300 goto error;
301 asdl_seq_SET(stmts, i / 2, s);
302 }
303 }
304
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000305 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000306 }
307 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000308 PyErr_Format(PyExc_SystemError,
309 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000310 goto error;
311 }
312 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000313 ast_error_finish(filename);
314 return NULL;
315}
316
317/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
318*/
319
320static operator_ty
321get_operator(const node *n)
322{
323 switch (TYPE(n)) {
324 case VBAR:
325 return BitOr;
326 case CIRCUMFLEX:
327 return BitXor;
328 case AMPER:
329 return BitAnd;
330 case LEFTSHIFT:
331 return LShift;
332 case RIGHTSHIFT:
333 return RShift;
334 case PLUS:
335 return Add;
336 case MINUS:
337 return Sub;
338 case STAR:
339 return Mult;
340 case SLASH:
341 return Div;
342 case DOUBLESLASH:
343 return FloorDiv;
344 case PERCENT:
345 return Mod;
346 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000347 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000348 }
349}
350
Guido van Rossume7ba4952007-06-06 23:52:48 +0000351static const char* FORBIDDEN[] = {
352 "None",
353 "True",
354 "False",
355 NULL,
356};
357
358static int
359forbidden_name(expr_ty e, const node *n)
360{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000361 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000362 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000363 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000364 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365 ast_error(n, "assignment to keyword");
366 return 1;
367 }
368 }
369 return 0;
370}
371
Jeremy Hyltona8293132006-02-28 17:58:27 +0000372/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373
374 Only sets context for expr kinds that "can appear in assignment context"
375 (according to ../Parser/Python.asdl). For other expr kinds, it sets
376 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000377*/
378
379static int
380set_context(expr_ty e, expr_context_ty ctx, const node *n)
381{
382 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000383 /* If a particular expression type can't be used for assign / delete,
384 set expr_name to its name and an error message will be generated.
385 */
386 const char* expr_name = NULL;
387
388 /* The ast defines augmented store and load contexts, but the
389 implementation here doesn't actually use them. The code may be
390 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000392 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000393 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 */
395 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396
397 switch (e->kind) {
398 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000399 e->v.Attribute.ctx = ctx;
400 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000401 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000402 e->v.Subscript.ctx = ctx;
403 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000404 case Starred_kind:
405 e->v.Starred.ctx = ctx;
406 if (!set_context(e->v.Starred.value, ctx, n))
407 return 0;
408 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000409 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000410 if (ctx == Store) {
411 if (forbidden_name(e, n))
412 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 }
414 e->v.Name.ctx = ctx;
415 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000416 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000417 e->v.List.ctx = ctx;
418 s = e->v.List.elts;
419 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000420 case Tuple_kind:
421 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
422 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 e->v.Tuple.ctx = ctx;
424 s = e->v.Tuple.elts;
425 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000426 case Lambda_kind:
427 expr_name = "lambda";
428 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000430 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000431 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000434 case UnaryOp_kind:
435 expr_name = "operator";
436 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000437 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000438 expr_name = "generator expression";
439 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000440 case Yield_kind:
441 expr_name = "yield expression";
442 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000443 case ListComp_kind:
444 expr_name = "list comprehension";
445 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000446 case SetComp_kind:
447 expr_name = "set comprehension";
448 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000449 case DictComp_kind:
450 expr_name = "dict comprehension";
451 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000452 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000453 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000454 case Num_kind:
455 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000456 expr_name = "literal";
457 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000458 case Ellipsis_kind:
459 expr_name = "Ellipsis";
460 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000461 case Compare_kind:
462 expr_name = "comparison";
463 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000464 case IfExp_kind:
465 expr_name = "conditional expression";
466 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000467 default:
468 PyErr_Format(PyExc_SystemError,
469 "unexpected expression in assignment %d (line %d)",
470 e->kind, e->lineno);
471 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000472 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 /* Check for error string set by switch */
474 if (expr_name) {
475 char buf[300];
476 PyOS_snprintf(buf, sizeof(buf),
477 "can't %s %s",
478 ctx == Store ? "assign to" : "delete",
479 expr_name);
480 return ast_error(n, buf);
481 }
482
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000483 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000484 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485 */
486 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000487 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 for (i = 0; i < asdl_seq_LEN(s); i++) {
490 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
491 return 0;
492 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493 }
494 return 1;
495}
496
497static operator_ty
498ast_for_augassign(const node *n)
499{
500 REQ(n, augassign);
501 n = CHILD(n, 0);
502 switch (STR(n)[0]) {
503 case '+':
504 return Add;
505 case '-':
506 return Sub;
507 case '/':
508 if (STR(n)[1] == '/')
509 return FloorDiv;
510 else
511 return Div;
512 case '%':
513 return Mod;
514 case '<':
515 return LShift;
516 case '>':
517 return RShift;
518 case '&':
519 return BitAnd;
520 case '^':
521 return BitXor;
522 case '|':
523 return BitOr;
524 case '*':
525 if (STR(n)[1] == '*')
526 return Pow;
527 else
528 return Mult;
529 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000530 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000531 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000532 }
533}
534
535static cmpop_ty
536ast_for_comp_op(const node *n)
537{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000538 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539 |'is' 'not'
540 */
541 REQ(n, comp_op);
542 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000543 n = CHILD(n, 0);
544 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 case LESS:
546 return Lt;
547 case GREATER:
548 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550 return Eq;
551 case LESSEQUAL:
552 return LtE;
553 case GREATEREQUAL:
554 return GtE;
555 case NOTEQUAL:
556 return NotEq;
557 case NAME:
558 if (strcmp(STR(n), "in") == 0)
559 return In;
560 if (strcmp(STR(n), "is") == 0)
561 return Is;
562 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000563 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000564 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000565 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000566 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 }
568 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000569 /* handle "not in" and "is not" */
570 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 case NAME:
572 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
573 return NotIn;
574 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
575 return IsNot;
576 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000577 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000579 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000580 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 }
Neal Norwitz79792652005-11-14 04:25:03 +0000582 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000584 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585}
586
587static asdl_seq *
588seq_for_testlist(struct compiling *c, const node *n)
589{
590 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000591 asdl_seq *seq;
592 expr_ty expression;
593 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000594 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000596 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 if (!seq)
598 return NULL;
599
600 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000601 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
603 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000604 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000605 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606
607 assert(i / 2 < seq->size);
608 asdl_seq_SET(seq, i / 2, expression);
609 }
610 return seq;
611}
612
Neal Norwitzc1505362006-12-28 06:47:50 +0000613static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000614compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000615{
616 identifier name;
617 expr_ty annotation = NULL;
618 node *ch;
619
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000620 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000621 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000622 name = NEW_IDENTIFIER(ch);
623 if (!name)
624 return NULL;
625
626 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
627 annotation = ast_for_expr(c, CHILD(n, 2));
628 if (!annotation)
629 return NULL;
630 }
631
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000632 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633}
634
Guido van Rossum4f72a782006-10-27 23:31:49 +0000635/* returns -1 if failed to handle keyword only arguments
636 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000637 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000638 ^^^
639 start pointing here
640 */
641static int
642handle_keywordonly_args(struct compiling *c, const node *n, int start,
643 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
644{
645 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000646 expr_ty expression, annotation;
647 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000648 int i = start;
649 int j = 0; /* index for kwdefaults and kwonlyargs */
650 assert(kwonlyargs != NULL);
651 assert(kwdefaults != NULL);
652 while (i < NCH(n)) {
653 ch = CHILD(n, i);
654 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000655 case vfpdef:
656 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000657 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000658 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000659 asdl_seq_SET(kwdefaults, j, expression);
660 i += 2; /* '=' and test */
661 }
662 else { /* setting NULL if no default value exists */
663 asdl_seq_SET(kwdefaults, j, NULL);
664 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000665 if (NCH(ch) == 3) {
666 /* ch is NAME ':' test */
667 annotation = ast_for_expr(c, CHILD(ch, 2));
668 if (!annotation) {
669 ast_error(ch, "expected expression");
670 goto error;
671 }
672 }
673 else {
674 annotation = NULL;
675 }
676 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000677 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000678 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000679 ast_error(ch, "expecting name");
680 goto error;
681 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000682 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000683 i += 2; /* the name and the comma */
684 break;
685 case DOUBLESTAR:
686 return i;
687 default:
688 ast_error(ch, "unexpected node");
689 goto error;
690 }
691 }
692 return i;
693 error:
694 return -1;
695}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000696
Jeremy Hyltona8293132006-02-28 17:58:27 +0000697/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698
699static arguments_ty
700ast_for_arguments(struct compiling *c, const node *n)
701{
Neal Norwitzc1505362006-12-28 06:47:50 +0000702 /* This function handles both typedargslist (function definition)
703 and varargslist (lambda definition).
704
705 parameters: '(' [typedargslist] ')'
706 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000707 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
708 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000709 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000710 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000711 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000712 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
713 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000715 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000717 int i, j, k, nposargs = 0, nkwonlyargs = 0;
718 int nposdefaults = 0, found_default = 0;
719 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000721 arg_ty arg;
722 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 node *ch;
724
725 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000726 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
728 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000729 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000731 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732
Guido van Rossum4f72a782006-10-27 23:31:49 +0000733 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 ch = CHILD(n, i);
736 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000737 /* skip star and possible argument */
738 i++;
739 i += (TYPE(CHILD(n, i)) == tfpdef
740 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000741 break;
742 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000743 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000744 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000745 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 /* count the number of keyword only args &
748 defaults for keyword only args */
749 for ( ; i < NCH(n); ++i) {
750 ch = CHILD(n, i);
751 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000752 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000754 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
755 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000757 kwonlyargs = (nkwonlyargs ?
758 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
759 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000760 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 posdefaults = (nposdefaults ?
762 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
763 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000764 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000765 /* The length of kwonlyargs and kwdefaults are same
766 since we set NULL as default for keyword only argument w/o default
767 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000768 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
770 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000771 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000772
773 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000774 ast_error(n, "more than 255 arguments");
775 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000778 /* tfpdef: NAME [':' test]
779 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 */
781 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000782 j = 0; /* index for defaults */
783 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000785 ch = CHILD(n, i);
786 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000787 case tfpdef:
788 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
790 anything other than EQUAL or a comma? */
791 /* XXX Should NCH(n) check be made a separate check? */
792 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000793 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
794 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 goto error;
796 assert(posdefaults != NULL);
797 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000799 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 else if (found_default) {
802 ast_error(n,
803 "non-default argument follows default argument");
804 goto error;
805 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000806 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000807 if (!arg)
808 goto error;
809 asdl_seq_SET(posargs, k++, arg);
810
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 i += 2; /* the name and the comma */
812 break;
813 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000814 if (i+1 >= NCH(n)) {
815 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000816 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000817 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000818 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000819 if (TYPE(ch) == COMMA) {
820 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000821 i += 2; /* now follows keyword only arguments */
822 res = handle_keywordonly_args(c, n, i,
823 kwonlyargs, kwdefaults);
824 if (res == -1) goto error;
825 i = res; /* res has new position to process */
826 }
827 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000828 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
829 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000830 /* there is an annotation on the vararg */
831 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000832 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000833 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000834 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
835 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000836 int res = 0;
837 res = handle_keywordonly_args(c, n, i,
838 kwonlyargs, kwdefaults);
839 if (res == -1) goto error;
840 i = res; /* res has new position to process */
841 }
842 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843 break;
844 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000845 ch = CHILD(n, i+1); /* tfpdef */
846 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000847 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
848 if (NCH(ch) > 1) {
849 /* there is an annotation on the kwarg */
850 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
851 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852 i += 3;
853 break;
854 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000855 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 "unexpected node in varargslist: %d @ %d",
857 TYPE(ch), i);
858 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000861 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
862 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000864 Py_XDECREF(vararg);
865 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 return NULL;
867}
868
869static expr_ty
870ast_for_dotted_name(struct compiling *c, const node *n)
871{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000872 expr_ty e;
873 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000874 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875 int i;
876
877 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000878
879 lineno = LINENO(n);
880 col_offset = n->n_col_offset;
881
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 id = NEW_IDENTIFIER(CHILD(n, 0));
883 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000884 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000885 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888
889 for (i = 2; i < NCH(n); i+=2) {
890 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000891 if (!id)
892 return NULL;
893 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
894 if (!e)
895 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000896 }
897
898 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899}
900
901static expr_ty
902ast_for_decorator(struct compiling *c, const node *n)
903{
904 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
905 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000906 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907
908 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000909 REQ(CHILD(n, 0), AT);
910 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000911
912 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
913 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000914 return NULL;
915
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000917 d = name_expr;
918 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919 }
920 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000921 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000922 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000923 if (!d)
924 return NULL;
925 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 }
927 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000928 d = ast_for_call(c, CHILD(n, 3), name_expr);
929 if (!d)
930 return NULL;
931 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 }
933
934 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935}
936
937static asdl_seq*
938ast_for_decorators(struct compiling *c, const node *n)
939{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000940 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000941 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942 int i;
943
944 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000945 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 if (!decorator_seq)
947 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000948
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000950 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 if (!d)
952 return NULL;
953 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 }
955 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956}
957
958static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000959ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000961 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000962 identifier name;
963 arguments_ty args;
964 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000965 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000966 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000967
968 REQ(n, funcdef);
969
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 name = NEW_IDENTIFIER(CHILD(n, name_i));
971 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000972 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 args = ast_for_arguments(c, CHILD(n, name_i + 1));
974 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000975 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000976 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
977 returns = ast_for_expr(c, CHILD(n, name_i + 3));
978 if (!returns)
979 return NULL;
980 name_i += 2;
981 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 body = ast_for_suite(c, CHILD(n, name_i + 3));
983 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000984 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985
Neal Norwitzc1505362006-12-28 06:47:50 +0000986 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000987 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988}
989
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000990static stmt_ty
991ast_for_decorated(struct compiling *c, const node *n)
992{
993 /* decorated: decorators (classdef | funcdef) */
994 stmt_ty thing = NULL;
995 asdl_seq *decorator_seq = NULL;
996
997 REQ(n, decorated);
998
999 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1000 if (!decorator_seq)
1001 return NULL;
1002
1003 assert(TYPE(CHILD(n, 1)) == funcdef ||
1004 TYPE(CHILD(n, 1)) == classdef);
1005
1006 if (TYPE(CHILD(n, 1)) == funcdef) {
1007 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1008 } else if (TYPE(CHILD(n, 1)) == classdef) {
1009 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1010 }
1011 return thing;
1012}
1013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014static expr_ty
1015ast_for_lambdef(struct compiling *c, const node *n)
1016{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001017 /* lambdef: 'lambda' [varargslist] ':' test
1018 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019 arguments_ty args;
1020 expr_ty expression;
1021
1022 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001023 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1024 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 if (!args)
1026 return NULL;
1027 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001028 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030 }
1031 else {
1032 args = ast_for_arguments(c, CHILD(n, 1));
1033 if (!args)
1034 return NULL;
1035 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001036 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 }
1039
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001040 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041}
1042
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001043static expr_ty
1044ast_for_ifexpr(struct compiling *c, const node *n)
1045{
1046 /* test: or_test 'if' or_test 'else' test */
1047 expr_ty expression, body, orelse;
1048
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001049 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001050 body = ast_for_expr(c, CHILD(n, 0));
1051 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001052 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001053 expression = ast_for_expr(c, CHILD(n, 2));
1054 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001055 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001056 orelse = ast_for_expr(c, CHILD(n, 4));
1057 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001058 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001059 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1060 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001061}
1062
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001064 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065
Nick Coghlan650f0d02007-04-15 12:05:43 +00001066 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067*/
1068
1069static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001070count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001072 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073
Guido van Rossumd8faa362007-04-27 19:54:29 +00001074 count_comp_for:
1075 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001076 REQ(n, comp_for);
1077 if (NCH(n) == 5)
1078 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001079 else
1080 return n_fors;
1081 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001082 REQ(n, comp_iter);
1083 n = CHILD(n, 0);
1084 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001085 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001086 else if (TYPE(n) == comp_if) {
1087 if (NCH(n) == 3) {
1088 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001089 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001090 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001091 else
1092 return n_fors;
1093 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001094
Guido van Rossumd8faa362007-04-27 19:54:29 +00001095 /* Should never be reached */
1096 PyErr_SetString(PyExc_SystemError,
1097 "logic error in count_comp_fors");
1098 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099}
1100
Nick Coghlan650f0d02007-04-15 12:05:43 +00001101/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102
Nick Coghlan650f0d02007-04-15 12:05:43 +00001103 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104*/
1105
1106static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001107count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001109 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111 while (1) {
1112 REQ(n, comp_iter);
1113 if (TYPE(CHILD(n, 0)) == comp_for)
1114 return n_ifs;
1115 n = CHILD(n, 0);
1116 REQ(n, comp_if);
1117 n_ifs++;
1118 if (NCH(n) == 2)
1119 return n_ifs;
1120 n = CHILD(n, 2);
1121 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122}
1123
Guido van Rossum992d4a32007-07-11 13:09:30 +00001124static asdl_seq *
1125ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001128 asdl_seq *comps;
1129
Nick Coghlan650f0d02007-04-15 12:05:43 +00001130 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 if (n_fors == -1)
1132 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001133
Nick Coghlan650f0d02007-04-15 12:05:43 +00001134 comps = asdl_seq_new(n_fors, c->c_arena);
1135 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001137
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001139 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 asdl_seq *t;
1141 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001142 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143
Guido van Rossum992d4a32007-07-11 13:09:30 +00001144 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145
Guido van Rossum992d4a32007-07-11 13:09:30 +00001146 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001147 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001148 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001150 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001151 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001153
Thomas Wouters89f507f2006-12-13 04:49:30 +00001154 /* Check the # of children rather than the length of t, since
1155 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1156 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001157 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1158 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001160 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001161 c->c_arena),
1162 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001163
Nick Coghlan650f0d02007-04-15 12:05:43 +00001164 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001166
Guido van Rossum992d4a32007-07-11 13:09:30 +00001167 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 int j, n_ifs;
1169 asdl_seq *ifs;
1170
Guido van Rossum992d4a32007-07-11 13:09:30 +00001171 n = CHILD(n, 4);
1172 n_ifs = count_comp_ifs(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001173 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001175
1176 ifs = asdl_seq_new(n_ifs, c->c_arena);
1177 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001179
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001181 REQ(n, comp_iter);
1182 n = CHILD(n, 0);
1183 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184
Guido van Rossum992d4a32007-07-11 13:09:30 +00001185 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001186 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001187 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001188 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001189 if (NCH(n) == 3)
1190 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001192 /* on exit, must guarantee that n is a comp_for */
1193 if (TYPE(n) == comp_iter)
1194 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001195 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001197 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001199 return comps;
1200}
1201
1202static expr_ty
1203ast_for_itercomp(struct compiling *c, const node *n, int type)
1204{
1205 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1206 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1207 expr_ty elt;
1208 asdl_seq *comps;
1209
1210 assert(NCH(n) > 1);
1211
1212 elt = ast_for_expr(c, CHILD(n, 0));
1213 if (!elt)
1214 return NULL;
1215
1216 comps = ast_for_comprehension(c, CHILD(n, 1));
1217 if (!comps)
1218 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001219
1220 if (type == COMP_GENEXP)
1221 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1222 else if (type == COMP_LISTCOMP)
1223 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1224 else if (type == COMP_SETCOMP)
1225 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1226 else
1227 /* Should never happen */
1228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229}
1230
1231static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001232ast_for_dictcomp(struct compiling *c, const node *n)
1233{
1234 expr_ty key, value;
1235 asdl_seq *comps;
1236
1237 assert(NCH(n) > 3);
1238 REQ(CHILD(n, 1), COLON);
1239
1240 key = ast_for_expr(c, CHILD(n, 0));
1241 if (!key)
1242 return NULL;
1243
1244 value = ast_for_expr(c, CHILD(n, 2));
1245 if (!value)
1246 return NULL;
1247
1248 comps = ast_for_comprehension(c, CHILD(n, 3));
1249 if (!comps)
1250 return NULL;
1251
1252 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1253}
1254
1255static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001256ast_for_genexp(struct compiling *c, const node *n)
1257{
1258 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001259 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001260}
1261
1262static expr_ty
1263ast_for_listcomp(struct compiling *c, const node *n)
1264{
1265 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001266 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001267}
1268
1269static expr_ty
1270ast_for_setcomp(struct compiling *c, const node *n)
1271{
1272 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001273 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001274}
1275
1276
1277static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278ast_for_atom(struct compiling *c, const node *n)
1279{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001280 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1281 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001282 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 */
1284 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001285 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286
1287 switch (TYPE(ch)) {
1288 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001289 /* All names start in Load context, but may later be
1290 changed. */
1291 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001292 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001293 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001294 if (!str) {
1295 if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
1296 PyObject *type, *value, *tback, *errstr;
1297 PyErr_Fetch(&type, &value, &tback);
1298 errstr = ((PyUnicodeErrorObject *)value)->reason;
1299 if (errstr) {
1300 char *s = "";
1301 char buf[128];
1302 s = PyString_AsString(errstr);
1303 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1304 ast_error(n, buf);
1305 } else {
1306 ast_error(n, "(unicode error) unknown error");
1307 }
1308 Py_DECREF(type);
1309 Py_DECREF(value);
1310 Py_XDECREF(tback);
1311 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001312 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001313 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001314 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001315 if (bytesmode)
1316 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1317 else
1318 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 }
1320 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001321 PyObject *pynum = parsenumber(STR(ch));
1322 if (!pynum)
1323 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001324
Thomas Wouters89f507f2006-12-13 04:49:30 +00001325 PyArena_AddPyObject(c->c_arena, pynum);
1326 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 }
Georg Brandldde00282007-03-18 19:01:53 +00001328 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001329 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001331 ch = CHILD(n, 1);
1332
1333 if (TYPE(ch) == RPAR)
1334 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1335
1336 if (TYPE(ch) == yield_expr)
1337 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001338
1339 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1340 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001341 return ast_for_genexp(c, ch);
1342
Nick Coghlan650f0d02007-04-15 12:05:43 +00001343 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001345 ch = CHILD(n, 1);
1346
1347 if (TYPE(ch) == RSQB)
1348 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1349
Nick Coghlan650f0d02007-04-15 12:05:43 +00001350 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001351 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1352 asdl_seq *elts = seq_for_testlist(c, ch);
1353 if (!elts)
1354 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001355
Thomas Wouters89f507f2006-12-13 04:49:30 +00001356 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1357 }
1358 else
1359 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001361 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1362 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001363 int i, size;
1364 asdl_seq *keys, *values;
1365
1366 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001367 if (TYPE(ch) == RBRACE) {
1368 /* it's an empty dict */
1369 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1370 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1371 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001372 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001373 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001374 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001375 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001376 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001377 for (i = 0; i < NCH(ch); i += 2) {
1378 expr_ty expression;
1379 expression = ast_for_expr(c, CHILD(ch, i));
1380 if (!expression)
1381 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001382 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001383 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001384 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1385 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1386 /* it's a set comprehension */
1387 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001388 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1389 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001390 } else {
1391 /* it's a dict */
1392 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1393 keys = asdl_seq_new(size, c->c_arena);
1394 if (!keys)
1395 return NULL;
1396
1397 values = asdl_seq_new(size, c->c_arena);
1398 if (!values)
1399 return NULL;
1400
1401 for (i = 0; i < NCH(ch); i += 4) {
1402 expr_ty expression;
1403
1404 expression = ast_for_expr(c, CHILD(ch, i));
1405 if (!expression)
1406 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001407
Guido van Rossum86e58e22006-08-28 15:27:34 +00001408 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001409
Guido van Rossum86e58e22006-08-28 15:27:34 +00001410 expression = ast_for_expr(c, CHILD(ch, i + 2));
1411 if (!expression)
1412 return NULL;
1413
1414 asdl_seq_SET(values, i / 4, expression);
1415 }
1416 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1417 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001420 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1421 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422 }
1423}
1424
1425static slice_ty
1426ast_for_slice(struct compiling *c, const node *n)
1427{
1428 node *ch;
1429 expr_ty lower = NULL, upper = NULL, step = NULL;
1430
1431 REQ(n, subscript);
1432
1433 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001434 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 sliceop: ':' [test]
1436 */
1437 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 if (NCH(n) == 1 && TYPE(ch) == test) {
1439 /* 'step' variable hold no significance in terms of being used over
1440 other vars */
1441 step = ast_for_expr(c, ch);
1442 if (!step)
1443 return NULL;
1444
Thomas Wouters89f507f2006-12-13 04:49:30 +00001445 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 }
1447
1448 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001449 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 if (!lower)
1451 return NULL;
1452 }
1453
1454 /* If there's an upper bound it's in the second or third position. */
1455 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001456 if (NCH(n) > 1) {
1457 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 if (TYPE(n2) == test) {
1460 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 if (!upper)
1462 return NULL;
1463 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001464 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467
Thomas Wouters89f507f2006-12-13 04:49:30 +00001468 if (TYPE(n2) == test) {
1469 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 if (!upper)
1471 return NULL;
1472 }
1473 }
1474
1475 ch = CHILD(n, NCH(n) - 1);
1476 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001477 if (NCH(ch) == 1) {
1478 /* No expression, so step is None */
1479 ch = CHILD(ch, 0);
1480 step = Name(new_identifier("None", c->c_arena), Load,
1481 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 if (!step)
1483 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001484 } else {
1485 ch = CHILD(ch, 1);
1486 if (TYPE(ch) == test) {
1487 step = ast_for_expr(c, ch);
1488 if (!step)
1489 return NULL;
1490 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 }
1492 }
1493
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001494 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495}
1496
1497static expr_ty
1498ast_for_binop(struct compiling *c, const node *n)
1499{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001500 /* Must account for a sequence of expressions.
1501 How should A op B op C by represented?
1502 BinOp(BinOp(A, op, B), op, C).
1503 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504
Guido van Rossumd8faa362007-04-27 19:54:29 +00001505 int i, nops;
1506 expr_ty expr1, expr2, result;
1507 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508
Guido van Rossumd8faa362007-04-27 19:54:29 +00001509 expr1 = ast_for_expr(c, CHILD(n, 0));
1510 if (!expr1)
1511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512
Guido van Rossumd8faa362007-04-27 19:54:29 +00001513 expr2 = ast_for_expr(c, CHILD(n, 2));
1514 if (!expr2)
1515 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516
Guido van Rossumd8faa362007-04-27 19:54:29 +00001517 newoperator = get_operator(CHILD(n, 1));
1518 if (!newoperator)
1519 return NULL;
1520
1521 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1522 c->c_arena);
1523 if (!result)
1524 return NULL;
1525
1526 nops = (NCH(n) - 1) / 2;
1527 for (i = 1; i < nops; i++) {
1528 expr_ty tmp_result, tmp;
1529 const node* next_oper = CHILD(n, i * 2 + 1);
1530
1531 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001532 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533 return NULL;
1534
Guido van Rossumd8faa362007-04-27 19:54:29 +00001535 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1536 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537 return NULL;
1538
Guido van Rossumd8faa362007-04-27 19:54:29 +00001539 tmp_result = BinOp(result, newoperator, tmp,
1540 LINENO(next_oper), next_oper->n_col_offset,
1541 c->c_arena);
1542 if (!tmp)
1543 return NULL;
1544 result = tmp_result;
1545 }
1546 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547}
1548
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001549static expr_ty
1550ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1551{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001552 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1553 subscriptlist: subscript (',' subscript)* [',']
1554 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1555 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001556 REQ(n, trailer);
1557 if (TYPE(CHILD(n, 0)) == LPAR) {
1558 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001559 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1560 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001561 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001562 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001563 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001564 else if (TYPE(CHILD(n, 0)) == DOT ) {
1565 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001566 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001567 }
1568 else {
1569 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001570 REQ(CHILD(n, 2), RSQB);
1571 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001572 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001573 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1574 if (!slc)
1575 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001576 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1577 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001578 }
1579 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001580 /* The grammar is ambiguous here. The ambiguity is resolved
1581 by treating the sequence as a tuple literal if there are
1582 no slice features.
1583 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001584 int j;
1585 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001586 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001587 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001588 asdl_seq *slices, *elts;
1589 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001590 if (!slices)
1591 return NULL;
1592 for (j = 0; j < NCH(n); j += 2) {
1593 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001594 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001595 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001596 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001597 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001598 asdl_seq_SET(slices, j / 2, slc);
1599 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001600 if (!simple) {
1601 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001602 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001603 }
1604 /* extract Index values and put them in a Tuple */
1605 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001606 if (!elts)
1607 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001608 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1609 slc = (slice_ty)asdl_seq_GET(slices, j);
1610 assert(slc->kind == Index_kind && slc->v.Index.value);
1611 asdl_seq_SET(elts, j, slc->v.Index.value);
1612 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001613 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001614 if (!e)
1615 return NULL;
1616 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001617 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001618 }
1619 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001620}
1621
1622static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001623ast_for_factor(struct compiling *c, const node *n)
1624{
1625 node *pfactor, *ppower, *patom, *pnum;
1626 expr_ty expression;
1627
1628 /* If the unary - operator is applied to a constant, don't generate
1629 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1630 constant. The peephole optimizer already does something like
1631 this but it doesn't handle the case where the constant is
1632 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1633 PyLongObject.
1634 */
1635 if (TYPE(CHILD(n, 0)) == MINUS
1636 && NCH(n) == 2
1637 && TYPE((pfactor = CHILD(n, 1))) == factor
1638 && NCH(pfactor) == 1
1639 && TYPE((ppower = CHILD(pfactor, 0))) == power
1640 && NCH(ppower) == 1
1641 && TYPE((patom = CHILD(ppower, 0))) == atom
1642 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1643 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1644 if (s == NULL)
1645 return NULL;
1646 s[0] = '-';
1647 strcpy(s + 1, STR(pnum));
1648 PyObject_FREE(STR(pnum));
1649 STR(pnum) = s;
1650 return ast_for_atom(c, patom);
1651 }
1652
1653 expression = ast_for_expr(c, CHILD(n, 1));
1654 if (!expression)
1655 return NULL;
1656
1657 switch (TYPE(CHILD(n, 0))) {
1658 case PLUS:
1659 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1660 c->c_arena);
1661 case MINUS:
1662 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1663 c->c_arena);
1664 case TILDE:
1665 return UnaryOp(Invert, expression, LINENO(n),
1666 n->n_col_offset, c->c_arena);
1667 }
1668 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1669 TYPE(CHILD(n, 0)));
1670 return NULL;
1671}
1672
1673static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001674ast_for_power(struct compiling *c, const node *n)
1675{
1676 /* power: atom trailer* ('**' factor)*
1677 */
1678 int i;
1679 expr_ty e, tmp;
1680 REQ(n, power);
1681 e = ast_for_atom(c, CHILD(n, 0));
1682 if (!e)
1683 return NULL;
1684 if (NCH(n) == 1)
1685 return e;
1686 for (i = 1; i < NCH(n); i++) {
1687 node *ch = CHILD(n, i);
1688 if (TYPE(ch) != trailer)
1689 break;
1690 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001691 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001692 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001693 tmp->lineno = e->lineno;
1694 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001695 e = tmp;
1696 }
1697 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1698 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001699 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001700 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001701 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001702 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001703 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001704 e = tmp;
1705 }
1706 return e;
1707}
1708
Guido van Rossum0368b722007-05-11 16:50:42 +00001709static expr_ty
1710ast_for_starred(struct compiling *c, const node *n)
1711{
1712 expr_ty tmp;
1713 REQ(n, star_expr);
1714
1715 tmp = ast_for_expr(c, CHILD(n, 1));
1716 if (!tmp)
1717 return NULL;
1718
1719 /* The Load context is changed later. */
1720 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1721}
1722
1723
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724/* Do not name a variable 'expr'! Will cause a compile error.
1725*/
1726
1727static expr_ty
1728ast_for_expr(struct compiling *c, const node *n)
1729{
1730 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001731 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001732 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001733 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734 and_test: not_test ('and' not_test)*
1735 not_test: 'not' not_test | comparison
1736 comparison: expr (comp_op expr)*
1737 expr: xor_expr ('|' xor_expr)*
1738 xor_expr: and_expr ('^' and_expr)*
1739 and_expr: shift_expr ('&' shift_expr)*
1740 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1741 arith_expr: term (('+'|'-') term)*
1742 term: factor (('*'|'/'|'%'|'//') factor)*
1743 factor: ('+'|'-'|'~') factor | power
1744 power: atom trailer* ('**' factor)*
1745 */
1746
1747 asdl_seq *seq;
1748 int i;
1749
1750 loop:
1751 switch (TYPE(n)) {
1752 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001753 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001754 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001755 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001756 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001757 else if (NCH(n) > 1)
1758 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001759 /* Fallthrough */
1760 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761 case and_test:
1762 if (NCH(n) == 1) {
1763 n = CHILD(n, 0);
1764 goto loop;
1765 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001766 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001767 if (!seq)
1768 return NULL;
1769 for (i = 0; i < NCH(n); i += 2) {
1770 expr_ty e = ast_for_expr(c, CHILD(n, i));
1771 if (!e)
1772 return NULL;
1773 asdl_seq_SET(seq, i / 2, e);
1774 }
1775 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001776 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1777 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001778 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001779 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 case not_test:
1781 if (NCH(n) == 1) {
1782 n = CHILD(n, 0);
1783 goto loop;
1784 }
1785 else {
1786 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1787 if (!expression)
1788 return NULL;
1789
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001790 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1791 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792 }
1793 case comparison:
1794 if (NCH(n) == 1) {
1795 n = CHILD(n, 0);
1796 goto loop;
1797 }
1798 else {
1799 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001800 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001801 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001802 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 if (!ops)
1804 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001805 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 return NULL;
1808 }
1809 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001810 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001812 newoperator = ast_for_comp_op(CHILD(n, i));
1813 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001815 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816
1817 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001818 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001820 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001822 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 asdl_seq_SET(cmps, i / 2, expression);
1824 }
1825 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001826 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001830 return Compare(expression, ops, cmps, LINENO(n),
1831 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 }
1833 break;
1834
Guido van Rossum0368b722007-05-11 16:50:42 +00001835 case star_expr:
1836 if (TYPE(CHILD(n, 0)) == STAR) {
1837 return ast_for_starred(c, n);
1838 }
1839 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 /* The next five cases all handle BinOps. The main body of code
1841 is the same in each case, but the switch turned inside out to
1842 reuse the code for each type of operator.
1843 */
1844 case expr:
1845 case xor_expr:
1846 case and_expr:
1847 case shift_expr:
1848 case arith_expr:
1849 case term:
1850 if (NCH(n) == 1) {
1851 n = CHILD(n, 0);
1852 goto loop;
1853 }
1854 return ast_for_binop(c, n);
1855 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001856 expr_ty exp = NULL;
1857 if (NCH(n) == 2) {
1858 exp = ast_for_testlist(c, CHILD(n, 1));
1859 if (!exp)
1860 return NULL;
1861 }
1862 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1863 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001864 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 if (NCH(n) == 1) {
1866 n = CHILD(n, 0);
1867 goto loop;
1868 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001869 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001870 case power:
1871 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001873 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 return NULL;
1875 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001876 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 return NULL;
1878}
1879
1880static expr_ty
1881ast_for_call(struct compiling *c, const node *n, expr_ty func)
1882{
1883 /*
1884 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1885 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001886 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 */
1888
1889 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001890 asdl_seq *args;
1891 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 expr_ty vararg = NULL, kwarg = NULL;
1893
1894 REQ(n, arglist);
1895
1896 nargs = 0;
1897 nkeywords = 0;
1898 ngens = 0;
1899 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 node *ch = CHILD(n, i);
1901 if (TYPE(ch) == argument) {
1902 if (NCH(ch) == 1)
1903 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001904 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 nkeywords++;
1908 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 }
1910 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001911 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001912 "if not sole argument");
1913 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 }
1915
1916 if (nargs + nkeywords + ngens > 255) {
1917 ast_error(n, "more than 255 arguments");
1918 return NULL;
1919 }
1920
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001921 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001923 return NULL;
1924 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001926 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 nargs = 0;
1928 nkeywords = 0;
1929 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001930 node *ch = CHILD(n, i);
1931 if (TYPE(ch) == argument) {
1932 expr_ty e;
1933 if (NCH(ch) == 1) {
1934 if (nkeywords) {
1935 ast_error(CHILD(ch, 0),
1936 "non-keyword arg after keyword arg");
1937 return NULL;
1938 }
1939 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001941 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 asdl_seq_SET(args, nargs++, e);
1943 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001944 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001945 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001947 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001948 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001950 else {
1951 keyword_ty kw;
1952 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953
Thomas Wouters89f507f2006-12-13 04:49:30 +00001954 /* CHILD(ch, 0) is test, but must be an identifier? */
1955 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001957 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 /* f(lambda x: x[0] = 3) ends up getting parsed with
1959 * LHS test = lambda x: x[0], and RHS test = 3.
1960 * SF bug 132313 points out that complaining about a keyword
1961 * then is very confusing.
1962 */
1963 if (e->kind == Lambda_kind) {
1964 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001965 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 } else if (e->kind != Name_kind) {
1967 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001968 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001969 } else if (forbidden_name(e, ch)) {
1970 return NULL;
1971 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001972 key = e->v.Name.id;
1973 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001975 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001979 asdl_seq_SET(keywords, nkeywords++, kw);
1980 }
1981 }
1982 else if (TYPE(ch) == STAR) {
1983 vararg = ast_for_expr(c, CHILD(n, i+1));
1984 i++;
1985 }
1986 else if (TYPE(ch) == DOUBLESTAR) {
1987 kwarg = ast_for_expr(c, CHILD(n, i+1));
1988 i++;
1989 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 }
1991
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001992 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993}
1994
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001996ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001998 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001999 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002000 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002002 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002003 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002004 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002005 }
2006 else {
2007 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002008 TYPE(n) == testlist1);
2009 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002011 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 else {
2013 asdl_seq *tmp = seq_for_testlist(c, n);
2014 if (!tmp)
2015 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002018}
2019
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020static stmt_ty
2021ast_for_expr_stmt(struct compiling *c, const node *n)
2022{
2023 REQ(n, expr_stmt);
2024 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2025 | ('=' (yield_expr|testlist))*)
2026 testlist: test (',' test)* [',']
2027 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 test: ... here starts the operator precendence dance
2030 */
2031
2032 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002033 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 if (!e)
2035 return NULL;
2036
Thomas Wouters89f507f2006-12-13 04:49:30 +00002037 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038 }
2039 else if (TYPE(CHILD(n, 1)) == augassign) {
2040 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002041 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 if (!expr1)
2046 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002047 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002048 switch (expr1->kind) {
2049 case GeneratorExp_kind:
2050 ast_error(ch, "augmented assignment to generator "
2051 "expression not possible");
2052 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002053 case Yield_kind:
2054 ast_error(ch, "augmented assignment to yield "
2055 "expression not possible");
2056 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002057 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002058 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002059 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002060 break;
2061 }
2062 case Attribute_kind:
2063 case Subscript_kind:
2064 break;
2065 default:
2066 ast_error(ch, "illegal expression for augmented "
2067 "assignment");
2068 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002070 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071
Thomas Wouters89f507f2006-12-13 04:49:30 +00002072 ch = CHILD(n, 2);
2073 if (TYPE(ch) == testlist)
2074 expr2 = ast_for_testlist(c, ch);
2075 else
2076 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002077 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 return NULL;
2079
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002080 newoperator = ast_for_augassign(CHILD(n, 1));
2081 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 return NULL;
2083
Thomas Wouters89f507f2006-12-13 04:49:30 +00002084 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 }
2086 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002087 int i;
2088 asdl_seq *targets;
2089 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 expr_ty expression;
2091
Thomas Wouters89f507f2006-12-13 04:49:30 +00002092 /* a normal assignment */
2093 REQ(CHILD(n, 1), EQUAL);
2094 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2095 if (!targets)
2096 return NULL;
2097 for (i = 0; i < NCH(n) - 2; i += 2) {
2098 expr_ty e;
2099 node *ch = CHILD(n, i);
2100 if (TYPE(ch) == yield_expr) {
2101 ast_error(ch, "assignment to yield expression not possible");
2102 return NULL;
2103 }
2104 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002105
Thomas Wouters89f507f2006-12-13 04:49:30 +00002106 /* set context to assign */
2107 if (!e)
2108 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109
Thomas Wouters89f507f2006-12-13 04:49:30 +00002110 if (!set_context(e, Store, CHILD(n, i)))
2111 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112
Thomas Wouters89f507f2006-12-13 04:49:30 +00002113 asdl_seq_SET(targets, i / 2, e);
2114 }
2115 value = CHILD(n, NCH(n) - 1);
2116 if (TYPE(value) == testlist)
2117 expression = ast_for_testlist(c, value);
2118 else
2119 expression = ast_for_expr(c, value);
2120 if (!expression)
2121 return NULL;
2122 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124}
2125
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002127ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128{
2129 asdl_seq *seq;
2130 int i;
2131 expr_ty e;
2132
2133 REQ(n, exprlist);
2134
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002135 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002139 e = ast_for_expr(c, CHILD(n, i));
2140 if (!e)
2141 return NULL;
2142 asdl_seq_SET(seq, i / 2, e);
2143 if (context && !set_context(e, context, CHILD(n, i)))
2144 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 }
2146 return seq;
2147}
2148
2149static stmt_ty
2150ast_for_del_stmt(struct compiling *c, const node *n)
2151{
2152 asdl_seq *expr_list;
2153
2154 /* del_stmt: 'del' exprlist */
2155 REQ(n, del_stmt);
2156
2157 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2158 if (!expr_list)
2159 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002160 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161}
2162
2163static stmt_ty
2164ast_for_flow_stmt(struct compiling *c, const node *n)
2165{
2166 /*
2167 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2168 | yield_stmt
2169 break_stmt: 'break'
2170 continue_stmt: 'continue'
2171 return_stmt: 'return' [testlist]
2172 yield_stmt: yield_expr
2173 yield_expr: 'yield' testlist
2174 raise_stmt: 'raise' [test [',' test [',' test]]]
2175 */
2176 node *ch;
2177
2178 REQ(n, flow_stmt);
2179 ch = CHILD(n, 0);
2180 switch (TYPE(ch)) {
2181 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002182 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002184 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002186 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2187 if (!exp)
2188 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002189 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 }
2191 case return_stmt:
2192 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002193 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002195 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 if (!expression)
2197 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002198 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199 }
2200 case raise_stmt:
2201 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002202 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 else if (NCH(ch) == 2) {
2204 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2205 if (!expression)
2206 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002207 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208 }
2209 else if (NCH(ch) == 4) {
2210 expr_ty expr1, expr2;
2211
2212 expr1 = ast_for_expr(c, CHILD(ch, 1));
2213 if (!expr1)
2214 return NULL;
2215 expr2 = ast_for_expr(c, CHILD(ch, 3));
2216 if (!expr2)
2217 return NULL;
2218
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002219 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 }
2221 else if (NCH(ch) == 6) {
2222 expr_ty expr1, expr2, expr3;
2223
2224 expr1 = ast_for_expr(c, CHILD(ch, 1));
2225 if (!expr1)
2226 return NULL;
2227 expr2 = ast_for_expr(c, CHILD(ch, 3));
2228 if (!expr2)
2229 return NULL;
2230 expr3 = ast_for_expr(c, CHILD(ch, 5));
2231 if (!expr3)
2232 return NULL;
2233
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002234 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 }
2236 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002237 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 "unexpected flow_stmt: %d", TYPE(ch));
2239 return NULL;
2240 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002241
2242 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2243 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244}
2245
2246static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002247alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248{
2249 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002250 import_as_name: NAME ['as' NAME]
2251 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 dotted_name: NAME ('.' NAME)*
2253 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002254 PyObject *str;
2255
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 loop:
2257 switch (TYPE(n)) {
2258 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002259 str = NULL;
2260 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002261 str = NEW_IDENTIFIER(CHILD(n, 2));
2262 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002263 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 case dotted_as_name:
2265 if (NCH(n) == 1) {
2266 n = CHILD(n, 0);
2267 goto loop;
2268 }
2269 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002270 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002271 if (!a)
2272 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 assert(!a->asname);
2274 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2275 return a;
2276 }
2277 break;
2278 case dotted_name:
2279 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002280 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 else {
2282 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002283 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002284 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002286 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287
2288 len = 0;
2289 for (i = 0; i < NCH(n); i += 2)
2290 /* length of string plus one for the dot */
2291 len += strlen(STR(CHILD(n, i))) + 1;
2292 len--; /* the last name doesn't have a dot */
2293 str = PyString_FromStringAndSize(NULL, len);
2294 if (!str)
2295 return NULL;
2296 s = PyString_AS_STRING(str);
2297 if (!s)
2298 return NULL;
2299 for (i = 0; i < NCH(n); i += 2) {
2300 char *sch = STR(CHILD(n, i));
2301 strcpy(s, STR(CHILD(n, i)));
2302 s += strlen(sch);
2303 *s++ = '.';
2304 }
2305 --s;
2306 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002307 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2308 PyString_GET_SIZE(str),
2309 NULL);
2310 Py_DECREF(str);
2311 if (!uni)
2312 return NULL;
2313 str = uni;
2314 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002315 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002316 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 }
2318 break;
2319 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002320 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002321 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002322 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002324 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 "unexpected import name: %d", TYPE(n));
2326 return NULL;
2327 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002328
2329 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 return NULL;
2331}
2332
2333static stmt_ty
2334ast_for_import_stmt(struct compiling *c, const node *n)
2335{
2336 /*
2337 import_stmt: import_name | import_from
2338 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002339 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2340 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002342 int lineno;
2343 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 int i;
2345 asdl_seq *aliases;
2346
2347 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002348 lineno = LINENO(n);
2349 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002351 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002353 REQ(n, dotted_as_names);
2354 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2355 if (!aliases)
2356 return NULL;
2357 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002358 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002359 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002360 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002361 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002363 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002365 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002367 int idx, ndots = 0;
2368 alias_ty mod = NULL;
2369 identifier modname;
2370
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002371 /* Count the number of dots (for relative imports) and check for the
2372 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002373 for (idx = 1; idx < NCH(n); idx++) {
2374 if (TYPE(CHILD(n, idx)) == dotted_name) {
2375 mod = alias_for_import_name(c, CHILD(n, idx));
2376 idx++;
2377 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002378 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2379 /* three consecutive dots are tokenized as one ELLIPSIS */
2380 ndots += 3;
2381 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002382 } else if (TYPE(CHILD(n, idx)) != DOT) {
2383 break;
2384 }
2385 ndots++;
2386 }
2387 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002388 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002389 case STAR:
2390 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002391 n = CHILD(n, idx);
2392 n_children = 1;
2393 if (ndots) {
2394 ast_error(n, "'import *' not allowed with 'from .'");
2395 return NULL;
2396 }
2397 break;
2398 case LPAR:
2399 /* from ... import (x, y, z) */
2400 n = CHILD(n, idx + 1);
2401 n_children = NCH(n);
2402 break;
2403 case import_as_names:
2404 /* from ... import x, y, z */
2405 n = CHILD(n, idx);
2406 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002407 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 ast_error(n, "trailing comma not allowed without"
2409 " surrounding parentheses");
2410 return NULL;
2411 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 break;
2413 default:
2414 ast_error(n, "Unexpected node-type in from-import");
2415 return NULL;
2416 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417
Thomas Wouters89f507f2006-12-13 04:49:30 +00002418 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2419 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421
2422 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002423 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002424 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002425 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002429 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002430 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002431 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2432 if (!import_alias)
2433 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002437 if (mod != NULL)
2438 modname = mod->name;
2439 else
2440 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002441 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002442 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 }
Neal Norwitz79792652005-11-14 04:25:03 +00002444 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 "unknown import statement: starts with command '%s'",
2446 STR(CHILD(n, 0)));
2447 return NULL;
2448}
2449
2450static stmt_ty
2451ast_for_global_stmt(struct compiling *c, const node *n)
2452{
2453 /* global_stmt: 'global' NAME (',' NAME)* */
2454 identifier name;
2455 asdl_seq *s;
2456 int i;
2457
2458 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002459 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002461 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 name = NEW_IDENTIFIER(CHILD(n, i));
2464 if (!name)
2465 return NULL;
2466 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002468 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469}
2470
2471static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002472ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2473{
2474 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2475 identifier name;
2476 asdl_seq *s;
2477 int i;
2478
2479 REQ(n, nonlocal_stmt);
2480 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2481 if (!s)
2482 return NULL;
2483 for (i = 1; i < NCH(n); i += 2) {
2484 name = NEW_IDENTIFIER(CHILD(n, i));
2485 if (!name)
2486 return NULL;
2487 asdl_seq_SET(s, i / 2, name);
2488 }
2489 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2490}
2491
2492static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493ast_for_assert_stmt(struct compiling *c, const node *n)
2494{
2495 /* assert_stmt: 'assert' test [',' test] */
2496 REQ(n, assert_stmt);
2497 if (NCH(n) == 2) {
2498 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2499 if (!expression)
2500 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002501 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 }
2503 else if (NCH(n) == 4) {
2504 expr_ty expr1, expr2;
2505
2506 expr1 = ast_for_expr(c, CHILD(n, 1));
2507 if (!expr1)
2508 return NULL;
2509 expr2 = ast_for_expr(c, CHILD(n, 3));
2510 if (!expr2)
2511 return NULL;
2512
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 }
Neal Norwitz79792652005-11-14 04:25:03 +00002515 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516 "improper number of parts to 'assert' statement: %d",
2517 NCH(n));
2518 return NULL;
2519}
2520
2521static asdl_seq *
2522ast_for_suite(struct compiling *c, const node *n)
2523{
2524 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002525 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 stmt_ty s;
2527 int i, total, num, end, pos = 0;
2528 node *ch;
2529
2530 REQ(n, suite);
2531
2532 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002533 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002535 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002537 n = CHILD(n, 0);
2538 /* simple_stmt always ends with a NEWLINE,
2539 and may have a trailing SEMI
2540 */
2541 end = NCH(n) - 1;
2542 if (TYPE(CHILD(n, end - 1)) == SEMI)
2543 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 for (i = 0; i < end; i += 2) {
2546 ch = CHILD(n, i);
2547 s = ast_for_stmt(c, ch);
2548 if (!s)
2549 return NULL;
2550 asdl_seq_SET(seq, pos++, s);
2551 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 }
2553 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002554 for (i = 2; i < (NCH(n) - 1); i++) {
2555 ch = CHILD(n, i);
2556 REQ(ch, stmt);
2557 num = num_stmts(ch);
2558 if (num == 1) {
2559 /* small_stmt or compound_stmt with only one child */
2560 s = ast_for_stmt(c, ch);
2561 if (!s)
2562 return NULL;
2563 asdl_seq_SET(seq, pos++, s);
2564 }
2565 else {
2566 int j;
2567 ch = CHILD(ch, 0);
2568 REQ(ch, simple_stmt);
2569 for (j = 0; j < NCH(ch); j += 2) {
2570 /* statement terminates with a semi-colon ';' */
2571 if (NCH(CHILD(ch, j)) == 0) {
2572 assert((j + 1) == NCH(ch));
2573 break;
2574 }
2575 s = ast_for_stmt(c, CHILD(ch, j));
2576 if (!s)
2577 return NULL;
2578 asdl_seq_SET(seq, pos++, s);
2579 }
2580 }
2581 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 }
2583 assert(pos == seq->size);
2584 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585}
2586
2587static stmt_ty
2588ast_for_if_stmt(struct compiling *c, const node *n)
2589{
2590 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2591 ['else' ':' suite]
2592 */
2593 char *s;
2594
2595 REQ(n, if_stmt);
2596
2597 if (NCH(n) == 4) {
2598 expr_ty expression;
2599 asdl_seq *suite_seq;
2600
2601 expression = ast_for_expr(c, CHILD(n, 1));
2602 if (!expression)
2603 return NULL;
2604 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002605 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 return NULL;
2607
Guido van Rossumd8faa362007-04-27 19:54:29 +00002608 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2609 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002611
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 s = STR(CHILD(n, 4));
2613 /* s[2], the third character in the string, will be
2614 's' for el_s_e, or
2615 'i' for el_i_f
2616 */
2617 if (s[2] == 's') {
2618 expr_ty expression;
2619 asdl_seq *seq1, *seq2;
2620
2621 expression = ast_for_expr(c, CHILD(n, 1));
2622 if (!expression)
2623 return NULL;
2624 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002625 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 return NULL;
2627 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002628 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 return NULL;
2630
Guido van Rossumd8faa362007-04-27 19:54:29 +00002631 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2632 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 }
2634 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002636 expr_ty expression;
2637 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002638 asdl_seq *orelse = NULL;
2639 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 /* must reference the child n_elif+1 since 'else' token is third,
2641 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002642 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2643 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2644 has_else = 1;
2645 n_elif -= 3;
2646 }
2647 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002650 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651
Thomas Wouters89f507f2006-12-13 04:49:30 +00002652 orelse = asdl_seq_new(1, c->c_arena);
2653 if (!orelse)
2654 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002656 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002658 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2659 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002661 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2662 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664
Guido van Rossumd8faa362007-04-27 19:54:29 +00002665 asdl_seq_SET(orelse, 0,
2666 If(expression, suite_seq, suite_seq2,
2667 LINENO(CHILD(n, NCH(n) - 6)),
2668 CHILD(n, NCH(n) - 6)->n_col_offset,
2669 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 /* the just-created orelse handled the last elif */
2671 n_elif--;
2672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673
Thomas Wouters89f507f2006-12-13 04:49:30 +00002674 for (i = 0; i < n_elif; i++) {
2675 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2677 if (!newobj)
2678 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002680 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002683 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 asdl_seq_SET(newobj, 0,
2687 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002688 LINENO(CHILD(n, off)),
2689 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002690 orelse = newobj;
2691 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002692 expression = ast_for_expr(c, CHILD(n, 1));
2693 if (!expression)
2694 return NULL;
2695 suite_seq = ast_for_suite(c, CHILD(n, 3));
2696 if (!suite_seq)
2697 return NULL;
2698 return If(expression, suite_seq, orelse,
2699 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002701
2702 PyErr_Format(PyExc_SystemError,
2703 "unexpected token in 'if' statement: %s", s);
2704 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705}
2706
2707static stmt_ty
2708ast_for_while_stmt(struct compiling *c, const node *n)
2709{
2710 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2711 REQ(n, while_stmt);
2712
2713 if (NCH(n) == 4) {
2714 expr_ty expression;
2715 asdl_seq *suite_seq;
2716
2717 expression = ast_for_expr(c, CHILD(n, 1));
2718 if (!expression)
2719 return NULL;
2720 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002721 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002723 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 }
2725 else if (NCH(n) == 7) {
2726 expr_ty expression;
2727 asdl_seq *seq1, *seq2;
2728
2729 expression = ast_for_expr(c, CHILD(n, 1));
2730 if (!expression)
2731 return NULL;
2732 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002733 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 return NULL;
2735 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002736 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 return NULL;
2738
Thomas Wouters89f507f2006-12-13 04:49:30 +00002739 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002741
2742 PyErr_Format(PyExc_SystemError,
2743 "wrong number of tokens for 'while' statement: %d",
2744 NCH(n));
2745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746}
2747
2748static stmt_ty
2749ast_for_for_stmt(struct compiling *c, const node *n)
2750{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002751 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 expr_ty expression;
2753 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002754 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2756 REQ(n, for_stmt);
2757
2758 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002759 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 if (!seq)
2761 return NULL;
2762 }
2763
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002764 node_target = CHILD(n, 1);
2765 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002766 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002768 /* Check the # of children rather than the length of _target, since
2769 for x, in ... has 1 element in _target, but still requires a Tuple. */
2770 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002771 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002773 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002775 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 return NULL;
2778 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002779 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 return NULL;
2781
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002782 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2783 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784}
2785
2786static excepthandler_ty
2787ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2788{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002789 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 REQ(exc, except_clause);
2791 REQ(body, suite);
2792
2793 if (NCH(exc) == 1) {
2794 asdl_seq *suite_seq = ast_for_suite(c, body);
2795 if (!suite_seq)
2796 return NULL;
2797
Thomas Wouters89f507f2006-12-13 04:49:30 +00002798 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002799 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 }
2801 else if (NCH(exc) == 2) {
2802 expr_ty expression;
2803 asdl_seq *suite_seq;
2804
2805 expression = ast_for_expr(c, CHILD(exc, 1));
2806 if (!expression)
2807 return NULL;
2808 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002809 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 return NULL;
2811
Thomas Wouters89f507f2006-12-13 04:49:30 +00002812 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002813 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002814 }
2815 else if (NCH(exc) == 4) {
2816 asdl_seq *suite_seq;
2817 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002818 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002819 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002822 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 return NULL;
2824 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002825 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 return NULL;
2827
Thomas Wouters89f507f2006-12-13 04:49:30 +00002828 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002829 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002831
2832 PyErr_Format(PyExc_SystemError,
2833 "wrong number of children for 'except' clause: %d",
2834 NCH(exc));
2835 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836}
2837
2838static stmt_ty
2839ast_for_try_stmt(struct compiling *c, const node *n)
2840{
Neal Norwitzf599f422005-12-17 21:33:47 +00002841 const int nch = NCH(n);
2842 int n_except = (nch - 3)/3;
2843 asdl_seq *body, *orelse = NULL, *finally = NULL;
2844
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 REQ(n, try_stmt);
2846
Neal Norwitzf599f422005-12-17 21:33:47 +00002847 body = ast_for_suite(c, CHILD(n, 2));
2848 if (body == NULL)
2849 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850
Neal Norwitzf599f422005-12-17 21:33:47 +00002851 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2852 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2853 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2854 /* we can assume it's an "else",
2855 because nch >= 9 for try-else-finally and
2856 it would otherwise have a type of except_clause */
2857 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2858 if (orelse == NULL)
2859 return NULL;
2860 n_except--;
2861 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862
Neal Norwitzf599f422005-12-17 21:33:47 +00002863 finally = ast_for_suite(c, CHILD(n, nch - 1));
2864 if (finally == NULL)
2865 return NULL;
2866 n_except--;
2867 }
2868 else {
2869 /* we can assume it's an "else",
2870 otherwise it would have a type of except_clause */
2871 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2872 if (orelse == NULL)
2873 return NULL;
2874 n_except--;
2875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002877 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002878 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 return NULL;
2880 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002881
2882 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002883 int i;
2884 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002885 /* process except statements to create a try ... except */
2886 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2887 if (handlers == NULL)
2888 return NULL;
2889
2890 for (i = 0; i < n_except; i++) {
2891 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2892 CHILD(n, 5 + i * 3));
2893 if (!e)
2894 return NULL;
2895 asdl_seq_SET(handlers, i, e);
2896 }
2897
Thomas Wouters89f507f2006-12-13 04:49:30 +00002898 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002899 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002900 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002902
2903 /* if a 'finally' is present too, we nest the TryExcept within a
2904 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 body = asdl_seq_new(1, c->c_arena);
2906 if (body == NULL)
2907 return NULL;
2908 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002909 }
2910
2911 /* must be a try ... finally (except clauses are in body, if any exist) */
2912 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002913 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914}
2915
Guido van Rossumc2e20742006-02-27 22:32:47 +00002916static expr_ty
2917ast_for_with_var(struct compiling *c, const node *n)
2918{
2919 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002920 return ast_for_expr(c, CHILD(n, 1));
2921}
2922
2923/* with_stmt: 'with' test [ with_var ] ':' suite */
2924static stmt_ty
2925ast_for_with_stmt(struct compiling *c, const node *n)
2926{
2927 expr_ty context_expr, optional_vars = NULL;
2928 int suite_index = 3; /* skip 'with', test, and ':' */
2929 asdl_seq *suite_seq;
2930
2931 assert(TYPE(n) == with_stmt);
2932 context_expr = ast_for_expr(c, CHILD(n, 1));
2933 if (TYPE(CHILD(n, 2)) == with_var) {
2934 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2935
2936 if (!optional_vars) {
2937 return NULL;
2938 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002939 if (!set_context(optional_vars, Store, n)) {
2940 return NULL;
2941 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002942 suite_index = 4;
2943 }
2944
2945 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2946 if (!suite_seq) {
2947 return NULL;
2948 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002949 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002950 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002951}
2952
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002954ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002956 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2957 asdl_seq *s;
2958 expr_ty call, dummy;
2959
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 REQ(n, classdef);
2961
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002962 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 s = ast_for_suite(c, CHILD(n, 3));
2964 if (!s)
2965 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002966 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002967 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002969
2970 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002971 s = ast_for_suite(c, CHILD(n,5));
2972 if (!s)
2973 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002974 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002975 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 }
2977
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002978 /* class NAME '(' arglist ')' ':' suite */
2979 /* build up a fake Call node so we can extract its pieces */
2980 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2981 call = ast_for_call(c, CHILD(n, 3), dummy);
2982 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002985 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002987
2988 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2989 call->v.Call.args, call->v.Call.keywords,
2990 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002991 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992}
2993
2994static stmt_ty
2995ast_for_stmt(struct compiling *c, const node *n)
2996{
2997 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002998 assert(NCH(n) == 1);
2999 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 }
3001 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003002 assert(num_stmts(n) == 1);
3003 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 }
3005 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003006 REQ(n, small_stmt);
3007 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003008 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3009 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003010 */
3011 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012 case expr_stmt:
3013 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 case del_stmt:
3015 return ast_for_del_stmt(c, n);
3016 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003017 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018 case flow_stmt:
3019 return ast_for_flow_stmt(c, n);
3020 case import_stmt:
3021 return ast_for_import_stmt(c, n);
3022 case global_stmt:
3023 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003024 case nonlocal_stmt:
3025 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026 case assert_stmt:
3027 return ast_for_assert_stmt(c, n);
3028 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003029 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3031 TYPE(n), NCH(n));
3032 return NULL;
3033 }
3034 }
3035 else {
3036 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003037 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003038 */
3039 node *ch = CHILD(n, 0);
3040 REQ(n, compound_stmt);
3041 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 case if_stmt:
3043 return ast_for_if_stmt(c, ch);
3044 case while_stmt:
3045 return ast_for_while_stmt(c, ch);
3046 case for_stmt:
3047 return ast_for_for_stmt(c, ch);
3048 case try_stmt:
3049 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003050 case with_stmt:
3051 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003053 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003055 return ast_for_classdef(c, ch, NULL);
3056 case decorated:
3057 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003059 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3061 TYPE(n), NCH(n));
3062 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003063 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 }
3065}
3066
3067static PyObject *
3068parsenumber(const char *s)
3069{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003070 const char *end;
3071 long x;
3072 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003074 Py_complex c;
3075 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076#endif
3077
Guido van Rossumd8faa362007-04-27 19:54:29 +00003078 errno = 0;
3079 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003081 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003083 if (s[0] == '0') {
3084 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3085 if (x < 0 && errno == 0) {
3086 return PyLong_FromString((char *)s,
3087 (char **)0,
3088 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003090 }
3091 else
3092 x = PyOS_strtol((char *)s, (char **)&end, 0);
3093 if (*end == '\0') {
3094 if (errno != 0)
3095 return PyLong_FromString((char *)s, (char **)0, 0);
3096 return PyInt_FromLong(x);
3097 }
3098 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003100 if (imflag) {
3101 c.real = 0.;
3102 PyFPE_START_PROTECT("atof", return 0)
3103 c.imag = PyOS_ascii_atof(s);
3104 PyFPE_END_PROTECT(c)
3105 return PyComplex_FromCComplex(c);
3106 }
3107 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003109 {
3110 PyFPE_START_PROTECT("atof", return 0)
3111 dx = PyOS_ascii_atof(s);
3112 PyFPE_END_PROTECT(dx)
3113 return PyFloat_FromDouble(dx);
3114 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115}
3116
3117static PyObject *
3118decode_utf8(const char **sPtr, const char *end, char* encoding)
3119{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003120 PyObject *u, *v;
3121 char *s, *t;
3122 t = s = (char *)*sPtr;
3123 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3124 while (s < end && (*s & 0x80)) s++;
3125 *sPtr = s;
3126 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3127 if (u == NULL)
3128 return NULL;
3129 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3130 Py_DECREF(u);
3131 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132}
3133
3134static PyObject *
3135decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3136{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003137 PyObject *v, *u;
3138 char *buf;
3139 char *p;
3140 const char *end;
3141 if (encoding == NULL) {
3142 buf = (char *)s;
3143 u = NULL;
3144 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3145 buf = (char *)s;
3146 u = NULL;
3147 } else {
3148 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3149 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3150 if (u == NULL)
3151 return NULL;
3152 p = buf = PyString_AsString(u);
3153 end = s + len;
3154 while (s < end) {
3155 if (*s == '\\') {
3156 *p++ = *s++;
3157 if (*s & 0x80) {
3158 strcpy(p, "u005c");
3159 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003160 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 }
3162 if (*s & 0x80) { /* XXX inefficient */
3163 PyObject *w;
3164 char *r;
3165 Py_ssize_t rn, i;
3166 w = decode_utf8(&s, end, "utf-16-be");
3167 if (w == NULL) {
3168 Py_DECREF(u);
3169 return NULL;
3170 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003171 assert(PyBytes_Check(w));
3172 r = PyBytes_AsString(w);
3173 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 assert(rn % 2 == 0);
3175 for (i = 0; i < rn; i += 2) {
3176 sprintf(p, "\\u%02x%02x",
3177 r[i + 0] & 0xFF,
3178 r[i + 1] & 0xFF);
3179 p += 6;
3180 }
3181 Py_DECREF(w);
3182 } else {
3183 *p++ = *s++;
3184 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003185 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 len = p - buf;
3187 s = buf;
3188 }
3189 if (rawmode)
3190 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3191 else
3192 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3193 Py_XDECREF(u);
3194 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195}
3196
3197/* s is a Python string literal, including the bracketing quote characters,
3198 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3199 * parsestr parses it, and returns the decoded Python string object.
3200 */
3201static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003202parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 size_t len;
3205 const char *s = STR(n);
3206 int quote = Py_CHARMASK(*s);
3207 int rawmode = 0;
3208 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 if (quote == 'b' || quote == 'B') {
3212 quote = *++s;
3213 *bytesmode = 1;
3214 }
3215 if (quote == 'r' || quote == 'R') {
3216 quote = *++s;
3217 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003219 }
3220 if (quote != '\'' && quote != '\"') {
3221 PyErr_BadInternalCall();
3222 return NULL;
3223 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003224 s++;
3225 len = strlen(s);
3226 if (len > INT_MAX) {
3227 PyErr_SetString(PyExc_OverflowError,
3228 "string to parse is too long");
3229 return NULL;
3230 }
3231 if (s[--len] != quote) {
3232 PyErr_BadInternalCall();
3233 return NULL;
3234 }
3235 if (len >= 4 && s[0] == quote && s[1] == quote) {
3236 s += 2;
3237 len -= 2;
3238 if (s[--len] != quote || s[--len] != quote) {
3239 PyErr_BadInternalCall();
3240 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003241 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003243 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003244 return decode_unicode(s, len, rawmode, encoding);
3245 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 if (*bytesmode) {
3247 /* Disallow non-ascii characters (but not escapes) */
3248 const char *c;
3249 for (c = s; *c; c++) {
3250 if (Py_CHARMASK(*c) >= 0x80) {
3251 ast_error(n, "bytes can only contain ASCII "
3252 "literal characters.");
3253 return NULL;
3254 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003255 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003256 }
3257 need_encoding = (!*bytesmode && encoding != NULL &&
3258 strcmp(encoding, "utf-8") != 0 &&
3259 strcmp(encoding, "iso-8859-1") != 0);
3260 if (rawmode || strchr(s, '\\') == NULL) {
3261 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003262 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3263 if (u == NULL)
3264 return NULL;
3265 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3266 Py_DECREF(u);
3267 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003268 } else {
3269 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003270 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272
Guido van Rossumbdde0112007-05-11 16:26:27 +00003273 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003274 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275}
3276
3277/* Build a Python string object out of a STRING atom. This takes care of
3278 * compile-time literal catenation, calling parsestr() on each piece, and
3279 * pasting the intermediate results together.
3280 */
3281static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003282parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003284 PyObject *v;
3285 int i;
3286 REQ(CHILD(n, 0), STRING);
3287 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3288 if (v != NULL) {
3289 /* String literal concatenation */
3290 for (i = 1; i < NCH(n); i++) {
3291 PyObject *s;
3292 int subbm = 0;
3293 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3294 if (s == NULL)
3295 goto onError;
3296 if (*bytesmode != subbm) {
3297 ast_error(n, "cannot mix bytes and nonbytes"
3298 "literals");
3299 goto onError;
3300 }
3301 if (PyString_Check(v) && PyString_Check(s)) {
3302 PyString_ConcatAndDel(&v, s);
3303 if (v == NULL)
3304 goto onError;
3305 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003306 else {
3307 PyObject *temp = PyUnicode_Concat(v, s);
3308 Py_DECREF(s);
3309 Py_DECREF(v);
3310 v = temp;
3311 if (v == NULL)
3312 goto onError;
3313 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003314 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003315 }
3316 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317
Guido van Rossumd8faa362007-04-27 19:54:29 +00003318 onError:
3319 Py_XDECREF(v);
3320 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321}