blob: da75975e4cf33e5d7e4ddaef394ee8c3d8348e50 [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 */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
37static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000038static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
39static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Martin v. Löwis47383402007-08-15 07:32:56 +000054 Py_UNICODE *u = PyUnicode_AS_UNICODE(id);
55 /* Check whether there are non-ASCII characters in the
56 identifier; if so, normalize to NFKC. */
57 for (; *u; u++) {
58 if (*u >= 128) {
59 PyObject *m = PyImport_ImportModule("unicodedata");
60 PyObject *id2;
61 if (!m)
62 return NULL;
63 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
64 Py_DECREF(m);
65 if (!id2)
66 return NULL;
67 Py_DECREF(id);
68 id = id2;
69 break;
70 }
71 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000072 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000073 PyArena_AddPyObject(arena, id);
74 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075}
76
Neal Norwitzadb69fc2005-12-17 20:54:49 +000077#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078
79/* This routine provides an invalid object for the syntax error.
80 The outermost routine must unpack this error and create the
81 proper object. We do this so that we don't have to pass
82 the filename to everything function.
83
84 XXX Maybe we should just pass the filename...
85*/
86
87static int
88ast_error(const node *n, const char *errstr)
89{
90 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
91 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000092 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093 PyErr_SetObject(PyExc_SyntaxError, u);
94 Py_DECREF(u);
95 return 0;
96}
97
98static void
99ast_error_finish(const char *filename)
100{
101 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000102 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103
104 assert(PyErr_Occurred());
105 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000106 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107
108 PyErr_Fetch(&type, &value, &tback);
109 errstr = PyTuple_GetItem(value, 0);
110 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000111 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112 Py_INCREF(errstr);
113 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000114 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 Py_DECREF(errstr);
116 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118 Py_DECREF(value);
119
120 loc = PyErr_ProgramText(filename, lineno);
121 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000122 Py_INCREF(Py_None);
123 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000125 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000127 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000128 Py_DECREF(errstr);
129 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132 Py_DECREF(errstr);
133 Py_DECREF(tmp);
134 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000135 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000136 PyErr_Restore(type, value, tback);
137}
138
139/* num_stmts() returns number of contained statements.
140
141 Use this routine to determine how big a sequence is needed for
142 the statements in a parse tree. Its raison d'etre is this bit of
143 grammar:
144
145 stmt: simple_stmt | compound_stmt
146 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
147
148 A simple_stmt can contain multiple small_stmt elements joined
149 by semicolons. If the arg is a simple_stmt, the number of
150 small_stmt elements is returned.
151*/
152
153static int
154num_stmts(const node *n)
155{
156 int i, l;
157 node *ch;
158
159 switch (TYPE(n)) {
160 case single_input:
161 if (TYPE(CHILD(n, 0)) == NEWLINE)
162 return 0;
163 else
164 return num_stmts(CHILD(n, 0));
165 case file_input:
166 l = 0;
167 for (i = 0; i < NCH(n); i++) {
168 ch = CHILD(n, i);
169 if (TYPE(ch) == stmt)
170 l += num_stmts(ch);
171 }
172 return l;
173 case stmt:
174 return num_stmts(CHILD(n, 0));
175 case compound_stmt:
176 return 1;
177 case simple_stmt:
178 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
179 case suite:
180 if (NCH(n) == 1)
181 return num_stmts(CHILD(n, 0));
182 else {
183 l = 0;
184 for (i = 2; i < (NCH(n) - 1); i++)
185 l += num_stmts(CHILD(n, i));
186 return l;
187 }
188 default: {
189 char buf[128];
190
191 sprintf(buf, "Non-statement found: %d %d\n",
192 TYPE(n), NCH(n));
193 Py_FatalError(buf);
194 }
195 }
196 assert(0);
197 return 0;
198}
199
200/* Transform the CST rooted at node * to the appropriate AST
201*/
202
203mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
205 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000207 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208 asdl_seq *stmts = NULL;
209 stmt_ty s;
210 node *ch;
211 struct compiling c;
212
213 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000214 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000215 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000216#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 ast_error(n, "encoding declaration in Unicode string");
218 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000219#endif
220 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222 } else if (TYPE(n) == encoding_decl) {
223 c.c_encoding = STR(n);
224 n = CHILD(n, 0);
225 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000226 /* PEP 3120 */
227 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000229 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000230 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231
Jeremy Hyltona8293132006-02-28 17:58:27 +0000232 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 switch (TYPE(n)) {
234 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 for (i = 0; i < NCH(n) - 1; i++) {
239 ch = CHILD(n, i);
240 if (TYPE(ch) == NEWLINE)
241 continue;
242 REQ(ch, stmt);
243 num = num_stmts(ch);
244 if (num == 1) {
245 s = ast_for_stmt(&c, ch);
246 if (!s)
247 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000248 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 }
250 else {
251 ch = CHILD(ch, 0);
252 REQ(ch, simple_stmt);
253 for (j = 0; j < num; j++) {
254 s = ast_for_stmt(&c, CHILD(ch, j * 2));
255 if (!s)
256 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000257 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 }
259 }
260 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000261 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 case eval_input: {
263 expr_ty testlist_ast;
264
Nick Coghlan650f0d02007-04-15 12:05:43 +0000265 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000266 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 if (!testlist_ast)
268 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000269 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 }
271 case single_input:
272 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000273 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000275 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000276 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
277 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000278 if (!asdl_seq_GET(stmts, 0))
279 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000280 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281 }
282 else {
283 n = CHILD(n, 0);
284 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000285 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000287 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000289 s = ast_for_stmt(&c, n);
290 if (!s)
291 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000292 asdl_seq_SET(stmts, 0, s);
293 }
294 else {
295 /* Only a simple_stmt can contain multiple statements. */
296 REQ(n, simple_stmt);
297 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 if (TYPE(CHILD(n, i)) == NEWLINE)
299 break;
300 s = ast_for_stmt(&c, CHILD(n, i));
301 if (!s)
302 goto error;
303 asdl_seq_SET(stmts, i / 2, s);
304 }
305 }
306
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000307 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000308 }
309 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000310 PyErr_Format(PyExc_SystemError,
311 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312 goto error;
313 }
314 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 ast_error_finish(filename);
316 return NULL;
317}
318
319/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
320*/
321
322static operator_ty
323get_operator(const node *n)
324{
325 switch (TYPE(n)) {
326 case VBAR:
327 return BitOr;
328 case CIRCUMFLEX:
329 return BitXor;
330 case AMPER:
331 return BitAnd;
332 case LEFTSHIFT:
333 return LShift;
334 case RIGHTSHIFT:
335 return RShift;
336 case PLUS:
337 return Add;
338 case MINUS:
339 return Sub;
340 case STAR:
341 return Mult;
342 case SLASH:
343 return Div;
344 case DOUBLESLASH:
345 return FloorDiv;
346 case PERCENT:
347 return Mod;
348 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000349 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350 }
351}
352
Guido van Rossume7ba4952007-06-06 23:52:48 +0000353static const char* FORBIDDEN[] = {
354 "None",
355 "True",
356 "False",
357 NULL,
358};
359
360static int
361forbidden_name(expr_ty e, const node *n)
362{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000363 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000364 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000366 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 ast_error(n, "assignment to keyword");
368 return 1;
369 }
370 }
371 return 0;
372}
373
Jeremy Hyltona8293132006-02-28 17:58:27 +0000374/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375
376 Only sets context for expr kinds that "can appear in assignment context"
377 (according to ../Parser/Python.asdl). For other expr kinds, it sets
378 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379*/
380
381static int
382set_context(expr_ty e, expr_context_ty ctx, const node *n)
383{
384 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000385 /* If a particular expression type can't be used for assign / delete,
386 set expr_name to its name and an error message will be generated.
387 */
388 const char* expr_name = NULL;
389
390 /* The ast defines augmented store and load contexts, but the
391 implementation here doesn't actually use them. The code may be
392 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000393 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000395 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000396 */
397 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
399 switch (e->kind) {
400 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 e->v.Attribute.ctx = ctx;
402 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404 e->v.Subscript.ctx = ctx;
405 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000406 case Starred_kind:
407 e->v.Starred.ctx = ctx;
408 if (!set_context(e->v.Starred.value, ctx, n))
409 return 0;
410 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000412 if (ctx == Store) {
413 if (forbidden_name(e, n))
414 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 }
416 e->v.Name.ctx = ctx;
417 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 e->v.List.ctx = ctx;
420 s = e->v.List.elts;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Tuple_kind:
423 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
424 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000425 e->v.Tuple.ctx = ctx;
426 s = e->v.Tuple.elts;
427 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000428 case Lambda_kind:
429 expr_name = "lambda";
430 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000434 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 case UnaryOp_kind:
437 expr_name = "operator";
438 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 expr_name = "generator expression";
441 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000442 case Yield_kind:
443 expr_name = "yield expression";
444 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000445 case ListComp_kind:
446 expr_name = "list comprehension";
447 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000448 case SetComp_kind:
449 expr_name = "set comprehension";
450 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000451 case DictComp_kind:
452 expr_name = "dict comprehension";
453 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000455 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000456 case Num_kind:
457 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 expr_name = "literal";
459 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000460 case Ellipsis_kind:
461 expr_name = "Ellipsis";
462 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000463 case Compare_kind:
464 expr_name = "comparison";
465 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466 case IfExp_kind:
467 expr_name = "conditional expression";
468 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000469 default:
470 PyErr_Format(PyExc_SystemError,
471 "unexpected expression in assignment %d (line %d)",
472 e->kind, e->lineno);
473 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000475 /* Check for error string set by switch */
476 if (expr_name) {
477 char buf[300];
478 PyOS_snprintf(buf, sizeof(buf),
479 "can't %s %s",
480 ctx == Store ? "assign to" : "delete",
481 expr_name);
482 return ast_error(n, buf);
483 }
484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000486 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487 */
488 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490
Thomas Wouters89f507f2006-12-13 04:49:30 +0000491 for (i = 0; i < asdl_seq_LEN(s); i++) {
492 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
493 return 0;
494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495 }
496 return 1;
497}
498
499static operator_ty
500ast_for_augassign(const node *n)
501{
502 REQ(n, augassign);
503 n = CHILD(n, 0);
504 switch (STR(n)[0]) {
505 case '+':
506 return Add;
507 case '-':
508 return Sub;
509 case '/':
510 if (STR(n)[1] == '/')
511 return FloorDiv;
512 else
513 return Div;
514 case '%':
515 return Mod;
516 case '<':
517 return LShift;
518 case '>':
519 return RShift;
520 case '&':
521 return BitAnd;
522 case '^':
523 return BitXor;
524 case '|':
525 return BitOr;
526 case '*':
527 if (STR(n)[1] == '*')
528 return Pow;
529 else
530 return Mult;
531 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000532 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000533 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534 }
535}
536
537static cmpop_ty
538ast_for_comp_op(const node *n)
539{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000540 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 |'is' 'not'
542 */
543 REQ(n, comp_op);
544 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000545 n = CHILD(n, 0);
546 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547 case LESS:
548 return Lt;
549 case GREATER:
550 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000551 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 return Eq;
553 case LESSEQUAL:
554 return LtE;
555 case GREATEREQUAL:
556 return GtE;
557 case NOTEQUAL:
558 return NotEq;
559 case NAME:
560 if (strcmp(STR(n), "in") == 0)
561 return In;
562 if (strcmp(STR(n), "is") == 0)
563 return Is;
564 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000565 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000567 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 }
570 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 /* handle "not in" and "is not" */
572 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 case NAME:
574 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
575 return NotIn;
576 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
577 return IsNot;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
Neal Norwitz79792652005-11-14 04:25:03 +0000584 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587}
588
589static asdl_seq *
590seq_for_testlist(struct compiling *c, const node *n)
591{
592 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000593 asdl_seq *seq;
594 expr_ty expression;
595 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000596 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000598 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 if (!seq)
600 return NULL;
601
602 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000603 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604
605 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000606 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 assert(i / 2 < seq->size);
610 asdl_seq_SET(seq, i / 2, expression);
611 }
612 return seq;
613}
614
Neal Norwitzc1505362006-12-28 06:47:50 +0000615static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000616compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000617{
618 identifier name;
619 expr_ty annotation = NULL;
620 node *ch;
621
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000622 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000623 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000624 name = NEW_IDENTIFIER(ch);
625 if (!name)
626 return NULL;
627
628 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
629 annotation = ast_for_expr(c, CHILD(n, 2));
630 if (!annotation)
631 return NULL;
632 }
633
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000634 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000635}
636
Guido van Rossum4f72a782006-10-27 23:31:49 +0000637/* returns -1 if failed to handle keyword only arguments
638 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000639 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000640 ^^^
641 start pointing here
642 */
643static int
644handle_keywordonly_args(struct compiling *c, const node *n, int start,
645 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
646{
647 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000648 expr_ty expression, annotation;
649 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 int i = start;
651 int j = 0; /* index for kwdefaults and kwonlyargs */
652 assert(kwonlyargs != NULL);
653 assert(kwdefaults != NULL);
654 while (i < NCH(n)) {
655 ch = CHILD(n, i);
656 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000657 case vfpdef:
658 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000659 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000660 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000661 asdl_seq_SET(kwdefaults, j, expression);
662 i += 2; /* '=' and test */
663 }
664 else { /* setting NULL if no default value exists */
665 asdl_seq_SET(kwdefaults, j, NULL);
666 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000667 if (NCH(ch) == 3) {
668 /* ch is NAME ':' test */
669 annotation = ast_for_expr(c, CHILD(ch, 2));
670 if (!annotation) {
671 ast_error(ch, "expected expression");
672 goto error;
673 }
674 }
675 else {
676 annotation = NULL;
677 }
678 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000679 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000680 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000681 ast_error(ch, "expecting name");
682 goto error;
683 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000684 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000685 i += 2; /* the name and the comma */
686 break;
687 case DOUBLESTAR:
688 return i;
689 default:
690 ast_error(ch, "unexpected node");
691 goto error;
692 }
693 }
694 return i;
695 error:
696 return -1;
697}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698
Jeremy Hyltona8293132006-02-28 17:58:27 +0000699/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700
701static arguments_ty
702ast_for_arguments(struct compiling *c, const node *n)
703{
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 /* This function handles both typedargslist (function definition)
705 and varargslist (lambda definition).
706
707 parameters: '(' [typedargslist] ')'
708 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000709 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
710 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000711 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000712 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000713 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000714 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
715 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000716 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000717 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000718 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000719 int i, j, k, nposargs = 0, nkwonlyargs = 0;
720 int nposdefaults = 0, found_default = 0;
721 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000723 arg_ty arg;
724 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 node *ch;
726
727 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000728 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000729 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
730 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000731 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000733 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000737 ch = CHILD(n, i);
738 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000739 /* skip star and possible argument */
740 i++;
741 i += (TYPE(CHILD(n, i)) == tfpdef
742 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000743 break;
744 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000745 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000749 /* count the number of keyword only args &
750 defaults for keyword only args */
751 for ( ; i < NCH(n); ++i) {
752 ch = CHILD(n, i);
753 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000754 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000755 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000756 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
757 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000758 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000759 kwonlyargs = (nkwonlyargs ?
760 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
761 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000762 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000763 posdefaults = (nposdefaults ?
764 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
765 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 /* The length of kwonlyargs and kwdefaults are same
768 since we set NULL as default for keyword only argument w/o default
769 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000770 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000771 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
772 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000773 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000774
775 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000776 ast_error(n, "more than 255 arguments");
777 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000780 /* tfpdef: NAME [':' test]
781 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 */
783 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000784 j = 0; /* index for defaults */
785 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000787 ch = CHILD(n, i);
788 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000789 case tfpdef:
790 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
792 anything other than EQUAL or a comma? */
793 /* XXX Should NCH(n) check be made a separate check? */
794 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000795 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
796 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000797 goto error;
798 assert(posdefaults != NULL);
799 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 else if (found_default) {
804 ast_error(n,
805 "non-default argument follows default argument");
806 goto error;
807 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000808 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 if (!arg)
810 goto error;
811 asdl_seq_SET(posargs, k++, arg);
812
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 i += 2; /* the name and the comma */
814 break;
815 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000816 if (i+1 >= NCH(n)) {
817 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000818 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000819 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000820 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000821 if (TYPE(ch) == COMMA) {
822 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 i += 2; /* now follows keyword only arguments */
824 res = handle_keywordonly_args(c, n, i,
825 kwonlyargs, kwdefaults);
826 if (res == -1) goto error;
827 i = res; /* res has new position to process */
828 }
829 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000830 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
831 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000832 /* there is an annotation on the vararg */
833 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000834 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000835 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000836 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
837 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000838 int res = 0;
839 res = handle_keywordonly_args(c, n, i,
840 kwonlyargs, kwdefaults);
841 if (res == -1) goto error;
842 i = res; /* res has new position to process */
843 }
844 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 break;
846 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000847 ch = CHILD(n, i+1); /* tfpdef */
848 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000849 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
850 if (NCH(ch) > 1) {
851 /* there is an annotation on the kwarg */
852 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
853 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 i += 3;
855 break;
856 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000857 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858 "unexpected node in varargslist: %d @ %d",
859 TYPE(ch), i);
860 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000861 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000863 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
864 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000866 Py_XDECREF(vararg);
867 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868 return NULL;
869}
870
871static expr_ty
872ast_for_dotted_name(struct compiling *c, const node *n)
873{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000874 expr_ty e;
875 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000876 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877 int i;
878
879 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000880
881 lineno = LINENO(n);
882 col_offset = n->n_col_offset;
883
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884 id = NEW_IDENTIFIER(CHILD(n, 0));
885 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000886 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000887 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890
891 for (i = 2; i < NCH(n); i+=2) {
892 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000893 if (!id)
894 return NULL;
895 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
896 if (!e)
897 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898 }
899
900 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901}
902
903static expr_ty
904ast_for_decorator(struct compiling *c, const node *n)
905{
906 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
907 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000908 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909
910 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000911 REQ(CHILD(n, 0), AT);
912 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913
914 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
915 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000916 return NULL;
917
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 d = name_expr;
920 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 }
922 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000923 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000924 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925 if (!d)
926 return NULL;
927 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 }
929 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 d = ast_for_call(c, CHILD(n, 3), name_expr);
931 if (!d)
932 return NULL;
933 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 }
935
936 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937}
938
939static asdl_seq*
940ast_for_decorators(struct compiling *c, const node *n)
941{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000942 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000943 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 int i;
945
946 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000947 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948 if (!decorator_seq)
949 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000950
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000952 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000953 if (!d)
954 return NULL;
955 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956 }
957 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958}
959
960static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000961ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000963 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000964 identifier name;
965 arguments_ty args;
966 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000967 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000968 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969
970 REQ(n, funcdef);
971
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 name = NEW_IDENTIFIER(CHILD(n, name_i));
973 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000974 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 args = ast_for_arguments(c, CHILD(n, name_i + 1));
976 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000977 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000978 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
979 returns = ast_for_expr(c, CHILD(n, name_i + 3));
980 if (!returns)
981 return NULL;
982 name_i += 2;
983 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 body = ast_for_suite(c, CHILD(n, name_i + 3));
985 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000986 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987
Neal Norwitzc1505362006-12-28 06:47:50 +0000988 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000989 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990}
991
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000992static stmt_ty
993ast_for_decorated(struct compiling *c, const node *n)
994{
995 /* decorated: decorators (classdef | funcdef) */
996 stmt_ty thing = NULL;
997 asdl_seq *decorator_seq = NULL;
998
999 REQ(n, decorated);
1000
1001 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1002 if (!decorator_seq)
1003 return NULL;
1004
1005 assert(TYPE(CHILD(n, 1)) == funcdef ||
1006 TYPE(CHILD(n, 1)) == classdef);
1007
1008 if (TYPE(CHILD(n, 1)) == funcdef) {
1009 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1010 } else if (TYPE(CHILD(n, 1)) == classdef) {
1011 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1012 }
1013 return thing;
1014}
1015
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016static expr_ty
1017ast_for_lambdef(struct compiling *c, const node *n)
1018{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001019 /* lambdef: 'lambda' [varargslist] ':' test
1020 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 arguments_ty args;
1022 expr_ty expression;
1023
1024 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001025 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1026 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027 if (!args)
1028 return NULL;
1029 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001030 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 }
1033 else {
1034 args = ast_for_arguments(c, CHILD(n, 1));
1035 if (!args)
1036 return NULL;
1037 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001038 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 }
1041
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001042 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043}
1044
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001045static expr_ty
1046ast_for_ifexpr(struct compiling *c, const node *n)
1047{
1048 /* test: or_test 'if' or_test 'else' test */
1049 expr_ty expression, body, orelse;
1050
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001051 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001052 body = ast_for_expr(c, CHILD(n, 0));
1053 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001054 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001055 expression = ast_for_expr(c, CHILD(n, 2));
1056 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001057 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001058 orelse = ast_for_expr(c, CHILD(n, 4));
1059 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001060 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001061 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1062 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001063}
1064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001066 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067
Nick Coghlan650f0d02007-04-15 12:05:43 +00001068 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069*/
1070
1071static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001072count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001074 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075
Guido van Rossumd8faa362007-04-27 19:54:29 +00001076 count_comp_for:
1077 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001078 REQ(n, comp_for);
1079 if (NCH(n) == 5)
1080 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001081 else
1082 return n_fors;
1083 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001084 REQ(n, comp_iter);
1085 n = CHILD(n, 0);
1086 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001087 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001088 else if (TYPE(n) == comp_if) {
1089 if (NCH(n) == 3) {
1090 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001091 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001093 else
1094 return n_fors;
1095 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001096
Guido van Rossumd8faa362007-04-27 19:54:29 +00001097 /* Should never be reached */
1098 PyErr_SetString(PyExc_SystemError,
1099 "logic error in count_comp_fors");
1100 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101}
1102
Nick Coghlan650f0d02007-04-15 12:05:43 +00001103/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104
Nick Coghlan650f0d02007-04-15 12:05:43 +00001105 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106*/
1107
1108static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001109count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112
Guido van Rossumd8faa362007-04-27 19:54:29 +00001113 while (1) {
1114 REQ(n, comp_iter);
1115 if (TYPE(CHILD(n, 0)) == comp_for)
1116 return n_ifs;
1117 n = CHILD(n, 0);
1118 REQ(n, comp_if);
1119 n_ifs++;
1120 if (NCH(n) == 2)
1121 return n_ifs;
1122 n = CHILD(n, 2);
1123 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124}
1125
Guido van Rossum992d4a32007-07-11 13:09:30 +00001126static asdl_seq *
1127ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001130 asdl_seq *comps;
1131
Nick Coghlan650f0d02007-04-15 12:05:43 +00001132 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133 if (n_fors == -1)
1134 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001135
Nick Coghlan650f0d02007-04-15 12:05:43 +00001136 comps = asdl_seq_new(n_fors, c->c_arena);
1137 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001139
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001141 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142 asdl_seq *t;
1143 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001144 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145
Guido van Rossum992d4a32007-07-11 13:09:30 +00001146 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
Guido van Rossum992d4a32007-07-11 13:09:30 +00001148 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001149 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001150 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001152 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001153 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001155
Thomas Wouters89f507f2006-12-13 04:49:30 +00001156 /* Check the # of children rather than the length of t, since
1157 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1158 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001159 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1160 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001162 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001163 c->c_arena),
1164 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001165
Nick Coghlan650f0d02007-04-15 12:05:43 +00001166 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001168
Guido van Rossum992d4a32007-07-11 13:09:30 +00001169 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170 int j, n_ifs;
1171 asdl_seq *ifs;
1172
Guido van Rossum992d4a32007-07-11 13:09:30 +00001173 n = CHILD(n, 4);
1174 n_ifs = count_comp_ifs(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001175 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001177
1178 ifs = asdl_seq_new(n_ifs, c->c_arena);
1179 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001181
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001183 REQ(n, comp_iter);
1184 n = CHILD(n, 0);
1185 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186
Guido van Rossum992d4a32007-07-11 13:09:30 +00001187 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001188 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001189 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001190 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001191 if (NCH(n) == 3)
1192 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 /* on exit, must guarantee that n is a comp_for */
1195 if (TYPE(n) == comp_iter)
1196 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001197 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001199 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001201 return comps;
1202}
1203
1204static expr_ty
1205ast_for_itercomp(struct compiling *c, const node *n, int type)
1206{
1207 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1208 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1209 expr_ty elt;
1210 asdl_seq *comps;
1211
1212 assert(NCH(n) > 1);
1213
1214 elt = ast_for_expr(c, CHILD(n, 0));
1215 if (!elt)
1216 return NULL;
1217
1218 comps = ast_for_comprehension(c, CHILD(n, 1));
1219 if (!comps)
1220 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001221
1222 if (type == COMP_GENEXP)
1223 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1224 else if (type == COMP_LISTCOMP)
1225 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1226 else if (type == COMP_SETCOMP)
1227 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1228 else
1229 /* Should never happen */
1230 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231}
1232
1233static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001234ast_for_dictcomp(struct compiling *c, const node *n)
1235{
1236 expr_ty key, value;
1237 asdl_seq *comps;
1238
1239 assert(NCH(n) > 3);
1240 REQ(CHILD(n, 1), COLON);
1241
1242 key = ast_for_expr(c, CHILD(n, 0));
1243 if (!key)
1244 return NULL;
1245
1246 value = ast_for_expr(c, CHILD(n, 2));
1247 if (!value)
1248 return NULL;
1249
1250 comps = ast_for_comprehension(c, CHILD(n, 3));
1251 if (!comps)
1252 return NULL;
1253
1254 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1255}
1256
1257static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001258ast_for_genexp(struct compiling *c, const node *n)
1259{
1260 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001261 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001262}
1263
1264static expr_ty
1265ast_for_listcomp(struct compiling *c, const node *n)
1266{
1267 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001268 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001269}
1270
1271static expr_ty
1272ast_for_setcomp(struct compiling *c, const node *n)
1273{
1274 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001275 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001276}
1277
1278
1279static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280ast_for_atom(struct compiling *c, const node *n)
1281{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001282 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1283 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001284 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285 */
1286 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001287 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288
1289 switch (TYPE(ch)) {
1290 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001291 /* All names start in Load context, but may later be
1292 changed. */
1293 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001294 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001295 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001296 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001297 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001298 PyObject *type, *value, *tback, *errstr;
1299 PyErr_Fetch(&type, &value, &tback);
1300 errstr = ((PyUnicodeErrorObject *)value)->reason;
1301 if (errstr) {
1302 char *s = "";
1303 char buf[128];
Amaury Forgeot d'Arc39599dc2007-11-22 02:48:12 +00001304 s = PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001305 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1306 ast_error(n, buf);
1307 } else {
1308 ast_error(n, "(unicode error) unknown error");
1309 }
1310 Py_DECREF(type);
1311 Py_DECREF(value);
1312 Py_XDECREF(tback);
1313 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001314 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001315 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001316 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001317 if (bytesmode)
1318 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1319 else
1320 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 }
1322 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001323 PyObject *pynum = parsenumber(STR(ch));
1324 if (!pynum)
1325 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001326
Thomas Wouters89f507f2006-12-13 04:49:30 +00001327 PyArena_AddPyObject(c->c_arena, pynum);
1328 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 }
Georg Brandldde00282007-03-18 19:01:53 +00001330 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001331 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001333 ch = CHILD(n, 1);
1334
1335 if (TYPE(ch) == RPAR)
1336 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1337
1338 if (TYPE(ch) == yield_expr)
1339 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001340
1341 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1342 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001343 return ast_for_genexp(c, ch);
1344
Nick Coghlan650f0d02007-04-15 12:05:43 +00001345 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001347 ch = CHILD(n, 1);
1348
1349 if (TYPE(ch) == RSQB)
1350 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1351
Nick Coghlan650f0d02007-04-15 12:05:43 +00001352 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001353 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1354 asdl_seq *elts = seq_for_testlist(c, ch);
1355 if (!elts)
1356 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001357
Thomas Wouters89f507f2006-12-13 04:49:30 +00001358 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1359 }
1360 else
1361 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001363 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1364 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001365 int i, size;
1366 asdl_seq *keys, *values;
1367
1368 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001369 if (TYPE(ch) == RBRACE) {
1370 /* it's an empty dict */
1371 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1372 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1373 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001374 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001375 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001376 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001377 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001378 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001379 for (i = 0; i < NCH(ch); i += 2) {
1380 expr_ty expression;
1381 expression = ast_for_expr(c, CHILD(ch, i));
1382 if (!expression)
1383 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001384 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001385 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001386 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1387 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1388 /* it's a set comprehension */
1389 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001390 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1391 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001392 } else {
1393 /* it's a dict */
1394 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1395 keys = asdl_seq_new(size, c->c_arena);
1396 if (!keys)
1397 return NULL;
1398
1399 values = asdl_seq_new(size, c->c_arena);
1400 if (!values)
1401 return NULL;
1402
1403 for (i = 0; i < NCH(ch); i += 4) {
1404 expr_ty expression;
1405
1406 expression = ast_for_expr(c, CHILD(ch, i));
1407 if (!expression)
1408 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001409
Guido van Rossum86e58e22006-08-28 15:27:34 +00001410 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001411
Guido van Rossum86e58e22006-08-28 15:27:34 +00001412 expression = ast_for_expr(c, CHILD(ch, i + 2));
1413 if (!expression)
1414 return NULL;
1415
1416 asdl_seq_SET(values, i / 4, expression);
1417 }
1418 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1419 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1423 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 }
1425}
1426
1427static slice_ty
1428ast_for_slice(struct compiling *c, const node *n)
1429{
1430 node *ch;
1431 expr_ty lower = NULL, upper = NULL, step = NULL;
1432
1433 REQ(n, subscript);
1434
1435 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001436 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 sliceop: ':' [test]
1438 */
1439 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 if (NCH(n) == 1 && TYPE(ch) == test) {
1441 /* 'step' variable hold no significance in terms of being used over
1442 other vars */
1443 step = ast_for_expr(c, ch);
1444 if (!step)
1445 return NULL;
1446
Thomas Wouters89f507f2006-12-13 04:49:30 +00001447 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 }
1449
1450 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001451 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452 if (!lower)
1453 return NULL;
1454 }
1455
1456 /* If there's an upper bound it's in the second or third position. */
1457 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001458 if (NCH(n) > 1) {
1459 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460
Thomas Wouters89f507f2006-12-13 04:49:30 +00001461 if (TYPE(n2) == test) {
1462 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 if (!upper)
1464 return NULL;
1465 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001468 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469
Thomas Wouters89f507f2006-12-13 04:49:30 +00001470 if (TYPE(n2) == test) {
1471 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 if (!upper)
1473 return NULL;
1474 }
1475 }
1476
1477 ch = CHILD(n, NCH(n) - 1);
1478 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001479 if (NCH(ch) == 1) {
1480 /* No expression, so step is None */
1481 ch = CHILD(ch, 0);
1482 step = Name(new_identifier("None", c->c_arena), Load,
1483 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 if (!step)
1485 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001486 } else {
1487 ch = CHILD(ch, 1);
1488 if (TYPE(ch) == test) {
1489 step = ast_for_expr(c, ch);
1490 if (!step)
1491 return NULL;
1492 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 }
1494 }
1495
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001496 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497}
1498
1499static expr_ty
1500ast_for_binop(struct compiling *c, const node *n)
1501{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001502 /* Must account for a sequence of expressions.
1503 How should A op B op C by represented?
1504 BinOp(BinOp(A, op, B), op, C).
1505 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506
Guido van Rossumd8faa362007-04-27 19:54:29 +00001507 int i, nops;
1508 expr_ty expr1, expr2, result;
1509 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510
Guido van Rossumd8faa362007-04-27 19:54:29 +00001511 expr1 = ast_for_expr(c, CHILD(n, 0));
1512 if (!expr1)
1513 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514
Guido van Rossumd8faa362007-04-27 19:54:29 +00001515 expr2 = ast_for_expr(c, CHILD(n, 2));
1516 if (!expr2)
1517 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518
Guido van Rossumd8faa362007-04-27 19:54:29 +00001519 newoperator = get_operator(CHILD(n, 1));
1520 if (!newoperator)
1521 return NULL;
1522
1523 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1524 c->c_arena);
1525 if (!result)
1526 return NULL;
1527
1528 nops = (NCH(n) - 1) / 2;
1529 for (i = 1; i < nops; i++) {
1530 expr_ty tmp_result, tmp;
1531 const node* next_oper = CHILD(n, i * 2 + 1);
1532
1533 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001534 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535 return NULL;
1536
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1538 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539 return NULL;
1540
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541 tmp_result = BinOp(result, newoperator, tmp,
1542 LINENO(next_oper), next_oper->n_col_offset,
1543 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001544 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001545 return NULL;
1546 result = tmp_result;
1547 }
1548 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549}
1550
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001551static expr_ty
1552ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1553{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001554 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1555 subscriptlist: subscript (',' subscript)* [',']
1556 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1557 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001558 REQ(n, trailer);
1559 if (TYPE(CHILD(n, 0)) == LPAR) {
1560 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001561 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1562 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001563 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001564 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001565 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001566 else if (TYPE(CHILD(n, 0)) == DOT ) {
1567 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001568 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001569 }
1570 else {
1571 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001572 REQ(CHILD(n, 2), RSQB);
1573 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001574 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001575 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1576 if (!slc)
1577 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001578 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1579 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001580 }
1581 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001582 /* The grammar is ambiguous here. The ambiguity is resolved
1583 by treating the sequence as a tuple literal if there are
1584 no slice features.
1585 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001586 int j;
1587 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001588 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001589 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001590 asdl_seq *slices, *elts;
1591 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001592 if (!slices)
1593 return NULL;
1594 for (j = 0; j < NCH(n); j += 2) {
1595 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001596 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001597 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001598 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001599 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600 asdl_seq_SET(slices, j / 2, slc);
1601 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001602 if (!simple) {
1603 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001604 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001605 }
1606 /* extract Index values and put them in a Tuple */
1607 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001608 if (!elts)
1609 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001610 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1611 slc = (slice_ty)asdl_seq_GET(slices, j);
1612 assert(slc->kind == Index_kind && slc->v.Index.value);
1613 asdl_seq_SET(elts, j, slc->v.Index.value);
1614 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001615 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001616 if (!e)
1617 return NULL;
1618 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001619 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001620 }
1621 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001622}
1623
1624static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001625ast_for_factor(struct compiling *c, const node *n)
1626{
1627 node *pfactor, *ppower, *patom, *pnum;
1628 expr_ty expression;
1629
1630 /* If the unary - operator is applied to a constant, don't generate
1631 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1632 constant. The peephole optimizer already does something like
1633 this but it doesn't handle the case where the constant is
1634 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1635 PyLongObject.
1636 */
1637 if (TYPE(CHILD(n, 0)) == MINUS
1638 && NCH(n) == 2
1639 && TYPE((pfactor = CHILD(n, 1))) == factor
1640 && NCH(pfactor) == 1
1641 && TYPE((ppower = CHILD(pfactor, 0))) == power
1642 && NCH(ppower) == 1
1643 && TYPE((patom = CHILD(ppower, 0))) == atom
1644 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1645 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1646 if (s == NULL)
1647 return NULL;
1648 s[0] = '-';
1649 strcpy(s + 1, STR(pnum));
1650 PyObject_FREE(STR(pnum));
1651 STR(pnum) = s;
1652 return ast_for_atom(c, patom);
1653 }
1654
1655 expression = ast_for_expr(c, CHILD(n, 1));
1656 if (!expression)
1657 return NULL;
1658
1659 switch (TYPE(CHILD(n, 0))) {
1660 case PLUS:
1661 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1662 c->c_arena);
1663 case MINUS:
1664 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1665 c->c_arena);
1666 case TILDE:
1667 return UnaryOp(Invert, expression, LINENO(n),
1668 n->n_col_offset, c->c_arena);
1669 }
1670 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1671 TYPE(CHILD(n, 0)));
1672 return NULL;
1673}
1674
1675static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001676ast_for_power(struct compiling *c, const node *n)
1677{
1678 /* power: atom trailer* ('**' factor)*
1679 */
1680 int i;
1681 expr_ty e, tmp;
1682 REQ(n, power);
1683 e = ast_for_atom(c, CHILD(n, 0));
1684 if (!e)
1685 return NULL;
1686 if (NCH(n) == 1)
1687 return e;
1688 for (i = 1; i < NCH(n); i++) {
1689 node *ch = CHILD(n, i);
1690 if (TYPE(ch) != trailer)
1691 break;
1692 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001693 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001694 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001695 tmp->lineno = e->lineno;
1696 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001697 e = tmp;
1698 }
1699 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1700 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001701 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001702 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001703 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001705 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001706 e = tmp;
1707 }
1708 return e;
1709}
1710
Guido van Rossum0368b722007-05-11 16:50:42 +00001711static expr_ty
1712ast_for_starred(struct compiling *c, const node *n)
1713{
1714 expr_ty tmp;
1715 REQ(n, star_expr);
1716
1717 tmp = ast_for_expr(c, CHILD(n, 1));
1718 if (!tmp)
1719 return NULL;
1720
1721 /* The Load context is changed later. */
1722 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1723}
1724
1725
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726/* Do not name a variable 'expr'! Will cause a compile error.
1727*/
1728
1729static expr_ty
1730ast_for_expr(struct compiling *c, const node *n)
1731{
1732 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001733 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001734 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001735 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736 and_test: not_test ('and' not_test)*
1737 not_test: 'not' not_test | comparison
1738 comparison: expr (comp_op expr)*
1739 expr: xor_expr ('|' xor_expr)*
1740 xor_expr: and_expr ('^' and_expr)*
1741 and_expr: shift_expr ('&' shift_expr)*
1742 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1743 arith_expr: term (('+'|'-') term)*
1744 term: factor (('*'|'/'|'%'|'//') factor)*
1745 factor: ('+'|'-'|'~') factor | power
1746 power: atom trailer* ('**' factor)*
1747 */
1748
1749 asdl_seq *seq;
1750 int i;
1751
1752 loop:
1753 switch (TYPE(n)) {
1754 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001755 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001756 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001757 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001759 else if (NCH(n) > 1)
1760 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001761 /* Fallthrough */
1762 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763 case and_test:
1764 if (NCH(n) == 1) {
1765 n = CHILD(n, 0);
1766 goto loop;
1767 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001768 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 if (!seq)
1770 return NULL;
1771 for (i = 0; i < NCH(n); i += 2) {
1772 expr_ty e = ast_for_expr(c, CHILD(n, i));
1773 if (!e)
1774 return NULL;
1775 asdl_seq_SET(seq, i / 2, e);
1776 }
1777 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001778 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1779 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001780 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001781 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782 case not_test:
1783 if (NCH(n) == 1) {
1784 n = CHILD(n, 0);
1785 goto loop;
1786 }
1787 else {
1788 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1789 if (!expression)
1790 return NULL;
1791
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001792 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1793 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 }
1795 case comparison:
1796 if (NCH(n) == 1) {
1797 n = CHILD(n, 0);
1798 goto loop;
1799 }
1800 else {
1801 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001802 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001803 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001804 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 if (!ops)
1806 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001807 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 return NULL;
1810 }
1811 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001812 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001814 newoperator = ast_for_comp_op(CHILD(n, i));
1815 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001817 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818
1819 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001820 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001824 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 asdl_seq_SET(cmps, i / 2, expression);
1826 }
1827 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001828 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001830 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001832 return Compare(expression, ops, cmps, LINENO(n),
1833 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 }
1835 break;
1836
Guido van Rossum0368b722007-05-11 16:50:42 +00001837 case star_expr:
1838 if (TYPE(CHILD(n, 0)) == STAR) {
1839 return ast_for_starred(c, n);
1840 }
1841 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 /* The next five cases all handle BinOps. The main body of code
1843 is the same in each case, but the switch turned inside out to
1844 reuse the code for each type of operator.
1845 */
1846 case expr:
1847 case xor_expr:
1848 case and_expr:
1849 case shift_expr:
1850 case arith_expr:
1851 case term:
1852 if (NCH(n) == 1) {
1853 n = CHILD(n, 0);
1854 goto loop;
1855 }
1856 return ast_for_binop(c, n);
1857 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 expr_ty exp = NULL;
1859 if (NCH(n) == 2) {
1860 exp = ast_for_testlist(c, CHILD(n, 1));
1861 if (!exp)
1862 return NULL;
1863 }
1864 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1865 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001866 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 if (NCH(n) == 1) {
1868 n = CHILD(n, 0);
1869 goto loop;
1870 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001872 case power:
1873 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001875 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 return NULL;
1877 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001878 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 return NULL;
1880}
1881
1882static expr_ty
1883ast_for_call(struct compiling *c, const node *n, expr_ty func)
1884{
1885 /*
1886 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1887 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001888 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 */
1890
1891 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001892 asdl_seq *args;
1893 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894 expr_ty vararg = NULL, kwarg = NULL;
1895
1896 REQ(n, arglist);
1897
1898 nargs = 0;
1899 nkeywords = 0;
1900 ngens = 0;
1901 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001902 node *ch = CHILD(n, i);
1903 if (TYPE(ch) == argument) {
1904 if (NCH(ch) == 1)
1905 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 nkeywords++;
1910 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911 }
1912 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001913 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001914 "if not sole argument");
1915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 }
1917
1918 if (nargs + nkeywords + ngens > 255) {
1919 ast_error(n, "more than 255 arguments");
1920 return NULL;
1921 }
1922
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001923 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001925 return NULL;
1926 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001928 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 nargs = 0;
1930 nkeywords = 0;
1931 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001932 node *ch = CHILD(n, i);
1933 if (TYPE(ch) == argument) {
1934 expr_ty e;
1935 if (NCH(ch) == 1) {
1936 if (nkeywords) {
1937 ast_error(CHILD(ch, 0),
1938 "non-keyword arg after keyword arg");
1939 return NULL;
1940 }
1941 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001943 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001944 asdl_seq_SET(args, nargs++, e);
1945 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001946 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001947 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001949 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001950 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001952 else {
1953 keyword_ty kw;
1954 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955
Thomas Wouters89f507f2006-12-13 04:49:30 +00001956 /* CHILD(ch, 0) is test, but must be an identifier? */
1957 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001959 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 /* f(lambda x: x[0] = 3) ends up getting parsed with
1961 * LHS test = lambda x: x[0], and RHS test = 3.
1962 * SF bug 132313 points out that complaining about a keyword
1963 * then is very confusing.
1964 */
1965 if (e->kind == Lambda_kind) {
1966 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001967 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 } else if (e->kind != Name_kind) {
1969 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001970 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001971 } else if (forbidden_name(e, ch)) {
1972 return NULL;
1973 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 key = e->v.Name.id;
1975 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001977 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001978 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001980 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001981 asdl_seq_SET(keywords, nkeywords++, kw);
1982 }
1983 }
1984 else if (TYPE(ch) == STAR) {
1985 vararg = ast_for_expr(c, CHILD(n, i+1));
1986 i++;
1987 }
1988 else if (TYPE(ch) == DOUBLESTAR) {
1989 kwarg = ast_for_expr(c, CHILD(n, i+1));
1990 i++;
1991 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 }
1993
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001994 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995}
1996
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001998ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002000 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002001 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002002 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002004 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002005 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002006 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002007 }
2008 else {
2009 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002010 TYPE(n) == testlist1);
2011 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 else {
2015 asdl_seq *tmp = seq_for_testlist(c, n);
2016 if (!tmp)
2017 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002020}
2021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022static stmt_ty
2023ast_for_expr_stmt(struct compiling *c, const node *n)
2024{
2025 REQ(n, expr_stmt);
2026 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2027 | ('=' (yield_expr|testlist))*)
2028 testlist: test (',' test)* [',']
2029 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002030 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 test: ... here starts the operator precendence dance
2032 */
2033
2034 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002035 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 if (!e)
2037 return NULL;
2038
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 }
2041 else if (TYPE(CHILD(n, 1)) == augassign) {
2042 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002043 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045
Thomas Wouters89f507f2006-12-13 04:49:30 +00002046 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 if (!expr1)
2048 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002049 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002050 switch (expr1->kind) {
2051 case GeneratorExp_kind:
2052 ast_error(ch, "augmented assignment to generator "
2053 "expression not possible");
2054 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002055 case Yield_kind:
2056 ast_error(ch, "augmented assignment to yield "
2057 "expression not possible");
2058 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002059 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002060 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002061 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002062 break;
2063 }
2064 case Attribute_kind:
2065 case Subscript_kind:
2066 break;
2067 default:
2068 ast_error(ch, "illegal expression for augmented "
2069 "assignment");
2070 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002072 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073
Thomas Wouters89f507f2006-12-13 04:49:30 +00002074 ch = CHILD(n, 2);
2075 if (TYPE(ch) == testlist)
2076 expr2 = ast_for_testlist(c, ch);
2077 else
2078 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002079 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 return NULL;
2081
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002082 newoperator = ast_for_augassign(CHILD(n, 1));
2083 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 return NULL;
2085
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 }
2088 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 int i;
2090 asdl_seq *targets;
2091 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 expr_ty expression;
2093
Thomas Wouters89f507f2006-12-13 04:49:30 +00002094 /* a normal assignment */
2095 REQ(CHILD(n, 1), EQUAL);
2096 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2097 if (!targets)
2098 return NULL;
2099 for (i = 0; i < NCH(n) - 2; i += 2) {
2100 expr_ty e;
2101 node *ch = CHILD(n, i);
2102 if (TYPE(ch) == yield_expr) {
2103 ast_error(ch, "assignment to yield expression not possible");
2104 return NULL;
2105 }
2106 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107
Thomas Wouters89f507f2006-12-13 04:49:30 +00002108 /* set context to assign */
2109 if (!e)
2110 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112 if (!set_context(e, Store, CHILD(n, i)))
2113 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114
Thomas Wouters89f507f2006-12-13 04:49:30 +00002115 asdl_seq_SET(targets, i / 2, e);
2116 }
2117 value = CHILD(n, NCH(n) - 1);
2118 if (TYPE(value) == testlist)
2119 expression = ast_for_testlist(c, value);
2120 else
2121 expression = ast_for_expr(c, value);
2122 if (!expression)
2123 return NULL;
2124 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126}
2127
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002129ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130{
2131 asdl_seq *seq;
2132 int i;
2133 expr_ty e;
2134
2135 REQ(n, exprlist);
2136
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002137 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002139 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002141 e = ast_for_expr(c, CHILD(n, i));
2142 if (!e)
2143 return NULL;
2144 asdl_seq_SET(seq, i / 2, e);
2145 if (context && !set_context(e, context, CHILD(n, i)))
2146 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 }
2148 return seq;
2149}
2150
2151static stmt_ty
2152ast_for_del_stmt(struct compiling *c, const node *n)
2153{
2154 asdl_seq *expr_list;
2155
2156 /* del_stmt: 'del' exprlist */
2157 REQ(n, del_stmt);
2158
2159 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2160 if (!expr_list)
2161 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002162 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163}
2164
2165static stmt_ty
2166ast_for_flow_stmt(struct compiling *c, const node *n)
2167{
2168 /*
2169 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2170 | yield_stmt
2171 break_stmt: 'break'
2172 continue_stmt: 'continue'
2173 return_stmt: 'return' [testlist]
2174 yield_stmt: yield_expr
2175 yield_expr: 'yield' testlist
2176 raise_stmt: 'raise' [test [',' test [',' test]]]
2177 */
2178 node *ch;
2179
2180 REQ(n, flow_stmt);
2181 ch = CHILD(n, 0);
2182 switch (TYPE(ch)) {
2183 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002184 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002186 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2189 if (!exp)
2190 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002191 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002192 }
2193 case return_stmt:
2194 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002195 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002197 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 if (!expression)
2199 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002200 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 }
2202 case raise_stmt:
2203 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002204 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2205 else if (NCH(ch) >= 2) {
2206 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2208 if (!expression)
2209 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002210 if (NCH(ch) == 4) {
2211 cause = ast_for_expr(c, CHILD(ch, 3));
2212 if (!cause)
2213 return NULL;
2214 }
2215 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 }
2217 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002218 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 "unexpected flow_stmt: %d", TYPE(ch));
2220 return NULL;
2221 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002222
2223 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2224 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002225}
2226
2227static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002228alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229{
2230 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002231 import_as_name: NAME ['as' NAME]
2232 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 dotted_name: NAME ('.' NAME)*
2234 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002235 PyObject *str;
2236
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 loop:
2238 switch (TYPE(n)) {
2239 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002240 str = NULL;
2241 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002242 str = NEW_IDENTIFIER(CHILD(n, 2));
2243 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002244 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 case dotted_as_name:
2246 if (NCH(n) == 1) {
2247 n = CHILD(n, 0);
2248 goto loop;
2249 }
2250 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002251 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002252 if (!a)
2253 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 assert(!a->asname);
2255 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2256 return a;
2257 }
2258 break;
2259 case dotted_name:
2260 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002261 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 else {
2263 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002264 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002265 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002267 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268
2269 len = 0;
2270 for (i = 0; i < NCH(n); i += 2)
2271 /* length of string plus one for the dot */
2272 len += strlen(STR(CHILD(n, i))) + 1;
2273 len--; /* the last name doesn't have a dot */
2274 str = PyString_FromStringAndSize(NULL, len);
2275 if (!str)
2276 return NULL;
2277 s = PyString_AS_STRING(str);
2278 if (!s)
2279 return NULL;
2280 for (i = 0; i < NCH(n); i += 2) {
2281 char *sch = STR(CHILD(n, i));
2282 strcpy(s, STR(CHILD(n, i)));
2283 s += strlen(sch);
2284 *s++ = '.';
2285 }
2286 --s;
2287 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002288 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2289 PyString_GET_SIZE(str),
2290 NULL);
2291 Py_DECREF(str);
2292 if (!uni)
2293 return NULL;
2294 str = uni;
2295 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002296 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002297 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 }
2299 break;
2300 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002301 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002302 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002303 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002305 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 "unexpected import name: %d", TYPE(n));
2307 return NULL;
2308 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002309
2310 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 return NULL;
2312}
2313
2314static stmt_ty
2315ast_for_import_stmt(struct compiling *c, const node *n)
2316{
2317 /*
2318 import_stmt: import_name | import_from
2319 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002320 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2321 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002323 int lineno;
2324 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 int i;
2326 asdl_seq *aliases;
2327
2328 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002329 lineno = LINENO(n);
2330 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002332 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002334 REQ(n, dotted_as_names);
2335 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2336 if (!aliases)
2337 return NULL;
2338 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002339 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002340 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002344 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002346 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002348 int idx, ndots = 0;
2349 alias_ty mod = NULL;
2350 identifier modname;
2351
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002352 /* Count the number of dots (for relative imports) and check for the
2353 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 for (idx = 1; idx < NCH(n); idx++) {
2355 if (TYPE(CHILD(n, idx)) == dotted_name) {
2356 mod = alias_for_import_name(c, CHILD(n, idx));
2357 idx++;
2358 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002359 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2360 /* three consecutive dots are tokenized as one ELLIPSIS */
2361 ndots += 3;
2362 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002363 } else if (TYPE(CHILD(n, idx)) != DOT) {
2364 break;
2365 }
2366 ndots++;
2367 }
2368 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002369 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002370 case STAR:
2371 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002372 n = CHILD(n, idx);
2373 n_children = 1;
2374 if (ndots) {
2375 ast_error(n, "'import *' not allowed with 'from .'");
2376 return NULL;
2377 }
2378 break;
2379 case LPAR:
2380 /* from ... import (x, y, z) */
2381 n = CHILD(n, idx + 1);
2382 n_children = NCH(n);
2383 break;
2384 case import_as_names:
2385 /* from ... import x, y, z */
2386 n = CHILD(n, idx);
2387 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002388 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 ast_error(n, "trailing comma not allowed without"
2390 " surrounding parentheses");
2391 return NULL;
2392 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002393 break;
2394 default:
2395 ast_error(n, "Unexpected node-type in from-import");
2396 return NULL;
2397 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398
Thomas Wouters89f507f2006-12-13 04:49:30 +00002399 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2400 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402
2403 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002404 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002405 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002406 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002408 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002410 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002412 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2413 if (!import_alias)
2414 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002416 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002418 if (mod != NULL)
2419 modname = mod->name;
2420 else
2421 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002422 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002423 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 }
Neal Norwitz79792652005-11-14 04:25:03 +00002425 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 "unknown import statement: starts with command '%s'",
2427 STR(CHILD(n, 0)));
2428 return NULL;
2429}
2430
2431static stmt_ty
2432ast_for_global_stmt(struct compiling *c, const node *n)
2433{
2434 /* global_stmt: 'global' NAME (',' NAME)* */
2435 identifier name;
2436 asdl_seq *s;
2437 int i;
2438
2439 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002440 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002444 name = NEW_IDENTIFIER(CHILD(n, i));
2445 if (!name)
2446 return NULL;
2447 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002449 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450}
2451
2452static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002453ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2454{
2455 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2456 identifier name;
2457 asdl_seq *s;
2458 int i;
2459
2460 REQ(n, nonlocal_stmt);
2461 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2462 if (!s)
2463 return NULL;
2464 for (i = 1; i < NCH(n); i += 2) {
2465 name = NEW_IDENTIFIER(CHILD(n, i));
2466 if (!name)
2467 return NULL;
2468 asdl_seq_SET(s, i / 2, name);
2469 }
2470 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2471}
2472
2473static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474ast_for_assert_stmt(struct compiling *c, const node *n)
2475{
2476 /* assert_stmt: 'assert' test [',' test] */
2477 REQ(n, assert_stmt);
2478 if (NCH(n) == 2) {
2479 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2480 if (!expression)
2481 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 }
2484 else if (NCH(n) == 4) {
2485 expr_ty expr1, expr2;
2486
2487 expr1 = ast_for_expr(c, CHILD(n, 1));
2488 if (!expr1)
2489 return NULL;
2490 expr2 = ast_for_expr(c, CHILD(n, 3));
2491 if (!expr2)
2492 return NULL;
2493
Thomas Wouters89f507f2006-12-13 04:49:30 +00002494 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 }
Neal Norwitz79792652005-11-14 04:25:03 +00002496 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 "improper number of parts to 'assert' statement: %d",
2498 NCH(n));
2499 return NULL;
2500}
2501
2502static asdl_seq *
2503ast_for_suite(struct compiling *c, const node *n)
2504{
2505 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002506 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 stmt_ty s;
2508 int i, total, num, end, pos = 0;
2509 node *ch;
2510
2511 REQ(n, suite);
2512
2513 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002514 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 n = CHILD(n, 0);
2519 /* simple_stmt always ends with a NEWLINE,
2520 and may have a trailing SEMI
2521 */
2522 end = NCH(n) - 1;
2523 if (TYPE(CHILD(n, end - 1)) == SEMI)
2524 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526 for (i = 0; i < end; i += 2) {
2527 ch = CHILD(n, i);
2528 s = ast_for_stmt(c, ch);
2529 if (!s)
2530 return NULL;
2531 asdl_seq_SET(seq, pos++, s);
2532 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 }
2534 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002535 for (i = 2; i < (NCH(n) - 1); i++) {
2536 ch = CHILD(n, i);
2537 REQ(ch, stmt);
2538 num = num_stmts(ch);
2539 if (num == 1) {
2540 /* small_stmt or compound_stmt with only one child */
2541 s = ast_for_stmt(c, ch);
2542 if (!s)
2543 return NULL;
2544 asdl_seq_SET(seq, pos++, s);
2545 }
2546 else {
2547 int j;
2548 ch = CHILD(ch, 0);
2549 REQ(ch, simple_stmt);
2550 for (j = 0; j < NCH(ch); j += 2) {
2551 /* statement terminates with a semi-colon ';' */
2552 if (NCH(CHILD(ch, j)) == 0) {
2553 assert((j + 1) == NCH(ch));
2554 break;
2555 }
2556 s = ast_for_stmt(c, CHILD(ch, j));
2557 if (!s)
2558 return NULL;
2559 asdl_seq_SET(seq, pos++, s);
2560 }
2561 }
2562 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 }
2564 assert(pos == seq->size);
2565 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566}
2567
2568static stmt_ty
2569ast_for_if_stmt(struct compiling *c, const node *n)
2570{
2571 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2572 ['else' ':' suite]
2573 */
2574 char *s;
2575
2576 REQ(n, if_stmt);
2577
2578 if (NCH(n) == 4) {
2579 expr_ty expression;
2580 asdl_seq *suite_seq;
2581
2582 expression = ast_for_expr(c, CHILD(n, 1));
2583 if (!expression)
2584 return NULL;
2585 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002586 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 return NULL;
2588
Guido van Rossumd8faa362007-04-27 19:54:29 +00002589 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2590 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002592
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 s = STR(CHILD(n, 4));
2594 /* s[2], the third character in the string, will be
2595 's' for el_s_e, or
2596 'i' for el_i_f
2597 */
2598 if (s[2] == 's') {
2599 expr_ty expression;
2600 asdl_seq *seq1, *seq2;
2601
2602 expression = ast_for_expr(c, CHILD(n, 1));
2603 if (!expression)
2604 return NULL;
2605 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002606 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 return NULL;
2608 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002609 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 return NULL;
2611
Guido van Rossumd8faa362007-04-27 19:54:29 +00002612 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2613 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 }
2615 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002616 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002617 expr_ty expression;
2618 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002619 asdl_seq *orelse = NULL;
2620 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 /* must reference the child n_elif+1 since 'else' token is third,
2622 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2624 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2625 has_else = 1;
2626 n_elif -= 3;
2627 }
2628 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002631 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 orelse = asdl_seq_new(1, c->c_arena);
2634 if (!orelse)
2635 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002637 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002639 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2640 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002642 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2643 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645
Guido van Rossumd8faa362007-04-27 19:54:29 +00002646 asdl_seq_SET(orelse, 0,
2647 If(expression, suite_seq, suite_seq2,
2648 LINENO(CHILD(n, NCH(n) - 6)),
2649 CHILD(n, NCH(n) - 6)->n_col_offset,
2650 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002651 /* the just-created orelse handled the last elif */
2652 n_elif--;
2653 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654
Thomas Wouters89f507f2006-12-13 04:49:30 +00002655 for (i = 0; i < n_elif; i++) {
2656 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002657 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2658 if (!newobj)
2659 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002661 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002664 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666
Thomas Wouters89f507f2006-12-13 04:49:30 +00002667 asdl_seq_SET(newobj, 0,
2668 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002669 LINENO(CHILD(n, off)),
2670 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002671 orelse = newobj;
2672 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002673 expression = ast_for_expr(c, CHILD(n, 1));
2674 if (!expression)
2675 return NULL;
2676 suite_seq = ast_for_suite(c, CHILD(n, 3));
2677 if (!suite_seq)
2678 return NULL;
2679 return If(expression, suite_seq, orelse,
2680 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002682
2683 PyErr_Format(PyExc_SystemError,
2684 "unexpected token in 'if' statement: %s", s);
2685 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686}
2687
2688static stmt_ty
2689ast_for_while_stmt(struct compiling *c, const node *n)
2690{
2691 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2692 REQ(n, while_stmt);
2693
2694 if (NCH(n) == 4) {
2695 expr_ty expression;
2696 asdl_seq *suite_seq;
2697
2698 expression = ast_for_expr(c, CHILD(n, 1));
2699 if (!expression)
2700 return NULL;
2701 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002702 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002704 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 }
2706 else if (NCH(n) == 7) {
2707 expr_ty expression;
2708 asdl_seq *seq1, *seq2;
2709
2710 expression = ast_for_expr(c, CHILD(n, 1));
2711 if (!expression)
2712 return NULL;
2713 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002714 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 return NULL;
2716 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002717 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 return NULL;
2719
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002722
2723 PyErr_Format(PyExc_SystemError,
2724 "wrong number of tokens for 'while' statement: %d",
2725 NCH(n));
2726 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727}
2728
2729static stmt_ty
2730ast_for_for_stmt(struct compiling *c, const node *n)
2731{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002732 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 expr_ty expression;
2734 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002735 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2737 REQ(n, for_stmt);
2738
2739 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002740 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 if (!seq)
2742 return NULL;
2743 }
2744
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002745 node_target = CHILD(n, 1);
2746 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002749 /* Check the # of children rather than the length of _target, since
2750 for x, in ... has 1 element in _target, but still requires a Tuple. */
2751 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002752 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002754 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002756 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002757 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 return NULL;
2759 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002760 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 return NULL;
2762
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002763 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2764 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765}
2766
2767static excepthandler_ty
2768ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2769{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002770 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 REQ(exc, except_clause);
2772 REQ(body, suite);
2773
2774 if (NCH(exc) == 1) {
2775 asdl_seq *suite_seq = ast_for_suite(c, body);
2776 if (!suite_seq)
2777 return NULL;
2778
Thomas Wouters89f507f2006-12-13 04:49:30 +00002779 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002780 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 }
2782 else if (NCH(exc) == 2) {
2783 expr_ty expression;
2784 asdl_seq *suite_seq;
2785
2786 expression = ast_for_expr(c, CHILD(exc, 1));
2787 if (!expression)
2788 return NULL;
2789 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002790 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791 return NULL;
2792
Thomas Wouters89f507f2006-12-13 04:49:30 +00002793 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002794 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 }
2796 else if (NCH(exc) == 4) {
2797 asdl_seq *suite_seq;
2798 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002799 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002800 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002803 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 return NULL;
2805 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002806 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 return NULL;
2808
Thomas Wouters89f507f2006-12-13 04:49:30 +00002809 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002810 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002812
2813 PyErr_Format(PyExc_SystemError,
2814 "wrong number of children for 'except' clause: %d",
2815 NCH(exc));
2816 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817}
2818
2819static stmt_ty
2820ast_for_try_stmt(struct compiling *c, const node *n)
2821{
Neal Norwitzf599f422005-12-17 21:33:47 +00002822 const int nch = NCH(n);
2823 int n_except = (nch - 3)/3;
2824 asdl_seq *body, *orelse = NULL, *finally = NULL;
2825
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 REQ(n, try_stmt);
2827
Neal Norwitzf599f422005-12-17 21:33:47 +00002828 body = ast_for_suite(c, CHILD(n, 2));
2829 if (body == NULL)
2830 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831
Neal Norwitzf599f422005-12-17 21:33:47 +00002832 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2833 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2834 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2835 /* we can assume it's an "else",
2836 because nch >= 9 for try-else-finally and
2837 it would otherwise have a type of except_clause */
2838 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2839 if (orelse == NULL)
2840 return NULL;
2841 n_except--;
2842 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843
Neal Norwitzf599f422005-12-17 21:33:47 +00002844 finally = ast_for_suite(c, CHILD(n, nch - 1));
2845 if (finally == NULL)
2846 return NULL;
2847 n_except--;
2848 }
2849 else {
2850 /* we can assume it's an "else",
2851 otherwise it would have a type of except_clause */
2852 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2853 if (orelse == NULL)
2854 return NULL;
2855 n_except--;
2856 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002858 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002859 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 return NULL;
2861 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002862
2863 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002864 int i;
2865 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002866 /* process except statements to create a try ... except */
2867 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2868 if (handlers == NULL)
2869 return NULL;
2870
2871 for (i = 0; i < n_except; i++) {
2872 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2873 CHILD(n, 5 + i * 3));
2874 if (!e)
2875 return NULL;
2876 asdl_seq_SET(handlers, i, e);
2877 }
2878
Thomas Wouters89f507f2006-12-13 04:49:30 +00002879 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002880 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002881 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002882 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002883
2884 /* if a 'finally' is present too, we nest the TryExcept within a
2885 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002886 body = asdl_seq_new(1, c->c_arena);
2887 if (body == NULL)
2888 return NULL;
2889 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002890 }
2891
2892 /* must be a try ... finally (except clauses are in body, if any exist) */
2893 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002894 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895}
2896
Guido van Rossumc2e20742006-02-27 22:32:47 +00002897static expr_ty
2898ast_for_with_var(struct compiling *c, const node *n)
2899{
2900 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002901 return ast_for_expr(c, CHILD(n, 1));
2902}
2903
2904/* with_stmt: 'with' test [ with_var ] ':' suite */
2905static stmt_ty
2906ast_for_with_stmt(struct compiling *c, const node *n)
2907{
2908 expr_ty context_expr, optional_vars = NULL;
2909 int suite_index = 3; /* skip 'with', test, and ':' */
2910 asdl_seq *suite_seq;
2911
2912 assert(TYPE(n) == with_stmt);
2913 context_expr = ast_for_expr(c, CHILD(n, 1));
2914 if (TYPE(CHILD(n, 2)) == with_var) {
2915 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2916
2917 if (!optional_vars) {
2918 return NULL;
2919 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920 if (!set_context(optional_vars, Store, n)) {
2921 return NULL;
2922 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002923 suite_index = 4;
2924 }
2925
2926 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2927 if (!suite_seq) {
2928 return NULL;
2929 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002930 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002931 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002932}
2933
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002935ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002937 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2938 asdl_seq *s;
2939 expr_ty call, dummy;
2940
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 REQ(n, classdef);
2942
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002943 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 s = ast_for_suite(c, CHILD(n, 3));
2945 if (!s)
2946 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002947 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002948 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002950
2951 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002952 s = ast_for_suite(c, CHILD(n,5));
2953 if (!s)
2954 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002955 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002956 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 }
2958
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002959 /* class NAME '(' arglist ')' ':' suite */
2960 /* build up a fake Call node so we can extract its pieces */
2961 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2962 call = ast_for_call(c, CHILD(n, 3), dummy);
2963 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002966 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002968
2969 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2970 call->v.Call.args, call->v.Call.keywords,
2971 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002972 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973}
2974
2975static stmt_ty
2976ast_for_stmt(struct compiling *c, const node *n)
2977{
2978 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002979 assert(NCH(n) == 1);
2980 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 }
2982 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002983 assert(num_stmts(n) == 1);
2984 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 }
2986 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002987 REQ(n, small_stmt);
2988 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002989 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2990 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 */
2992 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 case expr_stmt:
2994 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 case del_stmt:
2996 return ast_for_del_stmt(c, n);
2997 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002998 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999 case flow_stmt:
3000 return ast_for_flow_stmt(c, n);
3001 case import_stmt:
3002 return ast_for_import_stmt(c, n);
3003 case global_stmt:
3004 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003005 case nonlocal_stmt:
3006 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 case assert_stmt:
3008 return ast_for_assert_stmt(c, n);
3009 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003010 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3012 TYPE(n), NCH(n));
3013 return NULL;
3014 }
3015 }
3016 else {
3017 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003018 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003019 */
3020 node *ch = CHILD(n, 0);
3021 REQ(n, compound_stmt);
3022 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 case if_stmt:
3024 return ast_for_if_stmt(c, ch);
3025 case while_stmt:
3026 return ast_for_while_stmt(c, ch);
3027 case for_stmt:
3028 return ast_for_for_stmt(c, ch);
3029 case try_stmt:
3030 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003031 case with_stmt:
3032 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003034 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003036 return ast_for_classdef(c, ch, NULL);
3037 case decorated:
3038 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003040 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3042 TYPE(n), NCH(n));
3043 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003044 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 }
3046}
3047
3048static PyObject *
3049parsenumber(const char *s)
3050{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003051 const char *end;
3052 long x;
3053 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003055 Py_complex c;
3056 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057#endif
3058
Guido van Rossumd8faa362007-04-27 19:54:29 +00003059 errno = 0;
3060 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003062 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003064 if (s[0] == '0') {
3065 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3066 if (x < 0 && errno == 0) {
3067 return PyLong_FromString((char *)s,
3068 (char **)0,
3069 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003070 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003071 }
3072 else
3073 x = PyOS_strtol((char *)s, (char **)&end, 0);
3074 if (*end == '\0') {
3075 if (errno != 0)
3076 return PyLong_FromString((char *)s, (char **)0, 0);
3077 return PyInt_FromLong(x);
3078 }
3079 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003081 if (imflag) {
3082 c.real = 0.;
3083 PyFPE_START_PROTECT("atof", return 0)
3084 c.imag = PyOS_ascii_atof(s);
3085 PyFPE_END_PROTECT(c)
3086 return PyComplex_FromCComplex(c);
3087 }
3088 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003090 {
3091 PyFPE_START_PROTECT("atof", return 0)
3092 dx = PyOS_ascii_atof(s);
3093 PyFPE_END_PROTECT(dx)
3094 return PyFloat_FromDouble(dx);
3095 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096}
3097
3098static PyObject *
3099decode_utf8(const char **sPtr, const char *end, char* encoding)
3100{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003101 PyObject *u, *v;
3102 char *s, *t;
3103 t = s = (char *)*sPtr;
3104 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3105 while (s < end && (*s & 0x80)) s++;
3106 *sPtr = s;
3107 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3108 if (u == NULL)
3109 return NULL;
3110 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3111 Py_DECREF(u);
3112 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113}
3114
3115static PyObject *
3116decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3117{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003118 PyObject *v, *u;
3119 char *buf;
3120 char *p;
3121 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003122
Guido van Rossumd8faa362007-04-27 19:54:29 +00003123 if (encoding == NULL) {
3124 buf = (char *)s;
3125 u = NULL;
3126 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3127 buf = (char *)s;
3128 u = NULL;
3129 } else {
3130 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3131 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3132 if (u == NULL)
3133 return NULL;
3134 p = buf = PyString_AsString(u);
3135 end = s + len;
3136 while (s < end) {
3137 if (*s == '\\') {
3138 *p++ = *s++;
3139 if (*s & 0x80) {
3140 strcpy(p, "u005c");
3141 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003142 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003143 }
3144 if (*s & 0x80) { /* XXX inefficient */
3145 PyObject *w;
3146 char *r;
3147 Py_ssize_t rn, i;
3148 w = decode_utf8(&s, end, "utf-16-be");
3149 if (w == NULL) {
3150 Py_DECREF(u);
3151 return NULL;
3152 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00003153 r = PyString_AS_STRING(w);
3154 rn = Py_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003155 assert(rn % 2 == 0);
3156 for (i = 0; i < rn; i += 2) {
3157 sprintf(p, "\\u%02x%02x",
3158 r[i + 0] & 0xFF,
3159 r[i + 1] & 0xFF);
3160 p += 6;
3161 }
3162 Py_DECREF(w);
3163 } else {
3164 *p++ = *s++;
3165 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003166 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003167 len = p - buf;
3168 s = buf;
3169 }
3170 if (rawmode)
3171 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3172 else
3173 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3174 Py_XDECREF(u);
3175 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176}
3177
3178/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003179 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180 * parsestr parses it, and returns the decoded Python string object.
3181 */
3182static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003183parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 size_t len;
3186 const char *s = STR(n);
3187 int quote = Py_CHARMASK(*s);
3188 int rawmode = 0;
3189 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190
Guido van Rossum98297ee2007-11-06 21:34:58 +00003191 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003192 if (quote == 'b' || quote == 'B') {
3193 quote = *++s;
3194 *bytesmode = 1;
3195 }
3196 if (quote == 'r' || quote == 'R') {
3197 quote = *++s;
3198 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003199 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003200 }
3201 if (quote != '\'' && quote != '\"') {
3202 PyErr_BadInternalCall();
3203 return NULL;
3204 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 s++;
3206 len = strlen(s);
3207 if (len > INT_MAX) {
3208 PyErr_SetString(PyExc_OverflowError,
3209 "string to parse is too long");
3210 return NULL;
3211 }
3212 if (s[--len] != quote) {
3213 PyErr_BadInternalCall();
3214 return NULL;
3215 }
3216 if (len >= 4 && s[0] == quote && s[1] == quote) {
3217 s += 2;
3218 len -= 2;
3219 if (s[--len] != quote || s[--len] != quote) {
3220 PyErr_BadInternalCall();
3221 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003222 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 }
Guido van Rossum29fd7122007-11-12 01:13:56 +00003224 if (!*bytesmode && !rawmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003225 return decode_unicode(s, len, rawmode, encoding);
3226 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003227 if (*bytesmode) {
3228 /* Disallow non-ascii characters (but not escapes) */
3229 const char *c;
3230 for (c = s; *c; c++) {
3231 if (Py_CHARMASK(*c) >= 0x80) {
3232 ast_error(n, "bytes can only contain ASCII "
3233 "literal characters.");
3234 return NULL;
3235 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003236 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 }
3238 need_encoding = (!*bytesmode && encoding != NULL &&
3239 strcmp(encoding, "utf-8") != 0 &&
3240 strcmp(encoding, "iso-8859-1") != 0);
3241 if (rawmode || strchr(s, '\\') == NULL) {
3242 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003243 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003244 if (u == NULL || !*bytesmode)
3245 return u;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3247 Py_DECREF(u);
3248 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003249 } else if (*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003250 return PyString_FromStringAndSize(s, len);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003251 } else if (strcmp(encoding, "utf-8") == 0) {
3252 return PyUnicode_FromStringAndSize(s, len);
3253 } else {
3254 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003255 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003256 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257
Guido van Rossumbdde0112007-05-11 16:26:27 +00003258 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003259 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003260}
3261
Guido van Rossum29fd7122007-11-12 01:13:56 +00003262/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 * compile-time literal catenation, calling parsestr() on each piece, and
3264 * pasting the intermediate results together.
3265 */
3266static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003267parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 PyObject *v;
3270 int i;
3271 REQ(CHILD(n, 0), STRING);
3272 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3273 if (v != NULL) {
3274 /* String literal concatenation */
3275 for (i = 1; i < NCH(n); i++) {
3276 PyObject *s;
3277 int subbm = 0;
3278 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3279 if (s == NULL)
3280 goto onError;
3281 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003282 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003283 goto onError;
3284 }
3285 if (PyString_Check(v) && PyString_Check(s)) {
3286 PyString_ConcatAndDel(&v, s);
3287 if (v == NULL)
3288 goto onError;
3289 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003290 else {
3291 PyObject *temp = PyUnicode_Concat(v, s);
3292 Py_DECREF(s);
3293 Py_DECREF(v);
3294 v = temp;
3295 if (v == NULL)
3296 goto onError;
3297 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003298 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003299 }
3300 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301
Guido van Rossumd8faa362007-04-27 19:54:29 +00003302 onError:
3303 Py_XDECREF(v);
3304 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305}