blob: 23df29fc13db1b6f546dde1855d52892abbdb803 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000031static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
36static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000037static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
38static PyObject *parsestrplus(struct compiling *, const node *n,
39 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000042#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#endif
44
Nick Coghlan650f0d02007-04-15 12:05:43 +000045#define COMP_GENEXP 0
46#define COMP_LISTCOMP 1
47#define COMP_SETCOMP 2
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
Martin v. Löwis5b222132007-06-10 09:51:05 +000051 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
52 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000053 PyArena_AddPyObject(arena, id);
54 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055}
56
Neal Norwitzadb69fc2005-12-17 20:54:49 +000057#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000058
59/* This routine provides an invalid object for the syntax error.
60 The outermost routine must unpack this error and create the
61 proper object. We do this so that we don't have to pass
62 the filename to everything function.
63
64 XXX Maybe we should just pass the filename...
65*/
66
67static int
68ast_error(const node *n, const char *errstr)
69{
70 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
71 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000072 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000073 PyErr_SetObject(PyExc_SyntaxError, u);
74 Py_DECREF(u);
75 return 0;
76}
77
78static void
79ast_error_finish(const char *filename)
80{
81 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000082 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000083
84 assert(PyErr_Occurred());
85 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +000086 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000087
88 PyErr_Fetch(&type, &value, &tback);
89 errstr = PyTuple_GetItem(value, 0);
90 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +000091 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 Py_INCREF(errstr);
93 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000094 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 Py_DECREF(errstr);
96 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000097 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098 Py_DECREF(value);
99
100 loc = PyErr_ProgramText(filename, lineno);
101 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000102 Py_INCREF(Py_None);
103 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000107 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000108 Py_DECREF(errstr);
109 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000110 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112 Py_DECREF(errstr);
113 Py_DECREF(tmp);
114 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000116 PyErr_Restore(type, value, tback);
117}
118
119/* num_stmts() returns number of contained statements.
120
121 Use this routine to determine how big a sequence is needed for
122 the statements in a parse tree. Its raison d'etre is this bit of
123 grammar:
124
125 stmt: simple_stmt | compound_stmt
126 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
127
128 A simple_stmt can contain multiple small_stmt elements joined
129 by semicolons. If the arg is a simple_stmt, the number of
130 small_stmt elements is returned.
131*/
132
133static int
134num_stmts(const node *n)
135{
136 int i, l;
137 node *ch;
138
139 switch (TYPE(n)) {
140 case single_input:
141 if (TYPE(CHILD(n, 0)) == NEWLINE)
142 return 0;
143 else
144 return num_stmts(CHILD(n, 0));
145 case file_input:
146 l = 0;
147 for (i = 0; i < NCH(n); i++) {
148 ch = CHILD(n, i);
149 if (TYPE(ch) == stmt)
150 l += num_stmts(ch);
151 }
152 return l;
153 case stmt:
154 return num_stmts(CHILD(n, 0));
155 case compound_stmt:
156 return 1;
157 case simple_stmt:
158 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
159 case suite:
160 if (NCH(n) == 1)
161 return num_stmts(CHILD(n, 0));
162 else {
163 l = 0;
164 for (i = 2; i < (NCH(n) - 1); i++)
165 l += num_stmts(CHILD(n, i));
166 return l;
167 }
168 default: {
169 char buf[128];
170
171 sprintf(buf, "Non-statement found: %d %d\n",
172 TYPE(n), NCH(n));
173 Py_FatalError(buf);
174 }
175 }
176 assert(0);
177 return 0;
178}
179
180/* Transform the CST rooted at node * to the appropriate AST
181*/
182
183mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000184PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
185 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000187 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188 asdl_seq *stmts = NULL;
189 stmt_ty s;
190 node *ch;
191 struct compiling c;
192
193 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000194 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000195 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000196#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000197 ast_error(n, "encoding declaration in Unicode string");
198 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000199#endif
200 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000202 } else if (TYPE(n) == encoding_decl) {
203 c.c_encoding = STR(n);
204 n = CHILD(n, 0);
205 } else {
206 c.c_encoding = NULL;
207 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000208 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 switch (TYPE(n)) {
212 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000213 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000214 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000215 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216 for (i = 0; i < NCH(n) - 1; i++) {
217 ch = CHILD(n, i);
218 if (TYPE(ch) == NEWLINE)
219 continue;
220 REQ(ch, stmt);
221 num = num_stmts(ch);
222 if (num == 1) {
223 s = ast_for_stmt(&c, ch);
224 if (!s)
225 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000226 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227 }
228 else {
229 ch = CHILD(ch, 0);
230 REQ(ch, simple_stmt);
231 for (j = 0; j < num; j++) {
232 s = ast_for_stmt(&c, CHILD(ch, j * 2));
233 if (!s)
234 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 }
237 }
238 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000239 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000240 case eval_input: {
241 expr_ty testlist_ast;
242
Nick Coghlan650f0d02007-04-15 12:05:43 +0000243 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000244 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245 if (!testlist_ast)
246 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 }
249 case single_input:
250 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000251 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000253 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000254 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
255 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000256 if (!asdl_seq_GET(stmts, 0))
257 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000258 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 }
260 else {
261 n = CHILD(n, 0);
262 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000263 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000265 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000266 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000267 s = ast_for_stmt(&c, n);
268 if (!s)
269 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 asdl_seq_SET(stmts, 0, s);
271 }
272 else {
273 /* Only a simple_stmt can contain multiple statements. */
274 REQ(n, simple_stmt);
275 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000276 if (TYPE(CHILD(n, i)) == NEWLINE)
277 break;
278 s = ast_for_stmt(&c, CHILD(n, i));
279 if (!s)
280 goto error;
281 asdl_seq_SET(stmts, i / 2, s);
282 }
283 }
284
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000285 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 }
287 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000288 PyErr_Format(PyExc_SystemError,
289 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 goto error;
291 }
292 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000293 ast_error_finish(filename);
294 return NULL;
295}
296
297/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
298*/
299
300static operator_ty
301get_operator(const node *n)
302{
303 switch (TYPE(n)) {
304 case VBAR:
305 return BitOr;
306 case CIRCUMFLEX:
307 return BitXor;
308 case AMPER:
309 return BitAnd;
310 case LEFTSHIFT:
311 return LShift;
312 case RIGHTSHIFT:
313 return RShift;
314 case PLUS:
315 return Add;
316 case MINUS:
317 return Sub;
318 case STAR:
319 return Mult;
320 case SLASH:
321 return Div;
322 case DOUBLESLASH:
323 return FloorDiv;
324 case PERCENT:
325 return Mod;
326 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000327 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328 }
329}
330
Guido van Rossume7ba4952007-06-06 23:52:48 +0000331static const char* FORBIDDEN[] = {
332 "None",
333 "True",
334 "False",
335 NULL,
336};
337
338static int
339forbidden_name(expr_ty e, const node *n)
340{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000341 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000342 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000343 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000344 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000345 ast_error(n, "assignment to keyword");
346 return 1;
347 }
348 }
349 return 0;
350}
351
Jeremy Hyltona8293132006-02-28 17:58:27 +0000352/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353
354 Only sets context for expr kinds that "can appear in assignment context"
355 (according to ../Parser/Python.asdl). For other expr kinds, it sets
356 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000357*/
358
359static int
360set_context(expr_ty e, expr_context_ty ctx, const node *n)
361{
362 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000363 /* If a particular expression type can't be used for assign / delete,
364 set expr_name to its name and an error message will be generated.
365 */
366 const char* expr_name = NULL;
367
368 /* The ast defines augmented store and load contexts, but the
369 implementation here doesn't actually use them. The code may be
370 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000371 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000372 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000373 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000374 */
375 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000376
377 switch (e->kind) {
378 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000379 e->v.Attribute.ctx = ctx;
380 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000382 e->v.Subscript.ctx = ctx;
383 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000384 case Starred_kind:
385 e->v.Starred.ctx = ctx;
386 if (!set_context(e->v.Starred.value, ctx, n))
387 return 0;
388 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000390 if (ctx == Store) {
391 if (forbidden_name(e, n))
392 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000393 }
394 e->v.Name.ctx = ctx;
395 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000397 e->v.List.ctx = ctx;
398 s = e->v.List.elts;
399 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000400 case Tuple_kind:
401 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
402 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000403 e->v.Tuple.ctx = ctx;
404 s = e->v.Tuple.elts;
405 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000406 case Lambda_kind:
407 expr_name = "lambda";
408 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000409 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000411 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000412 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000413 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000414 case UnaryOp_kind:
415 expr_name = "operator";
416 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000418 expr_name = "generator expression";
419 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000420 case Yield_kind:
421 expr_name = "yield expression";
422 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000423 case ListComp_kind:
424 expr_name = "list comprehension";
425 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000426 case SetComp_kind:
427 expr_name = "set comprehension";
428 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000429 case DictComp_kind:
430 expr_name = "dict comprehension";
431 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000433 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 case Num_kind:
435 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 expr_name = "literal";
437 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000438 case Ellipsis_kind:
439 expr_name = "Ellipsis";
440 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000441 case Compare_kind:
442 expr_name = "comparison";
443 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000444 case IfExp_kind:
445 expr_name = "conditional expression";
446 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000447 default:
448 PyErr_Format(PyExc_SystemError,
449 "unexpected expression in assignment %d (line %d)",
450 e->kind, e->lineno);
451 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000452 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000453 /* Check for error string set by switch */
454 if (expr_name) {
455 char buf[300];
456 PyOS_snprintf(buf, sizeof(buf),
457 "can't %s %s",
458 ctx == Store ? "assign to" : "delete",
459 expr_name);
460 return ast_error(n, buf);
461 }
462
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000464 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000465 */
466 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000467 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000468
Thomas Wouters89f507f2006-12-13 04:49:30 +0000469 for (i = 0; i < asdl_seq_LEN(s); i++) {
470 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
471 return 0;
472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000473 }
474 return 1;
475}
476
477static operator_ty
478ast_for_augassign(const node *n)
479{
480 REQ(n, augassign);
481 n = CHILD(n, 0);
482 switch (STR(n)[0]) {
483 case '+':
484 return Add;
485 case '-':
486 return Sub;
487 case '/':
488 if (STR(n)[1] == '/')
489 return FloorDiv;
490 else
491 return Div;
492 case '%':
493 return Mod;
494 case '<':
495 return LShift;
496 case '>':
497 return RShift;
498 case '&':
499 return BitAnd;
500 case '^':
501 return BitXor;
502 case '|':
503 return BitOr;
504 case '*':
505 if (STR(n)[1] == '*')
506 return Pow;
507 else
508 return Mult;
509 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000510 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000511 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000512 }
513}
514
515static cmpop_ty
516ast_for_comp_op(const node *n)
517{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000518 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519 |'is' 'not'
520 */
521 REQ(n, comp_op);
522 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000523 n = CHILD(n, 0);
524 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525 case LESS:
526 return Lt;
527 case GREATER:
528 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000529 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000530 return Eq;
531 case LESSEQUAL:
532 return LtE;
533 case GREATEREQUAL:
534 return GtE;
535 case NOTEQUAL:
536 return NotEq;
537 case NAME:
538 if (strcmp(STR(n), "in") == 0)
539 return In;
540 if (strcmp(STR(n), "is") == 0)
541 return Is;
542 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000543 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000545 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000546 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547 }
548 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 /* handle "not in" and "is not" */
550 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551 case NAME:
552 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
553 return NotIn;
554 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
555 return IsNot;
556 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000557 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000559 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000560 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561 }
Neal Norwitz79792652005-11-14 04:25:03 +0000562 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000564 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000565}
566
567static asdl_seq *
568seq_for_testlist(struct compiling *c, const node *n)
569{
570 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000571 asdl_seq *seq;
572 expr_ty expression;
573 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000574 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000576 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577 if (!seq)
578 return NULL;
579
580 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000581 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582
583 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000584 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586
587 assert(i / 2 < seq->size);
588 asdl_seq_SET(seq, i / 2, expression);
589 }
590 return seq;
591}
592
Neal Norwitzc1505362006-12-28 06:47:50 +0000593static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000594compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000595{
596 identifier name;
597 expr_ty annotation = NULL;
598 node *ch;
599
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000600 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000601 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000602 name = NEW_IDENTIFIER(ch);
603 if (!name)
604 return NULL;
605
606 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
607 annotation = ast_for_expr(c, CHILD(n, 2));
608 if (!annotation)
609 return NULL;
610 }
611
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000612 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613}
614
Guido van Rossum4f72a782006-10-27 23:31:49 +0000615/* returns -1 if failed to handle keyword only arguments
616 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000617 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000618 ^^^
619 start pointing here
620 */
621static int
622handle_keywordonly_args(struct compiling *c, const node *n, int start,
623 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
624{
625 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000626 expr_ty expression, annotation;
627 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000628 int i = start;
629 int j = 0; /* index for kwdefaults and kwonlyargs */
630 assert(kwonlyargs != NULL);
631 assert(kwdefaults != NULL);
632 while (i < NCH(n)) {
633 ch = CHILD(n, i);
634 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000635 case vfpdef:
636 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000637 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000638 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000639 asdl_seq_SET(kwdefaults, j, expression);
640 i += 2; /* '=' and test */
641 }
642 else { /* setting NULL if no default value exists */
643 asdl_seq_SET(kwdefaults, j, NULL);
644 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000645 if (NCH(ch) == 3) {
646 /* ch is NAME ':' test */
647 annotation = ast_for_expr(c, CHILD(ch, 2));
648 if (!annotation) {
649 ast_error(ch, "expected expression");
650 goto error;
651 }
652 }
653 else {
654 annotation = NULL;
655 }
656 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000657 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000658 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000659 ast_error(ch, "expecting name");
660 goto error;
661 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000662 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000663 i += 2; /* the name and the comma */
664 break;
665 case DOUBLESTAR:
666 return i;
667 default:
668 ast_error(ch, "unexpected node");
669 goto error;
670 }
671 }
672 return i;
673 error:
674 return -1;
675}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000676
Jeremy Hyltona8293132006-02-28 17:58:27 +0000677/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000678
679static arguments_ty
680ast_for_arguments(struct compiling *c, const node *n)
681{
Neal Norwitzc1505362006-12-28 06:47:50 +0000682 /* This function handles both typedargslist (function definition)
683 and varargslist (lambda definition).
684
685 parameters: '(' [typedargslist] ')'
686 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000687 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
688 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000689 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000690 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000691 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000692 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
693 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000694 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000695 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000696 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000697 int i, j, k, nposargs = 0, nkwonlyargs = 0;
698 int nposdefaults = 0, found_default = 0;
699 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000701 arg_ty arg;
702 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703 node *ch;
704
705 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000706 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000707 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
708 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000709 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000710 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000711 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712
Guido van Rossum4f72a782006-10-27 23:31:49 +0000713 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000715 ch = CHILD(n, i);
716 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000717 /* skip star and possible argument */
718 i++;
719 i += (TYPE(CHILD(n, i)) == tfpdef
720 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000721 break;
722 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000723 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000724 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000725 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000727 /* count the number of keyword only args &
728 defaults for keyword only args */
729 for ( ; i < NCH(n); ++i) {
730 ch = CHILD(n, i);
731 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000732 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000733 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000734 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
735 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000736 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000737 kwonlyargs = (nkwonlyargs ?
738 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
739 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000740 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000741 posdefaults = (nposdefaults ?
742 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
743 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000744 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000745 /* The length of kwonlyargs and kwdefaults are same
746 since we set NULL as default for keyword only argument w/o default
747 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000748 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000749 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
750 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000751 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000752
753 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000754 ast_error(n, "more than 255 arguments");
755 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000756 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000758 /* tfpdef: NAME [':' test]
759 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760 */
761 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000762 j = 0; /* index for defaults */
763 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000765 ch = CHILD(n, i);
766 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000767 case tfpdef:
768 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
770 anything other than EQUAL or a comma? */
771 /* XXX Should NCH(n) check be made a separate check? */
772 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000773 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
774 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000775 goto error;
776 assert(posdefaults != NULL);
777 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000779 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 else if (found_default) {
782 ast_error(n,
783 "non-default argument follows default argument");
784 goto error;
785 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000786 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000787 if (!arg)
788 goto error;
789 asdl_seq_SET(posargs, k++, arg);
790
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 i += 2; /* the name and the comma */
792 break;
793 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 if (i+1 >= NCH(n)) {
795 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000796 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000797 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000798 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000799 if (TYPE(ch) == COMMA) {
800 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 i += 2; /* now follows keyword only arguments */
802 res = handle_keywordonly_args(c, n, i,
803 kwonlyargs, kwdefaults);
804 if (res == -1) goto error;
805 i = res; /* res has new position to process */
806 }
807 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000808 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
809 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000810 /* there is an annotation on the vararg */
811 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000812 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000813 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000814 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
815 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000816 int res = 0;
817 res = handle_keywordonly_args(c, n, i,
818 kwonlyargs, kwdefaults);
819 if (res == -1) goto error;
820 i = res; /* res has new position to process */
821 }
822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823 break;
824 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000825 ch = CHILD(n, i+1); /* tfpdef */
826 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000827 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
828 if (NCH(ch) > 1) {
829 /* there is an annotation on the kwarg */
830 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
831 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832 i += 3;
833 break;
834 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000835 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 "unexpected node in varargslist: %d @ %d",
837 TYPE(ch), i);
838 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000839 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000841 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
842 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000844 Py_XDECREF(vararg);
845 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846 return NULL;
847}
848
849static expr_ty
850ast_for_dotted_name(struct compiling *c, const node *n)
851{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000852 expr_ty e;
853 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000854 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000855 int i;
856
857 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000858
859 lineno = LINENO(n);
860 col_offset = n->n_col_offset;
861
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862 id = NEW_IDENTIFIER(CHILD(n, 0));
863 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000864 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000865 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000867 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868
869 for (i = 2; i < NCH(n); i+=2) {
870 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000871 if (!id)
872 return NULL;
873 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
874 if (!e)
875 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 }
877
878 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000879}
880
881static expr_ty
882ast_for_decorator(struct compiling *c, const node *n)
883{
884 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
885 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000886 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887
888 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000889 REQ(CHILD(n, 0), AT);
890 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891
892 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
893 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894 return NULL;
895
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000896 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000897 d = name_expr;
898 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 }
900 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000901 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000902 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000903 if (!d)
904 return NULL;
905 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 }
907 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000908 d = ast_for_call(c, CHILD(n, 3), name_expr);
909 if (!d)
910 return NULL;
911 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 }
913
914 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000915}
916
917static asdl_seq*
918ast_for_decorators(struct compiling *c, const node *n)
919{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000920 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000921 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922 int i;
923
924 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000925 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 if (!decorator_seq)
927 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000928
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000930 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000931 if (!d)
932 return NULL;
933 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 }
935 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936}
937
938static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000939ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000941 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000942 identifier name;
943 arguments_ty args;
944 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000945 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000946 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947
948 REQ(n, funcdef);
949
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 name = NEW_IDENTIFIER(CHILD(n, name_i));
951 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000952 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 args = ast_for_arguments(c, CHILD(n, name_i + 1));
954 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000955 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000956 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
957 returns = ast_for_expr(c, CHILD(n, name_i + 3));
958 if (!returns)
959 return NULL;
960 name_i += 2;
961 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 body = ast_for_suite(c, CHILD(n, name_i + 3));
963 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000964 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965
Neal Norwitzc1505362006-12-28 06:47:50 +0000966 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000967 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968}
969
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000970static stmt_ty
971ast_for_decorated(struct compiling *c, const node *n)
972{
973 /* decorated: decorators (classdef | funcdef) */
974 stmt_ty thing = NULL;
975 asdl_seq *decorator_seq = NULL;
976
977 REQ(n, decorated);
978
979 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
980 if (!decorator_seq)
981 return NULL;
982
983 assert(TYPE(CHILD(n, 1)) == funcdef ||
984 TYPE(CHILD(n, 1)) == classdef);
985
986 if (TYPE(CHILD(n, 1)) == funcdef) {
987 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
988 } else if (TYPE(CHILD(n, 1)) == classdef) {
989 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
990 }
991 return thing;
992}
993
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994static expr_ty
995ast_for_lambdef(struct compiling *c, const node *n)
996{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000997 /* lambdef: 'lambda' [varargslist] ':' test
998 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 arguments_ty args;
1000 expr_ty expression;
1001
1002 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001003 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1004 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005 if (!args)
1006 return NULL;
1007 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001008 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 }
1011 else {
1012 args = ast_for_arguments(c, CHILD(n, 1));
1013 if (!args)
1014 return NULL;
1015 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001016 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018 }
1019
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001020 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021}
1022
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001023static expr_ty
1024ast_for_ifexpr(struct compiling *c, const node *n)
1025{
1026 /* test: or_test 'if' or_test 'else' test */
1027 expr_ty expression, body, orelse;
1028
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001029 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001030 body = ast_for_expr(c, CHILD(n, 0));
1031 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001032 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001033 expression = ast_for_expr(c, CHILD(n, 2));
1034 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001035 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001036 orelse = ast_for_expr(c, CHILD(n, 4));
1037 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001038 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001039 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1040 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001041}
1042
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001044 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045
Nick Coghlan650f0d02007-04-15 12:05:43 +00001046 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047*/
1048
1049static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001050count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001052 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053
Guido van Rossumd8faa362007-04-27 19:54:29 +00001054 count_comp_for:
1055 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001056 REQ(n, comp_for);
1057 if (NCH(n) == 5)
1058 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001059 else
1060 return n_fors;
1061 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001062 REQ(n, comp_iter);
1063 n = CHILD(n, 0);
1064 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001065 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001066 else if (TYPE(n) == comp_if) {
1067 if (NCH(n) == 3) {
1068 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001069 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001071 else
1072 return n_fors;
1073 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001074
Guido van Rossumd8faa362007-04-27 19:54:29 +00001075 /* Should never be reached */
1076 PyErr_SetString(PyExc_SystemError,
1077 "logic error in count_comp_fors");
1078 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079}
1080
Nick Coghlan650f0d02007-04-15 12:05:43 +00001081/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082
Nick Coghlan650f0d02007-04-15 12:05:43 +00001083 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084*/
1085
1086static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001087count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001089 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090
Guido van Rossumd8faa362007-04-27 19:54:29 +00001091 while (1) {
1092 REQ(n, comp_iter);
1093 if (TYPE(CHILD(n, 0)) == comp_for)
1094 return n_ifs;
1095 n = CHILD(n, 0);
1096 REQ(n, comp_if);
1097 n_ifs++;
1098 if (NCH(n) == 2)
1099 return n_ifs;
1100 n = CHILD(n, 2);
1101 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102}
1103
Guido van Rossum992d4a32007-07-11 13:09:30 +00001104static asdl_seq *
1105ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001108 asdl_seq *comps;
1109
Nick Coghlan650f0d02007-04-15 12:05:43 +00001110 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111 if (n_fors == -1)
1112 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001113
Nick Coghlan650f0d02007-04-15 12:05:43 +00001114 comps = asdl_seq_new(n_fors, c->c_arena);
1115 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001117
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001119 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 asdl_seq *t;
1121 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001122 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123
Guido van Rossum992d4a32007-07-11 13:09:30 +00001124 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125
Guido van Rossum992d4a32007-07-11 13:09:30 +00001126 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001127 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001128 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001130 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001131 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001133
Thomas Wouters89f507f2006-12-13 04:49:30 +00001134 /* Check the # of children rather than the length of t, since
1135 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1136 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001137 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1138 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001140 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001141 c->c_arena),
1142 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001143
Nick Coghlan650f0d02007-04-15 12:05:43 +00001144 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001146
Guido van Rossum992d4a32007-07-11 13:09:30 +00001147 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148 int j, n_ifs;
1149 asdl_seq *ifs;
1150
Guido van Rossum992d4a32007-07-11 13:09:30 +00001151 n = CHILD(n, 4);
1152 n_ifs = count_comp_ifs(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001153 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001155
1156 ifs = asdl_seq_new(n_ifs, c->c_arena);
1157 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001161 REQ(n, comp_iter);
1162 n = CHILD(n, 0);
1163 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164
Guido van Rossum992d4a32007-07-11 13:09:30 +00001165 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001166 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001167 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001168 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001169 if (NCH(n) == 3)
1170 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001172 /* on exit, must guarantee that n is a comp_for */
1173 if (TYPE(n) == comp_iter)
1174 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001175 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001177 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001179 return comps;
1180}
1181
1182static expr_ty
1183ast_for_itercomp(struct compiling *c, const node *n, int type)
1184{
1185 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1186 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1187 expr_ty elt;
1188 asdl_seq *comps;
1189
1190 assert(NCH(n) > 1);
1191
1192 elt = ast_for_expr(c, CHILD(n, 0));
1193 if (!elt)
1194 return NULL;
1195
1196 comps = ast_for_comprehension(c, CHILD(n, 1));
1197 if (!comps)
1198 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001199
1200 if (type == COMP_GENEXP)
1201 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1202 else if (type == COMP_LISTCOMP)
1203 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1204 else if (type == COMP_SETCOMP)
1205 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1206 else
1207 /* Should never happen */
1208 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209}
1210
1211static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001212ast_for_dictcomp(struct compiling *c, const node *n)
1213{
1214 expr_ty key, value;
1215 asdl_seq *comps;
1216
1217 assert(NCH(n) > 3);
1218 REQ(CHILD(n, 1), COLON);
1219
1220 key = ast_for_expr(c, CHILD(n, 0));
1221 if (!key)
1222 return NULL;
1223
1224 value = ast_for_expr(c, CHILD(n, 2));
1225 if (!value)
1226 return NULL;
1227
1228 comps = ast_for_comprehension(c, CHILD(n, 3));
1229 if (!comps)
1230 return NULL;
1231
1232 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1233}
1234
1235static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001236ast_for_genexp(struct compiling *c, const node *n)
1237{
1238 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001239 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001240}
1241
1242static expr_ty
1243ast_for_listcomp(struct compiling *c, const node *n)
1244{
1245 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001246 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001247}
1248
1249static expr_ty
1250ast_for_setcomp(struct compiling *c, const node *n)
1251{
1252 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001253 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001254}
1255
1256
1257static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258ast_for_atom(struct compiling *c, const node *n)
1259{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001260 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1261 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001262 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 */
1264 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001265 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266
1267 switch (TYPE(ch)) {
1268 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001269 /* All names start in Load context, but may later be
1270 changed. */
1271 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001273 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001274 if (!str)
1275 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001276
Thomas Wouters89f507f2006-12-13 04:49:30 +00001277 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001278 if (bytesmode)
1279 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1280 else
1281 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001282 }
1283 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001284 PyObject *pynum = parsenumber(STR(ch));
1285 if (!pynum)
1286 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001287
Thomas Wouters89f507f2006-12-13 04:49:30 +00001288 PyArena_AddPyObject(c->c_arena, pynum);
1289 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290 }
Georg Brandldde00282007-03-18 19:01:53 +00001291 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001292 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001294 ch = CHILD(n, 1);
1295
1296 if (TYPE(ch) == RPAR)
1297 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1298
1299 if (TYPE(ch) == yield_expr)
1300 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001301
1302 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1303 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001304 return ast_for_genexp(c, ch);
1305
Nick Coghlan650f0d02007-04-15 12:05:43 +00001306 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001308 ch = CHILD(n, 1);
1309
1310 if (TYPE(ch) == RSQB)
1311 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1312
Nick Coghlan650f0d02007-04-15 12:05:43 +00001313 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001314 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1315 asdl_seq *elts = seq_for_testlist(c, ch);
1316 if (!elts)
1317 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001318
Thomas Wouters89f507f2006-12-13 04:49:30 +00001319 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1320 }
1321 else
1322 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001324 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1325 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001326 int i, size;
1327 asdl_seq *keys, *values;
1328
1329 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001330 if (TYPE(ch) == RBRACE) {
1331 /* it's an empty dict */
1332 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1333 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1334 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001335 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001336 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001337 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001338 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001339 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001340 for (i = 0; i < NCH(ch); i += 2) {
1341 expr_ty expression;
1342 expression = ast_for_expr(c, CHILD(ch, i));
1343 if (!expression)
1344 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001345 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001346 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001347 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1348 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1349 /* it's a set comprehension */
1350 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001351 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1352 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001353 } else {
1354 /* it's a dict */
1355 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1356 keys = asdl_seq_new(size, c->c_arena);
1357 if (!keys)
1358 return NULL;
1359
1360 values = asdl_seq_new(size, c->c_arena);
1361 if (!values)
1362 return NULL;
1363
1364 for (i = 0; i < NCH(ch); i += 4) {
1365 expr_ty expression;
1366
1367 expression = ast_for_expr(c, CHILD(ch, i));
1368 if (!expression)
1369 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001370
Guido van Rossum86e58e22006-08-28 15:27:34 +00001371 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001372
Guido van Rossum86e58e22006-08-28 15:27:34 +00001373 expression = ast_for_expr(c, CHILD(ch, i + 2));
1374 if (!expression)
1375 return NULL;
1376
1377 asdl_seq_SET(values, i / 4, expression);
1378 }
1379 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1380 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001383 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1384 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 }
1386}
1387
1388static slice_ty
1389ast_for_slice(struct compiling *c, const node *n)
1390{
1391 node *ch;
1392 expr_ty lower = NULL, upper = NULL, step = NULL;
1393
1394 REQ(n, subscript);
1395
1396 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001397 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 sliceop: ':' [test]
1399 */
1400 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 if (NCH(n) == 1 && TYPE(ch) == test) {
1402 /* 'step' variable hold no significance in terms of being used over
1403 other vars */
1404 step = ast_for_expr(c, ch);
1405 if (!step)
1406 return NULL;
1407
Thomas Wouters89f507f2006-12-13 04:49:30 +00001408 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 }
1410
1411 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001412 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 if (!lower)
1414 return NULL;
1415 }
1416
1417 /* If there's an upper bound it's in the second or third position. */
1418 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001419 if (NCH(n) > 1) {
1420 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 if (TYPE(n2) == test) {
1423 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 if (!upper)
1425 return NULL;
1426 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001427 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430
Thomas Wouters89f507f2006-12-13 04:49:30 +00001431 if (TYPE(n2) == test) {
1432 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433 if (!upper)
1434 return NULL;
1435 }
1436 }
1437
1438 ch = CHILD(n, NCH(n) - 1);
1439 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001440 if (NCH(ch) == 1) {
1441 /* No expression, so step is None */
1442 ch = CHILD(ch, 0);
1443 step = Name(new_identifier("None", c->c_arena), Load,
1444 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 if (!step)
1446 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001447 } else {
1448 ch = CHILD(ch, 1);
1449 if (TYPE(ch) == test) {
1450 step = ast_for_expr(c, ch);
1451 if (!step)
1452 return NULL;
1453 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 }
1455 }
1456
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001457 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458}
1459
1460static expr_ty
1461ast_for_binop(struct compiling *c, const node *n)
1462{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001463 /* Must account for a sequence of expressions.
1464 How should A op B op C by represented?
1465 BinOp(BinOp(A, op, B), op, C).
1466 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467
Guido van Rossumd8faa362007-04-27 19:54:29 +00001468 int i, nops;
1469 expr_ty expr1, expr2, result;
1470 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471
Guido van Rossumd8faa362007-04-27 19:54:29 +00001472 expr1 = ast_for_expr(c, CHILD(n, 0));
1473 if (!expr1)
1474 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475
Guido van Rossumd8faa362007-04-27 19:54:29 +00001476 expr2 = ast_for_expr(c, CHILD(n, 2));
1477 if (!expr2)
1478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479
Guido van Rossumd8faa362007-04-27 19:54:29 +00001480 newoperator = get_operator(CHILD(n, 1));
1481 if (!newoperator)
1482 return NULL;
1483
1484 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1485 c->c_arena);
1486 if (!result)
1487 return NULL;
1488
1489 nops = (NCH(n) - 1) / 2;
1490 for (i = 1; i < nops; i++) {
1491 expr_ty tmp_result, tmp;
1492 const node* next_oper = CHILD(n, i * 2 + 1);
1493
1494 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001495 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 return NULL;
1497
Guido van Rossumd8faa362007-04-27 19:54:29 +00001498 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1499 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 return NULL;
1501
Guido van Rossumd8faa362007-04-27 19:54:29 +00001502 tmp_result = BinOp(result, newoperator, tmp,
1503 LINENO(next_oper), next_oper->n_col_offset,
1504 c->c_arena);
1505 if (!tmp)
1506 return NULL;
1507 result = tmp_result;
1508 }
1509 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510}
1511
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001512static expr_ty
1513ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1514{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001515 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1516 subscriptlist: subscript (',' subscript)* [',']
1517 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1518 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001519 REQ(n, trailer);
1520 if (TYPE(CHILD(n, 0)) == LPAR) {
1521 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001522 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1523 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001525 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001526 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001527 else if (TYPE(CHILD(n, 0)) == DOT ) {
1528 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001529 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001530 }
1531 else {
1532 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001533 REQ(CHILD(n, 2), RSQB);
1534 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001535 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001536 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1537 if (!slc)
1538 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001539 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1540 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001541 }
1542 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001543 /* The grammar is ambiguous here. The ambiguity is resolved
1544 by treating the sequence as a tuple literal if there are
1545 no slice features.
1546 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001547 int j;
1548 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001549 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001550 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001551 asdl_seq *slices, *elts;
1552 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001553 if (!slices)
1554 return NULL;
1555 for (j = 0; j < NCH(n); j += 2) {
1556 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001557 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001558 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001559 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001560 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001561 asdl_seq_SET(slices, j / 2, slc);
1562 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001563 if (!simple) {
1564 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001565 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001566 }
1567 /* extract Index values and put them in a Tuple */
1568 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001569 if (!elts)
1570 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001571 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1572 slc = (slice_ty)asdl_seq_GET(slices, j);
1573 assert(slc->kind == Index_kind && slc->v.Index.value);
1574 asdl_seq_SET(elts, j, slc->v.Index.value);
1575 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001576 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001577 if (!e)
1578 return NULL;
1579 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001580 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001581 }
1582 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001583}
1584
1585static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001586ast_for_factor(struct compiling *c, const node *n)
1587{
1588 node *pfactor, *ppower, *patom, *pnum;
1589 expr_ty expression;
1590
1591 /* If the unary - operator is applied to a constant, don't generate
1592 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1593 constant. The peephole optimizer already does something like
1594 this but it doesn't handle the case where the constant is
1595 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1596 PyLongObject.
1597 */
1598 if (TYPE(CHILD(n, 0)) == MINUS
1599 && NCH(n) == 2
1600 && TYPE((pfactor = CHILD(n, 1))) == factor
1601 && NCH(pfactor) == 1
1602 && TYPE((ppower = CHILD(pfactor, 0))) == power
1603 && NCH(ppower) == 1
1604 && TYPE((patom = CHILD(ppower, 0))) == atom
1605 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1606 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1607 if (s == NULL)
1608 return NULL;
1609 s[0] = '-';
1610 strcpy(s + 1, STR(pnum));
1611 PyObject_FREE(STR(pnum));
1612 STR(pnum) = s;
1613 return ast_for_atom(c, patom);
1614 }
1615
1616 expression = ast_for_expr(c, CHILD(n, 1));
1617 if (!expression)
1618 return NULL;
1619
1620 switch (TYPE(CHILD(n, 0))) {
1621 case PLUS:
1622 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1623 c->c_arena);
1624 case MINUS:
1625 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1626 c->c_arena);
1627 case TILDE:
1628 return UnaryOp(Invert, expression, LINENO(n),
1629 n->n_col_offset, c->c_arena);
1630 }
1631 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1632 TYPE(CHILD(n, 0)));
1633 return NULL;
1634}
1635
1636static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637ast_for_power(struct compiling *c, const node *n)
1638{
1639 /* power: atom trailer* ('**' factor)*
1640 */
1641 int i;
1642 expr_ty e, tmp;
1643 REQ(n, power);
1644 e = ast_for_atom(c, CHILD(n, 0));
1645 if (!e)
1646 return NULL;
1647 if (NCH(n) == 1)
1648 return e;
1649 for (i = 1; i < NCH(n); i++) {
1650 node *ch = CHILD(n, i);
1651 if (TYPE(ch) != trailer)
1652 break;
1653 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001654 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001655 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001656 tmp->lineno = e->lineno;
1657 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001658 e = tmp;
1659 }
1660 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1661 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001662 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001663 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001664 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001665 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001666 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001667 e = tmp;
1668 }
1669 return e;
1670}
1671
Guido van Rossum0368b722007-05-11 16:50:42 +00001672static expr_ty
1673ast_for_starred(struct compiling *c, const node *n)
1674{
1675 expr_ty tmp;
1676 REQ(n, star_expr);
1677
1678 tmp = ast_for_expr(c, CHILD(n, 1));
1679 if (!tmp)
1680 return NULL;
1681
1682 /* The Load context is changed later. */
1683 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1684}
1685
1686
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687/* Do not name a variable 'expr'! Will cause a compile error.
1688*/
1689
1690static expr_ty
1691ast_for_expr(struct compiling *c, const node *n)
1692{
1693 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001694 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001695 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001696 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 and_test: not_test ('and' not_test)*
1698 not_test: 'not' not_test | comparison
1699 comparison: expr (comp_op expr)*
1700 expr: xor_expr ('|' xor_expr)*
1701 xor_expr: and_expr ('^' and_expr)*
1702 and_expr: shift_expr ('&' shift_expr)*
1703 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1704 arith_expr: term (('+'|'-') term)*
1705 term: factor (('*'|'/'|'%'|'//') factor)*
1706 factor: ('+'|'-'|'~') factor | power
1707 power: atom trailer* ('**' factor)*
1708 */
1709
1710 asdl_seq *seq;
1711 int i;
1712
1713 loop:
1714 switch (TYPE(n)) {
1715 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001716 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001717 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001718 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001720 else if (NCH(n) > 1)
1721 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001722 /* Fallthrough */
1723 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 case and_test:
1725 if (NCH(n) == 1) {
1726 n = CHILD(n, 0);
1727 goto loop;
1728 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001729 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 if (!seq)
1731 return NULL;
1732 for (i = 0; i < NCH(n); i += 2) {
1733 expr_ty e = ast_for_expr(c, CHILD(n, i));
1734 if (!e)
1735 return NULL;
1736 asdl_seq_SET(seq, i / 2, e);
1737 }
1738 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001739 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1740 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001741 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001742 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 case not_test:
1744 if (NCH(n) == 1) {
1745 n = CHILD(n, 0);
1746 goto loop;
1747 }
1748 else {
1749 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1750 if (!expression)
1751 return NULL;
1752
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001753 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1754 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755 }
1756 case comparison:
1757 if (NCH(n) == 1) {
1758 n = CHILD(n, 0);
1759 goto loop;
1760 }
1761 else {
1762 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001763 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001764 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001765 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 if (!ops)
1767 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001768 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770 return NULL;
1771 }
1772 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001773 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001775 newoperator = ast_for_comp_op(CHILD(n, i));
1776 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001778 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779
1780 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001781 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001783 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001785 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 asdl_seq_SET(cmps, i / 2, expression);
1787 }
1788 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001789 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001791 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001793 return Compare(expression, ops, cmps, LINENO(n),
1794 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795 }
1796 break;
1797
Guido van Rossum0368b722007-05-11 16:50:42 +00001798 case star_expr:
1799 if (TYPE(CHILD(n, 0)) == STAR) {
1800 return ast_for_starred(c, n);
1801 }
1802 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 /* The next five cases all handle BinOps. The main body of code
1804 is the same in each case, but the switch turned inside out to
1805 reuse the code for each type of operator.
1806 */
1807 case expr:
1808 case xor_expr:
1809 case and_expr:
1810 case shift_expr:
1811 case arith_expr:
1812 case term:
1813 if (NCH(n) == 1) {
1814 n = CHILD(n, 0);
1815 goto loop;
1816 }
1817 return ast_for_binop(c, n);
1818 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001819 expr_ty exp = NULL;
1820 if (NCH(n) == 2) {
1821 exp = ast_for_testlist(c, CHILD(n, 1));
1822 if (!exp)
1823 return NULL;
1824 }
1825 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1826 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001827 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 if (NCH(n) == 1) {
1829 n = CHILD(n, 0);
1830 goto loop;
1831 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001832 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001833 case power:
1834 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001836 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 return NULL;
1838 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001839 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 return NULL;
1841}
1842
1843static expr_ty
1844ast_for_call(struct compiling *c, const node *n, expr_ty func)
1845{
1846 /*
1847 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1848 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001849 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850 */
1851
1852 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001853 asdl_seq *args;
1854 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 expr_ty vararg = NULL, kwarg = NULL;
1856
1857 REQ(n, arglist);
1858
1859 nargs = 0;
1860 nkeywords = 0;
1861 ngens = 0;
1862 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 node *ch = CHILD(n, i);
1864 if (TYPE(ch) == argument) {
1865 if (NCH(ch) == 1)
1866 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001867 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 nkeywords++;
1871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001874 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 "if not sole argument");
1876 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 }
1878
1879 if (nargs + nkeywords + ngens > 255) {
1880 ast_error(n, "more than 255 arguments");
1881 return NULL;
1882 }
1883
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001884 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001886 return NULL;
1887 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 nargs = 0;
1891 nkeywords = 0;
1892 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 node *ch = CHILD(n, i);
1894 if (TYPE(ch) == argument) {
1895 expr_ty e;
1896 if (NCH(ch) == 1) {
1897 if (nkeywords) {
1898 ast_error(CHILD(ch, 0),
1899 "non-keyword arg after keyword arg");
1900 return NULL;
1901 }
1902 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001904 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 asdl_seq_SET(args, nargs++, e);
1906 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001907 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001910 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001913 else {
1914 keyword_ty kw;
1915 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916
Thomas Wouters89f507f2006-12-13 04:49:30 +00001917 /* CHILD(ch, 0) is test, but must be an identifier? */
1918 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001920 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 /* f(lambda x: x[0] = 3) ends up getting parsed with
1922 * LHS test = lambda x: x[0], and RHS test = 3.
1923 * SF bug 132313 points out that complaining about a keyword
1924 * then is very confusing.
1925 */
1926 if (e->kind == Lambda_kind) {
1927 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001928 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 } else if (e->kind != Name_kind) {
1930 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001931 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001932 } else if (forbidden_name(e, ch)) {
1933 return NULL;
1934 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001935 key = e->v.Name.id;
1936 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001937 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001938 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001939 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001941 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 asdl_seq_SET(keywords, nkeywords++, kw);
1943 }
1944 }
1945 else if (TYPE(ch) == STAR) {
1946 vararg = ast_for_expr(c, CHILD(n, i+1));
1947 i++;
1948 }
1949 else if (TYPE(ch) == DOUBLESTAR) {
1950 kwarg = ast_for_expr(c, CHILD(n, i+1));
1951 i++;
1952 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 }
1954
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001955 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956}
1957
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001959ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001961 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001962 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001963 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001965 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001966 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001967 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001968 }
1969 else {
1970 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001971 TYPE(n) == testlist1);
1972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 else {
1976 asdl_seq *tmp = seq_for_testlist(c, n);
1977 if (!tmp)
1978 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001979 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001981}
1982
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983static stmt_ty
1984ast_for_expr_stmt(struct compiling *c, const node *n)
1985{
1986 REQ(n, expr_stmt);
1987 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1988 | ('=' (yield_expr|testlist))*)
1989 testlist: test (',' test)* [',']
1990 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 test: ... here starts the operator precendence dance
1993 */
1994
1995 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001996 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 if (!e)
1998 return NULL;
1999
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 }
2002 else if (TYPE(CHILD(n, 1)) == augassign) {
2003 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002004 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006
Thomas Wouters89f507f2006-12-13 04:49:30 +00002007 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 if (!expr1)
2009 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002010 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002011 switch (expr1->kind) {
2012 case GeneratorExp_kind:
2013 ast_error(ch, "augmented assignment to generator "
2014 "expression not possible");
2015 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002016 case Yield_kind:
2017 ast_error(ch, "augmented assignment to yield "
2018 "expression not possible");
2019 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002020 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002021 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002022 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002023 break;
2024 }
2025 case Attribute_kind:
2026 case Subscript_kind:
2027 break;
2028 default:
2029 ast_error(ch, "illegal expression for augmented "
2030 "assignment");
2031 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002033 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034
Thomas Wouters89f507f2006-12-13 04:49:30 +00002035 ch = CHILD(n, 2);
2036 if (TYPE(ch) == testlist)
2037 expr2 = ast_for_testlist(c, ch);
2038 else
2039 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002040 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041 return NULL;
2042
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002043 newoperator = ast_for_augassign(CHILD(n, 1));
2044 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 return NULL;
2046
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 }
2049 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002050 int i;
2051 asdl_seq *targets;
2052 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 expr_ty expression;
2054
Thomas Wouters89f507f2006-12-13 04:49:30 +00002055 /* a normal assignment */
2056 REQ(CHILD(n, 1), EQUAL);
2057 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2058 if (!targets)
2059 return NULL;
2060 for (i = 0; i < NCH(n) - 2; i += 2) {
2061 expr_ty e;
2062 node *ch = CHILD(n, i);
2063 if (TYPE(ch) == yield_expr) {
2064 ast_error(ch, "assignment to yield expression not possible");
2065 return NULL;
2066 }
2067 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068
Thomas Wouters89f507f2006-12-13 04:49:30 +00002069 /* set context to assign */
2070 if (!e)
2071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072
Thomas Wouters89f507f2006-12-13 04:49:30 +00002073 if (!set_context(e, Store, CHILD(n, i)))
2074 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075
Thomas Wouters89f507f2006-12-13 04:49:30 +00002076 asdl_seq_SET(targets, i / 2, e);
2077 }
2078 value = CHILD(n, NCH(n) - 1);
2079 if (TYPE(value) == testlist)
2080 expression = ast_for_testlist(c, value);
2081 else
2082 expression = ast_for_expr(c, value);
2083 if (!expression)
2084 return NULL;
2085 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087}
2088
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002090ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091{
2092 asdl_seq *seq;
2093 int i;
2094 expr_ty e;
2095
2096 REQ(n, exprlist);
2097
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002098 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002100 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002102 e = ast_for_expr(c, CHILD(n, i));
2103 if (!e)
2104 return NULL;
2105 asdl_seq_SET(seq, i / 2, e);
2106 if (context && !set_context(e, context, CHILD(n, i)))
2107 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108 }
2109 return seq;
2110}
2111
2112static stmt_ty
2113ast_for_del_stmt(struct compiling *c, const node *n)
2114{
2115 asdl_seq *expr_list;
2116
2117 /* del_stmt: 'del' exprlist */
2118 REQ(n, del_stmt);
2119
2120 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2121 if (!expr_list)
2122 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002123 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124}
2125
2126static stmt_ty
2127ast_for_flow_stmt(struct compiling *c, const node *n)
2128{
2129 /*
2130 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2131 | yield_stmt
2132 break_stmt: 'break'
2133 continue_stmt: 'continue'
2134 return_stmt: 'return' [testlist]
2135 yield_stmt: yield_expr
2136 yield_expr: 'yield' testlist
2137 raise_stmt: 'raise' [test [',' test [',' test]]]
2138 */
2139 node *ch;
2140
2141 REQ(n, flow_stmt);
2142 ch = CHILD(n, 0);
2143 switch (TYPE(ch)) {
2144 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002145 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002147 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002149 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2150 if (!exp)
2151 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002152 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 }
2154 case return_stmt:
2155 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002156 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002158 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159 if (!expression)
2160 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 }
2163 case raise_stmt:
2164 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002165 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166 else if (NCH(ch) == 2) {
2167 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2168 if (!expression)
2169 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002170 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 }
2172 else if (NCH(ch) == 4) {
2173 expr_ty expr1, expr2;
2174
2175 expr1 = ast_for_expr(c, CHILD(ch, 1));
2176 if (!expr1)
2177 return NULL;
2178 expr2 = ast_for_expr(c, CHILD(ch, 3));
2179 if (!expr2)
2180 return NULL;
2181
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002182 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183 }
2184 else if (NCH(ch) == 6) {
2185 expr_ty expr1, expr2, expr3;
2186
2187 expr1 = ast_for_expr(c, CHILD(ch, 1));
2188 if (!expr1)
2189 return NULL;
2190 expr2 = ast_for_expr(c, CHILD(ch, 3));
2191 if (!expr2)
2192 return NULL;
2193 expr3 = ast_for_expr(c, CHILD(ch, 5));
2194 if (!expr3)
2195 return NULL;
2196
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002197 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 }
2199 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002200 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 "unexpected flow_stmt: %d", TYPE(ch));
2202 return NULL;
2203 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002204
2205 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2206 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207}
2208
2209static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002210alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211{
2212 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002213 import_as_name: NAME ['as' NAME]
2214 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215 dotted_name: NAME ('.' NAME)*
2216 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002217 PyObject *str;
2218
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 loop:
2220 switch (TYPE(n)) {
2221 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002222 str = NULL;
2223 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002224 str = NEW_IDENTIFIER(CHILD(n, 2));
2225 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002226 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227 case dotted_as_name:
2228 if (NCH(n) == 1) {
2229 n = CHILD(n, 0);
2230 goto loop;
2231 }
2232 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002233 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002234 if (!a)
2235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 assert(!a->asname);
2237 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2238 return a;
2239 }
2240 break;
2241 case dotted_name:
2242 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002243 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 else {
2245 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002246 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002247 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002249 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250
2251 len = 0;
2252 for (i = 0; i < NCH(n); i += 2)
2253 /* length of string plus one for the dot */
2254 len += strlen(STR(CHILD(n, i))) + 1;
2255 len--; /* the last name doesn't have a dot */
2256 str = PyString_FromStringAndSize(NULL, len);
2257 if (!str)
2258 return NULL;
2259 s = PyString_AS_STRING(str);
2260 if (!s)
2261 return NULL;
2262 for (i = 0; i < NCH(n); i += 2) {
2263 char *sch = STR(CHILD(n, i));
2264 strcpy(s, STR(CHILD(n, i)));
2265 s += strlen(sch);
2266 *s++ = '.';
2267 }
2268 --s;
2269 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002270 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2271 PyString_GET_SIZE(str),
2272 NULL);
2273 Py_DECREF(str);
2274 if (!uni)
2275 return NULL;
2276 str = uni;
2277 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002278 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002279 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 }
2281 break;
2282 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002283 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002284 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002285 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002287 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 "unexpected import name: %d", TYPE(n));
2289 return NULL;
2290 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002291
2292 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 return NULL;
2294}
2295
2296static stmt_ty
2297ast_for_import_stmt(struct compiling *c, const node *n)
2298{
2299 /*
2300 import_stmt: import_name | import_from
2301 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002302 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2303 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002305 int lineno;
2306 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 int i;
2308 asdl_seq *aliases;
2309
2310 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002311 lineno = LINENO(n);
2312 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002314 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002316 REQ(n, dotted_as_names);
2317 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2318 if (!aliases)
2319 return NULL;
2320 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002321 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002322 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002324 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002326 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002328 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002330 int idx, ndots = 0;
2331 alias_ty mod = NULL;
2332 identifier modname;
2333
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002334 /* Count the number of dots (for relative imports) and check for the
2335 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002336 for (idx = 1; idx < NCH(n); idx++) {
2337 if (TYPE(CHILD(n, idx)) == dotted_name) {
2338 mod = alias_for_import_name(c, CHILD(n, idx));
2339 idx++;
2340 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002341 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2342 /* three consecutive dots are tokenized as one ELLIPSIS */
2343 ndots += 3;
2344 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002345 } else if (TYPE(CHILD(n, idx)) != DOT) {
2346 break;
2347 }
2348 ndots++;
2349 }
2350 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002351 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002352 case STAR:
2353 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 n = CHILD(n, idx);
2355 n_children = 1;
2356 if (ndots) {
2357 ast_error(n, "'import *' not allowed with 'from .'");
2358 return NULL;
2359 }
2360 break;
2361 case LPAR:
2362 /* from ... import (x, y, z) */
2363 n = CHILD(n, idx + 1);
2364 n_children = NCH(n);
2365 break;
2366 case import_as_names:
2367 /* from ... import x, y, z */
2368 n = CHILD(n, idx);
2369 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002370 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 ast_error(n, "trailing comma not allowed without"
2372 " surrounding parentheses");
2373 return NULL;
2374 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002375 break;
2376 default:
2377 ast_error(n, "Unexpected node-type in from-import");
2378 return NULL;
2379 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380
Thomas Wouters89f507f2006-12-13 04:49:30 +00002381 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2382 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384
2385 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002386 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002387 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002388 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002392 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002393 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002394 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2395 if (!import_alias)
2396 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002397 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002398 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002400 if (mod != NULL)
2401 modname = mod->name;
2402 else
2403 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002404 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002405 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 }
Neal Norwitz79792652005-11-14 04:25:03 +00002407 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 "unknown import statement: starts with command '%s'",
2409 STR(CHILD(n, 0)));
2410 return NULL;
2411}
2412
2413static stmt_ty
2414ast_for_global_stmt(struct compiling *c, const node *n)
2415{
2416 /* global_stmt: 'global' NAME (',' NAME)* */
2417 identifier name;
2418 asdl_seq *s;
2419 int i;
2420
2421 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002422 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002424 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 name = NEW_IDENTIFIER(CHILD(n, i));
2427 if (!name)
2428 return NULL;
2429 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002431 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432}
2433
2434static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002435ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2436{
2437 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2438 identifier name;
2439 asdl_seq *s;
2440 int i;
2441
2442 REQ(n, nonlocal_stmt);
2443 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2444 if (!s)
2445 return NULL;
2446 for (i = 1; i < NCH(n); i += 2) {
2447 name = NEW_IDENTIFIER(CHILD(n, i));
2448 if (!name)
2449 return NULL;
2450 asdl_seq_SET(s, i / 2, name);
2451 }
2452 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2453}
2454
2455static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456ast_for_assert_stmt(struct compiling *c, const node *n)
2457{
2458 /* assert_stmt: 'assert' test [',' test] */
2459 REQ(n, assert_stmt);
2460 if (NCH(n) == 2) {
2461 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2462 if (!expression)
2463 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 }
2466 else if (NCH(n) == 4) {
2467 expr_ty expr1, expr2;
2468
2469 expr1 = ast_for_expr(c, CHILD(n, 1));
2470 if (!expr1)
2471 return NULL;
2472 expr2 = ast_for_expr(c, CHILD(n, 3));
2473 if (!expr2)
2474 return NULL;
2475
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 }
Neal Norwitz79792652005-11-14 04:25:03 +00002478 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 "improper number of parts to 'assert' statement: %d",
2480 NCH(n));
2481 return NULL;
2482}
2483
2484static asdl_seq *
2485ast_for_suite(struct compiling *c, const node *n)
2486{
2487 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002488 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 stmt_ty s;
2490 int i, total, num, end, pos = 0;
2491 node *ch;
2492
2493 REQ(n, suite);
2494
2495 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002496 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002500 n = CHILD(n, 0);
2501 /* simple_stmt always ends with a NEWLINE,
2502 and may have a trailing SEMI
2503 */
2504 end = NCH(n) - 1;
2505 if (TYPE(CHILD(n, end - 1)) == SEMI)
2506 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 for (i = 0; i < end; i += 2) {
2509 ch = CHILD(n, i);
2510 s = ast_for_stmt(c, ch);
2511 if (!s)
2512 return NULL;
2513 asdl_seq_SET(seq, pos++, s);
2514 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 }
2516 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002517 for (i = 2; i < (NCH(n) - 1); i++) {
2518 ch = CHILD(n, i);
2519 REQ(ch, stmt);
2520 num = num_stmts(ch);
2521 if (num == 1) {
2522 /* small_stmt or compound_stmt with only one child */
2523 s = ast_for_stmt(c, ch);
2524 if (!s)
2525 return NULL;
2526 asdl_seq_SET(seq, pos++, s);
2527 }
2528 else {
2529 int j;
2530 ch = CHILD(ch, 0);
2531 REQ(ch, simple_stmt);
2532 for (j = 0; j < NCH(ch); j += 2) {
2533 /* statement terminates with a semi-colon ';' */
2534 if (NCH(CHILD(ch, j)) == 0) {
2535 assert((j + 1) == NCH(ch));
2536 break;
2537 }
2538 s = ast_for_stmt(c, CHILD(ch, j));
2539 if (!s)
2540 return NULL;
2541 asdl_seq_SET(seq, pos++, s);
2542 }
2543 }
2544 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 }
2546 assert(pos == seq->size);
2547 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548}
2549
2550static stmt_ty
2551ast_for_if_stmt(struct compiling *c, const node *n)
2552{
2553 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2554 ['else' ':' suite]
2555 */
2556 char *s;
2557
2558 REQ(n, if_stmt);
2559
2560 if (NCH(n) == 4) {
2561 expr_ty expression;
2562 asdl_seq *suite_seq;
2563
2564 expression = ast_for_expr(c, CHILD(n, 1));
2565 if (!expression)
2566 return NULL;
2567 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002568 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 return NULL;
2570
Guido van Rossumd8faa362007-04-27 19:54:29 +00002571 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2572 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002574
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 s = STR(CHILD(n, 4));
2576 /* s[2], the third character in the string, will be
2577 's' for el_s_e, or
2578 'i' for el_i_f
2579 */
2580 if (s[2] == 's') {
2581 expr_ty expression;
2582 asdl_seq *seq1, *seq2;
2583
2584 expression = ast_for_expr(c, CHILD(n, 1));
2585 if (!expression)
2586 return NULL;
2587 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002588 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 return NULL;
2590 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002591 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 return NULL;
2593
Guido van Rossumd8faa362007-04-27 19:54:29 +00002594 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2595 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 }
2597 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002599 expr_ty expression;
2600 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002601 asdl_seq *orelse = NULL;
2602 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 /* must reference the child n_elif+1 since 'else' token is third,
2604 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002605 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2606 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2607 has_else = 1;
2608 n_elif -= 3;
2609 }
2610 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002613 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 orelse = asdl_seq_new(1, c->c_arena);
2616 if (!orelse)
2617 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002619 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002621 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2622 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002624 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2625 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627
Guido van Rossumd8faa362007-04-27 19:54:29 +00002628 asdl_seq_SET(orelse, 0,
2629 If(expression, suite_seq, suite_seq2,
2630 LINENO(CHILD(n, NCH(n) - 6)),
2631 CHILD(n, NCH(n) - 6)->n_col_offset,
2632 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 /* the just-created orelse handled the last elif */
2634 n_elif--;
2635 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636
Thomas Wouters89f507f2006-12-13 04:49:30 +00002637 for (i = 0; i < n_elif; i++) {
2638 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2640 if (!newobj)
2641 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002643 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002646 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 asdl_seq_SET(newobj, 0,
2650 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002651 LINENO(CHILD(n, off)),
2652 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002653 orelse = newobj;
2654 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002655 expression = ast_for_expr(c, CHILD(n, 1));
2656 if (!expression)
2657 return NULL;
2658 suite_seq = ast_for_suite(c, CHILD(n, 3));
2659 if (!suite_seq)
2660 return NULL;
2661 return If(expression, suite_seq, orelse,
2662 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002664
2665 PyErr_Format(PyExc_SystemError,
2666 "unexpected token in 'if' statement: %s", s);
2667 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668}
2669
2670static stmt_ty
2671ast_for_while_stmt(struct compiling *c, const node *n)
2672{
2673 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2674 REQ(n, while_stmt);
2675
2676 if (NCH(n) == 4) {
2677 expr_ty expression;
2678 asdl_seq *suite_seq;
2679
2680 expression = ast_for_expr(c, CHILD(n, 1));
2681 if (!expression)
2682 return NULL;
2683 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002684 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687 }
2688 else if (NCH(n) == 7) {
2689 expr_ty expression;
2690 asdl_seq *seq1, *seq2;
2691
2692 expression = ast_for_expr(c, CHILD(n, 1));
2693 if (!expression)
2694 return NULL;
2695 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002696 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return NULL;
2698 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002699 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return NULL;
2701
Thomas Wouters89f507f2006-12-13 04:49:30 +00002702 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002704
2705 PyErr_Format(PyExc_SystemError,
2706 "wrong number of tokens for 'while' statement: %d",
2707 NCH(n));
2708 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709}
2710
2711static stmt_ty
2712ast_for_for_stmt(struct compiling *c, const node *n)
2713{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002714 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 expr_ty expression;
2716 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002717 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2719 REQ(n, for_stmt);
2720
2721 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 if (!seq)
2724 return NULL;
2725 }
2726
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002727 node_target = CHILD(n, 1);
2728 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002729 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002731 /* Check the # of children rather than the length of _target, since
2732 for x, in ... has 1 element in _target, but still requires a Tuple. */
2733 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002734 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002736 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002738 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002739 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 return NULL;
2741 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002742 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 return NULL;
2744
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002745 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2746 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747}
2748
2749static excepthandler_ty
2750ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2751{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002752 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 REQ(exc, except_clause);
2754 REQ(body, suite);
2755
2756 if (NCH(exc) == 1) {
2757 asdl_seq *suite_seq = ast_for_suite(c, body);
2758 if (!suite_seq)
2759 return NULL;
2760
Thomas Wouters89f507f2006-12-13 04:49:30 +00002761 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002762 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 }
2764 else if (NCH(exc) == 2) {
2765 expr_ty expression;
2766 asdl_seq *suite_seq;
2767
2768 expression = ast_for_expr(c, CHILD(exc, 1));
2769 if (!expression)
2770 return NULL;
2771 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002772 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773 return NULL;
2774
Thomas Wouters89f507f2006-12-13 04:49:30 +00002775 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002776 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 }
2778 else if (NCH(exc) == 4) {
2779 asdl_seq *suite_seq;
2780 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002781 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002782 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 return NULL;
2787 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002788 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 return NULL;
2790
Thomas Wouters89f507f2006-12-13 04:49:30 +00002791 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002792 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002794
2795 PyErr_Format(PyExc_SystemError,
2796 "wrong number of children for 'except' clause: %d",
2797 NCH(exc));
2798 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799}
2800
2801static stmt_ty
2802ast_for_try_stmt(struct compiling *c, const node *n)
2803{
Neal Norwitzf599f422005-12-17 21:33:47 +00002804 const int nch = NCH(n);
2805 int n_except = (nch - 3)/3;
2806 asdl_seq *body, *orelse = NULL, *finally = NULL;
2807
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 REQ(n, try_stmt);
2809
Neal Norwitzf599f422005-12-17 21:33:47 +00002810 body = ast_for_suite(c, CHILD(n, 2));
2811 if (body == NULL)
2812 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813
Neal Norwitzf599f422005-12-17 21:33:47 +00002814 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2815 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2816 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2817 /* we can assume it's an "else",
2818 because nch >= 9 for try-else-finally and
2819 it would otherwise have a type of except_clause */
2820 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2821 if (orelse == NULL)
2822 return NULL;
2823 n_except--;
2824 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825
Neal Norwitzf599f422005-12-17 21:33:47 +00002826 finally = ast_for_suite(c, CHILD(n, nch - 1));
2827 if (finally == NULL)
2828 return NULL;
2829 n_except--;
2830 }
2831 else {
2832 /* we can assume it's an "else",
2833 otherwise it would have a type of except_clause */
2834 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2835 if (orelse == NULL)
2836 return NULL;
2837 n_except--;
2838 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002840 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002841 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842 return NULL;
2843 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002844
2845 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002846 int i;
2847 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002848 /* process except statements to create a try ... except */
2849 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2850 if (handlers == NULL)
2851 return NULL;
2852
2853 for (i = 0; i < n_except; i++) {
2854 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2855 CHILD(n, 5 + i * 3));
2856 if (!e)
2857 return NULL;
2858 asdl_seq_SET(handlers, i, e);
2859 }
2860
Thomas Wouters89f507f2006-12-13 04:49:30 +00002861 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002862 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002863 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002864 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002865
2866 /* if a 'finally' is present too, we nest the TryExcept within a
2867 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002868 body = asdl_seq_new(1, c->c_arena);
2869 if (body == NULL)
2870 return NULL;
2871 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002872 }
2873
2874 /* must be a try ... finally (except clauses are in body, if any exist) */
2875 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002876 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877}
2878
Guido van Rossumc2e20742006-02-27 22:32:47 +00002879static expr_ty
2880ast_for_with_var(struct compiling *c, const node *n)
2881{
2882 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002883 return ast_for_expr(c, CHILD(n, 1));
2884}
2885
2886/* with_stmt: 'with' test [ with_var ] ':' suite */
2887static stmt_ty
2888ast_for_with_stmt(struct compiling *c, const node *n)
2889{
2890 expr_ty context_expr, optional_vars = NULL;
2891 int suite_index = 3; /* skip 'with', test, and ':' */
2892 asdl_seq *suite_seq;
2893
2894 assert(TYPE(n) == with_stmt);
2895 context_expr = ast_for_expr(c, CHILD(n, 1));
2896 if (TYPE(CHILD(n, 2)) == with_var) {
2897 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2898
2899 if (!optional_vars) {
2900 return NULL;
2901 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002902 if (!set_context(optional_vars, Store, n)) {
2903 return NULL;
2904 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002905 suite_index = 4;
2906 }
2907
2908 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2909 if (!suite_seq) {
2910 return NULL;
2911 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002912 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002913 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002914}
2915
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002917ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002918{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002919 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2920 asdl_seq *s;
2921 expr_ty call, dummy;
2922
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 REQ(n, classdef);
2924
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002925 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 s = ast_for_suite(c, CHILD(n, 3));
2927 if (!s)
2928 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002929 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002930 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002931 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002932
2933 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002934 s = ast_for_suite(c, CHILD(n,5));
2935 if (!s)
2936 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002937 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002938 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 }
2940
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002941 /* class NAME '(' arglist ')' ':' suite */
2942 /* build up a fake Call node so we can extract its pieces */
2943 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2944 call = ast_for_call(c, CHILD(n, 3), dummy);
2945 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002948 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002950
2951 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2952 call->v.Call.args, call->v.Call.keywords,
2953 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002954 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955}
2956
2957static stmt_ty
2958ast_for_stmt(struct compiling *c, const node *n)
2959{
2960 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002961 assert(NCH(n) == 1);
2962 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 }
2964 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002965 assert(num_stmts(n) == 1);
2966 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 }
2968 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002969 REQ(n, small_stmt);
2970 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002971 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2972 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 */
2974 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 case expr_stmt:
2976 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977 case del_stmt:
2978 return ast_for_del_stmt(c, n);
2979 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002980 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 case flow_stmt:
2982 return ast_for_flow_stmt(c, n);
2983 case import_stmt:
2984 return ast_for_import_stmt(c, n);
2985 case global_stmt:
2986 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002987 case nonlocal_stmt:
2988 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 case assert_stmt:
2990 return ast_for_assert_stmt(c, n);
2991 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002992 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2994 TYPE(n), NCH(n));
2995 return NULL;
2996 }
2997 }
2998 else {
2999 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003000 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003001 */
3002 node *ch = CHILD(n, 0);
3003 REQ(n, compound_stmt);
3004 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005 case if_stmt:
3006 return ast_for_if_stmt(c, ch);
3007 case while_stmt:
3008 return ast_for_while_stmt(c, ch);
3009 case for_stmt:
3010 return ast_for_for_stmt(c, ch);
3011 case try_stmt:
3012 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003013 case with_stmt:
3014 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003016 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003018 return ast_for_classdef(c, ch, NULL);
3019 case decorated:
3020 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003022 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3024 TYPE(n), NCH(n));
3025 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003026 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 }
3028}
3029
3030static PyObject *
3031parsenumber(const char *s)
3032{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003033 const char *end;
3034 long x;
3035 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003037 Py_complex c;
3038 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039#endif
3040
Guido van Rossumd8faa362007-04-27 19:54:29 +00003041 errno = 0;
3042 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003044 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003046 if (s[0] == '0') {
3047 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3048 if (x < 0 && errno == 0) {
3049 return PyLong_FromString((char *)s,
3050 (char **)0,
3051 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003052 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003053 }
3054 else
3055 x = PyOS_strtol((char *)s, (char **)&end, 0);
3056 if (*end == '\0') {
3057 if (errno != 0)
3058 return PyLong_FromString((char *)s, (char **)0, 0);
3059 return PyInt_FromLong(x);
3060 }
3061 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003063 if (imflag) {
3064 c.real = 0.;
3065 PyFPE_START_PROTECT("atof", return 0)
3066 c.imag = PyOS_ascii_atof(s);
3067 PyFPE_END_PROTECT(c)
3068 return PyComplex_FromCComplex(c);
3069 }
3070 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003072 {
3073 PyFPE_START_PROTECT("atof", return 0)
3074 dx = PyOS_ascii_atof(s);
3075 PyFPE_END_PROTECT(dx)
3076 return PyFloat_FromDouble(dx);
3077 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078}
3079
3080static PyObject *
3081decode_utf8(const char **sPtr, const char *end, char* encoding)
3082{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003083 PyObject *u, *v;
3084 char *s, *t;
3085 t = s = (char *)*sPtr;
3086 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3087 while (s < end && (*s & 0x80)) s++;
3088 *sPtr = s;
3089 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3090 if (u == NULL)
3091 return NULL;
3092 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3093 Py_DECREF(u);
3094 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095}
3096
3097static PyObject *
3098decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3099{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003100 PyObject *v, *u;
3101 char *buf;
3102 char *p;
3103 const char *end;
3104 if (encoding == NULL) {
3105 buf = (char *)s;
3106 u = NULL;
3107 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3108 buf = (char *)s;
3109 u = NULL;
3110 } else {
3111 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3112 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3113 if (u == NULL)
3114 return NULL;
3115 p = buf = PyString_AsString(u);
3116 end = s + len;
3117 while (s < end) {
3118 if (*s == '\\') {
3119 *p++ = *s++;
3120 if (*s & 0x80) {
3121 strcpy(p, "u005c");
3122 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003123 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003124 }
3125 if (*s & 0x80) { /* XXX inefficient */
3126 PyObject *w;
3127 char *r;
3128 Py_ssize_t rn, i;
3129 w = decode_utf8(&s, end, "utf-16-be");
3130 if (w == NULL) {
3131 Py_DECREF(u);
3132 return NULL;
3133 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003134 assert(PyBytes_Check(w));
3135 r = PyBytes_AsString(w);
3136 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003137 assert(rn % 2 == 0);
3138 for (i = 0; i < rn; i += 2) {
3139 sprintf(p, "\\u%02x%02x",
3140 r[i + 0] & 0xFF,
3141 r[i + 1] & 0xFF);
3142 p += 6;
3143 }
3144 Py_DECREF(w);
3145 } else {
3146 *p++ = *s++;
3147 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003148 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003149 len = p - buf;
3150 s = buf;
3151 }
3152 if (rawmode)
3153 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3154 else
3155 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3156 Py_XDECREF(u);
3157 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158}
3159
3160/* s is a Python string literal, including the bracketing quote characters,
3161 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3162 * parsestr parses it, and returns the decoded Python string object.
3163 */
3164static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003165parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003167 size_t len;
3168 const char *s = STR(n);
3169 int quote = Py_CHARMASK(*s);
3170 int rawmode = 0;
3171 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 if (quote == 'b' || quote == 'B') {
3175 quote = *++s;
3176 *bytesmode = 1;
3177 }
3178 if (quote == 'r' || quote == 'R') {
3179 quote = *++s;
3180 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003181 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 }
3183 if (quote != '\'' && quote != '\"') {
3184 PyErr_BadInternalCall();
3185 return NULL;
3186 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 s++;
3188 len = strlen(s);
3189 if (len > INT_MAX) {
3190 PyErr_SetString(PyExc_OverflowError,
3191 "string to parse is too long");
3192 return NULL;
3193 }
3194 if (s[--len] != quote) {
3195 PyErr_BadInternalCall();
3196 return NULL;
3197 }
3198 if (len >= 4 && s[0] == quote && s[1] == quote) {
3199 s += 2;
3200 len -= 2;
3201 if (s[--len] != quote || s[--len] != quote) {
3202 PyErr_BadInternalCall();
3203 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003204 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003206 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 return decode_unicode(s, len, rawmode, encoding);
3208 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 if (*bytesmode) {
3210 /* Disallow non-ascii characters (but not escapes) */
3211 const char *c;
3212 for (c = s; *c; c++) {
3213 if (Py_CHARMASK(*c) >= 0x80) {
3214 ast_error(n, "bytes can only contain ASCII "
3215 "literal characters.");
3216 return NULL;
3217 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003218 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003219 }
3220 need_encoding = (!*bytesmode && encoding != NULL &&
3221 strcmp(encoding, "utf-8") != 0 &&
3222 strcmp(encoding, "iso-8859-1") != 0);
3223 if (rawmode || strchr(s, '\\') == NULL) {
3224 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003225 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3226 if (u == NULL)
3227 return NULL;
3228 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3229 Py_DECREF(u);
3230 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003231 } else {
3232 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003233 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235
Guido van Rossumbdde0112007-05-11 16:26:27 +00003236 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238}
3239
3240/* Build a Python string object out of a STRING atom. This takes care of
3241 * compile-time literal catenation, calling parsestr() on each piece, and
3242 * pasting the intermediate results together.
3243 */
3244static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003245parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003247 PyObject *v;
3248 int i;
3249 REQ(CHILD(n, 0), STRING);
3250 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3251 if (v != NULL) {
3252 /* String literal concatenation */
3253 for (i = 1; i < NCH(n); i++) {
3254 PyObject *s;
3255 int subbm = 0;
3256 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3257 if (s == NULL)
3258 goto onError;
3259 if (*bytesmode != subbm) {
3260 ast_error(n, "cannot mix bytes and nonbytes"
3261 "literals");
3262 goto onError;
3263 }
3264 if (PyString_Check(v) && PyString_Check(s)) {
3265 PyString_ConcatAndDel(&v, s);
3266 if (v == NULL)
3267 goto onError;
3268 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 else {
3270 PyObject *temp = PyUnicode_Concat(v, s);
3271 Py_DECREF(s);
3272 Py_DECREF(v);
3273 v = temp;
3274 if (v == NULL)
3275 goto onError;
3276 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003277 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003278 }
3279 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280
Guido van Rossumd8faa362007-04-27 19:54:29 +00003281 onError:
3282 Py_XDECREF(v);
3283 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284}