blob: 485dafbf3aec6ce60368a12193d778cdde57e37c [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);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001542 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001543 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)
Collin Winter828f04a2007-08-31 00:04:24 +00002202 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2203 else if (NCH(ch) >= 2) {
2204 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2206 if (!expression)
2207 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002208 if (NCH(ch) == 4) {
2209 cause = ast_for_expr(c, CHILD(ch, 3));
2210 if (!cause)
2211 return NULL;
2212 }
2213 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214 }
2215 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002216 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002217 "unexpected flow_stmt: %d", TYPE(ch));
2218 return NULL;
2219 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002220
2221 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223}
2224
2225static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002226alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227{
2228 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002229 import_as_name: NAME ['as' NAME]
2230 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 dotted_name: NAME ('.' NAME)*
2232 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002233 PyObject *str;
2234
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 loop:
2236 switch (TYPE(n)) {
2237 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002238 str = NULL;
2239 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002240 str = NEW_IDENTIFIER(CHILD(n, 2));
2241 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002242 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 case dotted_as_name:
2244 if (NCH(n) == 1) {
2245 n = CHILD(n, 0);
2246 goto loop;
2247 }
2248 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002249 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002250 if (!a)
2251 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 assert(!a->asname);
2253 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2254 return a;
2255 }
2256 break;
2257 case dotted_name:
2258 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002259 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 else {
2261 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002262 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002263 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002265 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266
2267 len = 0;
2268 for (i = 0; i < NCH(n); i += 2)
2269 /* length of string plus one for the dot */
2270 len += strlen(STR(CHILD(n, i))) + 1;
2271 len--; /* the last name doesn't have a dot */
2272 str = PyString_FromStringAndSize(NULL, len);
2273 if (!str)
2274 return NULL;
2275 s = PyString_AS_STRING(str);
2276 if (!s)
2277 return NULL;
2278 for (i = 0; i < NCH(n); i += 2) {
2279 char *sch = STR(CHILD(n, i));
2280 strcpy(s, STR(CHILD(n, i)));
2281 s += strlen(sch);
2282 *s++ = '.';
2283 }
2284 --s;
2285 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002286 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2287 PyString_GET_SIZE(str),
2288 NULL);
2289 Py_DECREF(str);
2290 if (!uni)
2291 return NULL;
2292 str = uni;
2293 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002294 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002295 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 }
2297 break;
2298 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002299 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002300 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002301 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002303 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 "unexpected import name: %d", TYPE(n));
2305 return NULL;
2306 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002307
2308 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 return NULL;
2310}
2311
2312static stmt_ty
2313ast_for_import_stmt(struct compiling *c, const node *n)
2314{
2315 /*
2316 import_stmt: import_name | import_from
2317 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002318 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2319 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002321 int lineno;
2322 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 int i;
2324 asdl_seq *aliases;
2325
2326 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002327 lineno = LINENO(n);
2328 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002330 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002332 REQ(n, dotted_as_names);
2333 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2334 if (!aliases)
2335 return NULL;
2336 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002337 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002338 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002340 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002344 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002346 int idx, ndots = 0;
2347 alias_ty mod = NULL;
2348 identifier modname;
2349
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002350 /* Count the number of dots (for relative imports) and check for the
2351 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002352 for (idx = 1; idx < NCH(n); idx++) {
2353 if (TYPE(CHILD(n, idx)) == dotted_name) {
2354 mod = alias_for_import_name(c, CHILD(n, idx));
2355 idx++;
2356 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002357 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2358 /* three consecutive dots are tokenized as one ELLIPSIS */
2359 ndots += 3;
2360 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002361 } else if (TYPE(CHILD(n, idx)) != DOT) {
2362 break;
2363 }
2364 ndots++;
2365 }
2366 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002367 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002368 case STAR:
2369 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002370 n = CHILD(n, idx);
2371 n_children = 1;
2372 if (ndots) {
2373 ast_error(n, "'import *' not allowed with 'from .'");
2374 return NULL;
2375 }
2376 break;
2377 case LPAR:
2378 /* from ... import (x, y, z) */
2379 n = CHILD(n, idx + 1);
2380 n_children = NCH(n);
2381 break;
2382 case import_as_names:
2383 /* from ... import x, y, z */
2384 n = CHILD(n, idx);
2385 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002386 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 ast_error(n, "trailing comma not allowed without"
2388 " surrounding parentheses");
2389 return NULL;
2390 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002391 break;
2392 default:
2393 ast_error(n, "Unexpected node-type in from-import");
2394 return NULL;
2395 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396
Thomas Wouters89f507f2006-12-13 04:49:30 +00002397 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2398 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400
2401 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002402 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002403 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002404 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002406 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002408 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002409 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002410 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2411 if (!import_alias)
2412 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002413 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002414 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002416 if (mod != NULL)
2417 modname = mod->name;
2418 else
2419 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002420 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002421 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 }
Neal Norwitz79792652005-11-14 04:25:03 +00002423 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 "unknown import statement: starts with command '%s'",
2425 STR(CHILD(n, 0)));
2426 return NULL;
2427}
2428
2429static stmt_ty
2430ast_for_global_stmt(struct compiling *c, const node *n)
2431{
2432 /* global_stmt: 'global' NAME (',' NAME)* */
2433 identifier name;
2434 asdl_seq *s;
2435 int i;
2436
2437 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002438 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 name = NEW_IDENTIFIER(CHILD(n, i));
2443 if (!name)
2444 return NULL;
2445 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002447 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448}
2449
2450static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002451ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2452{
2453 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2454 identifier name;
2455 asdl_seq *s;
2456 int i;
2457
2458 REQ(n, nonlocal_stmt);
2459 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2460 if (!s)
2461 return NULL;
2462 for (i = 1; i < NCH(n); i += 2) {
2463 name = NEW_IDENTIFIER(CHILD(n, i));
2464 if (!name)
2465 return NULL;
2466 asdl_seq_SET(s, i / 2, name);
2467 }
2468 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2469}
2470
2471static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472ast_for_assert_stmt(struct compiling *c, const node *n)
2473{
2474 /* assert_stmt: 'assert' test [',' test] */
2475 REQ(n, assert_stmt);
2476 if (NCH(n) == 2) {
2477 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2478 if (!expression)
2479 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 }
2482 else if (NCH(n) == 4) {
2483 expr_ty expr1, expr2;
2484
2485 expr1 = ast_for_expr(c, CHILD(n, 1));
2486 if (!expr1)
2487 return NULL;
2488 expr2 = ast_for_expr(c, CHILD(n, 3));
2489 if (!expr2)
2490 return NULL;
2491
Thomas Wouters89f507f2006-12-13 04:49:30 +00002492 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493 }
Neal Norwitz79792652005-11-14 04:25:03 +00002494 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 "improper number of parts to 'assert' statement: %d",
2496 NCH(n));
2497 return NULL;
2498}
2499
2500static asdl_seq *
2501ast_for_suite(struct compiling *c, const node *n)
2502{
2503 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002504 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 stmt_ty s;
2506 int i, total, num, end, pos = 0;
2507 node *ch;
2508
2509 REQ(n, suite);
2510
2511 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002512 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002514 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 n = CHILD(n, 0);
2517 /* simple_stmt always ends with a NEWLINE,
2518 and may have a trailing SEMI
2519 */
2520 end = NCH(n) - 1;
2521 if (TYPE(CHILD(n, end - 1)) == SEMI)
2522 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002524 for (i = 0; i < end; i += 2) {
2525 ch = CHILD(n, i);
2526 s = ast_for_stmt(c, ch);
2527 if (!s)
2528 return NULL;
2529 asdl_seq_SET(seq, pos++, s);
2530 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 }
2532 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002533 for (i = 2; i < (NCH(n) - 1); i++) {
2534 ch = CHILD(n, i);
2535 REQ(ch, stmt);
2536 num = num_stmts(ch);
2537 if (num == 1) {
2538 /* small_stmt or compound_stmt with only one child */
2539 s = ast_for_stmt(c, ch);
2540 if (!s)
2541 return NULL;
2542 asdl_seq_SET(seq, pos++, s);
2543 }
2544 else {
2545 int j;
2546 ch = CHILD(ch, 0);
2547 REQ(ch, simple_stmt);
2548 for (j = 0; j < NCH(ch); j += 2) {
2549 /* statement terminates with a semi-colon ';' */
2550 if (NCH(CHILD(ch, j)) == 0) {
2551 assert((j + 1) == NCH(ch));
2552 break;
2553 }
2554 s = ast_for_stmt(c, CHILD(ch, j));
2555 if (!s)
2556 return NULL;
2557 asdl_seq_SET(seq, pos++, s);
2558 }
2559 }
2560 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 }
2562 assert(pos == seq->size);
2563 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564}
2565
2566static stmt_ty
2567ast_for_if_stmt(struct compiling *c, const node *n)
2568{
2569 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2570 ['else' ':' suite]
2571 */
2572 char *s;
2573
2574 REQ(n, if_stmt);
2575
2576 if (NCH(n) == 4) {
2577 expr_ty expression;
2578 asdl_seq *suite_seq;
2579
2580 expression = ast_for_expr(c, CHILD(n, 1));
2581 if (!expression)
2582 return NULL;
2583 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002584 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585 return NULL;
2586
Guido van Rossumd8faa362007-04-27 19:54:29 +00002587 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2588 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002590
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 s = STR(CHILD(n, 4));
2592 /* s[2], the third character in the string, will be
2593 's' for el_s_e, or
2594 'i' for el_i_f
2595 */
2596 if (s[2] == 's') {
2597 expr_ty expression;
2598 asdl_seq *seq1, *seq2;
2599
2600 expression = ast_for_expr(c, CHILD(n, 1));
2601 if (!expression)
2602 return NULL;
2603 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002604 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 return NULL;
2606 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002607 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 return NULL;
2609
Guido van Rossumd8faa362007-04-27 19:54:29 +00002610 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2611 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 }
2613 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002615 expr_ty expression;
2616 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002617 asdl_seq *orelse = NULL;
2618 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 /* must reference the child n_elif+1 since 'else' token is third,
2620 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2622 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2623 has_else = 1;
2624 n_elif -= 3;
2625 }
2626 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002629 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 orelse = asdl_seq_new(1, c->c_arena);
2632 if (!orelse)
2633 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002635 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002637 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2638 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002640 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2641 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643
Guido van Rossumd8faa362007-04-27 19:54:29 +00002644 asdl_seq_SET(orelse, 0,
2645 If(expression, suite_seq, suite_seq2,
2646 LINENO(CHILD(n, NCH(n) - 6)),
2647 CHILD(n, NCH(n) - 6)->n_col_offset,
2648 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 /* the just-created orelse handled the last elif */
2650 n_elif--;
2651 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652
Thomas Wouters89f507f2006-12-13 04:49:30 +00002653 for (i = 0; i < n_elif; i++) {
2654 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002655 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2656 if (!newobj)
2657 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002659 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002662 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664
Thomas Wouters89f507f2006-12-13 04:49:30 +00002665 asdl_seq_SET(newobj, 0,
2666 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002667 LINENO(CHILD(n, off)),
2668 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002669 orelse = newobj;
2670 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671 expression = ast_for_expr(c, CHILD(n, 1));
2672 if (!expression)
2673 return NULL;
2674 suite_seq = ast_for_suite(c, CHILD(n, 3));
2675 if (!suite_seq)
2676 return NULL;
2677 return If(expression, suite_seq, orelse,
2678 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002680
2681 PyErr_Format(PyExc_SystemError,
2682 "unexpected token in 'if' statement: %s", s);
2683 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684}
2685
2686static stmt_ty
2687ast_for_while_stmt(struct compiling *c, const node *n)
2688{
2689 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2690 REQ(n, while_stmt);
2691
2692 if (NCH(n) == 4) {
2693 expr_ty expression;
2694 asdl_seq *suite_seq;
2695
2696 expression = ast_for_expr(c, CHILD(n, 1));
2697 if (!expression)
2698 return NULL;
2699 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002700 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002702 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 }
2704 else if (NCH(n) == 7) {
2705 expr_ty expression;
2706 asdl_seq *seq1, *seq2;
2707
2708 expression = ast_for_expr(c, CHILD(n, 1));
2709 if (!expression)
2710 return NULL;
2711 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002712 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 return NULL;
2714 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002715 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 return NULL;
2717
Thomas Wouters89f507f2006-12-13 04:49:30 +00002718 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002720
2721 PyErr_Format(PyExc_SystemError,
2722 "wrong number of tokens for 'while' statement: %d",
2723 NCH(n));
2724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725}
2726
2727static stmt_ty
2728ast_for_for_stmt(struct compiling *c, const node *n)
2729{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002730 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 expr_ty expression;
2732 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002733 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2735 REQ(n, for_stmt);
2736
2737 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002738 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 if (!seq)
2740 return NULL;
2741 }
2742
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002743 node_target = CHILD(n, 1);
2744 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002745 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002747 /* Check the # of children rather than the length of _target, since
2748 for x, in ... has 1 element in _target, but still requires a Tuple. */
2749 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002750 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002752 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002754 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002755 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 return NULL;
2757 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002758 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 return NULL;
2760
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002761 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2762 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763}
2764
2765static excepthandler_ty
2766ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2767{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002768 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 REQ(exc, except_clause);
2770 REQ(body, suite);
2771
2772 if (NCH(exc) == 1) {
2773 asdl_seq *suite_seq = ast_for_suite(c, body);
2774 if (!suite_seq)
2775 return NULL;
2776
Thomas Wouters89f507f2006-12-13 04:49:30 +00002777 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002778 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 }
2780 else if (NCH(exc) == 2) {
2781 expr_ty expression;
2782 asdl_seq *suite_seq;
2783
2784 expression = ast_for_expr(c, CHILD(exc, 1));
2785 if (!expression)
2786 return NULL;
2787 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002788 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 return NULL;
2790
Thomas Wouters89f507f2006-12-13 04:49:30 +00002791 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002792 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793 }
2794 else if (NCH(exc) == 4) {
2795 asdl_seq *suite_seq;
2796 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002797 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002798 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002801 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 return NULL;
2803 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002804 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 return NULL;
2806
Thomas Wouters89f507f2006-12-13 04:49:30 +00002807 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002808 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002810
2811 PyErr_Format(PyExc_SystemError,
2812 "wrong number of children for 'except' clause: %d",
2813 NCH(exc));
2814 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815}
2816
2817static stmt_ty
2818ast_for_try_stmt(struct compiling *c, const node *n)
2819{
Neal Norwitzf599f422005-12-17 21:33:47 +00002820 const int nch = NCH(n);
2821 int n_except = (nch - 3)/3;
2822 asdl_seq *body, *orelse = NULL, *finally = NULL;
2823
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 REQ(n, try_stmt);
2825
Neal Norwitzf599f422005-12-17 21:33:47 +00002826 body = ast_for_suite(c, CHILD(n, 2));
2827 if (body == NULL)
2828 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829
Neal Norwitzf599f422005-12-17 21:33:47 +00002830 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2831 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2832 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2833 /* we can assume it's an "else",
2834 because nch >= 9 for try-else-finally and
2835 it would otherwise have a type of except_clause */
2836 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2837 if (orelse == NULL)
2838 return NULL;
2839 n_except--;
2840 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841
Neal Norwitzf599f422005-12-17 21:33:47 +00002842 finally = ast_for_suite(c, CHILD(n, nch - 1));
2843 if (finally == NULL)
2844 return NULL;
2845 n_except--;
2846 }
2847 else {
2848 /* we can assume it's an "else",
2849 otherwise it would have a type of except_clause */
2850 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2851 if (orelse == NULL)
2852 return NULL;
2853 n_except--;
2854 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002856 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002857 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 return NULL;
2859 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002860
2861 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002862 int i;
2863 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002864 /* process except statements to create a try ... except */
2865 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2866 if (handlers == NULL)
2867 return NULL;
2868
2869 for (i = 0; i < n_except; i++) {
2870 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2871 CHILD(n, 5 + i * 3));
2872 if (!e)
2873 return NULL;
2874 asdl_seq_SET(handlers, i, e);
2875 }
2876
Thomas Wouters89f507f2006-12-13 04:49:30 +00002877 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002878 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002879 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002880 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002881
2882 /* if a 'finally' is present too, we nest the TryExcept within a
2883 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002884 body = asdl_seq_new(1, c->c_arena);
2885 if (body == NULL)
2886 return NULL;
2887 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002888 }
2889
2890 /* must be a try ... finally (except clauses are in body, if any exist) */
2891 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002892 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893}
2894
Guido van Rossumc2e20742006-02-27 22:32:47 +00002895static expr_ty
2896ast_for_with_var(struct compiling *c, const node *n)
2897{
2898 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002899 return ast_for_expr(c, CHILD(n, 1));
2900}
2901
2902/* with_stmt: 'with' test [ with_var ] ':' suite */
2903static stmt_ty
2904ast_for_with_stmt(struct compiling *c, const node *n)
2905{
2906 expr_ty context_expr, optional_vars = NULL;
2907 int suite_index = 3; /* skip 'with', test, and ':' */
2908 asdl_seq *suite_seq;
2909
2910 assert(TYPE(n) == with_stmt);
2911 context_expr = ast_for_expr(c, CHILD(n, 1));
2912 if (TYPE(CHILD(n, 2)) == with_var) {
2913 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2914
2915 if (!optional_vars) {
2916 return NULL;
2917 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002918 if (!set_context(optional_vars, Store, n)) {
2919 return NULL;
2920 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002921 suite_index = 4;
2922 }
2923
2924 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2925 if (!suite_seq) {
2926 return NULL;
2927 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002928 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002929 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002930}
2931
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002933ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002935 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2936 asdl_seq *s;
2937 expr_ty call, dummy;
2938
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 REQ(n, classdef);
2940
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002941 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 s = ast_for_suite(c, CHILD(n, 3));
2943 if (!s)
2944 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002945 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002946 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002948
2949 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002950 s = ast_for_suite(c, CHILD(n,5));
2951 if (!s)
2952 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002953 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002954 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955 }
2956
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002957 /* class NAME '(' arglist ')' ':' suite */
2958 /* build up a fake Call node so we can extract its pieces */
2959 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2960 call = ast_for_call(c, CHILD(n, 3), dummy);
2961 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002964 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002966
2967 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2968 call->v.Call.args, call->v.Call.keywords,
2969 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002970 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971}
2972
2973static stmt_ty
2974ast_for_stmt(struct compiling *c, const node *n)
2975{
2976 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002977 assert(NCH(n) == 1);
2978 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 }
2980 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002981 assert(num_stmts(n) == 1);
2982 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 }
2984 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002985 REQ(n, small_stmt);
2986 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002987 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2988 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002989 */
2990 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 case expr_stmt:
2992 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 case del_stmt:
2994 return ast_for_del_stmt(c, n);
2995 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002996 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997 case flow_stmt:
2998 return ast_for_flow_stmt(c, n);
2999 case import_stmt:
3000 return ast_for_import_stmt(c, n);
3001 case global_stmt:
3002 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003003 case nonlocal_stmt:
3004 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005 case assert_stmt:
3006 return ast_for_assert_stmt(c, n);
3007 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003008 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3010 TYPE(n), NCH(n));
3011 return NULL;
3012 }
3013 }
3014 else {
3015 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003016 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003017 */
3018 node *ch = CHILD(n, 0);
3019 REQ(n, compound_stmt);
3020 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 case if_stmt:
3022 return ast_for_if_stmt(c, ch);
3023 case while_stmt:
3024 return ast_for_while_stmt(c, ch);
3025 case for_stmt:
3026 return ast_for_for_stmt(c, ch);
3027 case try_stmt:
3028 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003029 case with_stmt:
3030 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003032 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003034 return ast_for_classdef(c, ch, NULL);
3035 case decorated:
3036 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003038 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3040 TYPE(n), NCH(n));
3041 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003042 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 }
3044}
3045
3046static PyObject *
3047parsenumber(const char *s)
3048{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003049 const char *end;
3050 long x;
3051 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003053 Py_complex c;
3054 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055#endif
3056
Guido van Rossumd8faa362007-04-27 19:54:29 +00003057 errno = 0;
3058 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003060 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003062 if (s[0] == '0') {
3063 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3064 if (x < 0 && errno == 0) {
3065 return PyLong_FromString((char *)s,
3066 (char **)0,
3067 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003069 }
3070 else
3071 x = PyOS_strtol((char *)s, (char **)&end, 0);
3072 if (*end == '\0') {
3073 if (errno != 0)
3074 return PyLong_FromString((char *)s, (char **)0, 0);
3075 return PyInt_FromLong(x);
3076 }
3077 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003079 if (imflag) {
3080 c.real = 0.;
3081 PyFPE_START_PROTECT("atof", return 0)
3082 c.imag = PyOS_ascii_atof(s);
3083 PyFPE_END_PROTECT(c)
3084 return PyComplex_FromCComplex(c);
3085 }
3086 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003088 {
3089 PyFPE_START_PROTECT("atof", return 0)
3090 dx = PyOS_ascii_atof(s);
3091 PyFPE_END_PROTECT(dx)
3092 return PyFloat_FromDouble(dx);
3093 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094}
3095
3096static PyObject *
3097decode_utf8(const char **sPtr, const char *end, char* encoding)
3098{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003099 PyObject *u, *v;
3100 char *s, *t;
3101 t = s = (char *)*sPtr;
3102 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3103 while (s < end && (*s & 0x80)) s++;
3104 *sPtr = s;
3105 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3106 if (u == NULL)
3107 return NULL;
3108 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3109 Py_DECREF(u);
3110 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111}
3112
3113static PyObject *
3114decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3115{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003116 PyObject *v, *u;
3117 char *buf;
3118 char *p;
3119 const char *end;
3120 if (encoding == NULL) {
3121 buf = (char *)s;
3122 u = NULL;
3123 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3124 buf = (char *)s;
3125 u = NULL;
3126 } else {
3127 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3128 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3129 if (u == NULL)
3130 return NULL;
3131 p = buf = PyString_AsString(u);
3132 end = s + len;
3133 while (s < end) {
3134 if (*s == '\\') {
3135 *p++ = *s++;
3136 if (*s & 0x80) {
3137 strcpy(p, "u005c");
3138 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003139 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003140 }
3141 if (*s & 0x80) { /* XXX inefficient */
3142 PyObject *w;
3143 char *r;
3144 Py_ssize_t rn, i;
3145 w = decode_utf8(&s, end, "utf-16-be");
3146 if (w == NULL) {
3147 Py_DECREF(u);
3148 return NULL;
3149 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003150 assert(PyBytes_Check(w));
3151 r = PyBytes_AsString(w);
3152 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003153 assert(rn % 2 == 0);
3154 for (i = 0; i < rn; i += 2) {
3155 sprintf(p, "\\u%02x%02x",
3156 r[i + 0] & 0xFF,
3157 r[i + 1] & 0xFF);
3158 p += 6;
3159 }
3160 Py_DECREF(w);
3161 } else {
3162 *p++ = *s++;
3163 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003164 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 len = p - buf;
3166 s = buf;
3167 }
3168 if (rawmode)
3169 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3170 else
3171 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3172 Py_XDECREF(u);
3173 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003174}
3175
3176/* s is a Python string literal, including the bracketing quote characters,
3177 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3178 * parsestr parses it, and returns the decoded Python string object.
3179 */
3180static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003181parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003183 size_t len;
3184 const char *s = STR(n);
3185 int quote = Py_CHARMASK(*s);
3186 int rawmode = 0;
3187 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188
Guido van Rossumd8faa362007-04-27 19:54:29 +00003189 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 if (quote == 'b' || quote == 'B') {
3191 quote = *++s;
3192 *bytesmode = 1;
3193 }
3194 if (quote == 'r' || quote == 'R') {
3195 quote = *++s;
3196 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003197 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003198 }
3199 if (quote != '\'' && quote != '\"') {
3200 PyErr_BadInternalCall();
3201 return NULL;
3202 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 s++;
3204 len = strlen(s);
3205 if (len > INT_MAX) {
3206 PyErr_SetString(PyExc_OverflowError,
3207 "string to parse is too long");
3208 return NULL;
3209 }
3210 if (s[--len] != quote) {
3211 PyErr_BadInternalCall();
3212 return NULL;
3213 }
3214 if (len >= 4 && s[0] == quote && s[1] == quote) {
3215 s += 2;
3216 len -= 2;
3217 if (s[--len] != quote || s[--len] != quote) {
3218 PyErr_BadInternalCall();
3219 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003220 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003222 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 return decode_unicode(s, len, rawmode, encoding);
3224 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003225 if (*bytesmode) {
3226 /* Disallow non-ascii characters (but not escapes) */
3227 const char *c;
3228 for (c = s; *c; c++) {
3229 if (Py_CHARMASK(*c) >= 0x80) {
3230 ast_error(n, "bytes can only contain ASCII "
3231 "literal characters.");
3232 return NULL;
3233 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003234 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003235 }
3236 need_encoding = (!*bytesmode && encoding != NULL &&
3237 strcmp(encoding, "utf-8") != 0 &&
3238 strcmp(encoding, "iso-8859-1") != 0);
3239 if (rawmode || strchr(s, '\\') == NULL) {
3240 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003241 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3242 if (u == NULL)
3243 return NULL;
3244 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3245 Py_DECREF(u);
3246 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003247 } else {
3248 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003249 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003250 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251
Guido van Rossumbdde0112007-05-11 16:26:27 +00003252 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003253 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254}
3255
3256/* Build a Python string object out of a STRING atom. This takes care of
3257 * compile-time literal catenation, calling parsestr() on each piece, and
3258 * pasting the intermediate results together.
3259 */
3260static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003261parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 PyObject *v;
3264 int i;
3265 REQ(CHILD(n, 0), STRING);
3266 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3267 if (v != NULL) {
3268 /* String literal concatenation */
3269 for (i = 1; i < NCH(n); i++) {
3270 PyObject *s;
3271 int subbm = 0;
3272 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3273 if (s == NULL)
3274 goto onError;
3275 if (*bytesmode != subbm) {
3276 ast_error(n, "cannot mix bytes and nonbytes"
3277 "literals");
3278 goto onError;
3279 }
3280 if (PyString_Check(v) && PyString_Check(s)) {
3281 PyString_ConcatAndDel(&v, s);
3282 if (v == NULL)
3283 goto onError;
3284 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003285 else {
3286 PyObject *temp = PyUnicode_Concat(v, s);
3287 Py_DECREF(s);
3288 Py_DECREF(v);
3289 v = temp;
3290 if (v == NULL)
3291 goto onError;
3292 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003293 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003294 }
3295 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296
Guido van Rossumd8faa362007-04-27 19:54:29 +00003297 onError:
3298 Py_XDECREF(v);
3299 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300}