blob: b313ef2aa459f2c388c5fbc4b78ded4da0644294 [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 if (ctx == Store &&
Martin v. Löwis5b222132007-06-10 09:51:05 +0000380 !PyUnicode_CompareWithASCIIString(e->v.Attribute.attr, "None")) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000381 return ast_error(n, "assignment to None");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000382 }
383 e->v.Attribute.ctx = ctx;
384 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000385 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000386 e->v.Subscript.ctx = ctx;
387 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000388 case Starred_kind:
389 e->v.Starred.ctx = ctx;
390 if (!set_context(e->v.Starred.value, ctx, n))
391 return 0;
392 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000394 if (ctx == Store) {
395 if (forbidden_name(e, n))
396 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000397 }
398 e->v.Name.ctx = ctx;
399 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000400 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 e->v.List.ctx = ctx;
402 s = e->v.List.elts;
403 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000404 case Tuple_kind:
405 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
406 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000407 e->v.Tuple.ctx = ctx;
408 s = e->v.Tuple.elts;
409 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 case Lambda_kind:
411 expr_name = "lambda";
412 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000413 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000414 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000418 case UnaryOp_kind:
419 expr_name = "operator";
420 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000421 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000422 expr_name = "generator expression";
423 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000424 case Yield_kind:
425 expr_name = "yield expression";
426 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000427 case ListComp_kind:
428 expr_name = "list comprehension";
429 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000430 case SetComp_kind:
431 expr_name = "set comprehension";
432 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000433 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000434 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case Num_kind:
436 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000437 expr_name = "literal";
438 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000439 case Ellipsis_kind:
440 expr_name = "Ellipsis";
441 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 case Compare_kind:
443 expr_name = "comparison";
444 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000445 case IfExp_kind:
446 expr_name = "conditional expression";
447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 default:
449 PyErr_Format(PyExc_SystemError,
450 "unexpected expression in assignment %d (line %d)",
451 e->kind, e->lineno);
452 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 /* Check for error string set by switch */
455 if (expr_name) {
456 char buf[300];
457 PyOS_snprintf(buf, sizeof(buf),
458 "can't %s %s",
459 ctx == Store ? "assign to" : "delete",
460 expr_name);
461 return ast_error(n, buf);
462 }
463
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000464 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000465 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466 */
467 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000468 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000469
Thomas Wouters89f507f2006-12-13 04:49:30 +0000470 for (i = 0; i < asdl_seq_LEN(s); i++) {
471 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
472 return 0;
473 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
475 return 1;
476}
477
478static operator_ty
479ast_for_augassign(const node *n)
480{
481 REQ(n, augassign);
482 n = CHILD(n, 0);
483 switch (STR(n)[0]) {
484 case '+':
485 return Add;
486 case '-':
487 return Sub;
488 case '/':
489 if (STR(n)[1] == '/')
490 return FloorDiv;
491 else
492 return Div;
493 case '%':
494 return Mod;
495 case '<':
496 return LShift;
497 case '>':
498 return RShift;
499 case '&':
500 return BitAnd;
501 case '^':
502 return BitXor;
503 case '|':
504 return BitOr;
505 case '*':
506 if (STR(n)[1] == '*')
507 return Pow;
508 else
509 return Mult;
510 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000511 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000512 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 }
514}
515
516static cmpop_ty
517ast_for_comp_op(const node *n)
518{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000519 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520 |'is' 'not'
521 */
522 REQ(n, comp_op);
523 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000524 n = CHILD(n, 0);
525 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526 case LESS:
527 return Lt;
528 case GREATER:
529 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000530 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000531 return Eq;
532 case LESSEQUAL:
533 return LtE;
534 case GREATEREQUAL:
535 return GtE;
536 case NOTEQUAL:
537 return NotEq;
538 case NAME:
539 if (strcmp(STR(n), "in") == 0)
540 return In;
541 if (strcmp(STR(n), "is") == 0)
542 return Is;
543 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000544 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000546 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000547 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 }
549 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000550 /* handle "not in" and "is not" */
551 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 case NAME:
553 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
554 return NotIn;
555 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
556 return IsNot;
557 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000558 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000560 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000561 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562 }
Neal Norwitz79792652005-11-14 04:25:03 +0000563 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000564 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000565 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566}
567
568static asdl_seq *
569seq_for_testlist(struct compiling *c, const node *n)
570{
571 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000572 asdl_seq *seq;
573 expr_ty expression;
574 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000575 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000577 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 if (!seq)
579 return NULL;
580
581 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000582 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
584 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000585 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587
588 assert(i / 2 < seq->size);
589 asdl_seq_SET(seq, i / 2, expression);
590 }
591 return seq;
592}
593
Neal Norwitzc1505362006-12-28 06:47:50 +0000594static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000595compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000596{
597 identifier name;
598 expr_ty annotation = NULL;
599 node *ch;
600
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000601 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000602 ch = CHILD(n, 0);
603 if (!strcmp(STR(ch), "None")) {
604 ast_error(ch, "assignment to None");
605 return NULL;
606 }
607 name = NEW_IDENTIFIER(ch);
608 if (!name)
609 return NULL;
610
611 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
612 annotation = ast_for_expr(c, CHILD(n, 2));
613 if (!annotation)
614 return NULL;
615 }
616
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000617 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618}
619
Guido van Rossum4f72a782006-10-27 23:31:49 +0000620/* returns -1 if failed to handle keyword only arguments
621 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000622 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000623 ^^^
624 start pointing here
625 */
626static int
627handle_keywordonly_args(struct compiling *c, const node *n, int start,
628 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
629{
630 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000631 expr_ty expression, annotation;
632 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000633 int i = start;
634 int j = 0; /* index for kwdefaults and kwonlyargs */
635 assert(kwonlyargs != NULL);
636 assert(kwdefaults != NULL);
637 while (i < NCH(n)) {
638 ch = CHILD(n, i);
639 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000640 case vfpdef:
641 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000642 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000643 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000644 if (!expression) {
645 ast_error(ch, "assignment to None");
646 goto error;
647 }
648 asdl_seq_SET(kwdefaults, j, expression);
649 i += 2; /* '=' and test */
650 }
651 else { /* setting NULL if no default value exists */
652 asdl_seq_SET(kwdefaults, j, NULL);
653 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000654 if (NCH(ch) == 3) {
655 /* ch is NAME ':' test */
656 annotation = ast_for_expr(c, CHILD(ch, 2));
657 if (!annotation) {
658 ast_error(ch, "expected expression");
659 goto error;
660 }
661 }
662 else {
663 annotation = NULL;
664 }
665 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000666 if (!strcmp(STR(ch), "None")) {
667 ast_error(ch, "assignment to None");
668 goto error;
669 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000670 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000671 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000672 ast_error(ch, "expecting name");
673 goto error;
674 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000675 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000676 i += 2; /* the name and the comma */
677 break;
678 case DOUBLESTAR:
679 return i;
680 default:
681 ast_error(ch, "unexpected node");
682 goto error;
683 }
684 }
685 return i;
686 error:
687 return -1;
688}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689
Jeremy Hyltona8293132006-02-28 17:58:27 +0000690/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000691
692static arguments_ty
693ast_for_arguments(struct compiling *c, const node *n)
694{
Neal Norwitzc1505362006-12-28 06:47:50 +0000695 /* This function handles both typedargslist (function definition)
696 and varargslist (lambda definition).
697
698 parameters: '(' [typedargslist] ')'
699 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000700 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
701 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000702 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000703 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000705 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
706 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000707 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000708 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000710 int i, j, k, nposargs = 0, nkwonlyargs = 0;
711 int nposdefaults = 0, found_default = 0;
712 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 arg_ty arg;
715 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 node *ch;
717
718 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000719 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
721 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000722 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000724 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725
Guido van Rossum4f72a782006-10-27 23:31:49 +0000726 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000728 ch = CHILD(n, i);
729 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000730 /* skip star and possible argument */
731 i++;
732 i += (TYPE(CHILD(n, i)) == tfpdef
733 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000734 break;
735 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000736 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000738 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000740 /* count the number of keyword only args &
741 defaults for keyword only args */
742 for ( ; i < NCH(n); ++i) {
743 ch = CHILD(n, i);
744 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000745 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000746 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
748 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000750 kwonlyargs = (nkwonlyargs ?
751 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
752 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000753 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000754 posdefaults = (nposdefaults ?
755 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
756 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000757 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000758 /* The length of kwonlyargs and kwdefaults are same
759 since we set NULL as default for keyword only argument w/o default
760 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000761 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000762 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
763 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000764 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000765
766 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000767 ast_error(n, "more than 255 arguments");
768 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000771 /* tfpdef: NAME [':' test]
772 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 */
774 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000775 j = 0; /* index for defaults */
776 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 ch = CHILD(n, i);
779 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 case tfpdef:
781 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
783 anything other than EQUAL or a comma? */
784 /* XXX Should NCH(n) check be made a separate check? */
785 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000786 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
787 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 goto error;
789 assert(posdefaults != NULL);
790 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 else if (found_default) {
795 ast_error(n,
796 "non-default argument follows default argument");
797 goto error;
798 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000799 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000800 if (!arg)
801 goto error;
802 asdl_seq_SET(posargs, k++, arg);
803
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 i += 2; /* the name and the comma */
805 break;
806 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 if (i+1 >= NCH(n)) {
808 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000811 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000812 if (TYPE(ch) == COMMA) {
813 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000814 i += 2; /* now follows keyword only arguments */
815 res = handle_keywordonly_args(c, n, i,
816 kwonlyargs, kwdefaults);
817 if (res == -1) goto error;
818 i = res; /* res has new position to process */
819 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000820 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
821 ast_error(CHILD(ch, 0), "assignment to None");
822 goto error;
823 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000824 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000825 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
826 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000827 /* there is an annotation on the vararg */
828 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000829 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000830 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000831 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
832 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000833 int res = 0;
834 res = handle_keywordonly_args(c, n, i,
835 kwonlyargs, kwdefaults);
836 if (res == -1) goto error;
837 i = res; /* res has new position to process */
838 }
839 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 break;
841 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000842 ch = CHILD(n, i+1); /* tfpdef */
843 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000844 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
845 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000846 goto error;
847 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000848 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
849 if (NCH(ch) > 1) {
850 /* there is an annotation on the kwarg */
851 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
852 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 i += 3;
854 break;
855 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000856 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857 "unexpected node in varargslist: %d @ %d",
858 TYPE(ch), i);
859 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000860 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000862 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
863 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000865 Py_XDECREF(vararg);
866 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 return NULL;
868}
869
870static expr_ty
871ast_for_dotted_name(struct compiling *c, const node *n)
872{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000873 expr_ty e;
874 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000875 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 int i;
877
878 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000879
880 lineno = LINENO(n);
881 col_offset = n->n_col_offset;
882
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883 id = NEW_IDENTIFIER(CHILD(n, 0));
884 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000885 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000886 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889
890 for (i = 2; i < NCH(n); i+=2) {
891 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000892 if (!id)
893 return NULL;
894 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
895 if (!e)
896 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 }
898
899 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000900}
901
902static expr_ty
903ast_for_decorator(struct compiling *c, const node *n)
904{
905 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
906 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000907 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908
909 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000910 REQ(CHILD(n, 0), AT);
911 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912
913 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
914 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 return NULL;
916
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000918 d = name_expr;
919 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 }
921 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000922 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000923 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 if (!d)
925 return NULL;
926 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927 }
928 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 d = ast_for_call(c, CHILD(n, 3), name_expr);
930 if (!d)
931 return NULL;
932 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 }
934
935 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936}
937
938static asdl_seq*
939ast_for_decorators(struct compiling *c, const node *n)
940{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000941 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000942 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 int i;
944
945 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000946 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 if (!decorator_seq)
948 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000951 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000952 if (!d)
953 return NULL;
954 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955 }
956 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957}
958
959static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000960ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000962 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000963 identifier name;
964 arguments_ty args;
965 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000966 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000967 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968
969 REQ(n, funcdef);
970
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 name = NEW_IDENTIFIER(CHILD(n, name_i));
972 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000973 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000975 ast_error(CHILD(n, name_i), "assignment to None");
976 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 }
978 args = ast_for_arguments(c, CHILD(n, name_i + 1));
979 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000980 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000981 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
982 returns = ast_for_expr(c, CHILD(n, name_i + 3));
983 if (!returns)
984 return NULL;
985 name_i += 2;
986 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 body = ast_for_suite(c, CHILD(n, name_i + 3));
988 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000989 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990
Neal Norwitzc1505362006-12-28 06:47:50 +0000991 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000992 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993}
994
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000995static stmt_ty
996ast_for_decorated(struct compiling *c, const node *n)
997{
998 /* decorated: decorators (classdef | funcdef) */
999 stmt_ty thing = NULL;
1000 asdl_seq *decorator_seq = NULL;
1001
1002 REQ(n, decorated);
1003
1004 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1005 if (!decorator_seq)
1006 return NULL;
1007
1008 assert(TYPE(CHILD(n, 1)) == funcdef ||
1009 TYPE(CHILD(n, 1)) == classdef);
1010
1011 if (TYPE(CHILD(n, 1)) == funcdef) {
1012 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1013 } else if (TYPE(CHILD(n, 1)) == classdef) {
1014 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1015 }
1016 return thing;
1017}
1018
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019static expr_ty
1020ast_for_lambdef(struct compiling *c, const node *n)
1021{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001022 /* lambdef: 'lambda' [varargslist] ':' test
1023 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024 arguments_ty args;
1025 expr_ty expression;
1026
1027 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001028 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1029 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030 if (!args)
1031 return NULL;
1032 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001033 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035 }
1036 else {
1037 args = ast_for_arguments(c, CHILD(n, 1));
1038 if (!args)
1039 return NULL;
1040 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001041 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 }
1044
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001045 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046}
1047
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001048static expr_ty
1049ast_for_ifexpr(struct compiling *c, const node *n)
1050{
1051 /* test: or_test 'if' or_test 'else' test */
1052 expr_ty expression, body, orelse;
1053
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001054 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001055 body = ast_for_expr(c, CHILD(n, 0));
1056 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001057 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001058 expression = ast_for_expr(c, CHILD(n, 2));
1059 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001060 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001061 orelse = ast_for_expr(c, CHILD(n, 4));
1062 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001063 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1065 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001066}
1067
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001069 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070
Nick Coghlan650f0d02007-04-15 12:05:43 +00001071 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072*/
1073
1074static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001075count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001077 int n_fors = 0;
1078 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079
Guido van Rossumd8faa362007-04-27 19:54:29 +00001080 count_comp_for:
1081 n_fors++;
1082 REQ(ch, comp_for);
1083 if (NCH(ch) == 5)
1084 ch = CHILD(ch, 4);
1085 else
1086 return n_fors;
1087 count_comp_iter:
1088 REQ(ch, comp_iter);
1089 ch = CHILD(ch, 0);
1090 if (TYPE(ch) == comp_for)
1091 goto count_comp_for;
1092 else if (TYPE(ch) == comp_if) {
1093 if (NCH(ch) == 3) {
1094 ch = CHILD(ch, 2);
1095 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001096 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001097 else
1098 return n_fors;
1099 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001100
Guido van Rossumd8faa362007-04-27 19:54:29 +00001101 /* Should never be reached */
1102 PyErr_SetString(PyExc_SystemError,
1103 "logic error in count_comp_fors");
1104 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105}
1106
Nick Coghlan650f0d02007-04-15 12:05:43 +00001107/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108
Nick Coghlan650f0d02007-04-15 12:05:43 +00001109 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110*/
1111
1112static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001113count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001115 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116
Guido van Rossumd8faa362007-04-27 19:54:29 +00001117 while (1) {
1118 REQ(n, comp_iter);
1119 if (TYPE(CHILD(n, 0)) == comp_for)
1120 return n_ifs;
1121 n = CHILD(n, 0);
1122 REQ(n, comp_if);
1123 n_ifs++;
1124 if (NCH(n) == 2)
1125 return n_ifs;
1126 n = CHILD(n, 2);
1127 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128}
1129
1130static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001131ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001133 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1134 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001136 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 int i, n_fors;
1138 node *ch;
1139
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 assert(NCH(n) > 1);
1141
1142 elt = ast_for_expr(c, CHILD(n, 0));
1143 if (!elt)
1144 return NULL;
1145
Nick Coghlan650f0d02007-04-15 12:05:43 +00001146 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 if (n_fors == -1)
1148 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001149
Nick Coghlan650f0d02007-04-15 12:05:43 +00001150 comps = asdl_seq_new(n_fors, c->c_arena);
1151 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001153
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 ch = CHILD(n, 1);
1155 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001156 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 asdl_seq *t;
1158 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001159 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160
Nick Coghlan650f0d02007-04-15 12:05:43 +00001161 REQ(ch, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162
Thomas Wouters89f507f2006-12-13 04:49:30 +00001163 for_ch = CHILD(ch, 1);
1164 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001165 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001167 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001168 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001170
Thomas Wouters89f507f2006-12-13 04:49:30 +00001171 /* Check the # of children rather than the length of t, since
1172 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1173 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001174 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1175 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001177 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1178 c->c_arena),
1179 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180
Nick Coghlan650f0d02007-04-15 12:05:43 +00001181 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001183
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 if (NCH(ch) == 5) {
1185 int j, n_ifs;
1186 asdl_seq *ifs;
1187
1188 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001189 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001192
1193 ifs = asdl_seq_new(n_ifs, c->c_arena);
1194 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001196
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001198 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001200 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001201
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001202 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001203 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001204 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001205 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 if (NCH(ch) == 3)
1207 ch = CHILD(ch, 2);
1208 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001209 /* on exit, must guarantee that ch is a comp_for */
1210 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001212 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001214 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001216
1217 if (type == COMP_GENEXP)
1218 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1219 else if (type == COMP_LISTCOMP)
1220 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1221 else if (type == COMP_SETCOMP)
1222 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1223 else
1224 /* Should never happen */
1225 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226}
1227
1228static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001229ast_for_genexp(struct compiling *c, const node *n)
1230{
1231 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1232 return ast_for_comprehension(c, n, COMP_GENEXP);
1233}
1234
1235static expr_ty
1236ast_for_listcomp(struct compiling *c, const node *n)
1237{
1238 assert(TYPE(n) == (testlist_comp));
1239 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1240}
1241
1242static expr_ty
1243ast_for_setcomp(struct compiling *c, const node *n)
1244{
1245 assert(TYPE(n) == (dictorsetmaker));
1246 return ast_for_comprehension(c, n, COMP_SETCOMP);
1247}
1248
1249
1250static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251ast_for_atom(struct compiling *c, const node *n)
1252{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001253 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1254 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001255 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256 */
1257 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001258 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259
1260 switch (TYPE(ch)) {
1261 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001262 /* All names start in Load context, but may later be
1263 changed. */
1264 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001266 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001267 if (!str)
1268 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001269
Thomas Wouters89f507f2006-12-13 04:49:30 +00001270 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001271 if (bytesmode)
1272 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1273 else
1274 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 }
1276 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001277 PyObject *pynum = parsenumber(STR(ch));
1278 if (!pynum)
1279 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001280
Thomas Wouters89f507f2006-12-13 04:49:30 +00001281 PyArena_AddPyObject(c->c_arena, pynum);
1282 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 }
Georg Brandldde00282007-03-18 19:01:53 +00001284 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001285 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001287 ch = CHILD(n, 1);
1288
1289 if (TYPE(ch) == RPAR)
1290 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1291
1292 if (TYPE(ch) == yield_expr)
1293 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001294
1295 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1296 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001297 return ast_for_genexp(c, ch);
1298
Nick Coghlan650f0d02007-04-15 12:05:43 +00001299 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001301 ch = CHILD(n, 1);
1302
1303 if (TYPE(ch) == RSQB)
1304 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1305
Nick Coghlan650f0d02007-04-15 12:05:43 +00001306 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001307 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1308 asdl_seq *elts = seq_for_testlist(c, ch);
1309 if (!elts)
1310 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001311
Thomas Wouters89f507f2006-12-13 04:49:30 +00001312 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1313 }
1314 else
1315 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001317 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1318 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001319 int i, size;
1320 asdl_seq *keys, *values;
1321
1322 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001323 if (TYPE(ch) == RBRACE) {
1324 /* it's an empty dict */
1325 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1326 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1327 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001328 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001329 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001330 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001331 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001332 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001333 for (i = 0; i < NCH(ch); i += 2) {
1334 expr_ty expression;
1335 expression = ast_for_expr(c, CHILD(ch, i));
1336 if (!expression)
1337 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001338 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001339 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001340 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1341 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1342 /* it's a set comprehension */
1343 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001344 } else {
1345 /* it's a dict */
1346 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1347 keys = asdl_seq_new(size, c->c_arena);
1348 if (!keys)
1349 return NULL;
1350
1351 values = asdl_seq_new(size, c->c_arena);
1352 if (!values)
1353 return NULL;
1354
1355 for (i = 0; i < NCH(ch); i += 4) {
1356 expr_ty expression;
1357
1358 expression = ast_for_expr(c, CHILD(ch, i));
1359 if (!expression)
1360 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001361
Guido van Rossum86e58e22006-08-28 15:27:34 +00001362 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001363
Guido van Rossum86e58e22006-08-28 15:27:34 +00001364 expression = ast_for_expr(c, CHILD(ch, i + 2));
1365 if (!expression)
1366 return NULL;
1367
1368 asdl_seq_SET(values, i / 4, expression);
1369 }
1370 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1371 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001374 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1375 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 }
1377}
1378
1379static slice_ty
1380ast_for_slice(struct compiling *c, const node *n)
1381{
1382 node *ch;
1383 expr_ty lower = NULL, upper = NULL, step = NULL;
1384
1385 REQ(n, subscript);
1386
1387 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001388 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 sliceop: ':' [test]
1390 */
1391 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392 if (NCH(n) == 1 && TYPE(ch) == test) {
1393 /* 'step' variable hold no significance in terms of being used over
1394 other vars */
1395 step = ast_for_expr(c, ch);
1396 if (!step)
1397 return NULL;
1398
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 }
1401
1402 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001403 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 if (!lower)
1405 return NULL;
1406 }
1407
1408 /* If there's an upper bound it's in the second or third position. */
1409 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 if (NCH(n) > 1) {
1411 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412
Thomas Wouters89f507f2006-12-13 04:49:30 +00001413 if (TYPE(n2) == test) {
1414 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 if (!upper)
1416 return NULL;
1417 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001418 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001420 node *n2 = CHILD(n, 2);
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 }
1427 }
1428
1429 ch = CHILD(n, NCH(n) - 1);
1430 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001431 if (NCH(ch) == 1) {
1432 /* No expression, so step is None */
1433 ch = CHILD(ch, 0);
1434 step = Name(new_identifier("None", c->c_arena), Load,
1435 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436 if (!step)
1437 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001438 } else {
1439 ch = CHILD(ch, 1);
1440 if (TYPE(ch) == test) {
1441 step = ast_for_expr(c, ch);
1442 if (!step)
1443 return NULL;
1444 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 }
1446 }
1447
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001448 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449}
1450
1451static expr_ty
1452ast_for_binop(struct compiling *c, const node *n)
1453{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001454 /* Must account for a sequence of expressions.
1455 How should A op B op C by represented?
1456 BinOp(BinOp(A, op, B), op, C).
1457 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458
Guido van Rossumd8faa362007-04-27 19:54:29 +00001459 int i, nops;
1460 expr_ty expr1, expr2, result;
1461 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462
Guido van Rossumd8faa362007-04-27 19:54:29 +00001463 expr1 = ast_for_expr(c, CHILD(n, 0));
1464 if (!expr1)
1465 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466
Guido van Rossumd8faa362007-04-27 19:54:29 +00001467 expr2 = ast_for_expr(c, CHILD(n, 2));
1468 if (!expr2)
1469 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470
Guido van Rossumd8faa362007-04-27 19:54:29 +00001471 newoperator = get_operator(CHILD(n, 1));
1472 if (!newoperator)
1473 return NULL;
1474
1475 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1476 c->c_arena);
1477 if (!result)
1478 return NULL;
1479
1480 nops = (NCH(n) - 1) / 2;
1481 for (i = 1; i < nops; i++) {
1482 expr_ty tmp_result, tmp;
1483 const node* next_oper = CHILD(n, i * 2 + 1);
1484
1485 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001486 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 return NULL;
1488
Guido van Rossumd8faa362007-04-27 19:54:29 +00001489 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1490 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 return NULL;
1492
Guido van Rossumd8faa362007-04-27 19:54:29 +00001493 tmp_result = BinOp(result, newoperator, tmp,
1494 LINENO(next_oper), next_oper->n_col_offset,
1495 c->c_arena);
1496 if (!tmp)
1497 return NULL;
1498 result = tmp_result;
1499 }
1500 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001503static expr_ty
1504ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1505{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001506 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1507 subscriptlist: subscript (',' subscript)* [',']
1508 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1509 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001510 REQ(n, trailer);
1511 if (TYPE(CHILD(n, 0)) == LPAR) {
1512 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001513 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1514 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001515 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001516 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001517 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001518 else if (TYPE(CHILD(n, 0)) == DOT ) {
1519 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001520 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001521 }
1522 else {
1523 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524 REQ(CHILD(n, 2), RSQB);
1525 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001526 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001527 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1528 if (!slc)
1529 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001530 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1531 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001532 }
1533 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001534 /* The grammar is ambiguous here. The ambiguity is resolved
1535 by treating the sequence as a tuple literal if there are
1536 no slice features.
1537 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001538 int j;
1539 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001540 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001541 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001542 asdl_seq *slices, *elts;
1543 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001544 if (!slices)
1545 return NULL;
1546 for (j = 0; j < NCH(n); j += 2) {
1547 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001548 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001549 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001550 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001551 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001552 asdl_seq_SET(slices, j / 2, slc);
1553 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001554 if (!simple) {
1555 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001556 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001557 }
1558 /* extract Index values and put them in a Tuple */
1559 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001560 if (!elts)
1561 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001562 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1563 slc = (slice_ty)asdl_seq_GET(slices, j);
1564 assert(slc->kind == Index_kind && slc->v.Index.value);
1565 asdl_seq_SET(elts, j, slc->v.Index.value);
1566 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001567 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001568 if (!e)
1569 return NULL;
1570 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001571 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001572 }
1573 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001574}
1575
1576static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001577ast_for_factor(struct compiling *c, const node *n)
1578{
1579 node *pfactor, *ppower, *patom, *pnum;
1580 expr_ty expression;
1581
1582 /* If the unary - operator is applied to a constant, don't generate
1583 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1584 constant. The peephole optimizer already does something like
1585 this but it doesn't handle the case where the constant is
1586 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1587 PyLongObject.
1588 */
1589 if (TYPE(CHILD(n, 0)) == MINUS
1590 && NCH(n) == 2
1591 && TYPE((pfactor = CHILD(n, 1))) == factor
1592 && NCH(pfactor) == 1
1593 && TYPE((ppower = CHILD(pfactor, 0))) == power
1594 && NCH(ppower) == 1
1595 && TYPE((patom = CHILD(ppower, 0))) == atom
1596 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1597 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1598 if (s == NULL)
1599 return NULL;
1600 s[0] = '-';
1601 strcpy(s + 1, STR(pnum));
1602 PyObject_FREE(STR(pnum));
1603 STR(pnum) = s;
1604 return ast_for_atom(c, patom);
1605 }
1606
1607 expression = ast_for_expr(c, CHILD(n, 1));
1608 if (!expression)
1609 return NULL;
1610
1611 switch (TYPE(CHILD(n, 0))) {
1612 case PLUS:
1613 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1614 c->c_arena);
1615 case MINUS:
1616 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1617 c->c_arena);
1618 case TILDE:
1619 return UnaryOp(Invert, expression, LINENO(n),
1620 n->n_col_offset, c->c_arena);
1621 }
1622 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1623 TYPE(CHILD(n, 0)));
1624 return NULL;
1625}
1626
1627static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001628ast_for_power(struct compiling *c, const node *n)
1629{
1630 /* power: atom trailer* ('**' factor)*
1631 */
1632 int i;
1633 expr_ty e, tmp;
1634 REQ(n, power);
1635 e = ast_for_atom(c, CHILD(n, 0));
1636 if (!e)
1637 return NULL;
1638 if (NCH(n) == 1)
1639 return e;
1640 for (i = 1; i < NCH(n); i++) {
1641 node *ch = CHILD(n, i);
1642 if (TYPE(ch) != trailer)
1643 break;
1644 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001645 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001647 tmp->lineno = e->lineno;
1648 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001649 e = tmp;
1650 }
1651 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1652 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001653 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001656 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001657 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001658 e = tmp;
1659 }
1660 return e;
1661}
1662
Guido van Rossum0368b722007-05-11 16:50:42 +00001663static expr_ty
1664ast_for_starred(struct compiling *c, const node *n)
1665{
1666 expr_ty tmp;
1667 REQ(n, star_expr);
1668
1669 tmp = ast_for_expr(c, CHILD(n, 1));
1670 if (!tmp)
1671 return NULL;
1672
1673 /* The Load context is changed later. */
1674 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1675}
1676
1677
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678/* Do not name a variable 'expr'! Will cause a compile error.
1679*/
1680
1681static expr_ty
1682ast_for_expr(struct compiling *c, const node *n)
1683{
1684 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001685 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001686 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001687 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688 and_test: not_test ('and' not_test)*
1689 not_test: 'not' not_test | comparison
1690 comparison: expr (comp_op expr)*
1691 expr: xor_expr ('|' xor_expr)*
1692 xor_expr: and_expr ('^' and_expr)*
1693 and_expr: shift_expr ('&' shift_expr)*
1694 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1695 arith_expr: term (('+'|'-') term)*
1696 term: factor (('*'|'/'|'%'|'//') factor)*
1697 factor: ('+'|'-'|'~') factor | power
1698 power: atom trailer* ('**' factor)*
1699 */
1700
1701 asdl_seq *seq;
1702 int i;
1703
1704 loop:
1705 switch (TYPE(n)) {
1706 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001707 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001708 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001709 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001711 else if (NCH(n) > 1)
1712 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001713 /* Fallthrough */
1714 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 case and_test:
1716 if (NCH(n) == 1) {
1717 n = CHILD(n, 0);
1718 goto loop;
1719 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001720 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721 if (!seq)
1722 return NULL;
1723 for (i = 0; i < NCH(n); i += 2) {
1724 expr_ty e = ast_for_expr(c, CHILD(n, i));
1725 if (!e)
1726 return NULL;
1727 asdl_seq_SET(seq, i / 2, e);
1728 }
1729 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001730 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1731 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001732 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001733 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734 case not_test:
1735 if (NCH(n) == 1) {
1736 n = CHILD(n, 0);
1737 goto loop;
1738 }
1739 else {
1740 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1741 if (!expression)
1742 return NULL;
1743
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001744 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1745 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 }
1747 case comparison:
1748 if (NCH(n) == 1) {
1749 n = CHILD(n, 0);
1750 goto loop;
1751 }
1752 else {
1753 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001754 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001755 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001756 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 if (!ops)
1758 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001759 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761 return NULL;
1762 }
1763 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001764 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001765
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001766 newoperator = ast_for_comp_op(CHILD(n, i));
1767 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001769 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770
1771 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001772 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001774 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001776 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 asdl_seq_SET(cmps, i / 2, expression);
1778 }
1779 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001780 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001782 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001784 return Compare(expression, ops, cmps, LINENO(n),
1785 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 }
1787 break;
1788
Guido van Rossum0368b722007-05-11 16:50:42 +00001789 case star_expr:
1790 if (TYPE(CHILD(n, 0)) == STAR) {
1791 return ast_for_starred(c, n);
1792 }
1793 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 /* The next five cases all handle BinOps. The main body of code
1795 is the same in each case, but the switch turned inside out to
1796 reuse the code for each type of operator.
1797 */
1798 case expr:
1799 case xor_expr:
1800 case and_expr:
1801 case shift_expr:
1802 case arith_expr:
1803 case term:
1804 if (NCH(n) == 1) {
1805 n = CHILD(n, 0);
1806 goto loop;
1807 }
1808 return ast_for_binop(c, n);
1809 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001810 expr_ty exp = NULL;
1811 if (NCH(n) == 2) {
1812 exp = ast_for_testlist(c, CHILD(n, 1));
1813 if (!exp)
1814 return NULL;
1815 }
1816 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1817 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001818 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 if (NCH(n) == 1) {
1820 n = CHILD(n, 0);
1821 goto loop;
1822 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001823 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001824 case power:
1825 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001827 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 return NULL;
1829 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001830 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 return NULL;
1832}
1833
1834static expr_ty
1835ast_for_call(struct compiling *c, const node *n, expr_ty func)
1836{
1837 /*
1838 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1839 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001840 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 */
1842
1843 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001844 asdl_seq *args;
1845 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 expr_ty vararg = NULL, kwarg = NULL;
1847
1848 REQ(n, arglist);
1849
1850 nargs = 0;
1851 nkeywords = 0;
1852 ngens = 0;
1853 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001854 node *ch = CHILD(n, i);
1855 if (TYPE(ch) == argument) {
1856 if (NCH(ch) == 1)
1857 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001858 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001859 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 nkeywords++;
1862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 }
1864 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001865 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001866 "if not sole argument");
1867 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 }
1869
1870 if (nargs + nkeywords + ngens > 255) {
1871 ast_error(n, "more than 255 arguments");
1872 return NULL;
1873 }
1874
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001875 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001877 return NULL;
1878 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001880 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 nargs = 0;
1882 nkeywords = 0;
1883 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 node *ch = CHILD(n, i);
1885 if (TYPE(ch) == argument) {
1886 expr_ty e;
1887 if (NCH(ch) == 1) {
1888 if (nkeywords) {
1889 ast_error(CHILD(ch, 0),
1890 "non-keyword arg after keyword arg");
1891 return NULL;
1892 }
1893 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001895 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 asdl_seq_SET(args, nargs++, e);
1897 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001898 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001901 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001902 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001904 else {
1905 keyword_ty kw;
1906 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 /* CHILD(ch, 0) is test, but must be an identifier? */
1909 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001910 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001911 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 /* f(lambda x: x[0] = 3) ends up getting parsed with
1913 * LHS test = lambda x: x[0], and RHS test = 3.
1914 * SF bug 132313 points out that complaining about a keyword
1915 * then is very confusing.
1916 */
1917 if (e->kind == Lambda_kind) {
1918 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001919 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001920 } else if (e->kind != Name_kind) {
1921 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001922 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001923 } else if (forbidden_name(e, ch)) {
1924 return NULL;
1925 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001926 key = e->v.Name.id;
1927 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001929 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001930 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001932 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 asdl_seq_SET(keywords, nkeywords++, kw);
1934 }
1935 }
1936 else if (TYPE(ch) == STAR) {
1937 vararg = ast_for_expr(c, CHILD(n, i+1));
1938 i++;
1939 }
1940 else if (TYPE(ch) == DOUBLESTAR) {
1941 kwarg = ast_for_expr(c, CHILD(n, i+1));
1942 i++;
1943 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944 }
1945
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001946 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947}
1948
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001950ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001952 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001953 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001954 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001956 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001957 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001958 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001959 }
1960 else {
1961 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001962 TYPE(n) == testlist1);
1963 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001965 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 else {
1967 asdl_seq *tmp = seq_for_testlist(c, n);
1968 if (!tmp)
1969 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001970 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001972}
1973
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974static stmt_ty
1975ast_for_expr_stmt(struct compiling *c, const node *n)
1976{
1977 REQ(n, expr_stmt);
1978 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1979 | ('=' (yield_expr|testlist))*)
1980 testlist: test (',' test)* [',']
1981 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001982 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983 test: ... here starts the operator precendence dance
1984 */
1985
1986 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 if (!e)
1989 return NULL;
1990
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 }
1993 else if (TYPE(CHILD(n, 1)) == augassign) {
1994 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001995 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001996 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 if (!expr1)
2000 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002001 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002002 switch (expr1->kind) {
2003 case GeneratorExp_kind:
2004 ast_error(ch, "augmented assignment to generator "
2005 "expression not possible");
2006 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002007 case Yield_kind:
2008 ast_error(ch, "augmented assignment to yield "
2009 "expression not possible");
2010 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002011 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002012 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002013 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002014 break;
2015 }
2016 case Attribute_kind:
2017 case Subscript_kind:
2018 break;
2019 default:
2020 ast_error(ch, "illegal expression for augmented "
2021 "assignment");
2022 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 ch = CHILD(n, 2);
2027 if (TYPE(ch) == testlist)
2028 expr2 = ast_for_testlist(c, ch);
2029 else
2030 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002031 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 return NULL;
2033
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002034 newoperator = ast_for_augassign(CHILD(n, 1));
2035 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 return NULL;
2037
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 }
2040 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 int i;
2042 asdl_seq *targets;
2043 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 expr_ty expression;
2045
Thomas Wouters89f507f2006-12-13 04:49:30 +00002046 /* a normal assignment */
2047 REQ(CHILD(n, 1), EQUAL);
2048 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2049 if (!targets)
2050 return NULL;
2051 for (i = 0; i < NCH(n) - 2; i += 2) {
2052 expr_ty e;
2053 node *ch = CHILD(n, i);
2054 if (TYPE(ch) == yield_expr) {
2055 ast_error(ch, "assignment to yield expression not possible");
2056 return NULL;
2057 }
2058 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059
Thomas Wouters89f507f2006-12-13 04:49:30 +00002060 /* set context to assign */
2061 if (!e)
2062 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063
Thomas Wouters89f507f2006-12-13 04:49:30 +00002064 if (!set_context(e, Store, CHILD(n, i)))
2065 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002066
Thomas Wouters89f507f2006-12-13 04:49:30 +00002067 asdl_seq_SET(targets, i / 2, e);
2068 }
2069 value = CHILD(n, NCH(n) - 1);
2070 if (TYPE(value) == testlist)
2071 expression = ast_for_testlist(c, value);
2072 else
2073 expression = ast_for_expr(c, value);
2074 if (!expression)
2075 return NULL;
2076 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078}
2079
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002081ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082{
2083 asdl_seq *seq;
2084 int i;
2085 expr_ty e;
2086
2087 REQ(n, exprlist);
2088
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002089 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002093 e = ast_for_expr(c, CHILD(n, i));
2094 if (!e)
2095 return NULL;
2096 asdl_seq_SET(seq, i / 2, e);
2097 if (context && !set_context(e, context, CHILD(n, i)))
2098 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 }
2100 return seq;
2101}
2102
2103static stmt_ty
2104ast_for_del_stmt(struct compiling *c, const node *n)
2105{
2106 asdl_seq *expr_list;
2107
2108 /* del_stmt: 'del' exprlist */
2109 REQ(n, del_stmt);
2110
2111 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2112 if (!expr_list)
2113 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002114 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115}
2116
2117static stmt_ty
2118ast_for_flow_stmt(struct compiling *c, const node *n)
2119{
2120 /*
2121 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2122 | yield_stmt
2123 break_stmt: 'break'
2124 continue_stmt: 'continue'
2125 return_stmt: 'return' [testlist]
2126 yield_stmt: yield_expr
2127 yield_expr: 'yield' testlist
2128 raise_stmt: 'raise' [test [',' test [',' test]]]
2129 */
2130 node *ch;
2131
2132 REQ(n, flow_stmt);
2133 ch = CHILD(n, 0);
2134 switch (TYPE(ch)) {
2135 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002136 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002138 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002140 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2141 if (!exp)
2142 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002143 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002144 }
2145 case return_stmt:
2146 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002147 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002149 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150 if (!expression)
2151 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002152 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 }
2154 case raise_stmt:
2155 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002156 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157 else if (NCH(ch) == 2) {
2158 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2159 if (!expression)
2160 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 }
2163 else if (NCH(ch) == 4) {
2164 expr_ty expr1, expr2;
2165
2166 expr1 = ast_for_expr(c, CHILD(ch, 1));
2167 if (!expr1)
2168 return NULL;
2169 expr2 = ast_for_expr(c, CHILD(ch, 3));
2170 if (!expr2)
2171 return NULL;
2172
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002173 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174 }
2175 else if (NCH(ch) == 6) {
2176 expr_ty expr1, expr2, expr3;
2177
2178 expr1 = ast_for_expr(c, CHILD(ch, 1));
2179 if (!expr1)
2180 return NULL;
2181 expr2 = ast_for_expr(c, CHILD(ch, 3));
2182 if (!expr2)
2183 return NULL;
2184 expr3 = ast_for_expr(c, CHILD(ch, 5));
2185 if (!expr3)
2186 return NULL;
2187
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002188 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 }
2190 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002191 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002192 "unexpected flow_stmt: %d", TYPE(ch));
2193 return NULL;
2194 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002195
2196 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2197 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198}
2199
2200static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002201alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202{
2203 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002204 import_as_name: NAME ['as' NAME]
2205 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206 dotted_name: NAME ('.' NAME)*
2207 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002208 PyObject *str;
2209
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002210 loop:
2211 switch (TYPE(n)) {
2212 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002213 str = NULL;
2214 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002215 str = NEW_IDENTIFIER(CHILD(n, 2));
2216 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002217 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218 case dotted_as_name:
2219 if (NCH(n) == 1) {
2220 n = CHILD(n, 0);
2221 goto loop;
2222 }
2223 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002224 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002225 if (!a)
2226 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227 assert(!a->asname);
2228 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2229 return a;
2230 }
2231 break;
2232 case dotted_name:
2233 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002234 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 else {
2236 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002237 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002238 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002240 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241
2242 len = 0;
2243 for (i = 0; i < NCH(n); i += 2)
2244 /* length of string plus one for the dot */
2245 len += strlen(STR(CHILD(n, i))) + 1;
2246 len--; /* the last name doesn't have a dot */
2247 str = PyString_FromStringAndSize(NULL, len);
2248 if (!str)
2249 return NULL;
2250 s = PyString_AS_STRING(str);
2251 if (!s)
2252 return NULL;
2253 for (i = 0; i < NCH(n); i += 2) {
2254 char *sch = STR(CHILD(n, i));
2255 strcpy(s, STR(CHILD(n, i)));
2256 s += strlen(sch);
2257 *s++ = '.';
2258 }
2259 --s;
2260 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002261 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2262 PyString_GET_SIZE(str),
2263 NULL);
2264 Py_DECREF(str);
2265 if (!uni)
2266 return NULL;
2267 str = uni;
2268 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002269 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002270 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 }
2272 break;
2273 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002274 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002275 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002276 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002278 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 "unexpected import name: %d", TYPE(n));
2280 return NULL;
2281 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002282
2283 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 return NULL;
2285}
2286
2287static stmt_ty
2288ast_for_import_stmt(struct compiling *c, const node *n)
2289{
2290 /*
2291 import_stmt: import_name | import_from
2292 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002293 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2294 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002296 int lineno;
2297 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 int i;
2299 asdl_seq *aliases;
2300
2301 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002302 lineno = LINENO(n);
2303 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002305 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002307 REQ(n, dotted_as_names);
2308 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2309 if (!aliases)
2310 return NULL;
2311 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002312 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002313 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002315 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002317 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002319 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002321 int idx, ndots = 0;
2322 alias_ty mod = NULL;
2323 identifier modname;
2324
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002325 /* Count the number of dots (for relative imports) and check for the
2326 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002327 for (idx = 1; idx < NCH(n); idx++) {
2328 if (TYPE(CHILD(n, idx)) == dotted_name) {
2329 mod = alias_for_import_name(c, CHILD(n, idx));
2330 idx++;
2331 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002332 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2333 /* three consecutive dots are tokenized as one ELLIPSIS */
2334 ndots += 3;
2335 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002336 } else if (TYPE(CHILD(n, idx)) != DOT) {
2337 break;
2338 }
2339 ndots++;
2340 }
2341 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002342 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002343 case STAR:
2344 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002345 n = CHILD(n, idx);
2346 n_children = 1;
2347 if (ndots) {
2348 ast_error(n, "'import *' not allowed with 'from .'");
2349 return NULL;
2350 }
2351 break;
2352 case LPAR:
2353 /* from ... import (x, y, z) */
2354 n = CHILD(n, idx + 1);
2355 n_children = NCH(n);
2356 break;
2357 case import_as_names:
2358 /* from ... import x, y, z */
2359 n = CHILD(n, idx);
2360 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002361 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 ast_error(n, "trailing comma not allowed without"
2363 " surrounding parentheses");
2364 return NULL;
2365 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002366 break;
2367 default:
2368 ast_error(n, "Unexpected node-type in from-import");
2369 return NULL;
2370 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371
Thomas Wouters89f507f2006-12-13 04:49:30 +00002372 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2373 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375
2376 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002377 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002378 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002379 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002381 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002382 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002383 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002384 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002385 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2386 if (!import_alias)
2387 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002388 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002389 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002391 if (mod != NULL)
2392 modname = mod->name;
2393 else
2394 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002395 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002396 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 }
Neal Norwitz79792652005-11-14 04:25:03 +00002398 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 "unknown import statement: starts with command '%s'",
2400 STR(CHILD(n, 0)));
2401 return NULL;
2402}
2403
2404static stmt_ty
2405ast_for_global_stmt(struct compiling *c, const node *n)
2406{
2407 /* global_stmt: 'global' NAME (',' NAME)* */
2408 identifier name;
2409 asdl_seq *s;
2410 int i;
2411
2412 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002413 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 name = NEW_IDENTIFIER(CHILD(n, i));
2418 if (!name)
2419 return NULL;
2420 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002422 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423}
2424
2425static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002426ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2427{
2428 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2429 identifier name;
2430 asdl_seq *s;
2431 int i;
2432
2433 REQ(n, nonlocal_stmt);
2434 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2435 if (!s)
2436 return NULL;
2437 for (i = 1; i < NCH(n); i += 2) {
2438 name = NEW_IDENTIFIER(CHILD(n, i));
2439 if (!name)
2440 return NULL;
2441 asdl_seq_SET(s, i / 2, name);
2442 }
2443 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2444}
2445
2446static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447ast_for_assert_stmt(struct compiling *c, const node *n)
2448{
2449 /* assert_stmt: 'assert' test [',' test] */
2450 REQ(n, assert_stmt);
2451 if (NCH(n) == 2) {
2452 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2453 if (!expression)
2454 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002455 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 }
2457 else if (NCH(n) == 4) {
2458 expr_ty expr1, expr2;
2459
2460 expr1 = ast_for_expr(c, CHILD(n, 1));
2461 if (!expr1)
2462 return NULL;
2463 expr2 = ast_for_expr(c, CHILD(n, 3));
2464 if (!expr2)
2465 return NULL;
2466
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 }
Neal Norwitz79792652005-11-14 04:25:03 +00002469 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 "improper number of parts to 'assert' statement: %d",
2471 NCH(n));
2472 return NULL;
2473}
2474
2475static asdl_seq *
2476ast_for_suite(struct compiling *c, const node *n)
2477{
2478 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002479 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 stmt_ty s;
2481 int i, total, num, end, pos = 0;
2482 node *ch;
2483
2484 REQ(n, suite);
2485
2486 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002487 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002489 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002491 n = CHILD(n, 0);
2492 /* simple_stmt always ends with a NEWLINE,
2493 and may have a trailing SEMI
2494 */
2495 end = NCH(n) - 1;
2496 if (TYPE(CHILD(n, end - 1)) == SEMI)
2497 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002499 for (i = 0; i < end; i += 2) {
2500 ch = CHILD(n, i);
2501 s = ast_for_stmt(c, ch);
2502 if (!s)
2503 return NULL;
2504 asdl_seq_SET(seq, pos++, s);
2505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 }
2507 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 for (i = 2; i < (NCH(n) - 1); i++) {
2509 ch = CHILD(n, i);
2510 REQ(ch, stmt);
2511 num = num_stmts(ch);
2512 if (num == 1) {
2513 /* small_stmt or compound_stmt with only one child */
2514 s = ast_for_stmt(c, ch);
2515 if (!s)
2516 return NULL;
2517 asdl_seq_SET(seq, pos++, s);
2518 }
2519 else {
2520 int j;
2521 ch = CHILD(ch, 0);
2522 REQ(ch, simple_stmt);
2523 for (j = 0; j < NCH(ch); j += 2) {
2524 /* statement terminates with a semi-colon ';' */
2525 if (NCH(CHILD(ch, j)) == 0) {
2526 assert((j + 1) == NCH(ch));
2527 break;
2528 }
2529 s = ast_for_stmt(c, CHILD(ch, j));
2530 if (!s)
2531 return NULL;
2532 asdl_seq_SET(seq, pos++, s);
2533 }
2534 }
2535 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 }
2537 assert(pos == seq->size);
2538 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539}
2540
2541static stmt_ty
2542ast_for_if_stmt(struct compiling *c, const node *n)
2543{
2544 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2545 ['else' ':' suite]
2546 */
2547 char *s;
2548
2549 REQ(n, if_stmt);
2550
2551 if (NCH(n) == 4) {
2552 expr_ty expression;
2553 asdl_seq *suite_seq;
2554
2555 expression = ast_for_expr(c, CHILD(n, 1));
2556 if (!expression)
2557 return NULL;
2558 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002559 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 return NULL;
2561
Guido van Rossumd8faa362007-04-27 19:54:29 +00002562 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2563 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002565
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 s = STR(CHILD(n, 4));
2567 /* s[2], the third character in the string, will be
2568 's' for el_s_e, or
2569 'i' for el_i_f
2570 */
2571 if (s[2] == 's') {
2572 expr_ty expression;
2573 asdl_seq *seq1, *seq2;
2574
2575 expression = ast_for_expr(c, CHILD(n, 1));
2576 if (!expression)
2577 return NULL;
2578 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002579 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 return NULL;
2581 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002582 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 return NULL;
2584
Guido van Rossumd8faa362007-04-27 19:54:29 +00002585 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2586 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 }
2588 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002590 expr_ty expression;
2591 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 asdl_seq *orelse = NULL;
2593 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 /* must reference the child n_elif+1 since 'else' token is third,
2595 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002596 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2597 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2598 has_else = 1;
2599 n_elif -= 3;
2600 }
2601 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602
Thomas Wouters89f507f2006-12-13 04:49:30 +00002603 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002604 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 orelse = asdl_seq_new(1, c->c_arena);
2607 if (!orelse)
2608 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002610 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002612 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2613 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002615 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2616 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618
Guido van Rossumd8faa362007-04-27 19:54:29 +00002619 asdl_seq_SET(orelse, 0,
2620 If(expression, suite_seq, suite_seq2,
2621 LINENO(CHILD(n, NCH(n) - 6)),
2622 CHILD(n, NCH(n) - 6)->n_col_offset,
2623 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002624 /* the just-created orelse handled the last elif */
2625 n_elif--;
2626 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 for (i = 0; i < n_elif; i++) {
2629 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2631 if (!newobj)
2632 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002634 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002637 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639
Thomas Wouters89f507f2006-12-13 04:49:30 +00002640 asdl_seq_SET(newobj, 0,
2641 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002642 LINENO(CHILD(n, off)),
2643 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 orelse = newobj;
2645 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002646 expression = ast_for_expr(c, CHILD(n, 1));
2647 if (!expression)
2648 return NULL;
2649 suite_seq = ast_for_suite(c, CHILD(n, 3));
2650 if (!suite_seq)
2651 return NULL;
2652 return If(expression, suite_seq, orelse,
2653 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002655
2656 PyErr_Format(PyExc_SystemError,
2657 "unexpected token in 'if' statement: %s", s);
2658 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659}
2660
2661static stmt_ty
2662ast_for_while_stmt(struct compiling *c, const node *n)
2663{
2664 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2665 REQ(n, while_stmt);
2666
2667 if (NCH(n) == 4) {
2668 expr_ty expression;
2669 asdl_seq *suite_seq;
2670
2671 expression = ast_for_expr(c, CHILD(n, 1));
2672 if (!expression)
2673 return NULL;
2674 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002675 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002677 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 }
2679 else if (NCH(n) == 7) {
2680 expr_ty expression;
2681 asdl_seq *seq1, *seq2;
2682
2683 expression = ast_for_expr(c, CHILD(n, 1));
2684 if (!expression)
2685 return NULL;
2686 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002687 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 return NULL;
2689 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002690 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 return NULL;
2692
Thomas Wouters89f507f2006-12-13 04:49:30 +00002693 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002695
2696 PyErr_Format(PyExc_SystemError,
2697 "wrong number of tokens for 'while' statement: %d",
2698 NCH(n));
2699 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700}
2701
2702static stmt_ty
2703ast_for_for_stmt(struct compiling *c, const node *n)
2704{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002705 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 expr_ty expression;
2707 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002708 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2710 REQ(n, for_stmt);
2711
2712 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002713 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 if (!seq)
2715 return NULL;
2716 }
2717
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002718 node_target = CHILD(n, 1);
2719 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002720 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002722 /* Check the # of children rather than the length of _target, since
2723 for x, in ... has 1 element in _target, but still requires a Tuple. */
2724 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002727 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002729 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002730 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 return NULL;
2732 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002733 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 return NULL;
2735
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002736 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2737 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738}
2739
2740static excepthandler_ty
2741ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2742{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002743 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 REQ(exc, except_clause);
2745 REQ(body, suite);
2746
2747 if (NCH(exc) == 1) {
2748 asdl_seq *suite_seq = ast_for_suite(c, body);
2749 if (!suite_seq)
2750 return NULL;
2751
Thomas Wouters89f507f2006-12-13 04:49:30 +00002752 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002753 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 }
2755 else if (NCH(exc) == 2) {
2756 expr_ty expression;
2757 asdl_seq *suite_seq;
2758
2759 expression = ast_for_expr(c, CHILD(exc, 1));
2760 if (!expression)
2761 return NULL;
2762 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002763 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 return NULL;
2765
Thomas Wouters89f507f2006-12-13 04:49:30 +00002766 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002767 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 }
2769 else if (NCH(exc) == 4) {
2770 asdl_seq *suite_seq;
2771 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002772 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002773 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 return NULL;
2778 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002779 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 return NULL;
2781
Thomas Wouters89f507f2006-12-13 04:49:30 +00002782 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002783 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785
2786 PyErr_Format(PyExc_SystemError,
2787 "wrong number of children for 'except' clause: %d",
2788 NCH(exc));
2789 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790}
2791
2792static stmt_ty
2793ast_for_try_stmt(struct compiling *c, const node *n)
2794{
Neal Norwitzf599f422005-12-17 21:33:47 +00002795 const int nch = NCH(n);
2796 int n_except = (nch - 3)/3;
2797 asdl_seq *body, *orelse = NULL, *finally = NULL;
2798
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 REQ(n, try_stmt);
2800
Neal Norwitzf599f422005-12-17 21:33:47 +00002801 body = ast_for_suite(c, CHILD(n, 2));
2802 if (body == NULL)
2803 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804
Neal Norwitzf599f422005-12-17 21:33:47 +00002805 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2806 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2807 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2808 /* we can assume it's an "else",
2809 because nch >= 9 for try-else-finally and
2810 it would otherwise have a type of except_clause */
2811 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2812 if (orelse == NULL)
2813 return NULL;
2814 n_except--;
2815 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816
Neal Norwitzf599f422005-12-17 21:33:47 +00002817 finally = ast_for_suite(c, CHILD(n, nch - 1));
2818 if (finally == NULL)
2819 return NULL;
2820 n_except--;
2821 }
2822 else {
2823 /* we can assume it's an "else",
2824 otherwise it would have a type of except_clause */
2825 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2826 if (orelse == NULL)
2827 return NULL;
2828 n_except--;
2829 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002831 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002832 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 return NULL;
2834 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002835
2836 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002837 int i;
2838 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002839 /* process except statements to create a try ... except */
2840 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2841 if (handlers == NULL)
2842 return NULL;
2843
2844 for (i = 0; i < n_except; i++) {
2845 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2846 CHILD(n, 5 + i * 3));
2847 if (!e)
2848 return NULL;
2849 asdl_seq_SET(handlers, i, e);
2850 }
2851
Thomas Wouters89f507f2006-12-13 04:49:30 +00002852 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002853 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002854 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002855 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002856
2857 /* if a 'finally' is present too, we nest the TryExcept within a
2858 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002859 body = asdl_seq_new(1, c->c_arena);
2860 if (body == NULL)
2861 return NULL;
2862 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002863 }
2864
2865 /* must be a try ... finally (except clauses are in body, if any exist) */
2866 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002867 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868}
2869
Guido van Rossumc2e20742006-02-27 22:32:47 +00002870static expr_ty
2871ast_for_with_var(struct compiling *c, const node *n)
2872{
2873 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002874 return ast_for_expr(c, CHILD(n, 1));
2875}
2876
2877/* with_stmt: 'with' test [ with_var ] ':' suite */
2878static stmt_ty
2879ast_for_with_stmt(struct compiling *c, const node *n)
2880{
2881 expr_ty context_expr, optional_vars = NULL;
2882 int suite_index = 3; /* skip 'with', test, and ':' */
2883 asdl_seq *suite_seq;
2884
2885 assert(TYPE(n) == with_stmt);
2886 context_expr = ast_for_expr(c, CHILD(n, 1));
2887 if (TYPE(CHILD(n, 2)) == with_var) {
2888 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2889
2890 if (!optional_vars) {
2891 return NULL;
2892 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 if (!set_context(optional_vars, Store, n)) {
2894 return NULL;
2895 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002896 suite_index = 4;
2897 }
2898
2899 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2900 if (!suite_seq) {
2901 return NULL;
2902 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002903 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002904 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002905}
2906
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002908ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002910 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2911 asdl_seq *s;
2912 expr_ty call, dummy;
2913
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 REQ(n, classdef);
2915
2916 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002917 ast_error(n, "assignment to None");
2918 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 }
2920
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002921 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 s = ast_for_suite(c, CHILD(n, 3));
2923 if (!s)
2924 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002925 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002926 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002928
2929 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002930 s = ast_for_suite(c, CHILD(n,5));
2931 if (!s)
2932 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002933 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002934 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935 }
2936
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002937 /* class NAME '(' arglist ')' ':' suite */
2938 /* build up a fake Call node so we can extract its pieces */
2939 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2940 call = ast_for_call(c, CHILD(n, 3), dummy);
2941 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002943 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002944 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002946
2947 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2948 call->v.Call.args, call->v.Call.keywords,
2949 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002950 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951}
2952
2953static stmt_ty
2954ast_for_stmt(struct compiling *c, const node *n)
2955{
2956 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002957 assert(NCH(n) == 1);
2958 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959 }
2960 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002961 assert(num_stmts(n) == 1);
2962 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 }
2964 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002965 REQ(n, small_stmt);
2966 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002967 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2968 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002969 */
2970 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 case expr_stmt:
2972 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 case del_stmt:
2974 return ast_for_del_stmt(c, n);
2975 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002976 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977 case flow_stmt:
2978 return ast_for_flow_stmt(c, n);
2979 case import_stmt:
2980 return ast_for_import_stmt(c, n);
2981 case global_stmt:
2982 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002983 case nonlocal_stmt:
2984 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 case assert_stmt:
2986 return ast_for_assert_stmt(c, n);
2987 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002988 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2990 TYPE(n), NCH(n));
2991 return NULL;
2992 }
2993 }
2994 else {
2995 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002996 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00002997 */
2998 node *ch = CHILD(n, 0);
2999 REQ(n, compound_stmt);
3000 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001 case if_stmt:
3002 return ast_for_if_stmt(c, ch);
3003 case while_stmt:
3004 return ast_for_while_stmt(c, ch);
3005 case for_stmt:
3006 return ast_for_for_stmt(c, ch);
3007 case try_stmt:
3008 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003009 case with_stmt:
3010 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003012 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003014 return ast_for_classdef(c, ch, NULL);
3015 case decorated:
3016 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003018 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3020 TYPE(n), NCH(n));
3021 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003022 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 }
3024}
3025
3026static PyObject *
3027parsenumber(const char *s)
3028{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003029 const char *end;
3030 long x;
3031 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003033 Py_complex c;
3034 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035#endif
3036
Guido van Rossumd8faa362007-04-27 19:54:29 +00003037 errno = 0;
3038 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003040 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003042 if (*end == 'l' || *end == 'L')
3043 return PyLong_FromString((char *)s, (char **)0, 0);
3044 if (s[0] == '0') {
3045 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3046 if (x < 0 && errno == 0) {
3047 return PyLong_FromString((char *)s,
3048 (char **)0,
3049 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003050 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003051 }
3052 else
3053 x = PyOS_strtol((char *)s, (char **)&end, 0);
3054 if (*end == '\0') {
3055 if (errno != 0)
3056 return PyLong_FromString((char *)s, (char **)0, 0);
3057 return PyInt_FromLong(x);
3058 }
3059 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003061 if (imflag) {
3062 c.real = 0.;
3063 PyFPE_START_PROTECT("atof", return 0)
3064 c.imag = PyOS_ascii_atof(s);
3065 PyFPE_END_PROTECT(c)
3066 return PyComplex_FromCComplex(c);
3067 }
3068 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003070 {
3071 PyFPE_START_PROTECT("atof", return 0)
3072 dx = PyOS_ascii_atof(s);
3073 PyFPE_END_PROTECT(dx)
3074 return PyFloat_FromDouble(dx);
3075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076}
3077
3078static PyObject *
3079decode_utf8(const char **sPtr, const char *end, char* encoding)
3080{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003081 PyObject *u, *v;
3082 char *s, *t;
3083 t = s = (char *)*sPtr;
3084 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3085 while (s < end && (*s & 0x80)) s++;
3086 *sPtr = s;
3087 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3088 if (u == NULL)
3089 return NULL;
3090 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3091 Py_DECREF(u);
3092 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093}
3094
3095static PyObject *
3096decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3097{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003098 PyObject *v, *u;
3099 char *buf;
3100 char *p;
3101 const char *end;
3102 if (encoding == NULL) {
3103 buf = (char *)s;
3104 u = NULL;
3105 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3106 buf = (char *)s;
3107 u = NULL;
3108 } else {
3109 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3110 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3111 if (u == NULL)
3112 return NULL;
3113 p = buf = PyString_AsString(u);
3114 end = s + len;
3115 while (s < end) {
3116 if (*s == '\\') {
3117 *p++ = *s++;
3118 if (*s & 0x80) {
3119 strcpy(p, "u005c");
3120 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003121 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003122 }
3123 if (*s & 0x80) { /* XXX inefficient */
3124 PyObject *w;
3125 char *r;
3126 Py_ssize_t rn, i;
3127 w = decode_utf8(&s, end, "utf-16-be");
3128 if (w == NULL) {
3129 Py_DECREF(u);
3130 return NULL;
3131 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003132 assert(PyBytes_Check(w));
3133 r = PyBytes_AsString(w);
3134 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003135 assert(rn % 2 == 0);
3136 for (i = 0; i < rn; i += 2) {
3137 sprintf(p, "\\u%02x%02x",
3138 r[i + 0] & 0xFF,
3139 r[i + 1] & 0xFF);
3140 p += 6;
3141 }
3142 Py_DECREF(w);
3143 } else {
3144 *p++ = *s++;
3145 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003146 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003147 len = p - buf;
3148 s = buf;
3149 }
3150 if (rawmode)
3151 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3152 else
3153 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3154 Py_XDECREF(u);
3155 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156}
3157
3158/* s is a Python string literal, including the bracketing quote characters,
3159 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3160 * parsestr parses it, and returns the decoded Python string object.
3161 */
3162static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003163parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 size_t len;
3166 const char *s = STR(n);
3167 int quote = Py_CHARMASK(*s);
3168 int rawmode = 0;
3169 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 if (quote == 'b' || quote == 'B') {
3173 quote = *++s;
3174 *bytesmode = 1;
3175 }
3176 if (quote == 'r' || quote == 'R') {
3177 quote = *++s;
3178 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 }
3181 if (quote != '\'' && quote != '\"') {
3182 PyErr_BadInternalCall();
3183 return NULL;
3184 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 s++;
3186 len = strlen(s);
3187 if (len > INT_MAX) {
3188 PyErr_SetString(PyExc_OverflowError,
3189 "string to parse is too long");
3190 return NULL;
3191 }
3192 if (s[--len] != quote) {
3193 PyErr_BadInternalCall();
3194 return NULL;
3195 }
3196 if (len >= 4 && s[0] == quote && s[1] == quote) {
3197 s += 2;
3198 len -= 2;
3199 if (s[--len] != quote || s[--len] != quote) {
3200 PyErr_BadInternalCall();
3201 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003202 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003204 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 return decode_unicode(s, len, rawmode, encoding);
3206 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 if (*bytesmode) {
3208 /* Disallow non-ascii characters (but not escapes) */
3209 const char *c;
3210 for (c = s; *c; c++) {
3211 if (Py_CHARMASK(*c) >= 0x80) {
3212 ast_error(n, "bytes can only contain ASCII "
3213 "literal characters.");
3214 return NULL;
3215 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003216 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003217 }
3218 need_encoding = (!*bytesmode && encoding != NULL &&
3219 strcmp(encoding, "utf-8") != 0 &&
3220 strcmp(encoding, "iso-8859-1") != 0);
3221 if (rawmode || strchr(s, '\\') == NULL) {
3222 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3224 if (u == NULL)
3225 return NULL;
3226 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3227 Py_DECREF(u);
3228 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 } else {
3230 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003231 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233
Guido van Rossumbdde0112007-05-11 16:26:27 +00003234 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003235 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236}
3237
3238/* Build a Python string object out of a STRING atom. This takes care of
3239 * compile-time literal catenation, calling parsestr() on each piece, and
3240 * pasting the intermediate results together.
3241 */
3242static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003243parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003245 PyObject *v;
3246 int i;
3247 REQ(CHILD(n, 0), STRING);
3248 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3249 if (v != NULL) {
3250 /* String literal concatenation */
3251 for (i = 1; i < NCH(n); i++) {
3252 PyObject *s;
3253 int subbm = 0;
3254 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3255 if (s == NULL)
3256 goto onError;
3257 if (*bytesmode != subbm) {
3258 ast_error(n, "cannot mix bytes and nonbytes"
3259 "literals");
3260 goto onError;
3261 }
3262 if (PyString_Check(v) && PyString_Check(s)) {
3263 PyString_ConcatAndDel(&v, s);
3264 if (v == NULL)
3265 goto onError;
3266 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003267 else {
3268 PyObject *temp = PyUnicode_Concat(v, s);
3269 Py_DECREF(s);
3270 Py_DECREF(v);
3271 v = temp;
3272 if (v == NULL)
3273 goto onError;
3274 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003275 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003276 }
3277 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278
Guido van Rossumd8faa362007-04-27 19:54:29 +00003279 onError:
3280 Py_XDECREF(v);
3281 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282}