blob: e0bd18e731307f4f3e295b48bfbcd02a71e115f6 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000031static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
36static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000037static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
38static PyObject *parsestrplus(struct compiling *, const node *n,
39 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000042#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#endif
44
Nick Coghlan650f0d02007-04-15 12:05:43 +000045#define COMP_GENEXP 0
46#define COMP_LISTCOMP 1
47#define COMP_SETCOMP 2
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
51 PyObject* id = PyString_InternFromString(n);
52 PyArena_AddPyObject(arena, id);
53 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000054}
55
Neal Norwitzadb69fc2005-12-17 20:54:49 +000056#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057
58/* This routine provides an invalid object for the syntax error.
59 The outermost routine must unpack this error and create the
60 proper object. We do this so that we don't have to pass
61 the filename to everything function.
62
63 XXX Maybe we should just pass the filename...
64*/
65
66static int
67ast_error(const node *n, const char *errstr)
68{
69 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
70 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000071 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000072 PyErr_SetObject(PyExc_SyntaxError, u);
73 Py_DECREF(u);
74 return 0;
75}
76
77static void
78ast_error_finish(const char *filename)
79{
80 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000081 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082
83 assert(PyErr_Occurred());
84 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +000085 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086
87 PyErr_Fetch(&type, &value, &tback);
88 errstr = PyTuple_GetItem(value, 0);
89 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +000090 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000091 Py_INCREF(errstr);
92 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000093 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000094 Py_DECREF(errstr);
95 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000096 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097 Py_DECREF(value);
98
99 loc = PyErr_ProgramText(filename, lineno);
100 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000101 Py_INCREF(Py_None);
102 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000104 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000106 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000107 Py_DECREF(errstr);
108 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000109 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000110 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111 Py_DECREF(errstr);
112 Py_DECREF(tmp);
113 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 PyErr_Restore(type, value, tback);
116}
117
118/* num_stmts() returns number of contained statements.
119
120 Use this routine to determine how big a sequence is needed for
121 the statements in a parse tree. Its raison d'etre is this bit of
122 grammar:
123
124 stmt: simple_stmt | compound_stmt
125 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
126
127 A simple_stmt can contain multiple small_stmt elements joined
128 by semicolons. If the arg is a simple_stmt, the number of
129 small_stmt elements is returned.
130*/
131
132static int
133num_stmts(const node *n)
134{
135 int i, l;
136 node *ch;
137
138 switch (TYPE(n)) {
139 case single_input:
140 if (TYPE(CHILD(n, 0)) == NEWLINE)
141 return 0;
142 else
143 return num_stmts(CHILD(n, 0));
144 case file_input:
145 l = 0;
146 for (i = 0; i < NCH(n); i++) {
147 ch = CHILD(n, i);
148 if (TYPE(ch) == stmt)
149 l += num_stmts(ch);
150 }
151 return l;
152 case stmt:
153 return num_stmts(CHILD(n, 0));
154 case compound_stmt:
155 return 1;
156 case simple_stmt:
157 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
158 case suite:
159 if (NCH(n) == 1)
160 return num_stmts(CHILD(n, 0));
161 else {
162 l = 0;
163 for (i = 2; i < (NCH(n) - 1); i++)
164 l += num_stmts(CHILD(n, i));
165 return l;
166 }
167 default: {
168 char buf[128];
169
170 sprintf(buf, "Non-statement found: %d %d\n",
171 TYPE(n), NCH(n));
172 Py_FatalError(buf);
173 }
174 }
175 assert(0);
176 return 0;
177}
178
179/* Transform the CST rooted at node * to the appropriate AST
180*/
181
182mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000183PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
184 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000186 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187 asdl_seq *stmts = NULL;
188 stmt_ty s;
189 node *ch;
190 struct compiling c;
191
192 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000193 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000194 if (TYPE(n) == encoding_decl) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000195 ast_error(n, "encoding declaration in Unicode string");
196 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 } else if (TYPE(n) == encoding_decl) {
199 c.c_encoding = STR(n);
200 n = CHILD(n, 0);
201 } else {
202 c.c_encoding = NULL;
203 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205
Jeremy Hyltona8293132006-02-28 17:58:27 +0000206 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207 switch (TYPE(n)) {
208 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000209 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000211 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000212 for (i = 0; i < NCH(n) - 1; i++) {
213 ch = CHILD(n, i);
214 if (TYPE(ch) == NEWLINE)
215 continue;
216 REQ(ch, stmt);
217 num = num_stmts(ch);
218 if (num == 1) {
219 s = ast_for_stmt(&c, ch);
220 if (!s)
221 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000222 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223 }
224 else {
225 ch = CHILD(ch, 0);
226 REQ(ch, simple_stmt);
227 for (j = 0; j < num; j++) {
228 s = ast_for_stmt(&c, CHILD(ch, j * 2));
229 if (!s)
230 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000231 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232 }
233 }
234 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 case eval_input: {
237 expr_ty testlist_ast;
238
Nick Coghlan650f0d02007-04-15 12:05:43 +0000239 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000240 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 if (!testlist_ast)
242 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000243 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 }
245 case single_input:
246 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000249 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000250 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
251 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000252 if (!asdl_seq_GET(stmts, 0))
253 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000254 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255 }
256 else {
257 n = CHILD(n, 0);
258 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000259 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000260 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000261 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000263 s = ast_for_stmt(&c, n);
264 if (!s)
265 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000266 asdl_seq_SET(stmts, 0, s);
267 }
268 else {
269 /* Only a simple_stmt can contain multiple statements. */
270 REQ(n, simple_stmt);
271 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000272 if (TYPE(CHILD(n, i)) == NEWLINE)
273 break;
274 s = ast_for_stmt(&c, CHILD(n, i));
275 if (!s)
276 goto error;
277 asdl_seq_SET(stmts, i / 2, s);
278 }
279 }
280
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000281 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000282 }
283 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000284 PyErr_Format(PyExc_SystemError,
285 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 goto error;
287 }
288 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 ast_error_finish(filename);
290 return NULL;
291}
292
293/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
294*/
295
296static operator_ty
297get_operator(const node *n)
298{
299 switch (TYPE(n)) {
300 case VBAR:
301 return BitOr;
302 case CIRCUMFLEX:
303 return BitXor;
304 case AMPER:
305 return BitAnd;
306 case LEFTSHIFT:
307 return LShift;
308 case RIGHTSHIFT:
309 return RShift;
310 case PLUS:
311 return Add;
312 case MINUS:
313 return Sub;
314 case STAR:
315 return Mult;
316 case SLASH:
317 return Div;
318 case DOUBLESLASH:
319 return FloorDiv;
320 case PERCENT:
321 return Mod;
322 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000323 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000324 }
325}
326
Guido van Rossume7ba4952007-06-06 23:52:48 +0000327static const char* FORBIDDEN[] = {
328 "None",
329 "True",
330 "False",
331 NULL,
332};
333
334static int
335forbidden_name(expr_ty e, const node *n)
336{
337 const char *id;
338 const char **p;
339 assert(PyString_Check(e->v.Name.id));
340 id = PyString_AS_STRING(e->v.Name.id);
341 for (p = FORBIDDEN; *p; p++) {
342 if (strcmp(*p, id) == 0) {
343 ast_error(n, "assignment to keyword");
344 return 1;
345 }
346 }
347 return 0;
348}
349
Jeremy Hyltona8293132006-02-28 17:58:27 +0000350/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000351
352 Only sets context for expr kinds that "can appear in assignment context"
353 (according to ../Parser/Python.asdl). For other expr kinds, it sets
354 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000355*/
356
357static int
358set_context(expr_ty e, expr_context_ty ctx, const node *n)
359{
360 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000361 /* If a particular expression type can't be used for assign / delete,
362 set expr_name to its name and an error message will be generated.
363 */
364 const char* expr_name = NULL;
365
366 /* The ast defines augmented store and load contexts, but the
367 implementation here doesn't actually use them. The code may be
368 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000369 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000370 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000371 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000372 */
373 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000374
375 switch (e->kind) {
376 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000377 if (ctx == Store &&
Guido van Rossumd8faa362007-04-27 19:54:29 +0000378 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
379 return ast_error(n, "assignment to None");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000380 }
381 e->v.Attribute.ctx = ctx;
382 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000384 e->v.Subscript.ctx = ctx;
385 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000386 case Starred_kind:
387 e->v.Starred.ctx = ctx;
388 if (!set_context(e->v.Starred.value, ctx, n))
389 return 0;
390 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000391 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000392 if (ctx == Store) {
393 if (forbidden_name(e, n))
394 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000395 }
396 e->v.Name.ctx = ctx;
397 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000399 e->v.List.ctx = ctx;
400 s = e->v.List.elts;
401 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402 case Tuple_kind:
403 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
404 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 e->v.Tuple.ctx = ctx;
406 s = e->v.Tuple.elts;
407 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 case Lambda_kind:
409 expr_name = "lambda";
410 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000412 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000414 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 case UnaryOp_kind:
417 expr_name = "operator";
418 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000419 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000420 expr_name = "generator expression";
421 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422 case Yield_kind:
423 expr_name = "yield expression";
424 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000425 case ListComp_kind:
426 expr_name = "list comprehension";
427 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000428 case SetComp_kind:
429 expr_name = "set comprehension";
430 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000431 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000432 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433 case Num_kind:
434 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000435 expr_name = "literal";
436 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000437 case Ellipsis_kind:
438 expr_name = "Ellipsis";
439 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 case Compare_kind:
441 expr_name = "comparison";
442 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000443 case IfExp_kind:
444 expr_name = "conditional expression";
445 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 default:
447 PyErr_Format(PyExc_SystemError,
448 "unexpected expression in assignment %d (line %d)",
449 e->kind, e->lineno);
450 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000452 /* Check for error string set by switch */
453 if (expr_name) {
454 char buf[300];
455 PyOS_snprintf(buf, sizeof(buf),
456 "can't %s %s",
457 ctx == Store ? "assign to" : "delete",
458 expr_name);
459 return ast_error(n, buf);
460 }
461
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000462 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000463 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000464 */
465 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000466 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467
Thomas Wouters89f507f2006-12-13 04:49:30 +0000468 for (i = 0; i < asdl_seq_LEN(s); i++) {
469 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
470 return 0;
471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000472 }
473 return 1;
474}
475
476static operator_ty
477ast_for_augassign(const node *n)
478{
479 REQ(n, augassign);
480 n = CHILD(n, 0);
481 switch (STR(n)[0]) {
482 case '+':
483 return Add;
484 case '-':
485 return Sub;
486 case '/':
487 if (STR(n)[1] == '/')
488 return FloorDiv;
489 else
490 return Div;
491 case '%':
492 return Mod;
493 case '<':
494 return LShift;
495 case '>':
496 return RShift;
497 case '&':
498 return BitAnd;
499 case '^':
500 return BitXor;
501 case '|':
502 return BitOr;
503 case '*':
504 if (STR(n)[1] == '*')
505 return Pow;
506 else
507 return Mult;
508 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000509 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000510 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000511 }
512}
513
514static cmpop_ty
515ast_for_comp_op(const node *n)
516{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000517 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518 |'is' 'not'
519 */
520 REQ(n, comp_op);
521 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000522 n = CHILD(n, 0);
523 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524 case LESS:
525 return Lt;
526 case GREATER:
527 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000528 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529 return Eq;
530 case LESSEQUAL:
531 return LtE;
532 case GREATEREQUAL:
533 return GtE;
534 case NOTEQUAL:
535 return NotEq;
536 case NAME:
537 if (strcmp(STR(n), "in") == 0)
538 return In;
539 if (strcmp(STR(n), "is") == 0)
540 return Is;
541 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000542 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000544 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000545 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546 }
547 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000548 /* handle "not in" and "is not" */
549 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550 case NAME:
551 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
552 return NotIn;
553 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
554 return IsNot;
555 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000556 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000557 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000558 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000559 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560 }
Neal Norwitz79792652005-11-14 04:25:03 +0000561 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000563 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000564}
565
566static asdl_seq *
567seq_for_testlist(struct compiling *c, const node *n)
568{
569 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000570 asdl_seq *seq;
571 expr_ty expression;
572 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000573 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000575 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 if (!seq)
577 return NULL;
578
579 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000580 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581
582 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000583 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585
586 assert(i / 2 < seq->size);
587 asdl_seq_SET(seq, i / 2, expression);
588 }
589 return seq;
590}
591
Neal Norwitzc1505362006-12-28 06:47:50 +0000592static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000593compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000594{
595 identifier name;
596 expr_ty annotation = NULL;
597 node *ch;
598
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000599 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000600 ch = CHILD(n, 0);
601 if (!strcmp(STR(ch), "None")) {
602 ast_error(ch, "assignment to None");
603 return NULL;
604 }
605 name = NEW_IDENTIFIER(ch);
606 if (!name)
607 return NULL;
608
609 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
610 annotation = ast_for_expr(c, CHILD(n, 2));
611 if (!annotation)
612 return NULL;
613 }
614
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000615 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616}
617
Guido van Rossum4f72a782006-10-27 23:31:49 +0000618/* returns -1 if failed to handle keyword only arguments
619 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000620 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000621 ^^^
622 start pointing here
623 */
624static int
625handle_keywordonly_args(struct compiling *c, const node *n, int start,
626 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
627{
628 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000629 expr_ty expression, annotation;
630 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000631 int i = start;
632 int j = 0; /* index for kwdefaults and kwonlyargs */
633 assert(kwonlyargs != NULL);
634 assert(kwdefaults != NULL);
635 while (i < NCH(n)) {
636 ch = CHILD(n, i);
637 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000638 case vfpdef:
639 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000640 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000641 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000642 if (!expression) {
643 ast_error(ch, "assignment to None");
644 goto error;
645 }
646 asdl_seq_SET(kwdefaults, j, expression);
647 i += 2; /* '=' and test */
648 }
649 else { /* setting NULL if no default value exists */
650 asdl_seq_SET(kwdefaults, j, NULL);
651 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000652 if (NCH(ch) == 3) {
653 /* ch is NAME ':' test */
654 annotation = ast_for_expr(c, CHILD(ch, 2));
655 if (!annotation) {
656 ast_error(ch, "expected expression");
657 goto error;
658 }
659 }
660 else {
661 annotation = NULL;
662 }
663 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000664 if (!strcmp(STR(ch), "None")) {
665 ast_error(ch, "assignment to None");
666 goto error;
667 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000668 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000669 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000670 ast_error(ch, "expecting name");
671 goto error;
672 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000673 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 i += 2; /* the name and the comma */
675 break;
676 case DOUBLESTAR:
677 return i;
678 default:
679 ast_error(ch, "unexpected node");
680 goto error;
681 }
682 }
683 return i;
684 error:
685 return -1;
686}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687
Jeremy Hyltona8293132006-02-28 17:58:27 +0000688/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689
690static arguments_ty
691ast_for_arguments(struct compiling *c, const node *n)
692{
Neal Norwitzc1505362006-12-28 06:47:50 +0000693 /* This function handles both typedargslist (function definition)
694 and varargslist (lambda definition).
695
696 parameters: '(' [typedargslist] ')'
697 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000698 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
699 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000700 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000701 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000702 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000703 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
704 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000705 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000706 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000708 int i, j, k, nposargs = 0, nkwonlyargs = 0;
709 int nposdefaults = 0, found_default = 0;
710 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000712 arg_ty arg;
713 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 node *ch;
715
716 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000717 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000718 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
719 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000720 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000721 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000722 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723
Guido van Rossum4f72a782006-10-27 23:31:49 +0000724 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000726 ch = CHILD(n, i);
727 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000728 /* skip star and possible argument */
729 i++;
730 i += (TYPE(CHILD(n, i)) == tfpdef
731 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000732 break;
733 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000734 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000735 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000736 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000738 /* count the number of keyword only args &
739 defaults for keyword only args */
740 for ( ; i < NCH(n); ++i) {
741 ch = CHILD(n, i);
742 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000743 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000745 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
746 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000747 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000748 kwonlyargs = (nkwonlyargs ?
749 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
750 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000751 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000752 posdefaults = (nposdefaults ?
753 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
754 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000755 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000756 /* The length of kwonlyargs and kwdefaults are same
757 since we set NULL as default for keyword only argument w/o default
758 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000759 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000760 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
761 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000762 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000763
764 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000765 ast_error(n, "more than 255 arguments");
766 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000769 /* tfpdef: NAME [':' test]
770 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000771 */
772 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000773 j = 0; /* index for defaults */
774 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 ch = CHILD(n, i);
777 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000778 case tfpdef:
779 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
781 anything other than EQUAL or a comma? */
782 /* XXX Should NCH(n) check be made a separate check? */
783 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000784 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
785 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000786 goto error;
787 assert(posdefaults != NULL);
788 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000790 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 else if (found_default) {
793 ast_error(n,
794 "non-default argument follows default argument");
795 goto error;
796 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000797 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000798 if (!arg)
799 goto error;
800 asdl_seq_SET(posargs, k++, arg);
801
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 i += 2; /* the name and the comma */
803 break;
804 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000805 if (i+1 >= NCH(n)) {
806 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000807 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000808 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000809 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000810 if (TYPE(ch) == COMMA) {
811 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000812 i += 2; /* now follows keyword only arguments */
813 res = handle_keywordonly_args(c, n, i,
814 kwonlyargs, kwdefaults);
815 if (res == -1) goto error;
816 i = res; /* res has new position to process */
817 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000818 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
819 ast_error(CHILD(ch, 0), "assignment to None");
820 goto error;
821 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000822 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000823 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
824 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000825 /* there is an annotation on the vararg */
826 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000827 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000828 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000829 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
830 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000831 int res = 0;
832 res = handle_keywordonly_args(c, n, i,
833 kwonlyargs, kwdefaults);
834 if (res == -1) goto error;
835 i = res; /* res has new position to process */
836 }
837 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 break;
839 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000840 ch = CHILD(n, i+1); /* tfpdef */
841 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000842 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
843 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000844 goto error;
845 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000846 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
847 if (NCH(ch) > 1) {
848 /* there is an annotation on the kwarg */
849 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
850 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851 i += 3;
852 break;
853 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000854 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000855 "unexpected node in varargslist: %d @ %d",
856 TYPE(ch), i);
857 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000858 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000860 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
861 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000863 Py_XDECREF(vararg);
864 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865 return NULL;
866}
867
868static expr_ty
869ast_for_dotted_name(struct compiling *c, const node *n)
870{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000871 expr_ty e;
872 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000873 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000874 int i;
875
876 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000877
878 lineno = LINENO(n);
879 col_offset = n->n_col_offset;
880
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881 id = NEW_IDENTIFIER(CHILD(n, 0));
882 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000883 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000884 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000886 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887
888 for (i = 2; i < NCH(n); i+=2) {
889 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000890 if (!id)
891 return NULL;
892 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
893 if (!e)
894 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895 }
896
897 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898}
899
900static expr_ty
901ast_for_decorator(struct compiling *c, const node *n)
902{
903 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
904 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000905 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906
907 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000908 REQ(CHILD(n, 0), AT);
909 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910
911 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
912 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000913 return NULL;
914
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000915 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000916 d = name_expr;
917 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918 }
919 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000921 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000922 if (!d)
923 return NULL;
924 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925 }
926 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000927 d = ast_for_call(c, CHILD(n, 3), name_expr);
928 if (!d)
929 return NULL;
930 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931 }
932
933 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934}
935
936static asdl_seq*
937ast_for_decorators(struct compiling *c, const node *n)
938{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000939 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000940 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 int i;
942
943 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000944 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 if (!decorator_seq)
946 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000947
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000949 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000950 if (!d)
951 return NULL;
952 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 }
954 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955}
956
957static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000958ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000960 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000961 identifier name;
962 arguments_ty args;
963 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000964 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000965 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966
967 REQ(n, funcdef);
968
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969 name = NEW_IDENTIFIER(CHILD(n, name_i));
970 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000971 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000973 ast_error(CHILD(n, name_i), "assignment to None");
974 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 }
976 args = ast_for_arguments(c, CHILD(n, name_i + 1));
977 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000978 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000979 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
980 returns = ast_for_expr(c, CHILD(n, name_i + 3));
981 if (!returns)
982 return NULL;
983 name_i += 2;
984 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 body = ast_for_suite(c, CHILD(n, name_i + 3));
986 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988
Neal Norwitzc1505362006-12-28 06:47:50 +0000989 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000990 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991}
992
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000993static stmt_ty
994ast_for_decorated(struct compiling *c, const node *n)
995{
996 /* decorated: decorators (classdef | funcdef) */
997 stmt_ty thing = NULL;
998 asdl_seq *decorator_seq = NULL;
999
1000 REQ(n, decorated);
1001
1002 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1003 if (!decorator_seq)
1004 return NULL;
1005
1006 assert(TYPE(CHILD(n, 1)) == funcdef ||
1007 TYPE(CHILD(n, 1)) == classdef);
1008
1009 if (TYPE(CHILD(n, 1)) == funcdef) {
1010 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1011 } else if (TYPE(CHILD(n, 1)) == classdef) {
1012 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1013 }
1014 return thing;
1015}
1016
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017static expr_ty
1018ast_for_lambdef(struct compiling *c, const node *n)
1019{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001020 /* lambdef: 'lambda' [varargslist] ':' test
1021 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022 arguments_ty args;
1023 expr_ty expression;
1024
1025 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001026 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1027 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001028 if (!args)
1029 return NULL;
1030 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001031 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033 }
1034 else {
1035 args = ast_for_arguments(c, CHILD(n, 1));
1036 if (!args)
1037 return NULL;
1038 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001039 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 }
1042
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001043 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044}
1045
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001046static expr_ty
1047ast_for_ifexpr(struct compiling *c, const node *n)
1048{
1049 /* test: or_test 'if' or_test 'else' test */
1050 expr_ty expression, body, orelse;
1051
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001052 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001053 body = ast_for_expr(c, CHILD(n, 0));
1054 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001055 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001056 expression = ast_for_expr(c, CHILD(n, 2));
1057 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001058 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001059 orelse = ast_for_expr(c, CHILD(n, 4));
1060 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001061 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001062 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1063 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001064}
1065
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001066/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001067 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068
Nick Coghlan650f0d02007-04-15 12:05:43 +00001069 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070*/
1071
1072static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001073count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001075 int n_fors = 0;
1076 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077
Guido van Rossumd8faa362007-04-27 19:54:29 +00001078 count_comp_for:
1079 n_fors++;
1080 REQ(ch, comp_for);
1081 if (NCH(ch) == 5)
1082 ch = CHILD(ch, 4);
1083 else
1084 return n_fors;
1085 count_comp_iter:
1086 REQ(ch, comp_iter);
1087 ch = CHILD(ch, 0);
1088 if (TYPE(ch) == comp_for)
1089 goto count_comp_for;
1090 else if (TYPE(ch) == comp_if) {
1091 if (NCH(ch) == 3) {
1092 ch = CHILD(ch, 2);
1093 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001094 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001095 else
1096 return n_fors;
1097 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001098
Guido van Rossumd8faa362007-04-27 19:54:29 +00001099 /* Should never be reached */
1100 PyErr_SetString(PyExc_SystemError,
1101 "logic error in count_comp_fors");
1102 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103}
1104
Nick Coghlan650f0d02007-04-15 12:05:43 +00001105/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106
Nick Coghlan650f0d02007-04-15 12:05:43 +00001107 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108*/
1109
1110static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001111count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001113 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114
Guido van Rossumd8faa362007-04-27 19:54:29 +00001115 while (1) {
1116 REQ(n, comp_iter);
1117 if (TYPE(CHILD(n, 0)) == comp_for)
1118 return n_ifs;
1119 n = CHILD(n, 0);
1120 REQ(n, comp_if);
1121 n_ifs++;
1122 if (NCH(n) == 2)
1123 return n_ifs;
1124 n = CHILD(n, 2);
1125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126}
1127
1128static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001129ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001131 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1132 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001134 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135 int i, n_fors;
1136 node *ch;
1137
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 assert(NCH(n) > 1);
1139
1140 elt = ast_for_expr(c, CHILD(n, 0));
1141 if (!elt)
1142 return NULL;
1143
Nick Coghlan650f0d02007-04-15 12:05:43 +00001144 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 if (n_fors == -1)
1146 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001147
Nick Coghlan650f0d02007-04-15 12:05:43 +00001148 comps = asdl_seq_new(n_fors, c->c_arena);
1149 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001151
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152 ch = CHILD(n, 1);
1153 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001154 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 asdl_seq *t;
1156 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001157 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158
Nick Coghlan650f0d02007-04-15 12:05:43 +00001159 REQ(ch, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160
Thomas Wouters89f507f2006-12-13 04:49:30 +00001161 for_ch = CHILD(ch, 1);
1162 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001163 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001165 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001166 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001168
Thomas Wouters89f507f2006-12-13 04:49:30 +00001169 /* Check the # of children rather than the length of t, since
1170 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1171 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001172 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1173 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001175 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1176 c->c_arena),
1177 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001178
Nick Coghlan650f0d02007-04-15 12:05:43 +00001179 if (!comp)
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 if (NCH(ch) == 5) {
1183 int j, n_ifs;
1184 asdl_seq *ifs;
1185
1186 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001187 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001188 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190
1191 ifs = asdl_seq_new(n_ifs, c->c_arena);
1192 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001196 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001198 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001200 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001201 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001202 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001203 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 if (NCH(ch) == 3)
1205 ch = CHILD(ch, 2);
1206 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001207 /* on exit, must guarantee that ch is a comp_for */
1208 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001210 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001212 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001214
1215 if (type == COMP_GENEXP)
1216 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1217 else if (type == COMP_LISTCOMP)
1218 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1219 else if (type == COMP_SETCOMP)
1220 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1221 else
1222 /* Should never happen */
1223 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224}
1225
1226static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001227ast_for_genexp(struct compiling *c, const node *n)
1228{
1229 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1230 return ast_for_comprehension(c, n, COMP_GENEXP);
1231}
1232
1233static expr_ty
1234ast_for_listcomp(struct compiling *c, const node *n)
1235{
1236 assert(TYPE(n) == (testlist_comp));
1237 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1238}
1239
1240static expr_ty
1241ast_for_setcomp(struct compiling *c, const node *n)
1242{
1243 assert(TYPE(n) == (dictorsetmaker));
1244 return ast_for_comprehension(c, n, COMP_SETCOMP);
1245}
1246
1247
1248static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249ast_for_atom(struct compiling *c, const node *n)
1250{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001251 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1252 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001253 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 */
1255 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001256 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257
1258 switch (TYPE(ch)) {
1259 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001260 /* All names start in Load context, but may later be
1261 changed. */
1262 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001264 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001265 if (!str)
1266 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001267
Thomas Wouters89f507f2006-12-13 04:49:30 +00001268 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001269 if (bytesmode)
1270 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1271 else
1272 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 }
1274 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001275 PyObject *pynum = parsenumber(STR(ch));
1276 if (!pynum)
1277 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001278
Thomas Wouters89f507f2006-12-13 04:49:30 +00001279 PyArena_AddPyObject(c->c_arena, pynum);
1280 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 }
Georg Brandldde00282007-03-18 19:01:53 +00001282 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001283 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001285 ch = CHILD(n, 1);
1286
1287 if (TYPE(ch) == RPAR)
1288 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1289
1290 if (TYPE(ch) == yield_expr)
1291 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001292
1293 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1294 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001295 return ast_for_genexp(c, ch);
1296
Nick Coghlan650f0d02007-04-15 12:05:43 +00001297 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001298 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001299 ch = CHILD(n, 1);
1300
1301 if (TYPE(ch) == RSQB)
1302 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1303
Nick Coghlan650f0d02007-04-15 12:05:43 +00001304 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001305 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1306 asdl_seq *elts = seq_for_testlist(c, ch);
1307 if (!elts)
1308 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001309
Thomas Wouters89f507f2006-12-13 04:49:30 +00001310 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1311 }
1312 else
1313 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001315 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1316 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001317 int i, size;
1318 asdl_seq *keys, *values;
1319
1320 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001321 if (TYPE(ch) == RBRACE) {
1322 /* it's an empty dict */
1323 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1324 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1325 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001326 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001327 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001328 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001329 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001330 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001331 for (i = 0; i < NCH(ch); i += 2) {
1332 expr_ty expression;
1333 expression = ast_for_expr(c, CHILD(ch, i));
1334 if (!expression)
1335 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001336 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001337 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001338 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1339 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1340 /* it's a set comprehension */
1341 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001342 } else {
1343 /* it's a dict */
1344 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1345 keys = asdl_seq_new(size, c->c_arena);
1346 if (!keys)
1347 return NULL;
1348
1349 values = asdl_seq_new(size, c->c_arena);
1350 if (!values)
1351 return NULL;
1352
1353 for (i = 0; i < NCH(ch); i += 4) {
1354 expr_ty expression;
1355
1356 expression = ast_for_expr(c, CHILD(ch, i));
1357 if (!expression)
1358 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001359
Guido van Rossum86e58e22006-08-28 15:27:34 +00001360 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001361
Guido van Rossum86e58e22006-08-28 15:27:34 +00001362 expression = ast_for_expr(c, CHILD(ch, i + 2));
1363 if (!expression)
1364 return NULL;
1365
1366 asdl_seq_SET(values, i / 4, expression);
1367 }
1368 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1369 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001371 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001372 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1373 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374 }
1375}
1376
1377static slice_ty
1378ast_for_slice(struct compiling *c, const node *n)
1379{
1380 node *ch;
1381 expr_ty lower = NULL, upper = NULL, step = NULL;
1382
1383 REQ(n, subscript);
1384
1385 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001386 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 sliceop: ':' [test]
1388 */
1389 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001390 if (NCH(n) == 1 && TYPE(ch) == test) {
1391 /* 'step' variable hold no significance in terms of being used over
1392 other vars */
1393 step = ast_for_expr(c, ch);
1394 if (!step)
1395 return NULL;
1396
Thomas Wouters89f507f2006-12-13 04:49:30 +00001397 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 }
1399
1400 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001401 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 if (!lower)
1403 return NULL;
1404 }
1405
1406 /* If there's an upper bound it's in the second or third position. */
1407 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001408 if (NCH(n) > 1) {
1409 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410
Thomas Wouters89f507f2006-12-13 04:49:30 +00001411 if (TYPE(n2) == test) {
1412 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 if (!upper)
1414 return NULL;
1415 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001418 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419
Thomas Wouters89f507f2006-12-13 04:49:30 +00001420 if (TYPE(n2) == test) {
1421 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422 if (!upper)
1423 return NULL;
1424 }
1425 }
1426
1427 ch = CHILD(n, NCH(n) - 1);
1428 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001429 if (NCH(ch) == 1) {
1430 /* No expression, so step is None */
1431 ch = CHILD(ch, 0);
1432 step = Name(new_identifier("None", c->c_arena), Load,
1433 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 if (!step)
1435 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001436 } else {
1437 ch = CHILD(ch, 1);
1438 if (TYPE(ch) == test) {
1439 step = ast_for_expr(c, ch);
1440 if (!step)
1441 return NULL;
1442 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 }
1444 }
1445
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001446 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447}
1448
1449static expr_ty
1450ast_for_binop(struct compiling *c, const node *n)
1451{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001452 /* Must account for a sequence of expressions.
1453 How should A op B op C by represented?
1454 BinOp(BinOp(A, op, B), op, C).
1455 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456
Guido van Rossumd8faa362007-04-27 19:54:29 +00001457 int i, nops;
1458 expr_ty expr1, expr2, result;
1459 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460
Guido van Rossumd8faa362007-04-27 19:54:29 +00001461 expr1 = ast_for_expr(c, CHILD(n, 0));
1462 if (!expr1)
1463 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464
Guido van Rossumd8faa362007-04-27 19:54:29 +00001465 expr2 = ast_for_expr(c, CHILD(n, 2));
1466 if (!expr2)
1467 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468
Guido van Rossumd8faa362007-04-27 19:54:29 +00001469 newoperator = get_operator(CHILD(n, 1));
1470 if (!newoperator)
1471 return NULL;
1472
1473 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1474 c->c_arena);
1475 if (!result)
1476 return NULL;
1477
1478 nops = (NCH(n) - 1) / 2;
1479 for (i = 1; i < nops; i++) {
1480 expr_ty tmp_result, tmp;
1481 const node* next_oper = CHILD(n, i * 2 + 1);
1482
1483 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001484 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 return NULL;
1486
Guido van Rossumd8faa362007-04-27 19:54:29 +00001487 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1488 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 return NULL;
1490
Guido van Rossumd8faa362007-04-27 19:54:29 +00001491 tmp_result = BinOp(result, newoperator, tmp,
1492 LINENO(next_oper), next_oper->n_col_offset,
1493 c->c_arena);
1494 if (!tmp)
1495 return NULL;
1496 result = tmp_result;
1497 }
1498 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499}
1500
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001501static expr_ty
1502ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1503{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001504 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1505 subscriptlist: subscript (',' subscript)* [',']
1506 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1507 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001508 REQ(n, trailer);
1509 if (TYPE(CHILD(n, 0)) == LPAR) {
1510 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001511 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1512 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001513 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001514 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001515 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001516 else if (TYPE(CHILD(n, 0)) == DOT ) {
1517 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001518 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001519 }
1520 else {
1521 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001522 REQ(CHILD(n, 2), RSQB);
1523 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001524 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001525 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1526 if (!slc)
1527 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001528 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1529 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001530 }
1531 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001532 /* The grammar is ambiguous here. The ambiguity is resolved
1533 by treating the sequence as a tuple literal if there are
1534 no slice features.
1535 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001536 int j;
1537 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001538 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001539 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001540 asdl_seq *slices, *elts;
1541 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001542 if (!slices)
1543 return NULL;
1544 for (j = 0; j < NCH(n); j += 2) {
1545 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001546 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001547 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001548 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001549 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001550 asdl_seq_SET(slices, j / 2, slc);
1551 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001552 if (!simple) {
1553 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001554 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001555 }
1556 /* extract Index values and put them in a Tuple */
1557 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001558 if (!elts)
1559 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001560 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1561 slc = (slice_ty)asdl_seq_GET(slices, j);
1562 assert(slc->kind == Index_kind && slc->v.Index.value);
1563 asdl_seq_SET(elts, j, slc->v.Index.value);
1564 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001565 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001566 if (!e)
1567 return NULL;
1568 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001569 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001570 }
1571 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001572}
1573
1574static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001575ast_for_factor(struct compiling *c, const node *n)
1576{
1577 node *pfactor, *ppower, *patom, *pnum;
1578 expr_ty expression;
1579
1580 /* If the unary - operator is applied to a constant, don't generate
1581 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1582 constant. The peephole optimizer already does something like
1583 this but it doesn't handle the case where the constant is
1584 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1585 PyLongObject.
1586 */
1587 if (TYPE(CHILD(n, 0)) == MINUS
1588 && NCH(n) == 2
1589 && TYPE((pfactor = CHILD(n, 1))) == factor
1590 && NCH(pfactor) == 1
1591 && TYPE((ppower = CHILD(pfactor, 0))) == power
1592 && NCH(ppower) == 1
1593 && TYPE((patom = CHILD(ppower, 0))) == atom
1594 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1595 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1596 if (s == NULL)
1597 return NULL;
1598 s[0] = '-';
1599 strcpy(s + 1, STR(pnum));
1600 PyObject_FREE(STR(pnum));
1601 STR(pnum) = s;
1602 return ast_for_atom(c, patom);
1603 }
1604
1605 expression = ast_for_expr(c, CHILD(n, 1));
1606 if (!expression)
1607 return NULL;
1608
1609 switch (TYPE(CHILD(n, 0))) {
1610 case PLUS:
1611 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1612 c->c_arena);
1613 case MINUS:
1614 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1615 c->c_arena);
1616 case TILDE:
1617 return UnaryOp(Invert, expression, LINENO(n),
1618 n->n_col_offset, c->c_arena);
1619 }
1620 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1621 TYPE(CHILD(n, 0)));
1622 return NULL;
1623}
1624
1625static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626ast_for_power(struct compiling *c, const node *n)
1627{
1628 /* power: atom trailer* ('**' factor)*
1629 */
1630 int i;
1631 expr_ty e, tmp;
1632 REQ(n, power);
1633 e = ast_for_atom(c, CHILD(n, 0));
1634 if (!e)
1635 return NULL;
1636 if (NCH(n) == 1)
1637 return e;
1638 for (i = 1; i < NCH(n); i++) {
1639 node *ch = CHILD(n, i);
1640 if (TYPE(ch) != trailer)
1641 break;
1642 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001643 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001644 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001645 tmp->lineno = e->lineno;
1646 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001647 e = tmp;
1648 }
1649 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1650 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001651 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001652 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001653 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001654 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001655 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001656 e = tmp;
1657 }
1658 return e;
1659}
1660
Guido van Rossum0368b722007-05-11 16:50:42 +00001661static expr_ty
1662ast_for_starred(struct compiling *c, const node *n)
1663{
1664 expr_ty tmp;
1665 REQ(n, star_expr);
1666
1667 tmp = ast_for_expr(c, CHILD(n, 1));
1668 if (!tmp)
1669 return NULL;
1670
1671 /* The Load context is changed later. */
1672 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1673}
1674
1675
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676/* Do not name a variable 'expr'! Will cause a compile error.
1677*/
1678
1679static expr_ty
1680ast_for_expr(struct compiling *c, const node *n)
1681{
1682 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001683 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001684 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001685 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 and_test: not_test ('and' not_test)*
1687 not_test: 'not' not_test | comparison
1688 comparison: expr (comp_op expr)*
1689 expr: xor_expr ('|' xor_expr)*
1690 xor_expr: and_expr ('^' and_expr)*
1691 and_expr: shift_expr ('&' shift_expr)*
1692 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1693 arith_expr: term (('+'|'-') term)*
1694 term: factor (('*'|'/'|'%'|'//') factor)*
1695 factor: ('+'|'-'|'~') factor | power
1696 power: atom trailer* ('**' factor)*
1697 */
1698
1699 asdl_seq *seq;
1700 int i;
1701
1702 loop:
1703 switch (TYPE(n)) {
1704 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001705 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001706 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001707 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001709 else if (NCH(n) > 1)
1710 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001711 /* Fallthrough */
1712 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 case and_test:
1714 if (NCH(n) == 1) {
1715 n = CHILD(n, 0);
1716 goto loop;
1717 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 if (!seq)
1720 return NULL;
1721 for (i = 0; i < NCH(n); i += 2) {
1722 expr_ty e = ast_for_expr(c, CHILD(n, i));
1723 if (!e)
1724 return NULL;
1725 asdl_seq_SET(seq, i / 2, e);
1726 }
1727 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001728 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1729 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001730 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001731 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732 case not_test:
1733 if (NCH(n) == 1) {
1734 n = CHILD(n, 0);
1735 goto loop;
1736 }
1737 else {
1738 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1739 if (!expression)
1740 return NULL;
1741
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001742 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1743 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001744 }
1745 case comparison:
1746 if (NCH(n) == 1) {
1747 n = CHILD(n, 0);
1748 goto loop;
1749 }
1750 else {
1751 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001752 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001753 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001754 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755 if (!ops)
1756 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001757 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 return NULL;
1760 }
1761 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001762 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001764 newoperator = ast_for_comp_op(CHILD(n, i));
1765 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001767 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768
1769 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001770 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001772 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001774 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775 asdl_seq_SET(cmps, i / 2, expression);
1776 }
1777 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001778 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001780 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001782 return Compare(expression, ops, cmps, LINENO(n),
1783 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784 }
1785 break;
1786
Guido van Rossum0368b722007-05-11 16:50:42 +00001787 case star_expr:
1788 if (TYPE(CHILD(n, 0)) == STAR) {
1789 return ast_for_starred(c, n);
1790 }
1791 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792 /* The next five cases all handle BinOps. The main body of code
1793 is the same in each case, but the switch turned inside out to
1794 reuse the code for each type of operator.
1795 */
1796 case expr:
1797 case xor_expr:
1798 case and_expr:
1799 case shift_expr:
1800 case arith_expr:
1801 case term:
1802 if (NCH(n) == 1) {
1803 n = CHILD(n, 0);
1804 goto loop;
1805 }
1806 return ast_for_binop(c, n);
1807 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001808 expr_ty exp = NULL;
1809 if (NCH(n) == 2) {
1810 exp = ast_for_testlist(c, CHILD(n, 1));
1811 if (!exp)
1812 return NULL;
1813 }
1814 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1815 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001816 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817 if (NCH(n) == 1) {
1818 n = CHILD(n, 0);
1819 goto loop;
1820 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001821 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001822 case power:
1823 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001825 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 return NULL;
1827 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001828 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 return NULL;
1830}
1831
1832static expr_ty
1833ast_for_call(struct compiling *c, const node *n, expr_ty func)
1834{
1835 /*
1836 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1837 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001838 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 */
1840
1841 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001842 asdl_seq *args;
1843 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 expr_ty vararg = NULL, kwarg = NULL;
1845
1846 REQ(n, arglist);
1847
1848 nargs = 0;
1849 nkeywords = 0;
1850 ngens = 0;
1851 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001852 node *ch = CHILD(n, i);
1853 if (TYPE(ch) == argument) {
1854 if (NCH(ch) == 1)
1855 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001856 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001857 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001859 nkeywords++;
1860 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 }
1862 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001863 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 "if not sole argument");
1865 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 }
1867
1868 if (nargs + nkeywords + ngens > 255) {
1869 ast_error(n, "more than 255 arguments");
1870 return NULL;
1871 }
1872
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001873 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001875 return NULL;
1876 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001878 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 nargs = 0;
1880 nkeywords = 0;
1881 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 node *ch = CHILD(n, i);
1883 if (TYPE(ch) == argument) {
1884 expr_ty e;
1885 if (NCH(ch) == 1) {
1886 if (nkeywords) {
1887 ast_error(CHILD(ch, 0),
1888 "non-keyword arg after keyword arg");
1889 return NULL;
1890 }
1891 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001893 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 asdl_seq_SET(args, nargs++, e);
1895 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001896 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001899 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001902 else {
1903 keyword_ty kw;
1904 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905
Thomas Wouters89f507f2006-12-13 04:49:30 +00001906 /* CHILD(ch, 0) is test, but must be an identifier? */
1907 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001909 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001910 /* f(lambda x: x[0] = 3) ends up getting parsed with
1911 * LHS test = lambda x: x[0], and RHS test = 3.
1912 * SF bug 132313 points out that complaining about a keyword
1913 * then is very confusing.
1914 */
1915 if (e->kind == Lambda_kind) {
1916 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001917 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 } else if (e->kind != Name_kind) {
1919 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001920 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001921 } else if (forbidden_name(e, ch)) {
1922 return NULL;
1923 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001924 key = e->v.Name.id;
1925 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001926 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001927 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001928 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001930 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001931 asdl_seq_SET(keywords, nkeywords++, kw);
1932 }
1933 }
1934 else if (TYPE(ch) == STAR) {
1935 vararg = ast_for_expr(c, CHILD(n, i+1));
1936 i++;
1937 }
1938 else if (TYPE(ch) == DOUBLESTAR) {
1939 kwarg = ast_for_expr(c, CHILD(n, i+1));
1940 i++;
1941 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 }
1943
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001944 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945}
1946
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001948ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001950 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001951 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001952 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001954 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001955 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001956 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001957 }
1958 else {
1959 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001960 TYPE(n) == testlist1);
1961 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001963 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 else {
1965 asdl_seq *tmp = seq_for_testlist(c, n);
1966 if (!tmp)
1967 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001968 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001970}
1971
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972static stmt_ty
1973ast_for_expr_stmt(struct compiling *c, const node *n)
1974{
1975 REQ(n, expr_stmt);
1976 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1977 | ('=' (yield_expr|testlist))*)
1978 testlist: test (',' test)* [',']
1979 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001980 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 test: ... here starts the operator precendence dance
1982 */
1983
1984 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 if (!e)
1987 return NULL;
1988
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 }
1991 else if (TYPE(CHILD(n, 1)) == augassign) {
1992 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001993 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995
Thomas Wouters89f507f2006-12-13 04:49:30 +00001996 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 if (!expr1)
1998 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001999 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002000 switch (expr1->kind) {
2001 case GeneratorExp_kind:
2002 ast_error(ch, "augmented assignment to generator "
2003 "expression not possible");
2004 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002005 case Yield_kind:
2006 ast_error(ch, "augmented assignment to yield "
2007 "expression not possible");
2008 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002009 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002010 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002011 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002012 break;
2013 }
2014 case Attribute_kind:
2015 case Subscript_kind:
2016 break;
2017 default:
2018 ast_error(ch, "illegal expression for augmented "
2019 "assignment");
2020 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 ch = CHILD(n, 2);
2025 if (TYPE(ch) == testlist)
2026 expr2 = ast_for_testlist(c, ch);
2027 else
2028 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002029 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 return NULL;
2031
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002032 newoperator = ast_for_augassign(CHILD(n, 1));
2033 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 return NULL;
2035
Thomas Wouters89f507f2006-12-13 04:49:30 +00002036 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 }
2038 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 int i;
2040 asdl_seq *targets;
2041 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 expr_ty expression;
2043
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 /* a normal assignment */
2045 REQ(CHILD(n, 1), EQUAL);
2046 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2047 if (!targets)
2048 return NULL;
2049 for (i = 0; i < NCH(n) - 2; i += 2) {
2050 expr_ty e;
2051 node *ch = CHILD(n, i);
2052 if (TYPE(ch) == yield_expr) {
2053 ast_error(ch, "assignment to yield expression not possible");
2054 return NULL;
2055 }
2056 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Thomas Wouters89f507f2006-12-13 04:49:30 +00002058 /* set context to assign */
2059 if (!e)
2060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061
Thomas Wouters89f507f2006-12-13 04:49:30 +00002062 if (!set_context(e, Store, CHILD(n, i)))
2063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064
Thomas Wouters89f507f2006-12-13 04:49:30 +00002065 asdl_seq_SET(targets, i / 2, e);
2066 }
2067 value = CHILD(n, NCH(n) - 1);
2068 if (TYPE(value) == testlist)
2069 expression = ast_for_testlist(c, value);
2070 else
2071 expression = ast_for_expr(c, value);
2072 if (!expression)
2073 return NULL;
2074 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076}
2077
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002079ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080{
2081 asdl_seq *seq;
2082 int i;
2083 expr_ty e;
2084
2085 REQ(n, exprlist);
2086
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002087 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 e = ast_for_expr(c, CHILD(n, i));
2092 if (!e)
2093 return NULL;
2094 asdl_seq_SET(seq, i / 2, e);
2095 if (context && !set_context(e, context, CHILD(n, i)))
2096 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 }
2098 return seq;
2099}
2100
2101static stmt_ty
2102ast_for_del_stmt(struct compiling *c, const node *n)
2103{
2104 asdl_seq *expr_list;
2105
2106 /* del_stmt: 'del' exprlist */
2107 REQ(n, del_stmt);
2108
2109 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2110 if (!expr_list)
2111 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002112 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113}
2114
2115static stmt_ty
2116ast_for_flow_stmt(struct compiling *c, const node *n)
2117{
2118 /*
2119 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2120 | yield_stmt
2121 break_stmt: 'break'
2122 continue_stmt: 'continue'
2123 return_stmt: 'return' [testlist]
2124 yield_stmt: yield_expr
2125 yield_expr: 'yield' testlist
2126 raise_stmt: 'raise' [test [',' test [',' test]]]
2127 */
2128 node *ch;
2129
2130 REQ(n, flow_stmt);
2131 ch = CHILD(n, 0);
2132 switch (TYPE(ch)) {
2133 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002134 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002136 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002138 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2139 if (!exp)
2140 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002141 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 }
2143 case return_stmt:
2144 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002145 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002147 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 if (!expression)
2149 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002150 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 }
2152 case raise_stmt:
2153 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002154 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 else if (NCH(ch) == 2) {
2156 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2157 if (!expression)
2158 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002159 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 }
2161 else if (NCH(ch) == 4) {
2162 expr_ty expr1, expr2;
2163
2164 expr1 = ast_for_expr(c, CHILD(ch, 1));
2165 if (!expr1)
2166 return NULL;
2167 expr2 = ast_for_expr(c, CHILD(ch, 3));
2168 if (!expr2)
2169 return NULL;
2170
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002171 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 }
2173 else if (NCH(ch) == 6) {
2174 expr_ty expr1, expr2, expr3;
2175
2176 expr1 = ast_for_expr(c, CHILD(ch, 1));
2177 if (!expr1)
2178 return NULL;
2179 expr2 = ast_for_expr(c, CHILD(ch, 3));
2180 if (!expr2)
2181 return NULL;
2182 expr3 = ast_for_expr(c, CHILD(ch, 5));
2183 if (!expr3)
2184 return NULL;
2185
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002186 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 }
2188 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002189 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 "unexpected flow_stmt: %d", TYPE(ch));
2191 return NULL;
2192 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002193
2194 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2195 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196}
2197
2198static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002199alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200{
2201 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002202 import_as_name: NAME ['as' NAME]
2203 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204 dotted_name: NAME ('.' NAME)*
2205 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002206 PyObject *str;
2207
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208 loop:
2209 switch (TYPE(n)) {
2210 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002211 str = NULL;
2212 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002213 str = NEW_IDENTIFIER(CHILD(n, 2));
2214 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002215 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 case dotted_as_name:
2217 if (NCH(n) == 1) {
2218 n = CHILD(n, 0);
2219 goto loop;
2220 }
2221 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002222 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002223 if (!a)
2224 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002225 assert(!a->asname);
2226 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2227 return a;
2228 }
2229 break;
2230 case dotted_name:
2231 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002232 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 else {
2234 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002235 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002236 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 char *s;
2238
2239 len = 0;
2240 for (i = 0; i < NCH(n); i += 2)
2241 /* length of string plus one for the dot */
2242 len += strlen(STR(CHILD(n, i))) + 1;
2243 len--; /* the last name doesn't have a dot */
2244 str = PyString_FromStringAndSize(NULL, len);
2245 if (!str)
2246 return NULL;
2247 s = PyString_AS_STRING(str);
2248 if (!s)
2249 return NULL;
2250 for (i = 0; i < NCH(n); i += 2) {
2251 char *sch = STR(CHILD(n, i));
2252 strcpy(s, STR(CHILD(n, i)));
2253 s += strlen(sch);
2254 *s++ = '.';
2255 }
2256 --s;
2257 *s = '\0';
2258 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002259 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002260 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261 }
2262 break;
2263 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002264 str = PyString_InternFromString("*");
2265 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002266 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002268 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269 "unexpected import name: %d", TYPE(n));
2270 return NULL;
2271 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002272
2273 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 return NULL;
2275}
2276
2277static stmt_ty
2278ast_for_import_stmt(struct compiling *c, const node *n)
2279{
2280 /*
2281 import_stmt: import_name | import_from
2282 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002283 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2284 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002286 int lineno;
2287 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 int i;
2289 asdl_seq *aliases;
2290
2291 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002292 lineno = LINENO(n);
2293 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002295 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002297 REQ(n, dotted_as_names);
2298 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2299 if (!aliases)
2300 return NULL;
2301 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002302 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002303 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002305 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002307 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002309 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002311 int idx, ndots = 0;
2312 alias_ty mod = NULL;
2313 identifier modname;
2314
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002315 /* Count the number of dots (for relative imports) and check for the
2316 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002317 for (idx = 1; idx < NCH(n); idx++) {
2318 if (TYPE(CHILD(n, idx)) == dotted_name) {
2319 mod = alias_for_import_name(c, CHILD(n, idx));
2320 idx++;
2321 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002322 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2323 /* three consecutive dots are tokenized as one ELLIPSIS */
2324 ndots += 3;
2325 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002326 } else if (TYPE(CHILD(n, idx)) != DOT) {
2327 break;
2328 }
2329 ndots++;
2330 }
2331 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002332 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002333 case STAR:
2334 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002335 n = CHILD(n, idx);
2336 n_children = 1;
2337 if (ndots) {
2338 ast_error(n, "'import *' not allowed with 'from .'");
2339 return NULL;
2340 }
2341 break;
2342 case LPAR:
2343 /* from ... import (x, y, z) */
2344 n = CHILD(n, idx + 1);
2345 n_children = NCH(n);
2346 break;
2347 case import_as_names:
2348 /* from ... import x, y, z */
2349 n = CHILD(n, idx);
2350 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002351 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 ast_error(n, "trailing comma not allowed without"
2353 " surrounding parentheses");
2354 return NULL;
2355 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002356 break;
2357 default:
2358 ast_error(n, "Unexpected node-type in from-import");
2359 return NULL;
2360 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002361
Thomas Wouters89f507f2006-12-13 04:49:30 +00002362 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2363 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365
2366 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002367 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002368 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002369 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002371 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002373 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002374 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002375 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2376 if (!import_alias)
2377 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002379 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002381 if (mod != NULL)
2382 modname = mod->name;
2383 else
2384 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002385 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002386 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 }
Neal Norwitz79792652005-11-14 04:25:03 +00002388 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 "unknown import statement: starts with command '%s'",
2390 STR(CHILD(n, 0)));
2391 return NULL;
2392}
2393
2394static stmt_ty
2395ast_for_global_stmt(struct compiling *c, const node *n)
2396{
2397 /* global_stmt: 'global' NAME (',' NAME)* */
2398 identifier name;
2399 asdl_seq *s;
2400 int i;
2401
2402 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002403 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002405 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002407 name = NEW_IDENTIFIER(CHILD(n, i));
2408 if (!name)
2409 return NULL;
2410 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002412 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413}
2414
2415static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002416ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2417{
2418 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2419 identifier name;
2420 asdl_seq *s;
2421 int i;
2422
2423 REQ(n, nonlocal_stmt);
2424 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2425 if (!s)
2426 return NULL;
2427 for (i = 1; i < NCH(n); i += 2) {
2428 name = NEW_IDENTIFIER(CHILD(n, i));
2429 if (!name)
2430 return NULL;
2431 asdl_seq_SET(s, i / 2, name);
2432 }
2433 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2434}
2435
2436static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437ast_for_assert_stmt(struct compiling *c, const node *n)
2438{
2439 /* assert_stmt: 'assert' test [',' test] */
2440 REQ(n, assert_stmt);
2441 if (NCH(n) == 2) {
2442 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2443 if (!expression)
2444 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002445 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 }
2447 else if (NCH(n) == 4) {
2448 expr_ty expr1, expr2;
2449
2450 expr1 = ast_for_expr(c, CHILD(n, 1));
2451 if (!expr1)
2452 return NULL;
2453 expr2 = ast_for_expr(c, CHILD(n, 3));
2454 if (!expr2)
2455 return NULL;
2456
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 }
Neal Norwitz79792652005-11-14 04:25:03 +00002459 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 "improper number of parts to 'assert' statement: %d",
2461 NCH(n));
2462 return NULL;
2463}
2464
2465static asdl_seq *
2466ast_for_suite(struct compiling *c, const node *n)
2467{
2468 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002469 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 stmt_ty s;
2471 int i, total, num, end, pos = 0;
2472 node *ch;
2473
2474 REQ(n, suite);
2475
2476 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002477 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 n = CHILD(n, 0);
2482 /* simple_stmt always ends with a NEWLINE,
2483 and may have a trailing SEMI
2484 */
2485 end = NCH(n) - 1;
2486 if (TYPE(CHILD(n, end - 1)) == SEMI)
2487 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002489 for (i = 0; i < end; i += 2) {
2490 ch = CHILD(n, i);
2491 s = ast_for_stmt(c, ch);
2492 if (!s)
2493 return NULL;
2494 asdl_seq_SET(seq, pos++, s);
2495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 }
2497 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 for (i = 2; i < (NCH(n) - 1); i++) {
2499 ch = CHILD(n, i);
2500 REQ(ch, stmt);
2501 num = num_stmts(ch);
2502 if (num == 1) {
2503 /* small_stmt or compound_stmt with only one child */
2504 s = ast_for_stmt(c, ch);
2505 if (!s)
2506 return NULL;
2507 asdl_seq_SET(seq, pos++, s);
2508 }
2509 else {
2510 int j;
2511 ch = CHILD(ch, 0);
2512 REQ(ch, simple_stmt);
2513 for (j = 0; j < NCH(ch); j += 2) {
2514 /* statement terminates with a semi-colon ';' */
2515 if (NCH(CHILD(ch, j)) == 0) {
2516 assert((j + 1) == NCH(ch));
2517 break;
2518 }
2519 s = ast_for_stmt(c, CHILD(ch, j));
2520 if (!s)
2521 return NULL;
2522 asdl_seq_SET(seq, pos++, s);
2523 }
2524 }
2525 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 }
2527 assert(pos == seq->size);
2528 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529}
2530
2531static stmt_ty
2532ast_for_if_stmt(struct compiling *c, const node *n)
2533{
2534 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2535 ['else' ':' suite]
2536 */
2537 char *s;
2538
2539 REQ(n, if_stmt);
2540
2541 if (NCH(n) == 4) {
2542 expr_ty expression;
2543 asdl_seq *suite_seq;
2544
2545 expression = ast_for_expr(c, CHILD(n, 1));
2546 if (!expression)
2547 return NULL;
2548 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002549 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 return NULL;
2551
Guido van Rossumd8faa362007-04-27 19:54:29 +00002552 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2553 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002555
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 s = STR(CHILD(n, 4));
2557 /* s[2], the third character in the string, will be
2558 's' for el_s_e, or
2559 'i' for el_i_f
2560 */
2561 if (s[2] == 's') {
2562 expr_ty expression;
2563 asdl_seq *seq1, *seq2;
2564
2565 expression = ast_for_expr(c, CHILD(n, 1));
2566 if (!expression)
2567 return NULL;
2568 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002569 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 return NULL;
2571 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002572 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 return NULL;
2574
Guido van Rossumd8faa362007-04-27 19:54:29 +00002575 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2576 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 }
2578 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002580 expr_ty expression;
2581 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002582 asdl_seq *orelse = NULL;
2583 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 /* must reference the child n_elif+1 since 'else' token is third,
2585 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002586 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2587 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2588 has_else = 1;
2589 n_elif -= 3;
2590 }
2591 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592
Thomas Wouters89f507f2006-12-13 04:49:30 +00002593 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002594 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595
Thomas Wouters89f507f2006-12-13 04:49:30 +00002596 orelse = asdl_seq_new(1, c->c_arena);
2597 if (!orelse)
2598 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002600 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002602 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2603 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002605 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2606 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608
Guido van Rossumd8faa362007-04-27 19:54:29 +00002609 asdl_seq_SET(orelse, 0,
2610 If(expression, suite_seq, suite_seq2,
2611 LINENO(CHILD(n, NCH(n) - 6)),
2612 CHILD(n, NCH(n) - 6)->n_col_offset,
2613 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 /* the just-created orelse handled the last elif */
2615 n_elif--;
2616 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617
Thomas Wouters89f507f2006-12-13 04:49:30 +00002618 for (i = 0; i < n_elif; i++) {
2619 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002620 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2621 if (!newobj)
2622 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002624 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002627 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 asdl_seq_SET(newobj, 0,
2631 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002632 LINENO(CHILD(n, off)),
2633 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 orelse = newobj;
2635 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002636 expression = ast_for_expr(c, CHILD(n, 1));
2637 if (!expression)
2638 return NULL;
2639 suite_seq = ast_for_suite(c, CHILD(n, 3));
2640 if (!suite_seq)
2641 return NULL;
2642 return If(expression, suite_seq, orelse,
2643 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002645
2646 PyErr_Format(PyExc_SystemError,
2647 "unexpected token in 'if' statement: %s", s);
2648 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649}
2650
2651static stmt_ty
2652ast_for_while_stmt(struct compiling *c, const node *n)
2653{
2654 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2655 REQ(n, while_stmt);
2656
2657 if (NCH(n) == 4) {
2658 expr_ty expression;
2659 asdl_seq *suite_seq;
2660
2661 expression = ast_for_expr(c, CHILD(n, 1));
2662 if (!expression)
2663 return NULL;
2664 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002665 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002667 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 }
2669 else if (NCH(n) == 7) {
2670 expr_ty expression;
2671 asdl_seq *seq1, *seq2;
2672
2673 expression = ast_for_expr(c, CHILD(n, 1));
2674 if (!expression)
2675 return NULL;
2676 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 return NULL;
2679 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002680 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 return NULL;
2682
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002685
2686 PyErr_Format(PyExc_SystemError,
2687 "wrong number of tokens for 'while' statement: %d",
2688 NCH(n));
2689 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690}
2691
2692static stmt_ty
2693ast_for_for_stmt(struct compiling *c, const node *n)
2694{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002695 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 expr_ty expression;
2697 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002698 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2700 REQ(n, for_stmt);
2701
2702 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002703 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 if (!seq)
2705 return NULL;
2706 }
2707
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002708 node_target = CHILD(n, 1);
2709 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002710 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002712 /* Check the # of children rather than the length of _target, since
2713 for x, in ... has 1 element in _target, but still requires a Tuple. */
2714 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002717 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002719 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002720 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 return NULL;
2722 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002723 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 return NULL;
2725
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002726 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2727 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728}
2729
2730static excepthandler_ty
2731ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2732{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002733 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 REQ(exc, except_clause);
2735 REQ(body, suite);
2736
2737 if (NCH(exc) == 1) {
2738 asdl_seq *suite_seq = ast_for_suite(c, body);
2739 if (!suite_seq)
2740 return NULL;
2741
Thomas Wouters89f507f2006-12-13 04:49:30 +00002742 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002743 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 }
2745 else if (NCH(exc) == 2) {
2746 expr_ty expression;
2747 asdl_seq *suite_seq;
2748
2749 expression = ast_for_expr(c, CHILD(exc, 1));
2750 if (!expression)
2751 return NULL;
2752 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002753 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 return NULL;
2755
Thomas Wouters89f507f2006-12-13 04:49:30 +00002756 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002757 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 }
2759 else if (NCH(exc) == 4) {
2760 asdl_seq *suite_seq;
2761 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002762 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002763 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002766 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 return NULL;
2768 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002769 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 return NULL;
2771
Thomas Wouters89f507f2006-12-13 04:49:30 +00002772 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002773 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002775
2776 PyErr_Format(PyExc_SystemError,
2777 "wrong number of children for 'except' clause: %d",
2778 NCH(exc));
2779 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780}
2781
2782static stmt_ty
2783ast_for_try_stmt(struct compiling *c, const node *n)
2784{
Neal Norwitzf599f422005-12-17 21:33:47 +00002785 const int nch = NCH(n);
2786 int n_except = (nch - 3)/3;
2787 asdl_seq *body, *orelse = NULL, *finally = NULL;
2788
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 REQ(n, try_stmt);
2790
Neal Norwitzf599f422005-12-17 21:33:47 +00002791 body = ast_for_suite(c, CHILD(n, 2));
2792 if (body == NULL)
2793 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794
Neal Norwitzf599f422005-12-17 21:33:47 +00002795 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2796 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2797 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2798 /* we can assume it's an "else",
2799 because nch >= 9 for try-else-finally and
2800 it would otherwise have a type of except_clause */
2801 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2802 if (orelse == NULL)
2803 return NULL;
2804 n_except--;
2805 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806
Neal Norwitzf599f422005-12-17 21:33:47 +00002807 finally = ast_for_suite(c, CHILD(n, nch - 1));
2808 if (finally == NULL)
2809 return NULL;
2810 n_except--;
2811 }
2812 else {
2813 /* we can assume it's an "else",
2814 otherwise it would have a type of except_clause */
2815 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2816 if (orelse == NULL)
2817 return NULL;
2818 n_except--;
2819 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002821 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002822 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 return NULL;
2824 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002825
2826 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002827 int i;
2828 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002829 /* process except statements to create a try ... except */
2830 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2831 if (handlers == NULL)
2832 return NULL;
2833
2834 for (i = 0; i < n_except; i++) {
2835 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2836 CHILD(n, 5 + i * 3));
2837 if (!e)
2838 return NULL;
2839 asdl_seq_SET(handlers, i, e);
2840 }
2841
Thomas Wouters89f507f2006-12-13 04:49:30 +00002842 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002843 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002844 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002845 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002846
2847 /* if a 'finally' is present too, we nest the TryExcept within a
2848 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002849 body = asdl_seq_new(1, c->c_arena);
2850 if (body == NULL)
2851 return NULL;
2852 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002853 }
2854
2855 /* must be a try ... finally (except clauses are in body, if any exist) */
2856 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002857 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858}
2859
Guido van Rossumc2e20742006-02-27 22:32:47 +00002860static expr_ty
2861ast_for_with_var(struct compiling *c, const node *n)
2862{
2863 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002864 return ast_for_expr(c, CHILD(n, 1));
2865}
2866
2867/* with_stmt: 'with' test [ with_var ] ':' suite */
2868static stmt_ty
2869ast_for_with_stmt(struct compiling *c, const node *n)
2870{
2871 expr_ty context_expr, optional_vars = NULL;
2872 int suite_index = 3; /* skip 'with', test, and ':' */
2873 asdl_seq *suite_seq;
2874
2875 assert(TYPE(n) == with_stmt);
2876 context_expr = ast_for_expr(c, CHILD(n, 1));
2877 if (TYPE(CHILD(n, 2)) == with_var) {
2878 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2879
2880 if (!optional_vars) {
2881 return NULL;
2882 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002883 if (!set_context(optional_vars, Store, n)) {
2884 return NULL;
2885 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002886 suite_index = 4;
2887 }
2888
2889 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2890 if (!suite_seq) {
2891 return NULL;
2892 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002893 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002894 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002895}
2896
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002898ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002900 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2901 asdl_seq *s;
2902 expr_ty call, dummy;
2903
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002904 REQ(n, classdef);
2905
2906 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002907 ast_error(n, "assignment to None");
2908 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 }
2910
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002911 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 s = ast_for_suite(c, CHILD(n, 3));
2913 if (!s)
2914 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002915 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002916 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002918
2919 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920 s = ast_for_suite(c, CHILD(n,5));
2921 if (!s)
2922 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002923 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002924 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 }
2926
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002927 /* class NAME '(' arglist ')' ':' suite */
2928 /* build up a fake Call node so we can extract its pieces */
2929 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2930 call = ast_for_call(c, CHILD(n, 3), dummy);
2931 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002934 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002936
2937 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2938 call->v.Call.args, call->v.Call.keywords,
2939 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002940 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941}
2942
2943static stmt_ty
2944ast_for_stmt(struct compiling *c, const node *n)
2945{
2946 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002947 assert(NCH(n) == 1);
2948 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 }
2950 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002951 assert(num_stmts(n) == 1);
2952 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953 }
2954 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002955 REQ(n, small_stmt);
2956 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002957 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2958 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 */
2960 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961 case expr_stmt:
2962 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 case del_stmt:
2964 return ast_for_del_stmt(c, n);
2965 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002966 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 case flow_stmt:
2968 return ast_for_flow_stmt(c, n);
2969 case import_stmt:
2970 return ast_for_import_stmt(c, n);
2971 case global_stmt:
2972 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002973 case nonlocal_stmt:
2974 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 case assert_stmt:
2976 return ast_for_assert_stmt(c, n);
2977 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002978 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2980 TYPE(n), NCH(n));
2981 return NULL;
2982 }
2983 }
2984 else {
2985 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002986 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00002987 */
2988 node *ch = CHILD(n, 0);
2989 REQ(n, compound_stmt);
2990 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 case if_stmt:
2992 return ast_for_if_stmt(c, ch);
2993 case while_stmt:
2994 return ast_for_while_stmt(c, ch);
2995 case for_stmt:
2996 return ast_for_for_stmt(c, ch);
2997 case try_stmt:
2998 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002999 case with_stmt:
3000 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003002 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003004 return ast_for_classdef(c, ch, NULL);
3005 case decorated:
3006 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003008 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3010 TYPE(n), NCH(n));
3011 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003012 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 }
3014}
3015
3016static PyObject *
3017parsenumber(const char *s)
3018{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003019 const char *end;
3020 long x;
3021 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003023 Py_complex c;
3024 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025#endif
3026
Guido van Rossumd8faa362007-04-27 19:54:29 +00003027 errno = 0;
3028 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003030 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003032 if (*end == 'l' || *end == 'L')
3033 return PyLong_FromString((char *)s, (char **)0, 0);
3034 if (s[0] == '0') {
3035 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3036 if (x < 0 && errno == 0) {
3037 return PyLong_FromString((char *)s,
3038 (char **)0,
3039 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003040 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003041 }
3042 else
3043 x = PyOS_strtol((char *)s, (char **)&end, 0);
3044 if (*end == '\0') {
3045 if (errno != 0)
3046 return PyLong_FromString((char *)s, (char **)0, 0);
3047 return PyInt_FromLong(x);
3048 }
3049 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003051 if (imflag) {
3052 c.real = 0.;
3053 PyFPE_START_PROTECT("atof", return 0)
3054 c.imag = PyOS_ascii_atof(s);
3055 PyFPE_END_PROTECT(c)
3056 return PyComplex_FromCComplex(c);
3057 }
3058 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003060 {
3061 PyFPE_START_PROTECT("atof", return 0)
3062 dx = PyOS_ascii_atof(s);
3063 PyFPE_END_PROTECT(dx)
3064 return PyFloat_FromDouble(dx);
3065 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066}
3067
3068static PyObject *
3069decode_utf8(const char **sPtr, const char *end, char* encoding)
3070{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003071 PyObject *u, *v;
3072 char *s, *t;
3073 t = s = (char *)*sPtr;
3074 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3075 while (s < end && (*s & 0x80)) s++;
3076 *sPtr = s;
3077 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3078 if (u == NULL)
3079 return NULL;
3080 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3081 Py_DECREF(u);
3082 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083}
3084
3085static PyObject *
3086decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3087{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003088 PyObject *v, *u;
3089 char *buf;
3090 char *p;
3091 const char *end;
3092 if (encoding == NULL) {
3093 buf = (char *)s;
3094 u = NULL;
3095 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3096 buf = (char *)s;
3097 u = NULL;
3098 } else {
3099 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3100 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3101 if (u == NULL)
3102 return NULL;
3103 p = buf = PyString_AsString(u);
3104 end = s + len;
3105 while (s < end) {
3106 if (*s == '\\') {
3107 *p++ = *s++;
3108 if (*s & 0x80) {
3109 strcpy(p, "u005c");
3110 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003111 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003112 }
3113 if (*s & 0x80) { /* XXX inefficient */
3114 PyObject *w;
3115 char *r;
3116 Py_ssize_t rn, i;
3117 w = decode_utf8(&s, end, "utf-16-be");
3118 if (w == NULL) {
3119 Py_DECREF(u);
3120 return NULL;
3121 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003122 assert(PyBytes_Check(w));
3123 r = PyBytes_AsString(w);
3124 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003125 assert(rn % 2 == 0);
3126 for (i = 0; i < rn; i += 2) {
3127 sprintf(p, "\\u%02x%02x",
3128 r[i + 0] & 0xFF,
3129 r[i + 1] & 0xFF);
3130 p += 6;
3131 }
3132 Py_DECREF(w);
3133 } else {
3134 *p++ = *s++;
3135 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003136 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003137 len = p - buf;
3138 s = buf;
3139 }
3140 if (rawmode)
3141 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3142 else
3143 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3144 Py_XDECREF(u);
3145 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146}
3147
3148/* s is a Python string literal, including the bracketing quote characters,
3149 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3150 * parsestr parses it, and returns the decoded Python string object.
3151 */
3152static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003153parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003155 size_t len;
3156 const char *s = STR(n);
3157 int quote = Py_CHARMASK(*s);
3158 int rawmode = 0;
3159 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 if (quote == 'b' || quote == 'B') {
3163 quote = *++s;
3164 *bytesmode = 1;
3165 }
3166 if (quote == 'r' || quote == 'R') {
3167 quote = *++s;
3168 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003169 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 }
3171 if (quote != '\'' && quote != '\"') {
3172 PyErr_BadInternalCall();
3173 return NULL;
3174 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 s++;
3176 len = strlen(s);
3177 if (len > INT_MAX) {
3178 PyErr_SetString(PyExc_OverflowError,
3179 "string to parse is too long");
3180 return NULL;
3181 }
3182 if (s[--len] != quote) {
3183 PyErr_BadInternalCall();
3184 return NULL;
3185 }
3186 if (len >= 4 && s[0] == quote && s[1] == quote) {
3187 s += 2;
3188 len -= 2;
3189 if (s[--len] != quote || s[--len] != quote) {
3190 PyErr_BadInternalCall();
3191 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003192 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003194 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003195 return decode_unicode(s, len, rawmode, encoding);
3196 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003197 if (*bytesmode) {
3198 /* Disallow non-ascii characters (but not escapes) */
3199 const char *c;
3200 for (c = s; *c; c++) {
3201 if (Py_CHARMASK(*c) >= 0x80) {
3202 ast_error(n, "bytes can only contain ASCII "
3203 "literal characters.");
3204 return NULL;
3205 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003206 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 }
3208 need_encoding = (!*bytesmode && encoding != NULL &&
3209 strcmp(encoding, "utf-8") != 0 &&
3210 strcmp(encoding, "iso-8859-1") != 0);
3211 if (rawmode || strchr(s, '\\') == NULL) {
3212 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003213 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3214 if (u == NULL)
3215 return NULL;
3216 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3217 Py_DECREF(u);
3218 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003219 } else {
3220 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003221 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003222 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223
Guido van Rossumbdde0112007-05-11 16:26:27 +00003224 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003225 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226}
3227
3228/* Build a Python string object out of a STRING atom. This takes care of
3229 * compile-time literal catenation, calling parsestr() on each piece, and
3230 * pasting the intermediate results together.
3231 */
3232static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003233parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003235 PyObject *v;
3236 int i;
3237 REQ(CHILD(n, 0), STRING);
3238 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3239 if (v != NULL) {
3240 /* String literal concatenation */
3241 for (i = 1; i < NCH(n); i++) {
3242 PyObject *s;
3243 int subbm = 0;
3244 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3245 if (s == NULL)
3246 goto onError;
3247 if (*bytesmode != subbm) {
3248 ast_error(n, "cannot mix bytes and nonbytes"
3249 "literals");
3250 goto onError;
3251 }
3252 if (PyString_Check(v) && PyString_Check(s)) {
3253 PyString_ConcatAndDel(&v, s);
3254 if (v == NULL)
3255 goto onError;
3256 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 else {
3258 PyObject *temp = PyUnicode_Concat(v, s);
3259 Py_DECREF(s);
3260 Py_DECREF(v);
3261 v = temp;
3262 if (v == NULL)
3263 goto onError;
3264 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003265 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003266 }
3267 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 onError:
3270 Py_XDECREF(v);
3271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272}