blob: 411c42ffd9cc645eb3c7172a2f188b879e5b34d8 [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 *);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *, expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000029static expr_ty ast_for_testlist(struct compiling *, const node *);
30static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000031
32/* Note different signature for ast_for_call */
33static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
34
35static PyObject *parsenumber(const char *);
36static PyObject *parsestr(const char *s, const char *encoding);
37static PyObject *parsestrplus(struct compiling *, const node *n);
38
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000039#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000040#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#endif
42
Neal Norwitzadb69fc2005-12-17 20:54:49 +000043static identifier
44new_identifier(const char* n, PyArena *arena) {
45 PyObject* id = PyString_InternFromString(n);
46 PyArena_AddPyObject(arena, id);
47 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000048}
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000051
52/* This routine provides an invalid object for the syntax error.
53 The outermost routine must unpack this error and create the
54 proper object. We do this so that we don't have to pass
55 the filename to everything function.
56
57 XXX Maybe we should just pass the filename...
58*/
59
60static int
61ast_error(const node *n, const char *errstr)
62{
63 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
64 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000065 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000066 PyErr_SetObject(PyExc_SyntaxError, u);
67 Py_DECREF(u);
68 return 0;
69}
70
71static void
72ast_error_finish(const char *filename)
73{
74 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000075 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000076
77 assert(PyErr_Occurred());
78 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +000079 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000080
81 PyErr_Fetch(&type, &value, &tback);
82 errstr = PyTuple_GetItem(value, 0);
83 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +000084 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085 Py_INCREF(errstr);
86 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000087 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000088 Py_DECREF(errstr);
89 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000090 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000091 Py_DECREF(value);
92
93 loc = PyErr_ProgramText(filename, lineno);
94 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 Py_INCREF(Py_None);
96 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +000098 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000099 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000100 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000101 Py_DECREF(errstr);
102 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000103 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000104 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105 Py_DECREF(errstr);
106 Py_DECREF(tmp);
107 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000108 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000109 PyErr_Restore(type, value, tback);
110}
111
112/* num_stmts() returns number of contained statements.
113
114 Use this routine to determine how big a sequence is needed for
115 the statements in a parse tree. Its raison d'etre is this bit of
116 grammar:
117
118 stmt: simple_stmt | compound_stmt
119 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
120
121 A simple_stmt can contain multiple small_stmt elements joined
122 by semicolons. If the arg is a simple_stmt, the number of
123 small_stmt elements is returned.
124*/
125
126static int
127num_stmts(const node *n)
128{
129 int i, l;
130 node *ch;
131
132 switch (TYPE(n)) {
133 case single_input:
134 if (TYPE(CHILD(n, 0)) == NEWLINE)
135 return 0;
136 else
137 return num_stmts(CHILD(n, 0));
138 case file_input:
139 l = 0;
140 for (i = 0; i < NCH(n); i++) {
141 ch = CHILD(n, i);
142 if (TYPE(ch) == stmt)
143 l += num_stmts(ch);
144 }
145 return l;
146 case stmt:
147 return num_stmts(CHILD(n, 0));
148 case compound_stmt:
149 return 1;
150 case simple_stmt:
151 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
152 case suite:
153 if (NCH(n) == 1)
154 return num_stmts(CHILD(n, 0));
155 else {
156 l = 0;
157 for (i = 2; i < (NCH(n) - 1); i++)
158 l += num_stmts(CHILD(n, i));
159 return l;
160 }
161 default: {
162 char buf[128];
163
164 sprintf(buf, "Non-statement found: %d %d\n",
165 TYPE(n), NCH(n));
166 Py_FatalError(buf);
167 }
168 }
169 assert(0);
170 return 0;
171}
172
173/* Transform the CST rooted at node * to the appropriate AST
174*/
175
176mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000177PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
178 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000179{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000180 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181 asdl_seq *stmts = NULL;
182 stmt_ty s;
183 node *ch;
184 struct compiling c;
185
186 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000187 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000188 if (TYPE(n) == encoding_decl) {
189 ast_error(n, "encoding declaration in Unicode string");
190 goto error;
191 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000192 } else if (TYPE(n) == encoding_decl) {
193 c.c_encoding = STR(n);
194 n = CHILD(n, 0);
195 } else {
196 c.c_encoding = NULL;
197 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000198 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000199
Jeremy Hyltona8293132006-02-28 17:58:27 +0000200 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000201 switch (TYPE(n)) {
202 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000203 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000204 if (!stmts)
205 return NULL;
206 for (i = 0; i < NCH(n) - 1; i++) {
207 ch = CHILD(n, i);
208 if (TYPE(ch) == NEWLINE)
209 continue;
210 REQ(ch, stmt);
211 num = num_stmts(ch);
212 if (num == 1) {
213 s = ast_for_stmt(&c, ch);
214 if (!s)
215 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000216 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000217 }
218 else {
219 ch = CHILD(ch, 0);
220 REQ(ch, simple_stmt);
221 for (j = 0; j < num; j++) {
222 s = ast_for_stmt(&c, CHILD(ch, j * 2));
223 if (!s)
224 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000225 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000226 }
227 }
228 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000229 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230 case eval_input: {
231 expr_ty testlist_ast;
232
233 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000234 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000235 if (!testlist_ast)
236 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000237 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 }
239 case single_input:
240 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000241 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000243 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000244 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
245 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000246 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000247 }
248 else {
249 n = CHILD(n, 0);
250 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000251 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000253 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000254 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000255 s = ast_for_stmt(&c, n);
256 if (!s)
257 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 asdl_seq_SET(stmts, 0, s);
259 }
260 else {
261 /* Only a simple_stmt can contain multiple statements. */
262 REQ(n, simple_stmt);
263 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 if (TYPE(CHILD(n, i)) == NEWLINE)
265 break;
266 s = ast_for_stmt(&c, CHILD(n, i));
267 if (!s)
268 goto error;
269 asdl_seq_SET(stmts, i / 2, s);
270 }
271 }
272
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000273 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 }
275 default:
276 goto error;
277 }
278 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 ast_error_finish(filename);
280 return NULL;
281}
282
283/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
284*/
285
286static operator_ty
287get_operator(const node *n)
288{
289 switch (TYPE(n)) {
290 case VBAR:
291 return BitOr;
292 case CIRCUMFLEX:
293 return BitXor;
294 case AMPER:
295 return BitAnd;
296 case LEFTSHIFT:
297 return LShift;
298 case RIGHTSHIFT:
299 return RShift;
300 case PLUS:
301 return Add;
302 case MINUS:
303 return Sub;
304 case STAR:
305 return Mult;
306 case SLASH:
307 return Div;
308 case DOUBLESLASH:
309 return FloorDiv;
310 case PERCENT:
311 return Mod;
312 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000313 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000314 }
315}
316
Jeremy Hyltona8293132006-02-28 17:58:27 +0000317/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318
319 Only sets context for expr kinds that "can appear in assignment context"
320 (according to ../Parser/Python.asdl). For other expr kinds, it sets
321 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000322*/
323
324static int
325set_context(expr_ty e, expr_context_ty ctx, const node *n)
326{
327 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000328 /* If a particular expression type can't be used for assign / delete,
329 set expr_name to its name and an error message will be generated.
330 */
331 const char* expr_name = NULL;
332
333 /* The ast defines augmented store and load contexts, but the
334 implementation here doesn't actually use them. The code may be
335 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000336 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000337 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000338 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000339 */
340 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000341
342 switch (e->kind) {
343 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000344 if (ctx == Store &&
345 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
346 return ast_error(n, "assignment to None");
347 }
348 e->v.Attribute.ctx = ctx;
349 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000351 e->v.Subscript.ctx = ctx;
352 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 case Name_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000354 if (ctx == Store &&
355 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
356 return ast_error(n, "assignment to None");
357 }
358 e->v.Name.ctx = ctx;
359 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000360 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000361 e->v.List.ctx = ctx;
362 s = e->v.List.elts;
363 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000364 case Tuple_kind:
365 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
366 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000367 e->v.Tuple.ctx = ctx;
368 s = e->v.Tuple.elts;
369 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000370 case Lambda_kind:
371 expr_name = "lambda";
372 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000374 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000375 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000376 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000377 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000378 case UnaryOp_kind:
379 expr_name = "operator";
380 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 expr_name = "generator expression";
383 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000384 case Yield_kind:
385 expr_name = "yield expression";
386 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000387 case ListComp_kind:
388 expr_name = "list comprehension";
389 break;
390 case Dict_kind:
Guido van Rossum86e58e22006-08-28 15:27:34 +0000391 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392 case Num_kind:
393 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 expr_name = "literal";
395 break;
Georg Brandl52318d62006-09-06 07:06:08 +0000396 case Ellipsis_kind:
397 expr_name = "Ellipsis";
398 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 case Compare_kind:
400 expr_name = "comparison";
401 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000402 case IfExp_kind:
403 expr_name = "conditional expression";
404 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000405 default:
406 PyErr_Format(PyExc_SystemError,
407 "unexpected expression in assignment %d (line %d)",
408 e->kind, e->lineno);
409 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000410 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000411 /* Check for error string set by switch */
412 if (expr_name) {
413 char buf[300];
414 PyOS_snprintf(buf, sizeof(buf),
415 "can't %s %s",
416 ctx == Store ? "assign to" : "delete",
417 expr_name);
418 return ast_error(n, buf);
419 }
420
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000421 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000422 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423 */
424 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000425 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427 for (i = 0; i < asdl_seq_LEN(s); i++) {
428 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
429 return 0;
430 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 }
432 return 1;
433}
434
435static operator_ty
436ast_for_augassign(const node *n)
437{
438 REQ(n, augassign);
439 n = CHILD(n, 0);
440 switch (STR(n)[0]) {
441 case '+':
442 return Add;
443 case '-':
444 return Sub;
445 case '/':
446 if (STR(n)[1] == '/')
447 return FloorDiv;
448 else
449 return Div;
450 case '%':
451 return Mod;
452 case '<':
453 return LShift;
454 case '>':
455 return RShift;
456 case '&':
457 return BitAnd;
458 case '^':
459 return BitXor;
460 case '|':
461 return BitOr;
462 case '*':
463 if (STR(n)[1] == '*')
464 return Pow;
465 else
466 return Mult;
467 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000468 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000469 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 }
471}
472
473static cmpop_ty
474ast_for_comp_op(const node *n)
475{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000476 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000477 |'is' 'not'
478 */
479 REQ(n, comp_op);
480 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000481 n = CHILD(n, 0);
482 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000483 case LESS:
484 return Lt;
485 case GREATER:
486 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000487 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488 return Eq;
489 case LESSEQUAL:
490 return LtE;
491 case GREATEREQUAL:
492 return GtE;
493 case NOTEQUAL:
494 return NotEq;
495 case NAME:
496 if (strcmp(STR(n), "in") == 0)
497 return In;
498 if (strcmp(STR(n), "is") == 0)
499 return Is;
500 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000501 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000503 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000504 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505 }
506 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000507 /* handle "not in" and "is not" */
508 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 case NAME:
510 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
511 return NotIn;
512 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
513 return IsNot;
514 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000515 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000516 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000517 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000518 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519 }
Neal Norwitz79792652005-11-14 04:25:03 +0000520 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000522 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523}
524
525static asdl_seq *
526seq_for_testlist(struct compiling *c, const node *n)
527{
528 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000529 asdl_seq *seq;
530 expr_ty expression;
531 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000532 assert(TYPE(n) == testlist
Thomas Wouters89f507f2006-12-13 04:49:30 +0000533 || TYPE(n) == listmaker
534 || TYPE(n) == testlist_gexp
535 || TYPE(n) == testlist_safe
536 || TYPE(n) == testlist1
537 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000539 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000540 if (!seq)
541 return NULL;
542
543 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000544 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545
546 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000547 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549
550 assert(i / 2 < seq->size);
551 asdl_seq_SET(seq, i / 2, expression);
552 }
553 return seq;
554}
555
556static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000557compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558{
559 int i, len = (NCH(n) + 1) / 2;
560 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000561 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562 if (!args)
563 return NULL;
564
Thomas Wouters89f507f2006-12-13 04:49:30 +0000565 /* fpdef: NAME | '(' fplist ')'
566 fplist: fpdef (',' fpdef)* [',']
567 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 for (i = 0; i < len; i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000570 const node *fpdef_node = CHILD(n, 2*i);
571 const node *child;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572 expr_ty arg;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000573set_name:
574 /* fpdef_node is either a NAME or an fplist */
575 child = CHILD(fpdef_node, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 if (TYPE(child) == NAME) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 if (!strcmp(STR(child), "None")) {
578 ast_error(child, "assignment to None");
579 return NULL;
580 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
582 child->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000583 }
Jeremy Hyltona8293132006-02-28 17:58:27 +0000584 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 assert(TYPE(fpdef_node) == fpdef);
586 /* fpdef_node[0] is not a name, so it must be a '(', get CHILD[1] */
587 child = CHILD(fpdef_node, 1);
588 assert(TYPE(child) == fplist);
589 /* NCH == 1 means we have (x), we need to elide the extra parens */
590 if (NCH(child) == 1) {
591 fpdef_node = CHILD(child, 0);
592 assert(TYPE(fpdef_node) == fpdef);
593 goto set_name;
594 }
595 arg = compiler_complex_args(c, child);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 asdl_seq_SET(args, i, arg);
598 }
599
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000600 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000601 if (!set_context(result, Store, n))
602 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 return result;
604}
605
Guido van Rossum4f72a782006-10-27 23:31:49 +0000606/* returns -1 if failed to handle keyword only arguments
607 returns new position to keep processing if successful
608 (',' NAME ['=' test])*
609 ^^^
610 start pointing here
611 */
612static int
613handle_keywordonly_args(struct compiling *c, const node *n, int start,
614 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
615{
616 node *ch;
617 expr_ty name;
618 int i = start;
619 int j = 0; /* index for kwdefaults and kwonlyargs */
620 assert(kwonlyargs != NULL);
621 assert(kwdefaults != NULL);
622 while (i < NCH(n)) {
623 ch = CHILD(n, i);
624 switch (TYPE(ch)) {
625 case NAME:
626 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
627 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
628 if (!expression) {
629 ast_error(ch, "assignment to None");
630 goto error;
631 }
632 asdl_seq_SET(kwdefaults, j, expression);
633 i += 2; /* '=' and test */
634 }
635 else { /* setting NULL if no default value exists */
636 asdl_seq_SET(kwdefaults, j, NULL);
637 }
638 if (!strcmp(STR(ch), "None")) {
639 ast_error(ch, "assignment to None");
640 goto error;
641 }
642 name = Name(NEW_IDENTIFIER(ch),
643 Param, LINENO(ch), ch->n_col_offset,
644 c->c_arena);
645 if (!name) {
646 ast_error(ch, "expecting name");
647 goto error;
648 }
649 asdl_seq_SET(kwonlyargs, j++, name);
650 i += 2; /* the name and the comma */
651 break;
652 case DOUBLESTAR:
653 return i;
654 default:
655 ast_error(ch, "unexpected node");
656 goto error;
657 }
658 }
659 return i;
660 error:
661 return -1;
662}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000663
Jeremy Hyltona8293132006-02-28 17:58:27 +0000664/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665
666static arguments_ty
667ast_for_arguments(struct compiling *c, const node *n)
668{
669 /* parameters: '(' [varargslist] ')'
Guido van Rossum4f72a782006-10-27 23:31:49 +0000670 varargslist: (fpdef ['=' test] ',')*
671 ('*' [NAME] (',' fpdef ['=' test])* [',' '**' NAME] | '**' NAME)
672 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000673 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 int i, j, k, nposargs = 0, nkwonlyargs = 0;
675 int nposdefaults = 0, found_default = 0;
676 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 identifier vararg = NULL, kwarg = NULL;
678 node *ch;
679
680 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000681 if (NCH(n) == 2) /* () as argument list */
682 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
683 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000684 }
685 REQ(n, varargslist);
686
Guido van Rossum4f72a782006-10-27 23:31:49 +0000687 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000688 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 ch = CHILD(n, i);
690 if (TYPE(ch) == STAR) {
691 if (TYPE(CHILD(n, i+1)) == NAME) {
692 /* skip NAME of vararg */
693 /* so that following can count only keyword only args */
694 i += 2;
695 }
696 else {
697 i++;
698 }
699 break;
700 }
701 if (TYPE(ch) == fpdef) nposargs++;
702 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000704 /* count the number of keyword only args &
705 defaults for keyword only args */
706 for ( ; i < NCH(n); ++i) {
707 ch = CHILD(n, i);
708 if (TYPE(ch) == DOUBLESTAR) break;
709 if (TYPE(ch) == NAME) nkwonlyargs++;
710 }
711
712 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
713 if (!posargs && nposargs)
714 return NULL; /* Don't need to goto error; no objects allocated */
715 kwonlyargs = (nkwonlyargs ?
716 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
717 if (!kwonlyargs && nkwonlyargs)
718 return NULL; /* Don't need to goto error; no objects allocated */
719 posdefaults = (nposdefaults ?
720 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
721 if (!posdefaults && nposdefaults)
722 return NULL; /* Don't need to goto error; no objects allocated */
723 /* The length of kwonlyargs and kwdefaults are same
724 since we set NULL as default for keyword only argument w/o default
725 - we have sequence data structure, but no dictionary */
726 kwdefaults = (nkwonlyargs ?
727 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
728 if (!kwdefaults && nkwonlyargs)
729 return NULL; /* Don't need to goto error; no objects allocated */
730
731 if (nposargs + nkwonlyargs > 255) {
732 ast_error(n, "more than 255 arguments");
733 return NULL;
734 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735
736 /* fpdef: NAME | '(' fplist ')'
737 fplist: fpdef (',' fpdef)* [',']
738 */
739 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000740 j = 0; /* index for defaults */
741 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000743 ch = CHILD(n, i);
744 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745 case fpdef:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000746 handle_fpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
748 anything other than EQUAL or a comma? */
749 /* XXX Should NCH(n) check be made a separate check? */
750 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000751 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
752 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 goto error;
754 assert(posdefaults != NULL);
755 asdl_seq_SET(posdefaults, j++, expression);
756
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000758 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000759 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000760 else if (found_default) {
761 ast_error(n,
762 "non-default argument follows default argument");
763 goto error;
764 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 if (NCH(ch) == 3) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 ch = CHILD(ch, 1);
767 /* def foo((x)): is not complex, special case. */
768 if (NCH(ch) != 1) {
769 /* We have complex arguments, setup for unpacking. */
770 asdl_seq_SET(posargs, k++,
771 compiler_complex_args(c, ch));
772 } else {
773 /* def foo((x)): setup for checking NAME below. */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000774 /* Loop because there can be many parens and tuple
775 unpacking mixed in. */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 ch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000777 assert(TYPE(ch) == fpdef);
778 goto handle_fpdef;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000779 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000780 }
781 if (TYPE(CHILD(ch, 0)) == NAME) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000782 expr_ty name;
783 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
784 ast_error(CHILD(ch, 0), "assignment to None");
785 goto error;
786 }
Armin Rigo31441302005-10-21 12:57:31 +0000787 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000788 Param, LINENO(ch), ch->n_col_offset,
789 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 if (!name)
791 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 asdl_seq_SET(posargs, k++, name);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000793
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 i += 2; /* the name and the comma */
796 break;
797 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 if (i+1 >= NCH(n)) {
799 ast_error(CHILD(n, i), "no name for vararg");
800 goto error;
801 }
802 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
803 ast_error(CHILD(n, i+1), "assignment to None");
804 goto error;
805 }
806 if (TYPE(CHILD(n, i+1)) == COMMA) {
807 int res = 0;
808 i += 2; /* now follows keyword only arguments */
809 res = handle_keywordonly_args(c, n, i,
810 kwonlyargs, kwdefaults);
811 if (res == -1) goto error;
812 i = res; /* res has new position to process */
813 }
814 else {
815 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
816 i += 3;
817 if (i < NCH(n) && TYPE(CHILD(n, i)) == NAME) {
818 int res = 0;
819 res = handle_keywordonly_args(c, n, i,
820 kwonlyargs, kwdefaults);
821 if (res == -1) goto error;
822 i = res; /* res has new position to process */
823 }
824 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 break;
826 case DOUBLESTAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000827 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
828 ast_error(CHILD(n, i+1), "assignment to None");
829 goto error;
830 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
832 i += 3;
833 break;
834 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000835 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 "unexpected node in varargslist: %d @ %d",
837 TYPE(ch), i);
838 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000839 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000841 return arguments(posargs, vararg, kwonlyargs, kwarg,
842 posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000844 Py_XDECREF(vararg);
845 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846 return NULL;
847}
848
849static expr_ty
850ast_for_dotted_name(struct compiling *c, const node *n)
851{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000852 expr_ty e;
853 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000854 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000855 int i;
856
857 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000858
859 lineno = LINENO(n);
860 col_offset = n->n_col_offset;
861
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862 id = NEW_IDENTIFIER(CHILD(n, 0));
863 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000864 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000865 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000867 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868
869 for (i = 2; i < NCH(n); i+=2) {
870 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000871 if (!id)
872 return NULL;
873 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
874 if (!e)
875 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 }
877
878 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000879}
880
881static expr_ty
882ast_for_decorator(struct compiling *c, const node *n)
883{
884 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
885 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000886 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887
888 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000889 REQ(CHILD(n, 0), AT);
890 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891
892 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
893 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894 return NULL;
895
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000896 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000897 d = name_expr;
898 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 }
900 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000901 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000902 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000903 if (!d)
904 return NULL;
905 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 }
907 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000908 d = ast_for_call(c, CHILD(n, 3), name_expr);
909 if (!d)
910 return NULL;
911 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 }
913
914 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000915}
916
917static asdl_seq*
918ast_for_decorators(struct compiling *c, const node *n)
919{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000920 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000921 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922 int i;
923
924 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000925 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 if (!decorator_seq)
927 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000928
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000930 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000931 if (!d)
932 return NULL;
933 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 }
935 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936}
937
938static stmt_ty
939ast_for_funcdef(struct compiling *c, const node *n)
940{
941 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000942 identifier name;
943 arguments_ty args;
944 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 asdl_seq *decorator_seq = NULL;
946 int name_i;
947
948 REQ(n, funcdef);
949
950 if (NCH(n) == 6) { /* decorators are present */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
952 if (!decorator_seq)
953 return NULL;
954 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955 }
956 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000957 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958 }
959
960 name = NEW_IDENTIFIER(CHILD(n, name_i));
961 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000962 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000964 ast_error(CHILD(n, name_i), "assignment to None");
965 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 }
967 args = ast_for_arguments(c, CHILD(n, name_i + 1));
968 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 body = ast_for_suite(c, CHILD(n, name_i + 3));
971 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000972 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000974 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
975 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976}
977
978static expr_ty
979ast_for_lambdef(struct compiling *c, const node *n)
980{
981 /* lambdef: 'lambda' [varargslist] ':' test */
982 arguments_ty args;
983 expr_ty expression;
984
985 if (NCH(n) == 3) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000986 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 if (!args)
988 return NULL;
989 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000990 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 }
993 else {
994 args = ast_for_arguments(c, CHILD(n, 1));
995 if (!args)
996 return NULL;
997 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000998 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 }
1001
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001002 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003}
1004
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001005static expr_ty
1006ast_for_ifexpr(struct compiling *c, const node *n)
1007{
1008 /* test: or_test 'if' or_test 'else' test */
1009 expr_ty expression, body, orelse;
1010
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001011 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001012 body = ast_for_expr(c, CHILD(n, 0));
1013 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001014 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001015 expression = ast_for_expr(c, CHILD(n, 2));
1016 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001017 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001018 orelse = ast_for_expr(c, CHILD(n, 4));
1019 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001020 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001021 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1022 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001023}
1024
Thomas Wouters89f507f2006-12-13 04:49:30 +00001025/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
1026 so there is only a single version. Possibly for loops can also re-use
1027 the code.
1028*/
1029
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030/* Count the number of 'for' loop in a list comprehension.
1031
1032 Helper for ast_for_listcomp().
1033*/
1034
1035static int
1036count_list_fors(const node *n)
1037{
1038 int n_fors = 0;
1039 node *ch = CHILD(n, 1);
1040
1041 count_list_for:
1042 n_fors++;
1043 REQ(ch, list_for);
1044 if (NCH(ch) == 5)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001045 ch = CHILD(ch, 4);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001047 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048 count_list_iter:
1049 REQ(ch, list_iter);
1050 ch = CHILD(ch, 0);
1051 if (TYPE(ch) == list_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001052 goto count_list_for;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 else if (TYPE(ch) == list_if) {
1054 if (NCH(ch) == 3) {
1055 ch = CHILD(ch, 2);
1056 goto count_list_iter;
1057 }
1058 else
1059 return n_fors;
1060 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001061
1062 /* Should never be reached */
1063 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
1064 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065}
1066
1067/* Count the number of 'if' statements in a list comprehension.
1068
1069 Helper for ast_for_listcomp().
1070*/
1071
1072static int
1073count_list_ifs(const node *n)
1074{
1075 int n_ifs = 0;
1076
1077 count_list_iter:
1078 REQ(n, list_iter);
1079 if (TYPE(CHILD(n, 0)) == list_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001080 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 n = CHILD(n, 0);
1082 REQ(n, list_if);
1083 n_ifs++;
1084 if (NCH(n) == 2)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001085 return n_ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 n = CHILD(n, 2);
1087 goto count_list_iter;
1088}
1089
1090static expr_ty
1091ast_for_listcomp(struct compiling *c, const node *n)
1092{
1093 /* listmaker: test ( list_for | (',' test)* [','] )
1094 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1095 list_iter: list_for | list_if
1096 list_if: 'if' test [list_iter]
1097 testlist_safe: test [(',' test)+ [',']]
1098 */
1099 expr_ty elt;
1100 asdl_seq *listcomps;
1101 int i, n_fors;
1102 node *ch;
1103
1104 REQ(n, listmaker);
1105 assert(NCH(n) > 1);
1106
1107 elt = ast_for_expr(c, CHILD(n, 0));
1108 if (!elt)
1109 return NULL;
1110
1111 n_fors = count_list_fors(n);
1112 if (n_fors == -1)
1113 return NULL;
1114
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001115 listcomps = asdl_seq_new(n_fors, c->c_arena);
1116 if (!listcomps)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001117 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001118
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119 ch = CHILD(n, 1);
1120 for (i = 0; i < n_fors; i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001121 comprehension_ty lc;
1122 asdl_seq *t;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125
Thomas Wouters89f507f2006-12-13 04:49:30 +00001126 REQ(ch, list_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127
Thomas Wouters89f507f2006-12-13 04:49:30 +00001128 for_ch = CHILD(ch, 1);
1129 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001130 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001132 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001133 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135
Thomas Wouters89f507f2006-12-13 04:49:30 +00001136 /* Check the # of children rather than the length of t, since
1137 [x for x, in ... ] has 1 element in t, but still requires a Tuple. */
1138 if (NCH(for_ch) == 1)
1139 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001140 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001141 else
1142 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001143 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001144 expression, NULL, c->c_arena);
1145 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
Thomas Wouters89f507f2006-12-13 04:49:30 +00001148 if (NCH(ch) == 5) {
1149 int j, n_ifs;
1150 asdl_seq *ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151
Thomas Wouters89f507f2006-12-13 04:49:30 +00001152 ch = CHILD(ch, 4);
1153 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001154 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156
Thomas Wouters89f507f2006-12-13 04:49:30 +00001157 ifs = asdl_seq_new(n_ifs, c->c_arena);
1158 if (!ifs)
1159 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160
Thomas Wouters89f507f2006-12-13 04:49:30 +00001161 for (j = 0; j < n_ifs; j++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001162 REQ(ch, list_iter);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001163 ch = CHILD(ch, 0);
1164 REQ(ch, list_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165
Thomas Wouters89f507f2006-12-13 04:49:30 +00001166 asdl_seq_SET(ifs, j, ast_for_expr(c, CHILD(ch, 1)));
1167 if (NCH(ch) == 3)
1168 ch = CHILD(ch, 2);
1169 }
1170 /* on exit, must guarantee that ch is a list_for */
1171 if (TYPE(ch) == list_iter)
1172 ch = CHILD(ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173 lc->ifs = ifs;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001174 }
1175 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 }
1177
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001178 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179}
1180
1181/*
1182 Count the number of 'for' loops in a generator expression.
1183
1184 Helper for ast_for_genexp().
1185*/
1186
1187static int
1188count_gen_fors(const node *n)
1189{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001190 int n_fors = 0;
1191 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192
1193 count_gen_for:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001194 n_fors++;
1195 REQ(ch, gen_for);
1196 if (NCH(ch) == 5)
1197 ch = CHILD(ch, 4);
1198 else
1199 return n_fors;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 count_gen_iter:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001201 REQ(ch, gen_iter);
1202 ch = CHILD(ch, 0);
1203 if (TYPE(ch) == gen_for)
1204 goto count_gen_for;
1205 else if (TYPE(ch) == gen_if) {
1206 if (NCH(ch) == 3) {
1207 ch = CHILD(ch, 2);
1208 goto count_gen_iter;
1209 }
1210 else
1211 return n_fors;
1212 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001213
Thomas Wouters89f507f2006-12-13 04:49:30 +00001214 /* Should never be reached */
1215 PyErr_SetString(PyExc_SystemError,
1216 "logic error in count_gen_fors");
1217 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218}
1219
1220/* Count the number of 'if' statements in a generator expression.
1221
1222 Helper for ast_for_genexp().
1223*/
1224
1225static int
1226count_gen_ifs(const node *n)
1227{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001228 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229
Thomas Wouters89f507f2006-12-13 04:49:30 +00001230 while (1) {
1231 REQ(n, gen_iter);
1232 if (TYPE(CHILD(n, 0)) == gen_for)
1233 return n_ifs;
1234 n = CHILD(n, 0);
1235 REQ(n, gen_if);
1236 n_ifs++;
1237 if (NCH(n) == 2)
1238 return n_ifs;
1239 n = CHILD(n, 2);
1240 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241}
1242
Jeremy Hyltona8293132006-02-28 17:58:27 +00001243/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244static expr_ty
1245ast_for_genexp(struct compiling *c, const node *n)
1246{
1247 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
Thomas Wouters89f507f2006-12-13 04:49:30 +00001248 argument: [test '='] test [gen_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249 expr_ty elt;
1250 asdl_seq *genexps;
1251 int i, n_fors;
1252 node *ch;
1253
1254 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1255 assert(NCH(n) > 1);
1256
1257 elt = ast_for_expr(c, CHILD(n, 0));
1258 if (!elt)
1259 return NULL;
1260
1261 n_fors = count_gen_fors(n);
1262 if (n_fors == -1)
1263 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001264
1265 genexps = asdl_seq_new(n_fors, c->c_arena);
1266 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001268
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 ch = CHILD(n, 1);
1270 for (i = 0; i < n_fors; i++) {
1271 comprehension_ty ge;
1272 asdl_seq *t;
1273 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001274 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275
1276 REQ(ch, gen_for);
1277
Thomas Wouters89f507f2006-12-13 04:49:30 +00001278 for_ch = CHILD(ch, 1);
1279 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001280 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001282 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001283 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001285
Thomas Wouters89f507f2006-12-13 04:49:30 +00001286 /* Check the # of children rather than the length of t, since
1287 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1288 if (NCH(for_ch) == 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001289 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001290 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001292 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1293 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001294 expression, NULL, c->c_arena);
1295
1296 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001298
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 if (NCH(ch) == 5) {
1300 int j, n_ifs;
1301 asdl_seq *ifs;
1302
1303 ch = CHILD(ch, 4);
1304 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001305 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001307
1308 ifs = asdl_seq_new(n_ifs, c->c_arena);
1309 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001311
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 for (j = 0; j < n_ifs; j++) {
1313 REQ(ch, gen_iter);
1314 ch = CHILD(ch, 0);
1315 REQ(ch, gen_if);
1316
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001317 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001318 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001319 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001320 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 if (NCH(ch) == 3)
1322 ch = CHILD(ch, 2);
1323 }
1324 /* on exit, must guarantee that ch is a gen_for */
1325 if (TYPE(ch) == gen_iter)
1326 ch = CHILD(ch, 0);
1327 ge->ifs = ifs;
1328 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00001329 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 }
1331
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001332 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333}
1334
1335static expr_ty
1336ast_for_atom(struct compiling *c, const node *n)
1337{
1338 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
Guido van Rossum86e58e22006-08-28 15:27:34 +00001339 | '{' [dictsetmaker] '}' | NAME | NUMBER | STRING+
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 */
1341 node *ch = CHILD(n, 0);
1342
1343 switch (TYPE(ch)) {
1344 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001345 /* All names start in Load context, but may later be
1346 changed. */
1347 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 case STRING: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001349 PyObject *str = parsestrplus(c, n);
1350 if (!str)
1351 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001352
Thomas Wouters89f507f2006-12-13 04:49:30 +00001353 PyArena_AddPyObject(c->c_arena, str);
1354 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 }
1356 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001357 PyObject *pynum = parsenumber(STR(ch));
1358 if (!pynum)
1359 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001360
Thomas Wouters89f507f2006-12-13 04:49:30 +00001361 PyArena_AddPyObject(c->c_arena, pynum);
1362 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001363 }
Georg Brandl52318d62006-09-06 07:06:08 +00001364 case DOT:
1365 /* Ellipsis */
1366 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001368 ch = CHILD(n, 1);
1369
1370 if (TYPE(ch) == RPAR)
1371 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1372
1373 if (TYPE(ch) == yield_expr)
1374 return ast_for_expr(c, ch);
1375
1376 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1377 return ast_for_genexp(c, ch);
1378
1379 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001381 ch = CHILD(n, 1);
1382
1383 if (TYPE(ch) == RSQB)
1384 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1385
1386 REQ(ch, listmaker);
1387 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1388 asdl_seq *elts = seq_for_testlist(c, ch);
1389 if (!elts)
1390 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001391
Thomas Wouters89f507f2006-12-13 04:49:30 +00001392 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1393 }
1394 else
1395 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 case LBRACE: {
Guido van Rossum86e58e22006-08-28 15:27:34 +00001397 /* dictsetmaker: test ':' test (',' test ':' test)* [','] |
1398 * test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 int i, size;
1400 asdl_seq *keys, *values;
1401
1402 ch = CHILD(n, 1);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001403 if (NCH(ch) == 1 || (NCH(ch) > 0 && STR(CHILD(ch, 1))[0] == ',')) {
1404 /* it's a set */
1405 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
1406 keys = asdl_seq_new(size, c->c_arena);
1407 if (!keys)
1408 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001409
Guido van Rossum86e58e22006-08-28 15:27:34 +00001410 for (i = 0; i < NCH(ch); i += 2) {
1411 expr_ty expression;
1412 expression = ast_for_expr(c, CHILD(ch, i));
1413 if (!expression)
1414 return NULL;
1415 asdl_seq_SET(keys, i / 2, expression);
1416 }
1417 return Set(keys, LINENO(n), n->n_col_offset, c->c_arena);
1418 } else {
1419 /* it's a dict */
1420 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1421 keys = asdl_seq_new(size, c->c_arena);
1422 if (!keys)
1423 return NULL;
1424
1425 values = asdl_seq_new(size, c->c_arena);
1426 if (!values)
1427 return NULL;
1428
1429 for (i = 0; i < NCH(ch); i += 4) {
1430 expr_ty expression;
1431
1432 expression = ast_for_expr(c, CHILD(ch, i));
1433 if (!expression)
1434 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001435
Guido van Rossum86e58e22006-08-28 15:27:34 +00001436 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001437
Guido van Rossum86e58e22006-08-28 15:27:34 +00001438 expression = ast_for_expr(c, CHILD(ch, i + 2));
1439 if (!expression)
1440 return NULL;
1441
1442 asdl_seq_SET(values, i / 4, expression);
1443 }
1444 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1445 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001448 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1449 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 }
1451}
1452
1453static slice_ty
1454ast_for_slice(struct compiling *c, const node *n)
1455{
1456 node *ch;
1457 expr_ty lower = NULL, upper = NULL, step = NULL;
1458
1459 REQ(n, subscript);
1460
1461 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001462 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 sliceop: ':' [test]
1464 */
1465 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466 if (NCH(n) == 1 && TYPE(ch) == test) {
1467 /* 'step' variable hold no significance in terms of being used over
1468 other vars */
1469 step = ast_for_expr(c, ch);
1470 if (!step)
1471 return NULL;
1472
Thomas Wouters89f507f2006-12-13 04:49:30 +00001473 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 }
1475
1476 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001477 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 if (!lower)
1479 return NULL;
1480 }
1481
1482 /* If there's an upper bound it's in the second or third position. */
1483 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484 if (NCH(n) > 1) {
1485 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486
Thomas Wouters89f507f2006-12-13 04:49:30 +00001487 if (TYPE(n2) == test) {
1488 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 if (!upper)
1490 return NULL;
1491 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001492 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496 if (TYPE(n2) == test) {
1497 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 if (!upper)
1499 return NULL;
1500 }
1501 }
1502
1503 ch = CHILD(n, NCH(n) - 1);
1504 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001505 if (NCH(ch) == 1) {
1506 /* No expression, so step is None */
1507 ch = CHILD(ch, 0);
1508 step = Name(new_identifier("None", c->c_arena), Load,
1509 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 if (!step)
1511 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001512 } else {
1513 ch = CHILD(ch, 1);
1514 if (TYPE(ch) == test) {
1515 step = ast_for_expr(c, ch);
1516 if (!step)
1517 return NULL;
1518 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519 }
1520 }
1521
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001522 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523}
1524
1525static expr_ty
1526ast_for_binop(struct compiling *c, const node *n)
1527{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001528 /* Must account for a sequence of expressions.
1529 How should A op B op C by represented?
1530 BinOp(BinOp(A, op, B), op, C).
1531 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533 int i, nops;
1534 expr_ty expr1, expr2, result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001535 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536
1537 expr1 = ast_for_expr(c, CHILD(n, 0));
1538 if (!expr1)
1539 return NULL;
1540
1541 expr2 = ast_for_expr(c, CHILD(n, 2));
1542 if (!expr2)
1543 return NULL;
1544
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001545 newoperator = get_operator(CHILD(n, 1));
1546 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547 return NULL;
1548
Thomas Wouters89f507f2006-12-13 04:49:30 +00001549 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001550 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001551 if (!result)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001552 return NULL;
1553
Thomas Wouters89f507f2006-12-13 04:49:30 +00001554 nops = (NCH(n) - 1) / 2;
1555 for (i = 1; i < nops; i++) {
1556 expr_ty tmp_result, tmp;
1557 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558
Thomas Wouters89f507f2006-12-13 04:49:30 +00001559 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001560 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561 return NULL;
1562
1563 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1564 if (!tmp)
1565 return NULL;
1566
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001567 tmp_result = BinOp(result, newoperator, tmp,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001568 LINENO(next_oper), next_oper->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001569 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001570 if (!tmp)
1571 return NULL;
1572 result = tmp_result;
1573 }
1574 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575}
1576
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001577static expr_ty
1578ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1579{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001580 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1581 subscriptlist: subscript (',' subscript)* [',']
1582 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1583 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001584 REQ(n, trailer);
1585 if (TYPE(CHILD(n, 0)) == LPAR) {
1586 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001587 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1588 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001589 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001590 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001591 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001592 else if (TYPE(CHILD(n, 0)) == DOT ) {
1593 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001594 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001595 }
1596 else {
1597 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001598 REQ(CHILD(n, 2), RSQB);
1599 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001600 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001601 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1602 if (!slc)
1603 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001604 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1605 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001606 }
1607 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001608 /* The grammar is ambiguous here. The ambiguity is resolved
1609 by treating the sequence as a tuple literal if there are
1610 no slice features.
1611 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612 int j;
1613 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001614 expr_ty e;
Thomas Wouters65b3dab2006-03-01 22:06:23 +00001615 bool simple = true;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001616 asdl_seq *slices, *elts;
1617 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001618 if (!slices)
1619 return NULL;
1620 for (j = 0; j < NCH(n); j += 2) {
1621 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001622 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001623 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001624 if (slc->kind != Index_kind)
1625 simple = false;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 asdl_seq_SET(slices, j / 2, slc);
1627 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 if (!simple) {
1629 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001630 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001631 }
1632 /* extract Index values and put them in a Tuple */
1633 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001634 if (!elts)
1635 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001636 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1637 slc = (slice_ty)asdl_seq_GET(slices, j);
1638 assert(slc->kind == Index_kind && slc->v.Index.value);
1639 asdl_seq_SET(elts, j, slc->v.Index.value);
1640 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001641 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 if (!e)
1643 return NULL;
1644 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001645 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 }
1647 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001648}
1649
1650static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001651ast_for_factor(struct compiling *c, const node *n)
1652{
1653 node *pfactor, *ppower, *patom, *pnum;
1654 expr_ty expression;
1655
1656 /* If the unary - operator is applied to a constant, don't generate
1657 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1658 constant. The peephole optimizer already does something like
1659 this but it doesn't handle the case where the constant is
1660 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1661 PyLongObject.
1662 */
1663 if (TYPE(CHILD(n, 0)) == MINUS
1664 && NCH(n) == 2
1665 && TYPE((pfactor = CHILD(n, 1))) == factor
1666 && NCH(pfactor) == 1
1667 && TYPE((ppower = CHILD(pfactor, 0))) == power
1668 && NCH(ppower) == 1
1669 && TYPE((patom = CHILD(ppower, 0))) == atom
1670 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1671 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1672 if (s == NULL)
1673 return NULL;
1674 s[0] = '-';
1675 strcpy(s + 1, STR(pnum));
1676 PyObject_FREE(STR(pnum));
1677 STR(pnum) = s;
1678 return ast_for_atom(c, patom);
1679 }
1680
1681 expression = ast_for_expr(c, CHILD(n, 1));
1682 if (!expression)
1683 return NULL;
1684
1685 switch (TYPE(CHILD(n, 0))) {
1686 case PLUS:
1687 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1688 c->c_arena);
1689 case MINUS:
1690 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1691 c->c_arena);
1692 case TILDE:
1693 return UnaryOp(Invert, expression, LINENO(n),
1694 n->n_col_offset, c->c_arena);
1695 }
1696 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1697 TYPE(CHILD(n, 0)));
1698 return NULL;
1699}
1700
1701static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001702ast_for_power(struct compiling *c, const node *n)
1703{
1704 /* power: atom trailer* ('**' factor)*
1705 */
1706 int i;
1707 expr_ty e, tmp;
1708 REQ(n, power);
1709 e = ast_for_atom(c, CHILD(n, 0));
1710 if (!e)
1711 return NULL;
1712 if (NCH(n) == 1)
1713 return e;
1714 for (i = 1; i < NCH(n); i++) {
1715 node *ch = CHILD(n, i);
1716 if (TYPE(ch) != trailer)
1717 break;
1718 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001719 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001720 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001721 tmp->lineno = e->lineno;
1722 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001723 e = tmp;
1724 }
1725 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1726 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001727 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001728 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001729 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001730 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001731 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001732 e = tmp;
1733 }
1734 return e;
1735}
1736
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737/* Do not name a variable 'expr'! Will cause a compile error.
1738*/
1739
1740static expr_ty
1741ast_for_expr(struct compiling *c, const node *n)
1742{
1743 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001744 test: or_test ['if' or_test 'else' test] | lambdef
1745 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 and_test: not_test ('and' not_test)*
1747 not_test: 'not' not_test | comparison
1748 comparison: expr (comp_op expr)*
1749 expr: xor_expr ('|' xor_expr)*
1750 xor_expr: and_expr ('^' and_expr)*
1751 and_expr: shift_expr ('&' shift_expr)*
1752 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1753 arith_expr: term (('+'|'-') term)*
1754 term: factor (('*'|'/'|'%'|'//') factor)*
1755 factor: ('+'|'-'|'~') factor | power
1756 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001757
1758 As well as modified versions that exist for backward compatibility,
1759 to explicitly allow:
1760 [ x for x in lambda: 0, lambda: 1 ]
1761 (which would be ambiguous without these extra rules)
1762
1763 old_test: or_test | old_lambdef
1764 old_lambdef: 'lambda' [vararglist] ':' old_test
1765
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 */
1767
1768 asdl_seq *seq;
1769 int i;
1770
1771 loop:
1772 switch (TYPE(n)) {
1773 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001774 case old_test:
1775 if (TYPE(CHILD(n, 0)) == lambdef ||
1776 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001778 else if (NCH(n) > 1)
1779 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001780 /* Fallthrough */
1781 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782 case and_test:
1783 if (NCH(n) == 1) {
1784 n = CHILD(n, 0);
1785 goto loop;
1786 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001787 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001788 if (!seq)
1789 return NULL;
1790 for (i = 0; i < NCH(n); i += 2) {
1791 expr_ty e = ast_for_expr(c, CHILD(n, i));
1792 if (!e)
1793 return NULL;
1794 asdl_seq_SET(seq, i / 2, e);
1795 }
1796 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001797 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1798 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001799 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001800 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801 case not_test:
1802 if (NCH(n) == 1) {
1803 n = CHILD(n, 0);
1804 goto loop;
1805 }
1806 else {
1807 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1808 if (!expression)
1809 return NULL;
1810
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001811 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1812 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813 }
1814 case comparison:
1815 if (NCH(n) == 1) {
1816 n = CHILD(n, 0);
1817 goto loop;
1818 }
1819 else {
1820 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001821 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001822 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001823 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 if (!ops)
1825 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001826 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 return NULL;
1829 }
1830 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001831 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001833 newoperator = ast_for_comp_op(CHILD(n, i));
1834 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001836 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837
1838 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001839 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001841 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 asdl_seq_SET(cmps, i / 2, expression);
1845 }
1846 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001847 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001851 return Compare(expression, ops, cmps, LINENO(n),
1852 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 }
1854 break;
1855
1856 /* The next five cases all handle BinOps. The main body of code
1857 is the same in each case, but the switch turned inside out to
1858 reuse the code for each type of operator.
1859 */
1860 case expr:
1861 case xor_expr:
1862 case and_expr:
1863 case shift_expr:
1864 case arith_expr:
1865 case term:
1866 if (NCH(n) == 1) {
1867 n = CHILD(n, 0);
1868 goto loop;
1869 }
1870 return ast_for_binop(c, n);
1871 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 expr_ty exp = NULL;
1873 if (NCH(n) == 2) {
1874 exp = ast_for_testlist(c, CHILD(n, 1));
1875 if (!exp)
1876 return NULL;
1877 }
1878 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1879 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001880 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 if (NCH(n) == 1) {
1882 n = CHILD(n, 0);
1883 goto loop;
1884 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001886 case power:
1887 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001889 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 return NULL;
1891 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001892 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 return NULL;
1894}
1895
1896static expr_ty
1897ast_for_call(struct compiling *c, const node *n, expr_ty func)
1898{
1899 /*
1900 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1901 | '**' test)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001902 argument: [test '='] test [gen_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 */
1904
1905 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001906 asdl_seq *args;
1907 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 expr_ty vararg = NULL, kwarg = NULL;
1909
1910 REQ(n, arglist);
1911
1912 nargs = 0;
1913 nkeywords = 0;
1914 ngens = 0;
1915 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001916 node *ch = CHILD(n, i);
1917 if (TYPE(ch) == argument) {
1918 if (NCH(ch) == 1)
1919 nargs++;
1920 else if (TYPE(CHILD(ch, 1)) == gen_for)
1921 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001923 nkeywords++;
1924 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 }
1926 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001927 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001928 "if not sole argument");
1929 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 }
1931
1932 if (nargs + nkeywords + ngens > 255) {
1933 ast_error(n, "more than 255 arguments");
1934 return NULL;
1935 }
1936
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001937 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001939 return NULL;
1940 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001942 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 nargs = 0;
1944 nkeywords = 0;
1945 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001946 node *ch = CHILD(n, i);
1947 if (TYPE(ch) == argument) {
1948 expr_ty e;
1949 if (NCH(ch) == 1) {
1950 if (nkeywords) {
1951 ast_error(CHILD(ch, 0),
1952 "non-keyword arg after keyword arg");
1953 return NULL;
1954 }
1955 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001957 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 asdl_seq_SET(args, nargs++, e);
1959 }
1960 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1961 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001964 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001966 else {
1967 keyword_ty kw;
1968 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969
Thomas Wouters89f507f2006-12-13 04:49:30 +00001970 /* CHILD(ch, 0) is test, but must be an identifier? */
1971 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001973 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 /* f(lambda x: x[0] = 3) ends up getting parsed with
1975 * LHS test = lambda x: x[0], and RHS test = 3.
1976 * SF bug 132313 points out that complaining about a keyword
1977 * then is very confusing.
1978 */
1979 if (e->kind == Lambda_kind) {
1980 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001981 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982 } else if (e->kind != Name_kind) {
1983 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001984 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 key = e->v.Name.id;
1987 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001989 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001990 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001992 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001993 asdl_seq_SET(keywords, nkeywords++, kw);
1994 }
1995 }
1996 else if (TYPE(ch) == STAR) {
1997 vararg = ast_for_expr(c, CHILD(n, i+1));
1998 i++;
1999 }
2000 else if (TYPE(ch) == DOUBLESTAR) {
2001 kwarg = ast_for_expr(c, CHILD(n, i+1));
2002 i++;
2003 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 }
2005
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002006 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007}
2008
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002010ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002012 /* testlist_gexp: test (',' test)* [','] */
2013 /* testlist: test (',' test)* [','] */
2014 /* testlist_safe: test (',' test)+ [','] */
2015 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002017 if (TYPE(n) == testlist_gexp) {
2018 if (NCH(n) > 1)
2019 assert(TYPE(CHILD(n, 1)) != gen_for);
2020 }
2021 else {
2022 assert(TYPE(n) == testlist ||
2023 TYPE(n) == testlist_safe ||
2024 TYPE(n) == testlist1);
2025 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002027 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 else {
2029 asdl_seq *tmp = seq_for_testlist(c, n);
2030 if (!tmp)
2031 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002032 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002034}
2035
2036static expr_ty
2037ast_for_testlist_gexp(struct compiling *c, const node* n)
2038{
2039 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2040 /* argument: test [ gen_for ] */
2041 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002042 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002043 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002044 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002045}
2046
2047/* like ast_for_testlist() but returns a sequence */
2048static asdl_seq*
2049ast_for_class_bases(struct compiling *c, const node* n)
2050{
2051 /* testlist: test (',' test)* [','] */
2052 assert(NCH(n) > 0);
2053 REQ(n, testlist);
2054 if (NCH(n) == 1) {
2055 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002056 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002057 if (!bases)
2058 return NULL;
2059 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002060 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002061 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002062 asdl_seq_SET(bases, 0, base);
2063 return bases;
2064 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002065
2066 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067}
2068
2069static stmt_ty
2070ast_for_expr_stmt(struct compiling *c, const node *n)
2071{
2072 REQ(n, expr_stmt);
2073 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2074 | ('=' (yield_expr|testlist))*)
2075 testlist: test (',' test)* [',']
2076 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002077 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 test: ... here starts the operator precendence dance
2079 */
2080
2081 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002082 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083 if (!e)
2084 return NULL;
2085
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 }
2088 else if (TYPE(CHILD(n, 1)) == augassign) {
2089 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002090 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092
Thomas Wouters89f507f2006-12-13 04:49:30 +00002093 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 if (!expr1)
2095 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002096 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002097 switch (expr1->kind) {
2098 case GeneratorExp_kind:
2099 ast_error(ch, "augmented assignment to generator "
2100 "expression not possible");
2101 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002102 case Yield_kind:
2103 ast_error(ch, "augmented assignment to yield "
2104 "expression not possible");
2105 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002106 case Name_kind: {
2107 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
2108 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
2109 ast_error(ch, "assignment to None");
2110 return NULL;
2111 }
2112 break;
2113 }
2114 case Attribute_kind:
2115 case Subscript_kind:
2116 break;
2117 default:
2118 ast_error(ch, "illegal expression for augmented "
2119 "assignment");
2120 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002122 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123
Thomas Wouters89f507f2006-12-13 04:49:30 +00002124 ch = CHILD(n, 2);
2125 if (TYPE(ch) == testlist)
2126 expr2 = ast_for_testlist(c, ch);
2127 else
2128 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002129 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130 return NULL;
2131
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002132 newoperator = ast_for_augassign(CHILD(n, 1));
2133 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 return NULL;
2135
Thomas Wouters89f507f2006-12-13 04:49:30 +00002136 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 }
2138 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002139 int i;
2140 asdl_seq *targets;
2141 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 expr_ty expression;
2143
Thomas Wouters89f507f2006-12-13 04:49:30 +00002144 /* a normal assignment */
2145 REQ(CHILD(n, 1), EQUAL);
2146 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2147 if (!targets)
2148 return NULL;
2149 for (i = 0; i < NCH(n) - 2; i += 2) {
2150 expr_ty e;
2151 node *ch = CHILD(n, i);
2152 if (TYPE(ch) == yield_expr) {
2153 ast_error(ch, "assignment to yield expression not possible");
2154 return NULL;
2155 }
2156 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157
Thomas Wouters89f507f2006-12-13 04:49:30 +00002158 /* set context to assign */
2159 if (!e)
2160 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161
Thomas Wouters89f507f2006-12-13 04:49:30 +00002162 if (!set_context(e, Store, CHILD(n, i)))
2163 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002164
Thomas Wouters89f507f2006-12-13 04:49:30 +00002165 asdl_seq_SET(targets, i / 2, e);
2166 }
2167 value = CHILD(n, NCH(n) - 1);
2168 if (TYPE(value) == testlist)
2169 expression = ast_for_testlist(c, value);
2170 else
2171 expression = ast_for_expr(c, value);
2172 if (!expression)
2173 return NULL;
2174 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002175 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176}
2177
2178static stmt_ty
2179ast_for_print_stmt(struct compiling *c, const node *n)
2180{
2181 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2182 | '>>' test [ (',' test)+ [','] ] )
2183 */
2184 expr_ty dest = NULL, expression;
2185 asdl_seq *seq;
2186 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002187 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188
2189 REQ(n, print_stmt);
2190 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002191 dest = ast_for_expr(c, CHILD(n, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002192 if (!dest)
2193 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002194 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002195 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002196 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002198 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002199 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002201 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002203 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204 }
2205 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002206 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207}
2208
2209static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002210ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211{
2212 asdl_seq *seq;
2213 int i;
2214 expr_ty e;
2215
2216 REQ(n, exprlist);
2217
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002218 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002220 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002222 e = ast_for_expr(c, CHILD(n, i));
2223 if (!e)
2224 return NULL;
2225 asdl_seq_SET(seq, i / 2, e);
2226 if (context && !set_context(e, context, CHILD(n, i)))
2227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 }
2229 return seq;
2230}
2231
2232static stmt_ty
2233ast_for_del_stmt(struct compiling *c, const node *n)
2234{
2235 asdl_seq *expr_list;
2236
2237 /* del_stmt: 'del' exprlist */
2238 REQ(n, del_stmt);
2239
2240 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2241 if (!expr_list)
2242 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002243 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244}
2245
2246static stmt_ty
2247ast_for_flow_stmt(struct compiling *c, const node *n)
2248{
2249 /*
2250 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2251 | yield_stmt
2252 break_stmt: 'break'
2253 continue_stmt: 'continue'
2254 return_stmt: 'return' [testlist]
2255 yield_stmt: yield_expr
2256 yield_expr: 'yield' testlist
2257 raise_stmt: 'raise' [test [',' test [',' test]]]
2258 */
2259 node *ch;
2260
2261 REQ(n, flow_stmt);
2262 ch = CHILD(n, 0);
2263 switch (TYPE(ch)) {
2264 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002265 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002267 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002269 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2270 if (!exp)
2271 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002272 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 }
2274 case return_stmt:
2275 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002276 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002278 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 if (!expression)
2280 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002281 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 }
2283 case raise_stmt:
2284 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002285 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 else if (NCH(ch) == 2) {
2287 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2288 if (!expression)
2289 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002290 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 }
2292 else if (NCH(ch) == 4) {
2293 expr_ty expr1, expr2;
2294
2295 expr1 = ast_for_expr(c, CHILD(ch, 1));
2296 if (!expr1)
2297 return NULL;
2298 expr2 = ast_for_expr(c, CHILD(ch, 3));
2299 if (!expr2)
2300 return NULL;
2301
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002302 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 }
2304 else if (NCH(ch) == 6) {
2305 expr_ty expr1, expr2, expr3;
2306
2307 expr1 = ast_for_expr(c, CHILD(ch, 1));
2308 if (!expr1)
2309 return NULL;
2310 expr2 = ast_for_expr(c, CHILD(ch, 3));
2311 if (!expr2)
2312 return NULL;
2313 expr3 = ast_for_expr(c, CHILD(ch, 5));
2314 if (!expr3)
2315 return NULL;
2316
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002317 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 }
2319 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002320 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 "unexpected flow_stmt: %d", TYPE(ch));
2322 return NULL;
2323 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002324
2325 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2326 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327}
2328
2329static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002330alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331{
2332 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002333 import_as_name: NAME ['as' NAME]
2334 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 dotted_name: NAME ('.' NAME)*
2336 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002337 PyObject *str;
2338
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 loop:
2340 switch (TYPE(n)) {
2341 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002342 str = NULL;
2343 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002344 str = NEW_IDENTIFIER(CHILD(n, 2));
2345 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002346 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 case dotted_as_name:
2348 if (NCH(n) == 1) {
2349 n = CHILD(n, 0);
2350 goto loop;
2351 }
2352 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002353 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002354 if (!a)
2355 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 assert(!a->asname);
2357 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2358 return a;
2359 }
2360 break;
2361 case dotted_name:
2362 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002363 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 else {
2365 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002366 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002367 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368 char *s;
2369
2370 len = 0;
2371 for (i = 0; i < NCH(n); i += 2)
2372 /* length of string plus one for the dot */
2373 len += strlen(STR(CHILD(n, i))) + 1;
2374 len--; /* the last name doesn't have a dot */
2375 str = PyString_FromStringAndSize(NULL, len);
2376 if (!str)
2377 return NULL;
2378 s = PyString_AS_STRING(str);
2379 if (!s)
2380 return NULL;
2381 for (i = 0; i < NCH(n); i += 2) {
2382 char *sch = STR(CHILD(n, i));
2383 strcpy(s, STR(CHILD(n, i)));
2384 s += strlen(sch);
2385 *s++ = '.';
2386 }
2387 --s;
2388 *s = '\0';
2389 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002391 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 }
2393 break;
2394 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002395 str = PyString_InternFromString("*");
2396 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002397 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002399 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 "unexpected import name: %d", TYPE(n));
2401 return NULL;
2402 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002403
2404 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 return NULL;
2406}
2407
2408static stmt_ty
2409ast_for_import_stmt(struct compiling *c, const node *n)
2410{
2411 /*
2412 import_stmt: import_name | import_from
2413 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002414 import_from: 'from' ('.'* dotted_name | '.') 'import'
2415 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002417 int lineno;
2418 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419 int i;
2420 asdl_seq *aliases;
2421
2422 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002423 lineno = LINENO(n);
2424 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002426 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002428 REQ(n, dotted_as_names);
2429 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2430 if (!aliases)
2431 return NULL;
2432 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002433 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002434 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002436 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002438 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002440 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 int idx, ndots = 0;
2443 alias_ty mod = NULL;
2444 identifier modname;
2445
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002446 /* Count the number of dots (for relative imports) and check for the
2447 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448 for (idx = 1; idx < NCH(n); idx++) {
2449 if (TYPE(CHILD(n, idx)) == dotted_name) {
2450 mod = alias_for_import_name(c, CHILD(n, idx));
2451 idx++;
2452 break;
2453 } else if (TYPE(CHILD(n, idx)) != DOT) {
2454 break;
2455 }
2456 ndots++;
2457 }
2458 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002459 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002460 case STAR:
2461 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 n = CHILD(n, idx);
2463 n_children = 1;
2464 if (ndots) {
2465 ast_error(n, "'import *' not allowed with 'from .'");
2466 return NULL;
2467 }
2468 break;
2469 case LPAR:
2470 /* from ... import (x, y, z) */
2471 n = CHILD(n, idx + 1);
2472 n_children = NCH(n);
2473 break;
2474 case import_as_names:
2475 /* from ... import x, y, z */
2476 n = CHILD(n, idx);
2477 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002478 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 ast_error(n, "trailing comma not allowed without"
2480 " surrounding parentheses");
2481 return NULL;
2482 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483 break;
2484 default:
2485 ast_error(n, "Unexpected node-type in from-import");
2486 return NULL;
2487 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488
Thomas Wouters89f507f2006-12-13 04:49:30 +00002489 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2490 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492
2493 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002494 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002495 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002496 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002500 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002501 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002502 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2503 if (!import_alias)
2504 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002506 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002508 if (mod != NULL)
2509 modname = mod->name;
2510 else
2511 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002512 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002513 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 }
Neal Norwitz79792652005-11-14 04:25:03 +00002515 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516 "unknown import statement: starts with command '%s'",
2517 STR(CHILD(n, 0)));
2518 return NULL;
2519}
2520
2521static stmt_ty
2522ast_for_global_stmt(struct compiling *c, const node *n)
2523{
2524 /* global_stmt: 'global' NAME (',' NAME)* */
2525 identifier name;
2526 asdl_seq *s;
2527 int i;
2528
2529 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002530 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002532 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002534 name = NEW_IDENTIFIER(CHILD(n, i));
2535 if (!name)
2536 return NULL;
2537 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002539 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540}
2541
2542static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543ast_for_assert_stmt(struct compiling *c, const node *n)
2544{
2545 /* assert_stmt: 'assert' test [',' test] */
2546 REQ(n, assert_stmt);
2547 if (NCH(n) == 2) {
2548 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2549 if (!expression)
2550 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002551 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 }
2553 else if (NCH(n) == 4) {
2554 expr_ty expr1, expr2;
2555
2556 expr1 = ast_for_expr(c, CHILD(n, 1));
2557 if (!expr1)
2558 return NULL;
2559 expr2 = ast_for_expr(c, CHILD(n, 3));
2560 if (!expr2)
2561 return NULL;
2562
Thomas Wouters89f507f2006-12-13 04:49:30 +00002563 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 }
Neal Norwitz79792652005-11-14 04:25:03 +00002565 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 "improper number of parts to 'assert' statement: %d",
2567 NCH(n));
2568 return NULL;
2569}
2570
2571static asdl_seq *
2572ast_for_suite(struct compiling *c, const node *n)
2573{
2574 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002575 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 stmt_ty s;
2577 int i, total, num, end, pos = 0;
2578 node *ch;
2579
2580 REQ(n, suite);
2581
2582 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002583 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002587 n = CHILD(n, 0);
2588 /* simple_stmt always ends with a NEWLINE,
2589 and may have a trailing SEMI
2590 */
2591 end = NCH(n) - 1;
2592 if (TYPE(CHILD(n, end - 1)) == SEMI)
2593 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 for (i = 0; i < end; i += 2) {
2596 ch = CHILD(n, i);
2597 s = ast_for_stmt(c, ch);
2598 if (!s)
2599 return NULL;
2600 asdl_seq_SET(seq, pos++, s);
2601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 }
2603 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002604 for (i = 2; i < (NCH(n) - 1); i++) {
2605 ch = CHILD(n, i);
2606 REQ(ch, stmt);
2607 num = num_stmts(ch);
2608 if (num == 1) {
2609 /* small_stmt or compound_stmt with only one child */
2610 s = ast_for_stmt(c, ch);
2611 if (!s)
2612 return NULL;
2613 asdl_seq_SET(seq, pos++, s);
2614 }
2615 else {
2616 int j;
2617 ch = CHILD(ch, 0);
2618 REQ(ch, simple_stmt);
2619 for (j = 0; j < NCH(ch); j += 2) {
2620 /* statement terminates with a semi-colon ';' */
2621 if (NCH(CHILD(ch, j)) == 0) {
2622 assert((j + 1) == NCH(ch));
2623 break;
2624 }
2625 s = ast_for_stmt(c, CHILD(ch, j));
2626 if (!s)
2627 return NULL;
2628 asdl_seq_SET(seq, pos++, s);
2629 }
2630 }
2631 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 }
2633 assert(pos == seq->size);
2634 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635}
2636
2637static stmt_ty
2638ast_for_if_stmt(struct compiling *c, const node *n)
2639{
2640 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2641 ['else' ':' suite]
2642 */
2643 char *s;
2644
2645 REQ(n, if_stmt);
2646
2647 if (NCH(n) == 4) {
2648 expr_ty expression;
2649 asdl_seq *suite_seq;
2650
2651 expression = ast_for_expr(c, CHILD(n, 1));
2652 if (!expression)
2653 return NULL;
2654 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002655 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 return NULL;
2657
Thomas Wouters89f507f2006-12-13 04:49:30 +00002658 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002660
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 s = STR(CHILD(n, 4));
2662 /* s[2], the third character in the string, will be
2663 's' for el_s_e, or
2664 'i' for el_i_f
2665 */
2666 if (s[2] == 's') {
2667 expr_ty expression;
2668 asdl_seq *seq1, *seq2;
2669
2670 expression = ast_for_expr(c, CHILD(n, 1));
2671 if (!expression)
2672 return NULL;
2673 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002674 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 return NULL;
2676 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 return NULL;
2679
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 }
2682 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 int i, n_elif, has_else = 0;
2684 asdl_seq *orelse = NULL;
2685 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 /* must reference the child n_elif+1 since 'else' token is third,
2687 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2689 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2690 has_else = 1;
2691 n_elif -= 3;
2692 }
2693 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694
Thomas Wouters89f507f2006-12-13 04:49:30 +00002695 if (has_else) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 expr_ty expression;
2697 asdl_seq *seq1, *seq2;
2698
Thomas Wouters89f507f2006-12-13 04:49:30 +00002699 orelse = asdl_seq_new(1, c->c_arena);
2700 if (!orelse)
2701 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002703 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002706 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002709 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711
Thomas Wouters89f507f2006-12-13 04:49:30 +00002712 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
2713 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002714 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 /* the just-created orelse handled the last elif */
2716 n_elif--;
2717 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 for (i = 0; i < n_elif; i++) {
2720 int off = 5 + (n_elif - i - 1) * 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 expr_ty expression;
2722 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002723 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2724 if (!newobj)
2725 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002727 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002730 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732
Thomas Wouters89f507f2006-12-13 04:49:30 +00002733 asdl_seq_SET(newobj, 0,
2734 If(expression, suite_seq, orelse,
2735 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
2736 orelse = newobj;
2737 }
2738 return If(ast_for_expr(c, CHILD(n, 1)),
2739 ast_for_suite(c, CHILD(n, 3)),
2740 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002742
2743 PyErr_Format(PyExc_SystemError,
2744 "unexpected token in 'if' statement: %s", s);
2745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746}
2747
2748static stmt_ty
2749ast_for_while_stmt(struct compiling *c, const node *n)
2750{
2751 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2752 REQ(n, while_stmt);
2753
2754 if (NCH(n) == 4) {
2755 expr_ty expression;
2756 asdl_seq *suite_seq;
2757
2758 expression = ast_for_expr(c, CHILD(n, 1));
2759 if (!expression)
2760 return NULL;
2761 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002762 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002764 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 }
2766 else if (NCH(n) == 7) {
2767 expr_ty expression;
2768 asdl_seq *seq1, *seq2;
2769
2770 expression = ast_for_expr(c, CHILD(n, 1));
2771 if (!expression)
2772 return NULL;
2773 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002774 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 return NULL;
2776 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002777 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778 return NULL;
2779
Thomas Wouters89f507f2006-12-13 04:49:30 +00002780 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002782
2783 PyErr_Format(PyExc_SystemError,
2784 "wrong number of tokens for 'while' statement: %d",
2785 NCH(n));
2786 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787}
2788
2789static stmt_ty
2790ast_for_for_stmt(struct compiling *c, const node *n)
2791{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002792 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793 expr_ty expression;
2794 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002795 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2797 REQ(n, for_stmt);
2798
2799 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002800 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 if (!seq)
2802 return NULL;
2803 }
2804
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002805 node_target = CHILD(n, 1);
2806 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002807 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002809 /* Check the # of children rather than the length of _target, since
2810 for x, in ... has 1 element in _target, but still requires a Tuple. */
2811 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002812 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002814 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002816 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002817 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 return NULL;
2819 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002820 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 return NULL;
2822
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002823 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2824 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825}
2826
2827static excepthandler_ty
2828ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2829{
2830 /* except_clause: 'except' [test [',' test]] */
2831 REQ(exc, except_clause);
2832 REQ(body, suite);
2833
2834 if (NCH(exc) == 1) {
2835 asdl_seq *suite_seq = ast_for_suite(c, body);
2836 if (!suite_seq)
2837 return NULL;
2838
Thomas Wouters89f507f2006-12-13 04:49:30 +00002839 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002840 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 }
2842 else if (NCH(exc) == 2) {
2843 expr_ty expression;
2844 asdl_seq *suite_seq;
2845
2846 expression = ast_for_expr(c, CHILD(exc, 1));
2847 if (!expression)
2848 return NULL;
2849 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002850 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 return NULL;
2852
Thomas Wouters89f507f2006-12-13 04:49:30 +00002853 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002854 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 }
2856 else if (NCH(exc) == 4) {
2857 asdl_seq *suite_seq;
2858 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002859 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2860 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002862 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 return NULL;
2864 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002865 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 return NULL;
2867 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002868 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 return NULL;
2870
Thomas Wouters89f507f2006-12-13 04:49:30 +00002871 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002872 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002874
2875 PyErr_Format(PyExc_SystemError,
2876 "wrong number of children for 'except' clause: %d",
2877 NCH(exc));
2878 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879}
2880
2881static stmt_ty
2882ast_for_try_stmt(struct compiling *c, const node *n)
2883{
Neal Norwitzf599f422005-12-17 21:33:47 +00002884 const int nch = NCH(n);
2885 int n_except = (nch - 3)/3;
2886 asdl_seq *body, *orelse = NULL, *finally = NULL;
2887
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 REQ(n, try_stmt);
2889
Neal Norwitzf599f422005-12-17 21:33:47 +00002890 body = ast_for_suite(c, CHILD(n, 2));
2891 if (body == NULL)
2892 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893
Neal Norwitzf599f422005-12-17 21:33:47 +00002894 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2895 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2896 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2897 /* we can assume it's an "else",
2898 because nch >= 9 for try-else-finally and
2899 it would otherwise have a type of except_clause */
2900 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2901 if (orelse == NULL)
2902 return NULL;
2903 n_except--;
2904 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905
Neal Norwitzf599f422005-12-17 21:33:47 +00002906 finally = ast_for_suite(c, CHILD(n, nch - 1));
2907 if (finally == NULL)
2908 return NULL;
2909 n_except--;
2910 }
2911 else {
2912 /* we can assume it's an "else",
2913 otherwise it would have a type of except_clause */
2914 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2915 if (orelse == NULL)
2916 return NULL;
2917 n_except--;
2918 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002921 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 return NULL;
2923 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002924
2925 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 int i;
2927 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002928 /* process except statements to create a try ... except */
2929 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2930 if (handlers == NULL)
2931 return NULL;
2932
2933 for (i = 0; i < n_except; i++) {
2934 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2935 CHILD(n, 5 + i * 3));
2936 if (!e)
2937 return NULL;
2938 asdl_seq_SET(handlers, i, e);
2939 }
2940
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002942 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002943 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002945
2946 /* if a 'finally' is present too, we nest the TryExcept within a
2947 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 body = asdl_seq_new(1, c->c_arena);
2949 if (body == NULL)
2950 return NULL;
2951 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002952 }
2953
2954 /* must be a try ... finally (except clauses are in body, if any exist) */
2955 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002956 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957}
2958
Guido van Rossumc2e20742006-02-27 22:32:47 +00002959static expr_ty
2960ast_for_with_var(struct compiling *c, const node *n)
2961{
2962 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002963 return ast_for_expr(c, CHILD(n, 1));
2964}
2965
2966/* with_stmt: 'with' test [ with_var ] ':' suite */
2967static stmt_ty
2968ast_for_with_stmt(struct compiling *c, const node *n)
2969{
2970 expr_ty context_expr, optional_vars = NULL;
2971 int suite_index = 3; /* skip 'with', test, and ':' */
2972 asdl_seq *suite_seq;
2973
2974 assert(TYPE(n) == with_stmt);
2975 context_expr = ast_for_expr(c, CHILD(n, 1));
2976 if (TYPE(CHILD(n, 2)) == with_var) {
2977 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2978
2979 if (!optional_vars) {
2980 return NULL;
2981 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002982 if (!set_context(optional_vars, Store, n)) {
2983 return NULL;
2984 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002985 suite_index = 4;
2986 }
2987
2988 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2989 if (!suite_seq) {
2990 return NULL;
2991 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002992 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002993 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002994}
2995
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996static stmt_ty
2997ast_for_classdef(struct compiling *c, const node *n)
2998{
2999 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 asdl_seq *bases, *s;
3001
3002 REQ(n, classdef);
3003
3004 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003005 ast_error(n, "assignment to None");
3006 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 }
3008
3009 if (NCH(n) == 4) {
3010 s = ast_for_suite(c, CHILD(n, 3));
3011 if (!s)
3012 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003013 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003014 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 }
3016 /* check for empty base list */
3017 if (TYPE(CHILD(n,3)) == RPAR) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003018 s = ast_for_suite(c, CHILD(n,5));
3019 if (!s)
3020 return NULL;
3021 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003022 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 }
3024
3025 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003026 bases = ast_for_class_bases(c, CHILD(n, 3));
3027 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029
3030 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003031 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003033 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
3034 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035}
3036
3037static stmt_ty
3038ast_for_stmt(struct compiling *c, const node *n)
3039{
3040 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003041 assert(NCH(n) == 1);
3042 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 }
3044 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 assert(num_stmts(n) == 1);
3046 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047 }
3048 if (TYPE(n) == small_stmt) {
3049 REQ(n, small_stmt);
3050 n = CHILD(n, 0);
3051 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
Georg Brandl7cae87c2006-09-06 06:51:57 +00003052 | flow_stmt | import_stmt | global_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003053 */
3054 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055 case expr_stmt:
3056 return ast_for_expr_stmt(c, n);
3057 case print_stmt:
3058 return ast_for_print_stmt(c, n);
3059 case del_stmt:
3060 return ast_for_del_stmt(c, n);
3061 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003062 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063 case flow_stmt:
3064 return ast_for_flow_stmt(c, n);
3065 case import_stmt:
3066 return ast_for_import_stmt(c, n);
3067 case global_stmt:
3068 return ast_for_global_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 case assert_stmt:
3070 return ast_for_assert_stmt(c, n);
3071 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003072 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3074 TYPE(n), NCH(n));
3075 return NULL;
3076 }
3077 }
3078 else {
3079 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003080 | funcdef | classdef
3081 */
3082 node *ch = CHILD(n, 0);
3083 REQ(n, compound_stmt);
3084 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 case if_stmt:
3086 return ast_for_if_stmt(c, ch);
3087 case while_stmt:
3088 return ast_for_while_stmt(c, ch);
3089 case for_stmt:
3090 return ast_for_for_stmt(c, ch);
3091 case try_stmt:
3092 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003093 case with_stmt:
3094 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 case funcdef:
3096 return ast_for_funcdef(c, ch);
3097 case classdef:
3098 return ast_for_classdef(c, ch);
3099 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003100 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3102 TYPE(n), NCH(n));
3103 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003104 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 }
3106}
3107
3108static PyObject *
3109parsenumber(const char *s)
3110{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003111 const char *end;
3112 long x;
3113 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003115 Py_complex c;
3116 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117#endif
3118
Thomas Wouters89f507f2006-12-13 04:49:30 +00003119 errno = 0;
3120 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003122 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003124 if (*end == 'l' || *end == 'L')
3125 return PyLong_FromString((char *)s, (char **)0, 0);
3126 if (s[0] == '0') {
3127 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3128 if (x < 0 && errno == 0) {
3129 return PyLong_FromString((char *)s,
3130 (char **)0,
3131 0);
3132 }
3133 }
3134 else
3135 x = PyOS_strtol((char *)s, (char **)&end, 0);
3136 if (*end == '\0') {
3137 if (errno != 0)
3138 return PyLong_FromString((char *)s, (char **)0, 0);
3139 return PyInt_FromLong(x);
3140 }
3141 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003143 if (imflag) {
3144 c.real = 0.;
3145 PyFPE_START_PROTECT("atof", return 0)
3146 c.imag = PyOS_ascii_atof(s);
3147 PyFPE_END_PROTECT(c)
3148 return PyComplex_FromCComplex(c);
3149 }
3150 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003152 {
3153 PyFPE_START_PROTECT("atof", return 0)
3154 dx = PyOS_ascii_atof(s);
3155 PyFPE_END_PROTECT(dx)
3156 return PyFloat_FromDouble(dx);
3157 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158}
3159
3160static PyObject *
3161decode_utf8(const char **sPtr, const char *end, char* encoding)
3162{
3163#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003164 Py_FatalError("decode_utf8 should not be called in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003165 return NULL;
3166#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003167 PyObject *u, *v;
3168 char *s, *t;
3169 t = s = (char *)*sPtr;
3170 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3171 while (s < end && (*s & 0x80)) s++;
3172 *sPtr = s;
3173 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3174 if (u == NULL)
3175 return NULL;
3176 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3177 Py_DECREF(u);
3178 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179#endif
3180}
3181
3182static PyObject *
3183decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3184{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003185 PyObject *v, *u;
3186 char *buf;
3187 char *p;
3188 const char *end;
3189 if (encoding == NULL) {
3190 buf = (char *)s;
3191 u = NULL;
3192 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3193 buf = (char *)s;
3194 u = NULL;
3195 } else {
3196 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3197 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3198 if (u == NULL)
3199 return NULL;
3200 p = buf = PyString_AsString(u);
3201 end = s + len;
3202 while (s < end) {
3203 if (*s == '\\') {
3204 *p++ = *s++;
3205 if (*s & 0x80) {
3206 strcpy(p, "u005c");
3207 p += 5;
3208 }
3209 }
3210 if (*s & 0x80) { /* XXX inefficient */
3211 PyObject *w;
3212 char *r;
3213 Py_ssize_t rn, i;
3214 w = decode_utf8(&s, end, "utf-16-be");
3215 if (w == NULL) {
3216 Py_DECREF(u);
3217 return NULL;
3218 }
3219 r = PyString_AsString(w);
3220 rn = PyString_Size(w);
3221 assert(rn % 2 == 0);
3222 for (i = 0; i < rn; i += 2) {
3223 sprintf(p, "\\u%02x%02x",
3224 r[i + 0] & 0xFF,
3225 r[i + 1] & 0xFF);
3226 p += 6;
3227 }
3228 Py_DECREF(w);
3229 } else {
3230 *p++ = *s++;
3231 }
3232 }
3233 len = p - buf;
3234 s = buf;
3235 }
3236 if (rawmode)
3237 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3238 else
3239 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3240 Py_XDECREF(u);
3241 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242}
3243
3244/* s is a Python string literal, including the bracketing quote characters,
3245 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3246 * parsestr parses it, and returns the decoded Python string object.
3247 */
3248static PyObject *
3249parsestr(const char *s, const char *encoding)
3250{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003251 size_t len;
3252 int quote = Py_CHARMASK(*s);
3253 int rawmode = 0;
3254 int need_encoding;
3255 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256
Thomas Wouters89f507f2006-12-13 04:49:30 +00003257 if (isalpha(quote) || quote == '_') {
3258 if (quote == 'u' || quote == 'U') {
3259 quote = *++s;
3260 unicode = 1;
3261 }
3262 if (quote == 'r' || quote == 'R') {
3263 quote = *++s;
3264 rawmode = 1;
3265 }
3266 }
3267 if (quote != '\'' && quote != '\"') {
3268 PyErr_BadInternalCall();
3269 return NULL;
3270 }
3271 s++;
3272 len = strlen(s);
3273 if (len > INT_MAX) {
3274 PyErr_SetString(PyExc_OverflowError,
3275 "string to parse is too long");
3276 return NULL;
3277 }
3278 if (s[--len] != quote) {
3279 PyErr_BadInternalCall();
3280 return NULL;
3281 }
3282 if (len >= 4 && s[0] == quote && s[1] == quote) {
3283 s += 2;
3284 len -= 2;
3285 if (s[--len] != quote || s[--len] != quote) {
3286 PyErr_BadInternalCall();
3287 return NULL;
3288 }
3289 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003291 if (unicode || Py_UnicodeFlag) {
3292 return decode_unicode(s, len, rawmode, encoding);
3293 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003295 need_encoding = (encoding != NULL &&
3296 strcmp(encoding, "utf-8") != 0 &&
3297 strcmp(encoding, "iso-8859-1") != 0);
3298 if (rawmode || strchr(s, '\\') == NULL) {
3299 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003301 /* This should not happen - we never see any other
3302 encoding. */
3303 Py_FatalError(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003304 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003306 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3307 if (u == NULL)
3308 return NULL;
3309 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3310 Py_DECREF(u);
3311 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003313 } else {
3314 return PyString_FromStringAndSize(s, len);
3315 }
3316 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317
Thomas Wouters89f507f2006-12-13 04:49:30 +00003318 return PyString_DecodeEscape(s, len, NULL, unicode,
3319 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320}
3321
3322/* Build a Python string object out of a STRING atom. This takes care of
3323 * compile-time literal catenation, calling parsestr() on each piece, and
3324 * pasting the intermediate results together.
3325 */
3326static PyObject *
3327parsestrplus(struct compiling *c, const node *n)
3328{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003329 PyObject *v;
3330 int i;
3331 REQ(CHILD(n, 0), STRING);
3332 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3333 /* String literal concatenation */
3334 for (i = 1; i < NCH(n); i++) {
3335 PyObject *s;
3336 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3337 if (s == NULL)
3338 goto onError;
3339 if (PyString_Check(v) && PyString_Check(s)) {
3340 PyString_ConcatAndDel(&v, s);
3341 if (v == NULL)
3342 goto onError;
3343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003345 else {
3346 PyObject *temp = PyUnicode_Concat(v, s);
3347 Py_DECREF(s);
3348 Py_DECREF(v);
3349 v = temp;
3350 if (v == NULL)
3351 goto onError;
3352 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003354 }
3355 }
3356 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357
3358 onError:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003359 Py_XDECREF(v);
3360 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361}