blob: f8bcdf291abc3268d71b087c1013e162b0ebc017 [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 *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000030
31/* Note different signature for ast_for_call */
32static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
33
34static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000035static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
36static PyObject *parsestrplus(struct compiling *, const node *n,
37 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000038
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
Nick Coghlan650f0d02007-04-15 12:05:43 +000043#define COMP_GENEXP 0
44#define COMP_LISTCOMP 1
45#define COMP_SETCOMP 2
46
Neal Norwitzadb69fc2005-12-17 20:54:49 +000047static identifier
48new_identifier(const char* n, PyArena *arena) {
49 PyObject* id = PyString_InternFromString(n);
50 PyArena_AddPyObject(arena, id);
51 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000052}
53
Neal Norwitzadb69fc2005-12-17 20:54:49 +000054#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055
56/* This routine provides an invalid object for the syntax error.
57 The outermost routine must unpack this error and create the
58 proper object. We do this so that we don't have to pass
59 the filename to everything function.
60
61 XXX Maybe we should just pass the filename...
62*/
63
64static int
65ast_error(const node *n, const char *errstr)
66{
67 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
68 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000069 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000070 PyErr_SetObject(PyExc_SyntaxError, u);
71 Py_DECREF(u);
72 return 0;
73}
74
75static void
76ast_error_finish(const char *filename)
77{
78 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000079 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000080
81 assert(PyErr_Occurred());
82 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +000083 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000084
85 PyErr_Fetch(&type, &value, &tback);
86 errstr = PyTuple_GetItem(value, 0);
87 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +000088 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000089 Py_INCREF(errstr);
90 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000091 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000092 Py_DECREF(errstr);
93 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000094 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 Py_DECREF(value);
96
97 loc = PyErr_ProgramText(filename, lineno);
98 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000099 Py_INCREF(Py_None);
100 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000101 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000102 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000104 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000105 Py_DECREF(errstr);
106 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000107 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000109 Py_DECREF(errstr);
110 Py_DECREF(tmp);
111 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000112 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000113 PyErr_Restore(type, value, tback);
114}
115
116/* num_stmts() returns number of contained statements.
117
118 Use this routine to determine how big a sequence is needed for
119 the statements in a parse tree. Its raison d'etre is this bit of
120 grammar:
121
122 stmt: simple_stmt | compound_stmt
123 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
124
125 A simple_stmt can contain multiple small_stmt elements joined
126 by semicolons. If the arg is a simple_stmt, the number of
127 small_stmt elements is returned.
128*/
129
130static int
131num_stmts(const node *n)
132{
133 int i, l;
134 node *ch;
135
136 switch (TYPE(n)) {
137 case single_input:
138 if (TYPE(CHILD(n, 0)) == NEWLINE)
139 return 0;
140 else
141 return num_stmts(CHILD(n, 0));
142 case file_input:
143 l = 0;
144 for (i = 0; i < NCH(n); i++) {
145 ch = CHILD(n, i);
146 if (TYPE(ch) == stmt)
147 l += num_stmts(ch);
148 }
149 return l;
150 case stmt:
151 return num_stmts(CHILD(n, 0));
152 case compound_stmt:
153 return 1;
154 case simple_stmt:
155 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
156 case suite:
157 if (NCH(n) == 1)
158 return num_stmts(CHILD(n, 0));
159 else {
160 l = 0;
161 for (i = 2; i < (NCH(n) - 1); i++)
162 l += num_stmts(CHILD(n, i));
163 return l;
164 }
165 default: {
166 char buf[128];
167
168 sprintf(buf, "Non-statement found: %d %d\n",
169 TYPE(n), NCH(n));
170 Py_FatalError(buf);
171 }
172 }
173 assert(0);
174 return 0;
175}
176
177/* Transform the CST rooted at node * to the appropriate AST
178*/
179
180mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000181PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
182 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000183{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000184 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185 asdl_seq *stmts = NULL;
186 stmt_ty s;
187 node *ch;
188 struct compiling c;
189
190 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000191 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000192 if (TYPE(n) == encoding_decl) {
193 ast_error(n, "encoding declaration in Unicode string");
194 goto error;
195 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196 } else if (TYPE(n) == encoding_decl) {
197 c.c_encoding = STR(n);
198 n = CHILD(n, 0);
199 } else {
200 c.c_encoding = NULL;
201 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000202 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000203
Jeremy Hyltona8293132006-02-28 17:58:27 +0000204 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205 switch (TYPE(n)) {
206 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208 if (!stmts)
209 return NULL;
210 for (i = 0; i < NCH(n) - 1; i++) {
211 ch = CHILD(n, i);
212 if (TYPE(ch) == NEWLINE)
213 continue;
214 REQ(ch, stmt);
215 num = num_stmts(ch);
216 if (num == 1) {
217 s = ast_for_stmt(&c, ch);
218 if (!s)
219 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000220 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000221 }
222 else {
223 ch = CHILD(ch, 0);
224 REQ(ch, simple_stmt);
225 for (j = 0; j < num; j++) {
226 s = ast_for_stmt(&c, CHILD(ch, j * 2));
227 if (!s)
228 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000229 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230 }
231 }
232 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000233 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234 case eval_input: {
235 expr_ty testlist_ast;
236
Nick Coghlan650f0d02007-04-15 12:05:43 +0000237 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000238 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!testlist_ast)
240 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000241 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242 }
243 case single_input:
244 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000245 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000247 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000248 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
249 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000250 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251 }
252 else {
253 n = CHILD(n, 0);
254 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000255 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000257 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000259 s = ast_for_stmt(&c, n);
260 if (!s)
261 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 asdl_seq_SET(stmts, 0, s);
263 }
264 else {
265 /* Only a simple_stmt can contain multiple statements. */
266 REQ(n, simple_stmt);
267 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000268 if (TYPE(CHILD(n, i)) == NEWLINE)
269 break;
270 s = ast_for_stmt(&c, CHILD(n, i));
271 if (!s)
272 goto error;
273 asdl_seq_SET(stmts, i / 2, s);
274 }
275 }
276
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000277 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000278 }
279 default:
280 goto error;
281 }
282 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283 ast_error_finish(filename);
284 return NULL;
285}
286
287/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
288*/
289
290static operator_ty
291get_operator(const node *n)
292{
293 switch (TYPE(n)) {
294 case VBAR:
295 return BitOr;
296 case CIRCUMFLEX:
297 return BitXor;
298 case AMPER:
299 return BitAnd;
300 case LEFTSHIFT:
301 return LShift;
302 case RIGHTSHIFT:
303 return RShift;
304 case PLUS:
305 return Add;
306 case MINUS:
307 return Sub;
308 case STAR:
309 return Mult;
310 case SLASH:
311 return Div;
312 case DOUBLESLASH:
313 return FloorDiv;
314 case PERCENT:
315 return Mod;
316 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000317 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 }
319}
320
Jeremy Hyltona8293132006-02-28 17:58:27 +0000321/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000322
323 Only sets context for expr kinds that "can appear in assignment context"
324 (according to ../Parser/Python.asdl). For other expr kinds, it sets
325 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000326*/
327
328static int
329set_context(expr_ty e, expr_context_ty ctx, const node *n)
330{
331 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000332 /* If a particular expression type can't be used for assign / delete,
333 set expr_name to its name and an error message will be generated.
334 */
335 const char* expr_name = NULL;
336
337 /* The ast defines augmented store and load contexts, but the
338 implementation here doesn't actually use them. The code may be
339 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000340 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000341 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000342 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343 */
344 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345
346 switch (e->kind) {
347 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000348 if (ctx == Store &&
349 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
350 return ast_error(n, "assignment to None");
351 }
352 e->v.Attribute.ctx = ctx;
353 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000354 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000355 e->v.Subscript.ctx = ctx;
356 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000357 case Name_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000358 if (ctx == Store &&
359 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
360 return ast_error(n, "assignment to None");
361 }
362 e->v.Name.ctx = ctx;
363 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000364 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000365 e->v.List.ctx = ctx;
366 s = e->v.List.elts;
367 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368 case Tuple_kind:
369 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
370 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000371 e->v.Tuple.ctx = ctx;
372 s = e->v.Tuple.elts;
373 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000374 case Lambda_kind:
375 expr_name = "lambda";
376 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000377 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000378 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000379 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 case UnaryOp_kind:
383 expr_name = "operator";
384 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000385 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000386 expr_name = "generator expression";
387 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388 case Yield_kind:
389 expr_name = "yield expression";
390 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000391 case ListComp_kind:
392 expr_name = "list comprehension";
393 break;
394 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000395 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396 case Num_kind:
397 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000398 expr_name = "literal";
399 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000400 case Ellipsis_kind:
401 expr_name = "Ellipsis";
402 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403 case Compare_kind:
404 expr_name = "comparison";
405 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000406 case IfExp_kind:
407 expr_name = "conditional expression";
408 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000409 default:
410 PyErr_Format(PyExc_SystemError,
411 "unexpected expression in assignment %d (line %d)",
412 e->kind, e->lineno);
413 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000415 /* Check for error string set by switch */
416 if (expr_name) {
417 char buf[300];
418 PyOS_snprintf(buf, sizeof(buf),
419 "can't %s %s",
420 ctx == Store ? "assign to" : "delete",
421 expr_name);
422 return ast_error(n, buf);
423 }
424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000426 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427 */
428 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000430
Thomas Wouters89f507f2006-12-13 04:49:30 +0000431 for (i = 0; i < asdl_seq_LEN(s); i++) {
432 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
433 return 0;
434 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 }
436 return 1;
437}
438
439static operator_ty
440ast_for_augassign(const node *n)
441{
442 REQ(n, augassign);
443 n = CHILD(n, 0);
444 switch (STR(n)[0]) {
445 case '+':
446 return Add;
447 case '-':
448 return Sub;
449 case '/':
450 if (STR(n)[1] == '/')
451 return FloorDiv;
452 else
453 return Div;
454 case '%':
455 return Mod;
456 case '<':
457 return LShift;
458 case '>':
459 return RShift;
460 case '&':
461 return BitAnd;
462 case '^':
463 return BitXor;
464 case '|':
465 return BitOr;
466 case '*':
467 if (STR(n)[1] == '*')
468 return Pow;
469 else
470 return Mult;
471 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000472 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000473 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
475}
476
477static cmpop_ty
478ast_for_comp_op(const node *n)
479{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000480 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000481 |'is' 'not'
482 */
483 REQ(n, comp_op);
484 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000485 n = CHILD(n, 0);
486 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487 case LESS:
488 return Lt;
489 case GREATER:
490 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000491 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000492 return Eq;
493 case LESSEQUAL:
494 return LtE;
495 case GREATEREQUAL:
496 return GtE;
497 case NOTEQUAL:
498 return NotEq;
499 case NAME:
500 if (strcmp(STR(n), "in") == 0)
501 return In;
502 if (strcmp(STR(n), "is") == 0)
503 return Is;
504 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000505 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000507 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000511 /* handle "not in" and "is not" */
512 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 case NAME:
514 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
515 return NotIn;
516 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
517 return IsNot;
518 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000519 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000521 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000522 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
Neal Norwitz79792652005-11-14 04:25:03 +0000524 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000526 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527}
528
529static asdl_seq *
530seq_for_testlist(struct compiling *c, const node *n)
531{
532 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000533 asdl_seq *seq;
534 expr_ty expression;
535 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000536 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000538 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539 if (!seq)
540 return NULL;
541
542 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000543 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544
545 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000546 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548
549 assert(i / 2 < seq->size);
550 asdl_seq_SET(seq, i / 2, expression);
551 }
552 return seq;
553}
554
Neal Norwitzc1505362006-12-28 06:47:50 +0000555static arg_ty
556compiler_simple_arg(struct compiling *c, const node *n)
557{
558 identifier name;
559 expr_ty annotation = NULL;
560 node *ch;
561
562 assert(TYPE(n) == tname || TYPE(n) == vname);
563 ch = CHILD(n, 0);
564 if (!strcmp(STR(ch), "None")) {
565 ast_error(ch, "assignment to None");
566 return NULL;
567 }
568 name = NEW_IDENTIFIER(ch);
569 if (!name)
570 return NULL;
571
572 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
573 annotation = ast_for_expr(c, CHILD(n, 2));
574 if (!annotation)
575 return NULL;
576 }
577
578 return SimpleArg(name, annotation, c->c_arena);
579}
580
581static arg_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000582compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583{
584 int i, len = (NCH(n) + 1) / 2;
Neal Norwitzc1505362006-12-28 06:47:50 +0000585 arg_ty arg;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000586 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 if (!args)
588 return NULL;
589
Neal Norwitzc1505362006-12-28 06:47:50 +0000590 assert(TYPE(n) == tfplist || TYPE(n) == vfplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591 for (i = 0; i < len; i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000592 const node *child = CHILD(n, 2*i);
593 /* def foo(((x), y)): -- x is not nested complex, special case. */
594 while (NCH(child) == 3 && NCH(CHILD(child, 1)) == 1)
595 child = CHILD(CHILD(child, 1), 0);
596
597 /* child either holds a tname or '(', a tfplist, ')' */
598 switch (TYPE(CHILD(child, 0))) {
599 case tname:
600 case vname:
601 arg = compiler_simple_arg(c, CHILD(child, 0));
602 break;
603 case LPAR:
604 arg = compiler_complex_args(c, CHILD(child, 1));
605 break;
606 default:
607 PyErr_Format(PyExc_SystemError,
608 "unexpected node in args: %d @ %d",
609 TYPE(CHILD(child, 0)), i);
610 arg = NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000611 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000612 if (!arg)
613 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 asdl_seq_SET(args, i, arg);
615 }
616
Neal Norwitzc1505362006-12-28 06:47:50 +0000617 return NestedArgs(args, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618}
619
Guido van Rossum4f72a782006-10-27 23:31:49 +0000620/* returns -1 if failed to handle keyword only arguments
621 returns new position to keep processing if successful
Neal Norwitzc1505362006-12-28 06:47:50 +0000622 (',' tname ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000623 ^^^
624 start pointing here
625 */
626static int
627handle_keywordonly_args(struct compiling *c, const node *n, int start,
628 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
629{
630 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000631 expr_ty expression, annotation;
632 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000633 int i = start;
634 int j = 0; /* index for kwdefaults and kwonlyargs */
635 assert(kwonlyargs != NULL);
636 assert(kwdefaults != NULL);
637 while (i < NCH(n)) {
638 ch = CHILD(n, i);
639 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000640 case vname:
641 case tname:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000642 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000643 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000644 if (!expression) {
645 ast_error(ch, "assignment to None");
646 goto error;
647 }
648 asdl_seq_SET(kwdefaults, j, expression);
649 i += 2; /* '=' and test */
650 }
651 else { /* setting NULL if no default value exists */
652 asdl_seq_SET(kwdefaults, j, NULL);
653 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000654 if (NCH(ch) == 3) {
655 /* ch is NAME ':' test */
656 annotation = ast_for_expr(c, CHILD(ch, 2));
657 if (!annotation) {
658 ast_error(ch, "expected expression");
659 goto error;
660 }
661 }
662 else {
663 annotation = NULL;
664 }
665 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000666 if (!strcmp(STR(ch), "None")) {
667 ast_error(ch, "assignment to None");
668 goto error;
669 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000670 arg = SimpleArg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
671 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000672 ast_error(ch, "expecting name");
673 goto error;
674 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000675 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000676 i += 2; /* the name and the comma */
677 break;
678 case DOUBLESTAR:
679 return i;
680 default:
681 ast_error(ch, "unexpected node");
682 goto error;
683 }
684 }
685 return i;
686 error:
687 return -1;
688}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689
Jeremy Hyltona8293132006-02-28 17:58:27 +0000690/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000691
692static arguments_ty
693ast_for_arguments(struct compiling *c, const node *n)
694{
Neal Norwitzc1505362006-12-28 06:47:50 +0000695 /* This function handles both typedargslist (function definition)
696 and varargslist (lambda definition).
697
698 parameters: '(' [typedargslist] ')'
699 typedargslist: ((tfpdef ['=' test] ',')*
700 ('*' [tname] (',' tname ['=' test])* [',' '**' tname]
701 | '**' tname)
702 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
703 varargslist: ((vfpdef ['=' test] ',')*
704 ('*' [vname] (',' vname ['=' test])* [',' '**' vname]
705 | '**' vname)
706 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000708 int i, j, k, nposargs = 0, nkwonlyargs = 0;
709 int nposdefaults = 0, found_default = 0;
710 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000712 arg_ty arg;
713 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 node *ch;
715
716 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000717 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000718 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
719 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000720 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000721 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000722 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723
Guido van Rossum4f72a782006-10-27 23:31:49 +0000724 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000726 ch = CHILD(n, i);
727 if (TYPE(ch) == STAR) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000728 if (TYPE(CHILD(n, i+1)) == tname
729 || TYPE(CHILD(n, i+1)) == vname) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000730 /* skip NAME of vararg */
731 /* so that following can count only keyword only args */
732 i += 2;
733 }
734 else {
735 i++;
736 }
737 break;
738 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000739 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000740 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000742 /* count the number of keyword only args &
743 defaults for keyword only args */
744 for ( ; i < NCH(n); ++i) {
745 ch = CHILD(n, i);
746 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000747 if (TYPE(ch) == tname || TYPE(ch) == vname) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000748 }
749
750 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
751 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000752 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 kwonlyargs = (nkwonlyargs ?
754 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
755 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000757 posdefaults = (nposdefaults ?
758 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
759 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000760 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 /* The length of kwonlyargs and kwdefaults are same
762 since we set NULL as default for keyword only argument w/o default
763 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000764 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000765 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
766 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000767 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000768
769 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000770 ast_error(n, "more than 255 arguments");
771 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000772 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773
Neal Norwitzc1505362006-12-28 06:47:50 +0000774 /* tname: NAME [':' test]
775 tfpdef: tname | '(' tfplist ')'
776 tfplist: tfpdef (',' tfpdef)* [',']
777 vname: NAME
778 vfpdef: NAME | '(' vfplist ')'
779 vfplist: vfpdef (',' vfpdef)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 */
781 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000782 j = 0; /* index for defaults */
783 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000785 ch = CHILD(n, i);
786 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000787 case tfpdef:
788 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
790 anything other than EQUAL or a comma? */
791 /* XXX Should NCH(n) check be made a separate check? */
792 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000793 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
794 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 goto error;
796 assert(posdefaults != NULL);
797 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000799 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 else if (found_default) {
802 ast_error(n,
803 "non-default argument follows default argument");
804 goto error;
805 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000806 /* def foo((x)): is not complex, special case. */
807 while (NCH(ch) == 3 && NCH(CHILD(ch, 1)) == 1)
808 ch = CHILD(CHILD(ch, 1), 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000809
Neal Norwitzc1505362006-12-28 06:47:50 +0000810 if (NCH(ch) != 1)
811 arg = compiler_complex_args(c, CHILD(ch, 1));
812 else
813 arg = compiler_simple_arg(c, CHILD(ch, 0));
814 if (!arg)
815 goto error;
816 asdl_seq_SET(posargs, k++, arg);
817
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818 i += 2; /* the name and the comma */
819 break;
820 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000821 if (i+1 >= NCH(n)) {
822 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000823 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000824 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000825 ch = CHILD(n, i+1); /* tname or COMMA */
826 if (TYPE(ch) == COMMA) {
827 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000828 i += 2; /* now follows keyword only arguments */
829 res = handle_keywordonly_args(c, n, i,
830 kwonlyargs, kwdefaults);
831 if (res == -1) goto error;
832 i = res; /* res has new position to process */
833 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000834 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
835 ast_error(CHILD(ch, 0), "assignment to None");
836 goto error;
837 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000838 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000839 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
840 if (NCH(ch) > 1) {
841 /* there is an annotation on the vararg */
842 varargannotation = ast_for_expr(c, CHILD(ch, 2));
843 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000844 i += 3;
Neal Norwitzc1505362006-12-28 06:47:50 +0000845 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tname
846 || TYPE(CHILD(n, i)) == vname)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000847 int res = 0;
848 res = handle_keywordonly_args(c, n, i,
849 kwonlyargs, kwdefaults);
850 if (res == -1) goto error;
851 i = res; /* res has new position to process */
852 }
853 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 break;
855 case DOUBLESTAR:
Neal Norwitzc1505362006-12-28 06:47:50 +0000856 ch = CHILD(n, i+1); /* tname */
857 assert(TYPE(ch) == tname || TYPE(ch) == vname);
858 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
859 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000860 goto error;
861 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000862 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
863 if (NCH(ch) > 1) {
864 /* there is an annotation on the kwarg */
865 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
866 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 i += 3;
868 break;
869 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000870 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871 "unexpected node in varargslist: %d @ %d",
872 TYPE(ch), i);
873 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000874 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000876 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
877 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000878 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000879 Py_XDECREF(vararg);
880 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881 return NULL;
882}
883
884static expr_ty
885ast_for_dotted_name(struct compiling *c, const node *n)
886{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000887 expr_ty e;
888 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000889 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890 int i;
891
892 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000893
894 lineno = LINENO(n);
895 col_offset = n->n_col_offset;
896
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 id = NEW_IDENTIFIER(CHILD(n, 0));
898 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000899 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000900 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000902 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903
904 for (i = 2; i < NCH(n); i+=2) {
905 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000906 if (!id)
907 return NULL;
908 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
909 if (!e)
910 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000911 }
912
913 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914}
915
916static expr_ty
917ast_for_decorator(struct compiling *c, const node *n)
918{
919 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
920 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000921 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922
923 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000924 REQ(CHILD(n, 0), AT);
925 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926
927 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
928 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 return NULL;
930
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000932 d = name_expr;
933 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 }
935 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000936 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000937 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000938 if (!d)
939 return NULL;
940 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 }
942 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000943 d = ast_for_call(c, CHILD(n, 3), name_expr);
944 if (!d)
945 return NULL;
946 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 }
948
949 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950}
951
952static asdl_seq*
953ast_for_decorators(struct compiling *c, const node *n)
954{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000955 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000956 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 int i;
958
959 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000960 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961 if (!decorator_seq)
962 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000963
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000964 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000965 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000966 if (!d)
967 return NULL;
968 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969 }
970 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971}
972
973static stmt_ty
974ast_for_funcdef(struct compiling *c, const node *n)
975{
Neal Norwitzc1505362006-12-28 06:47:50 +0000976 /* funcdef: 'def' [decorators] NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000977 identifier name;
978 arguments_ty args;
979 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 asdl_seq *decorator_seq = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000981 expr_ty returns = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 int name_i;
983
984 REQ(n, funcdef);
985
Nick Coghlan71011e22007-04-23 11:05:01 +0000986 if (NCH(n) == 6 || NCH(n) == 8) { /* decorators are present */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
988 if (!decorator_seq)
989 return NULL;
990 name_i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 }
992 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000993 name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 }
995
996 name = NEW_IDENTIFIER(CHILD(n, name_i));
997 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 ast_error(CHILD(n, name_i), "assignment to None");
1001 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002 }
1003 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1004 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001005 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001006 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1007 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1008 if (!returns)
1009 return NULL;
1010 name_i += 2;
1011 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 body = ast_for_suite(c, CHILD(n, name_i + 3));
1013 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001014 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015
Neal Norwitzc1505362006-12-28 06:47:50 +00001016 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001017 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018}
1019
1020static expr_ty
1021ast_for_lambdef(struct compiling *c, const node *n)
1022{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001023 /* lambdef: 'lambda' [varargslist] ':' test
1024 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 arguments_ty args;
1026 expr_ty expression;
1027
1028 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001029 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1030 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031 if (!args)
1032 return NULL;
1033 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001034 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 }
1037 else {
1038 args = ast_for_arguments(c, CHILD(n, 1));
1039 if (!args)
1040 return NULL;
1041 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001042 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 }
1045
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001046 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047}
1048
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001049static expr_ty
1050ast_for_ifexpr(struct compiling *c, const node *n)
1051{
1052 /* test: or_test 'if' or_test 'else' test */
1053 expr_ty expression, body, orelse;
1054
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001055 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001056 body = ast_for_expr(c, CHILD(n, 0));
1057 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001058 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001059 expression = ast_for_expr(c, CHILD(n, 2));
1060 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001061 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001062 orelse = ast_for_expr(c, CHILD(n, 4));
1063 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001064 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001065 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1066 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001067}
1068
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001070 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071
Nick Coghlan650f0d02007-04-15 12:05:43 +00001072 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073*/
1074
1075static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001076count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001078 int n_fors = 0;
1079 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080
Nick Coghlan650f0d02007-04-15 12:05:43 +00001081 count_comp_for:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001082 n_fors++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001083 REQ(ch, comp_for);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 if (NCH(ch) == 5)
1085 ch = CHILD(ch, 4);
1086 else
1087 return n_fors;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001088 count_comp_iter:
1089 REQ(ch, comp_iter);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001090 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001091 if (TYPE(ch) == comp_for)
1092 goto count_comp_for;
1093 else if (TYPE(ch) == comp_if) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001094 if (NCH(ch) == 3) {
1095 ch = CHILD(ch, 2);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001096 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001097 }
1098 else
1099 return n_fors;
1100 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001101
Thomas Wouters89f507f2006-12-13 04:49:30 +00001102 /* Should never be reached */
1103 PyErr_SetString(PyExc_SystemError,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001104 "logic error in count_comp_fors");
Thomas Wouters89f507f2006-12-13 04:49:30 +00001105 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106}
1107
Nick Coghlan650f0d02007-04-15 12:05:43 +00001108/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Nick Coghlan650f0d02007-04-15 12:05:43 +00001110 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111*/
1112
1113static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001114count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001116 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117
Thomas Wouters89f507f2006-12-13 04:49:30 +00001118 while (1) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001119 REQ(n, comp_iter);
1120 if (TYPE(CHILD(n, 0)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001121 return n_ifs;
1122 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001123 REQ(n, comp_if);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 n_ifs++;
1125 if (NCH(n) == 2)
1126 return n_ifs;
1127 n = CHILD(n, 2);
1128 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129}
1130
1131static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001132ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001134 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1135 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001137 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 int i, n_fors;
1139 node *ch;
1140
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141 assert(NCH(n) > 1);
1142
1143 elt = ast_for_expr(c, CHILD(n, 0));
1144 if (!elt)
1145 return NULL;
1146
Nick Coghlan650f0d02007-04-15 12:05:43 +00001147 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148 if (n_fors == -1)
1149 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001150
Nick Coghlan650f0d02007-04-15 12:05:43 +00001151 comps = asdl_seq_new(n_fors, c->c_arena);
1152 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001154
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 ch = CHILD(n, 1);
1156 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001157 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 asdl_seq *t;
1159 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001160 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161
Nick Coghlan650f0d02007-04-15 12:05:43 +00001162 REQ(ch, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163
Thomas Wouters89f507f2006-12-13 04:49:30 +00001164 for_ch = CHILD(ch, 1);
1165 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001166 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001168 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001169 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001171
Thomas Wouters89f507f2006-12-13 04:49:30 +00001172 /* Check the # of children rather than the length of t, since
1173 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1174 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001175 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1176 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001178 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1179 c->c_arena),
1180 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001181
Nick Coghlan650f0d02007-04-15 12:05:43 +00001182 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001184
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 if (NCH(ch) == 5) {
1186 int j, n_ifs;
1187 asdl_seq *ifs;
1188
1189 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001190 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001191 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001193
1194 ifs = asdl_seq_new(n_ifs, c->c_arena);
1195 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001199 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001201 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001203 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001204 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001205 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001206 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 if (NCH(ch) == 3)
1208 ch = CHILD(ch, 2);
1209 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001210 /* on exit, must guarantee that ch is a comp_for */
1211 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001213 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001215 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001217
1218 if (type == COMP_GENEXP)
1219 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1220 else if (type == COMP_LISTCOMP)
1221 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1222 else if (type == COMP_SETCOMP)
1223 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1224 else
1225 /* Should never happen */
1226 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227}
1228
1229static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001230ast_for_genexp(struct compiling *c, const node *n)
1231{
1232 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1233 return ast_for_comprehension(c, n, COMP_GENEXP);
1234}
1235
1236static expr_ty
1237ast_for_listcomp(struct compiling *c, const node *n)
1238{
1239 assert(TYPE(n) == (testlist_comp));
1240 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1241}
1242
1243static expr_ty
1244ast_for_setcomp(struct compiling *c, const node *n)
1245{
1246 assert(TYPE(n) == (dictorsetmaker));
1247 return ast_for_comprehension(c, n, COMP_SETCOMP);
1248}
1249
1250
1251static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252ast_for_atom(struct compiling *c, const node *n)
1253{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001254 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1255 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256 */
1257 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001258 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259
1260 switch (TYPE(ch)) {
1261 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001262 /* All names start in Load context, but may later be
1263 changed. */
1264 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001266 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001267 if (!str)
1268 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001269
Thomas Wouters89f507f2006-12-13 04:49:30 +00001270 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001271 if (bytesmode)
1272 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1273 else
1274 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 }
1276 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001277 PyObject *pynum = parsenumber(STR(ch));
1278 if (!pynum)
1279 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001280
Thomas Wouters89f507f2006-12-13 04:49:30 +00001281 PyArena_AddPyObject(c->c_arena, pynum);
1282 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 }
Georg Brandldde00282007-03-18 19:01:53 +00001284 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001285 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001287 ch = CHILD(n, 1);
1288
1289 if (TYPE(ch) == RPAR)
1290 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1291
1292 if (TYPE(ch) == yield_expr)
1293 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001294
1295 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1296 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001297 return ast_for_genexp(c, ch);
1298
Nick Coghlan650f0d02007-04-15 12:05:43 +00001299 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001301 ch = CHILD(n, 1);
1302
1303 if (TYPE(ch) == RSQB)
1304 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1305
Nick Coghlan650f0d02007-04-15 12:05:43 +00001306 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001307 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1308 asdl_seq *elts = seq_for_testlist(c, ch);
1309 if (!elts)
1310 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001311
Thomas Wouters89f507f2006-12-13 04:49:30 +00001312 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1313 }
1314 else
1315 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001317 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1318 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001319 int i, size;
1320 asdl_seq *keys, *values;
1321
1322 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001323 if (TYPE(ch) == RBRACE) {
1324 /* it's an empty dict */
1325 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1326 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1327 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001328 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001329 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001330 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001331 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001332 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001333 for (i = 0; i < NCH(ch); i += 2) {
1334 expr_ty expression;
1335 expression = ast_for_expr(c, CHILD(ch, i));
1336 if (!expression)
1337 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001338 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001339 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001340 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1341 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1342 /* it's a set comprehension */
1343 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001344 } else {
1345 /* it's a dict */
1346 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1347 keys = asdl_seq_new(size, c->c_arena);
1348 if (!keys)
1349 return NULL;
1350
1351 values = asdl_seq_new(size, c->c_arena);
1352 if (!values)
1353 return NULL;
1354
1355 for (i = 0; i < NCH(ch); i += 4) {
1356 expr_ty expression;
1357
1358 expression = ast_for_expr(c, CHILD(ch, i));
1359 if (!expression)
1360 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001361
Guido van Rossum86e58e22006-08-28 15:27:34 +00001362 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001363
Guido van Rossum86e58e22006-08-28 15:27:34 +00001364 expression = ast_for_expr(c, CHILD(ch, i + 2));
1365 if (!expression)
1366 return NULL;
1367
1368 asdl_seq_SET(values, i / 4, expression);
1369 }
1370 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1371 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001374 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1375 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 }
1377}
1378
1379static slice_ty
1380ast_for_slice(struct compiling *c, const node *n)
1381{
1382 node *ch;
1383 expr_ty lower = NULL, upper = NULL, step = NULL;
1384
1385 REQ(n, subscript);
1386
1387 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001388 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 sliceop: ':' [test]
1390 */
1391 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392 if (NCH(n) == 1 && TYPE(ch) == test) {
1393 /* 'step' variable hold no significance in terms of being used over
1394 other vars */
1395 step = ast_for_expr(c, ch);
1396 if (!step)
1397 return NULL;
1398
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 }
1401
1402 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001403 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 if (!lower)
1405 return NULL;
1406 }
1407
1408 /* If there's an upper bound it's in the second or third position. */
1409 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 if (NCH(n) > 1) {
1411 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412
Thomas Wouters89f507f2006-12-13 04:49:30 +00001413 if (TYPE(n2) == test) {
1414 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 if (!upper)
1416 return NULL;
1417 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001418 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001420 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 if (TYPE(n2) == test) {
1423 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 if (!upper)
1425 return NULL;
1426 }
1427 }
1428
1429 ch = CHILD(n, NCH(n) - 1);
1430 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001431 if (NCH(ch) == 1) {
1432 /* No expression, so step is None */
1433 ch = CHILD(ch, 0);
1434 step = Name(new_identifier("None", c->c_arena), Load,
1435 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436 if (!step)
1437 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001438 } else {
1439 ch = CHILD(ch, 1);
1440 if (TYPE(ch) == test) {
1441 step = ast_for_expr(c, ch);
1442 if (!step)
1443 return NULL;
1444 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 }
1446 }
1447
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001448 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449}
1450
1451static expr_ty
1452ast_for_binop(struct compiling *c, const node *n)
1453{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001454 /* Must account for a sequence of expressions.
1455 How should A op B op C by represented?
1456 BinOp(BinOp(A, op, B), op, C).
1457 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 int i, nops;
1460 expr_ty expr1, expr2, result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001461 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462
1463 expr1 = ast_for_expr(c, CHILD(n, 0));
1464 if (!expr1)
1465 return NULL;
1466
1467 expr2 = ast_for_expr(c, CHILD(n, 2));
1468 if (!expr2)
1469 return NULL;
1470
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001471 newoperator = get_operator(CHILD(n, 1));
1472 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 return NULL;
1474
Thomas Wouters89f507f2006-12-13 04:49:30 +00001475 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001476 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001477 if (!result)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 return NULL;
1479
Thomas Wouters89f507f2006-12-13 04:49:30 +00001480 nops = (NCH(n) - 1) / 2;
1481 for (i = 1; i < nops; i++) {
1482 expr_ty tmp_result, tmp;
1483 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484
Thomas Wouters89f507f2006-12-13 04:49:30 +00001485 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001486 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 return NULL;
1488
1489 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1490 if (!tmp)
1491 return NULL;
1492
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001493 tmp_result = BinOp(result, newoperator, tmp,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 LINENO(next_oper), next_oper->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001495 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496 if (!tmp)
1497 return NULL;
1498 result = tmp_result;
1499 }
1500 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001503static expr_ty
1504ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1505{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001506 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1507 subscriptlist: subscript (',' subscript)* [',']
1508 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1509 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001510 REQ(n, trailer);
1511 if (TYPE(CHILD(n, 0)) == LPAR) {
1512 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001513 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1514 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001515 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001516 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001517 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001518 else if (TYPE(CHILD(n, 0)) == DOT ) {
1519 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001520 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001521 }
1522 else {
1523 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524 REQ(CHILD(n, 2), RSQB);
1525 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001526 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001527 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1528 if (!slc)
1529 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001530 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1531 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001532 }
1533 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001534 /* The grammar is ambiguous here. The ambiguity is resolved
1535 by treating the sequence as a tuple literal if there are
1536 no slice features.
1537 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001538 int j;
1539 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001540 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001541 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001542 asdl_seq *slices, *elts;
1543 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001544 if (!slices)
1545 return NULL;
1546 for (j = 0; j < NCH(n); j += 2) {
1547 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001548 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001549 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001550 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001551 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001552 asdl_seq_SET(slices, j / 2, slc);
1553 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001554 if (!simple) {
1555 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001556 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001557 }
1558 /* extract Index values and put them in a Tuple */
1559 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001560 if (!elts)
1561 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001562 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1563 slc = (slice_ty)asdl_seq_GET(slices, j);
1564 assert(slc->kind == Index_kind && slc->v.Index.value);
1565 asdl_seq_SET(elts, j, slc->v.Index.value);
1566 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001567 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001568 if (!e)
1569 return NULL;
1570 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001571 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001572 }
1573 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001574}
1575
1576static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001577ast_for_factor(struct compiling *c, const node *n)
1578{
1579 node *pfactor, *ppower, *patom, *pnum;
1580 expr_ty expression;
1581
1582 /* If the unary - operator is applied to a constant, don't generate
1583 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1584 constant. The peephole optimizer already does something like
1585 this but it doesn't handle the case where the constant is
1586 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1587 PyLongObject.
1588 */
1589 if (TYPE(CHILD(n, 0)) == MINUS
1590 && NCH(n) == 2
1591 && TYPE((pfactor = CHILD(n, 1))) == factor
1592 && NCH(pfactor) == 1
1593 && TYPE((ppower = CHILD(pfactor, 0))) == power
1594 && NCH(ppower) == 1
1595 && TYPE((patom = CHILD(ppower, 0))) == atom
1596 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1597 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1598 if (s == NULL)
1599 return NULL;
1600 s[0] = '-';
1601 strcpy(s + 1, STR(pnum));
1602 PyObject_FREE(STR(pnum));
1603 STR(pnum) = s;
1604 return ast_for_atom(c, patom);
1605 }
1606
1607 expression = ast_for_expr(c, CHILD(n, 1));
1608 if (!expression)
1609 return NULL;
1610
1611 switch (TYPE(CHILD(n, 0))) {
1612 case PLUS:
1613 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1614 c->c_arena);
1615 case MINUS:
1616 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1617 c->c_arena);
1618 case TILDE:
1619 return UnaryOp(Invert, expression, LINENO(n),
1620 n->n_col_offset, c->c_arena);
1621 }
1622 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1623 TYPE(CHILD(n, 0)));
1624 return NULL;
1625}
1626
1627static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001628ast_for_power(struct compiling *c, const node *n)
1629{
1630 /* power: atom trailer* ('**' factor)*
1631 */
1632 int i;
1633 expr_ty e, tmp;
1634 REQ(n, power);
1635 e = ast_for_atom(c, CHILD(n, 0));
1636 if (!e)
1637 return NULL;
1638 if (NCH(n) == 1)
1639 return e;
1640 for (i = 1; i < NCH(n); i++) {
1641 node *ch = CHILD(n, i);
1642 if (TYPE(ch) != trailer)
1643 break;
1644 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001645 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001647 tmp->lineno = e->lineno;
1648 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001649 e = tmp;
1650 }
1651 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1652 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001653 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001656 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001657 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001658 e = tmp;
1659 }
1660 return e;
1661}
1662
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663/* Do not name a variable 'expr'! Will cause a compile error.
1664*/
1665
1666static expr_ty
1667ast_for_expr(struct compiling *c, const node *n)
1668{
1669 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001670 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001671 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001672 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673 and_test: not_test ('and' not_test)*
1674 not_test: 'not' not_test | comparison
1675 comparison: expr (comp_op expr)*
1676 expr: xor_expr ('|' xor_expr)*
1677 xor_expr: and_expr ('^' and_expr)*
1678 and_expr: shift_expr ('&' shift_expr)*
1679 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1680 arith_expr: term (('+'|'-') term)*
1681 term: factor (('*'|'/'|'%'|'//') factor)*
1682 factor: ('+'|'-'|'~') factor | power
1683 power: atom trailer* ('**' factor)*
1684 */
1685
1686 asdl_seq *seq;
1687 int i;
1688
1689 loop:
1690 switch (TYPE(n)) {
1691 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001692 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001693 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001694 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001696 else if (NCH(n) > 1)
1697 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001698 /* Fallthrough */
1699 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 case and_test:
1701 if (NCH(n) == 1) {
1702 n = CHILD(n, 0);
1703 goto loop;
1704 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001705 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 if (!seq)
1707 return NULL;
1708 for (i = 0; i < NCH(n); i += 2) {
1709 expr_ty e = ast_for_expr(c, CHILD(n, i));
1710 if (!e)
1711 return NULL;
1712 asdl_seq_SET(seq, i / 2, e);
1713 }
1714 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001715 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1716 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001717 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001718 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 case not_test:
1720 if (NCH(n) == 1) {
1721 n = CHILD(n, 0);
1722 goto loop;
1723 }
1724 else {
1725 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1726 if (!expression)
1727 return NULL;
1728
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001729 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1730 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 }
1732 case comparison:
1733 if (NCH(n) == 1) {
1734 n = CHILD(n, 0);
1735 goto loop;
1736 }
1737 else {
1738 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001739 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001740 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001741 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001742 if (!ops)
1743 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001744 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 return NULL;
1747 }
1748 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001749 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001751 newoperator = ast_for_comp_op(CHILD(n, i));
1752 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001754 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755
1756 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001757 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001759 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001761 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762 asdl_seq_SET(cmps, i / 2, expression);
1763 }
1764 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001765 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001767 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001769 return Compare(expression, ops, cmps, LINENO(n),
1770 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771 }
1772 break;
1773
1774 /* The next five cases all handle BinOps. The main body of code
1775 is the same in each case, but the switch turned inside out to
1776 reuse the code for each type of operator.
1777 */
1778 case expr:
1779 case xor_expr:
1780 case and_expr:
1781 case shift_expr:
1782 case arith_expr:
1783 case term:
1784 if (NCH(n) == 1) {
1785 n = CHILD(n, 0);
1786 goto loop;
1787 }
1788 return ast_for_binop(c, n);
1789 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001790 expr_ty exp = NULL;
1791 if (NCH(n) == 2) {
1792 exp = ast_for_testlist(c, CHILD(n, 1));
1793 if (!exp)
1794 return NULL;
1795 }
1796 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1797 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001798 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799 if (NCH(n) == 1) {
1800 n = CHILD(n, 0);
1801 goto loop;
1802 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001803 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001804 case power:
1805 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001807 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 return NULL;
1809 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001810 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811 return NULL;
1812}
1813
1814static expr_ty
1815ast_for_call(struct compiling *c, const node *n, expr_ty func)
1816{
1817 /*
1818 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1819 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001820 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 */
1822
1823 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001824 asdl_seq *args;
1825 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 expr_ty vararg = NULL, kwarg = NULL;
1827
1828 REQ(n, arglist);
1829
1830 nargs = 0;
1831 nkeywords = 0;
1832 ngens = 0;
1833 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001834 node *ch = CHILD(n, i);
1835 if (TYPE(ch) == argument) {
1836 if (NCH(ch) == 1)
1837 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001838 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001839 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001841 nkeywords++;
1842 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 }
1844 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001845 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001846 "if not sole argument");
1847 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 }
1849
1850 if (nargs + nkeywords + ngens > 255) {
1851 ast_error(n, "more than 255 arguments");
1852 return NULL;
1853 }
1854
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001855 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001857 return NULL;
1858 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001860 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 nargs = 0;
1862 nkeywords = 0;
1863 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 node *ch = CHILD(n, i);
1865 if (TYPE(ch) == argument) {
1866 expr_ty e;
1867 if (NCH(ch) == 1) {
1868 if (nkeywords) {
1869 ast_error(CHILD(ch, 0),
1870 "non-keyword arg after keyword arg");
1871 return NULL;
1872 }
1873 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001875 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 asdl_seq_SET(args, nargs++, e);
1877 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001878 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001879 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001881 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 else {
1885 keyword_ty kw;
1886 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887
Thomas Wouters89f507f2006-12-13 04:49:30 +00001888 /* CHILD(ch, 0) is test, but must be an identifier? */
1889 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001891 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 /* f(lambda x: x[0] = 3) ends up getting parsed with
1893 * LHS test = lambda x: x[0], and RHS test = 3.
1894 * SF bug 132313 points out that complaining about a keyword
1895 * then is very confusing.
1896 */
1897 if (e->kind == Lambda_kind) {
1898 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001899 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 } else if (e->kind != Name_kind) {
1901 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001902 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001904 key = e->v.Name.id;
1905 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001907 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001910 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 asdl_seq_SET(keywords, nkeywords++, kw);
1912 }
1913 }
1914 else if (TYPE(ch) == STAR) {
1915 vararg = ast_for_expr(c, CHILD(n, i+1));
1916 i++;
1917 }
1918 else if (TYPE(ch) == DOUBLESTAR) {
1919 kwarg = ast_for_expr(c, CHILD(n, i+1));
1920 i++;
1921 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 }
1923
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001924 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925}
1926
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001928ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001930 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001931 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001932 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001934 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001935 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001937 }
1938 else {
1939 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001940 TYPE(n) == testlist1);
1941 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001943 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944 else {
1945 asdl_seq *tmp = seq_for_testlist(c, n);
1946 if (!tmp)
1947 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001948 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001950}
1951
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952static stmt_ty
1953ast_for_expr_stmt(struct compiling *c, const node *n)
1954{
1955 REQ(n, expr_stmt);
1956 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1957 | ('=' (yield_expr|testlist))*)
1958 testlist: test (',' test)* [',']
1959 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001960 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 test: ... here starts the operator precendence dance
1962 */
1963
1964 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001965 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 if (!e)
1967 return NULL;
1968
Thomas Wouters89f507f2006-12-13 04:49:30 +00001969 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 }
1971 else if (TYPE(CHILD(n, 1)) == augassign) {
1972 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001973 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (!expr1)
1978 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001979 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001980 switch (expr1->kind) {
1981 case GeneratorExp_kind:
1982 ast_error(ch, "augmented assignment to generator "
1983 "expression not possible");
1984 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001985 case Yield_kind:
1986 ast_error(ch, "augmented assignment to yield "
1987 "expression not possible");
1988 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001989 case Name_kind: {
1990 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1991 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1992 ast_error(ch, "assignment to None");
1993 return NULL;
1994 }
1995 break;
1996 }
1997 case Attribute_kind:
1998 case Subscript_kind:
1999 break;
2000 default:
2001 ast_error(ch, "illegal expression for augmented "
2002 "assignment");
2003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006
Thomas Wouters89f507f2006-12-13 04:49:30 +00002007 ch = CHILD(n, 2);
2008 if (TYPE(ch) == testlist)
2009 expr2 = ast_for_testlist(c, ch);
2010 else
2011 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002012 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 return NULL;
2014
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002015 newoperator = ast_for_augassign(CHILD(n, 1));
2016 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 return NULL;
2018
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 }
2021 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 int i;
2023 asdl_seq *targets;
2024 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 expr_ty expression;
2026
Thomas Wouters89f507f2006-12-13 04:49:30 +00002027 /* a normal assignment */
2028 REQ(CHILD(n, 1), EQUAL);
2029 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2030 if (!targets)
2031 return NULL;
2032 for (i = 0; i < NCH(n) - 2; i += 2) {
2033 expr_ty e;
2034 node *ch = CHILD(n, i);
2035 if (TYPE(ch) == yield_expr) {
2036 ast_error(ch, "assignment to yield expression not possible");
2037 return NULL;
2038 }
2039 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 /* set context to assign */
2042 if (!e)
2043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 if (!set_context(e, Store, CHILD(n, i)))
2046 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047
Thomas Wouters89f507f2006-12-13 04:49:30 +00002048 asdl_seq_SET(targets, i / 2, e);
2049 }
2050 value = CHILD(n, NCH(n) - 1);
2051 if (TYPE(value) == testlist)
2052 expression = ast_for_testlist(c, value);
2053 else
2054 expression = ast_for_expr(c, value);
2055 if (!expression)
2056 return NULL;
2057 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059}
2060
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002062ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063{
2064 asdl_seq *seq;
2065 int i;
2066 expr_ty e;
2067
2068 REQ(n, exprlist);
2069
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002070 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002072 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002074 e = ast_for_expr(c, CHILD(n, i));
2075 if (!e)
2076 return NULL;
2077 asdl_seq_SET(seq, i / 2, e);
2078 if (context && !set_context(e, context, CHILD(n, i)))
2079 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 }
2081 return seq;
2082}
2083
2084static stmt_ty
2085ast_for_del_stmt(struct compiling *c, const node *n)
2086{
2087 asdl_seq *expr_list;
2088
2089 /* del_stmt: 'del' exprlist */
2090 REQ(n, del_stmt);
2091
2092 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2093 if (!expr_list)
2094 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002095 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096}
2097
2098static stmt_ty
2099ast_for_flow_stmt(struct compiling *c, const node *n)
2100{
2101 /*
2102 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2103 | yield_stmt
2104 break_stmt: 'break'
2105 continue_stmt: 'continue'
2106 return_stmt: 'return' [testlist]
2107 yield_stmt: yield_expr
2108 yield_expr: 'yield' testlist
2109 raise_stmt: 'raise' [test [',' test [',' test]]]
2110 */
2111 node *ch;
2112
2113 REQ(n, flow_stmt);
2114 ch = CHILD(n, 0);
2115 switch (TYPE(ch)) {
2116 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002117 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002119 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002121 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2122 if (!exp)
2123 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002124 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 }
2126 case return_stmt:
2127 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002128 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002130 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 if (!expression)
2132 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002133 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 }
2135 case raise_stmt:
2136 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002137 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 else if (NCH(ch) == 2) {
2139 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2140 if (!expression)
2141 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002142 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 }
2144 else if (NCH(ch) == 4) {
2145 expr_ty expr1, expr2;
2146
2147 expr1 = ast_for_expr(c, CHILD(ch, 1));
2148 if (!expr1)
2149 return NULL;
2150 expr2 = ast_for_expr(c, CHILD(ch, 3));
2151 if (!expr2)
2152 return NULL;
2153
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002154 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 }
2156 else if (NCH(ch) == 6) {
2157 expr_ty expr1, expr2, expr3;
2158
2159 expr1 = ast_for_expr(c, CHILD(ch, 1));
2160 if (!expr1)
2161 return NULL;
2162 expr2 = ast_for_expr(c, CHILD(ch, 3));
2163 if (!expr2)
2164 return NULL;
2165 expr3 = ast_for_expr(c, CHILD(ch, 5));
2166 if (!expr3)
2167 return NULL;
2168
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002169 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 }
2171 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002172 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173 "unexpected flow_stmt: %d", TYPE(ch));
2174 return NULL;
2175 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002176
2177 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2178 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179}
2180
2181static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002182alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183{
2184 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002185 import_as_name: NAME ['as' NAME]
2186 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 dotted_name: NAME ('.' NAME)*
2188 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002189 PyObject *str;
2190
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002191 loop:
2192 switch (TYPE(n)) {
2193 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002194 str = NULL;
2195 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002196 str = NEW_IDENTIFIER(CHILD(n, 2));
2197 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002198 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199 case dotted_as_name:
2200 if (NCH(n) == 1) {
2201 n = CHILD(n, 0);
2202 goto loop;
2203 }
2204 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002205 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002206 if (!a)
2207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208 assert(!a->asname);
2209 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2210 return a;
2211 }
2212 break;
2213 case dotted_name:
2214 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002215 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 else {
2217 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002218 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002219 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 char *s;
2221
2222 len = 0;
2223 for (i = 0; i < NCH(n); i += 2)
2224 /* length of string plus one for the dot */
2225 len += strlen(STR(CHILD(n, i))) + 1;
2226 len--; /* the last name doesn't have a dot */
2227 str = PyString_FromStringAndSize(NULL, len);
2228 if (!str)
2229 return NULL;
2230 s = PyString_AS_STRING(str);
2231 if (!s)
2232 return NULL;
2233 for (i = 0; i < NCH(n); i += 2) {
2234 char *sch = STR(CHILD(n, i));
2235 strcpy(s, STR(CHILD(n, i)));
2236 s += strlen(sch);
2237 *s++ = '.';
2238 }
2239 --s;
2240 *s = '\0';
2241 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002242 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002243 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 }
2245 break;
2246 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002247 str = PyString_InternFromString("*");
2248 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002249 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002251 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 "unexpected import name: %d", TYPE(n));
2253 return NULL;
2254 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002255
2256 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 return NULL;
2258}
2259
2260static stmt_ty
2261ast_for_import_stmt(struct compiling *c, const node *n)
2262{
2263 /*
2264 import_stmt: import_name | import_from
2265 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002266 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2267 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002269 int lineno;
2270 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 int i;
2272 asdl_seq *aliases;
2273
2274 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002275 lineno = LINENO(n);
2276 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002278 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002280 REQ(n, dotted_as_names);
2281 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2282 if (!aliases)
2283 return NULL;
2284 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002285 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002286 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002288 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002290 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002292 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002294 int idx, ndots = 0;
2295 alias_ty mod = NULL;
2296 identifier modname;
2297
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002298 /* Count the number of dots (for relative imports) and check for the
2299 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002300 for (idx = 1; idx < NCH(n); idx++) {
2301 if (TYPE(CHILD(n, idx)) == dotted_name) {
2302 mod = alias_for_import_name(c, CHILD(n, idx));
2303 idx++;
2304 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002305 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2306 /* three consecutive dots are tokenized as one ELLIPSIS */
2307 ndots += 3;
2308 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002309 } else if (TYPE(CHILD(n, idx)) != DOT) {
2310 break;
2311 }
2312 ndots++;
2313 }
2314 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002315 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002316 case STAR:
2317 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002318 n = CHILD(n, idx);
2319 n_children = 1;
2320 if (ndots) {
2321 ast_error(n, "'import *' not allowed with 'from .'");
2322 return NULL;
2323 }
2324 break;
2325 case LPAR:
2326 /* from ... import (x, y, z) */
2327 n = CHILD(n, idx + 1);
2328 n_children = NCH(n);
2329 break;
2330 case import_as_names:
2331 /* from ... import x, y, z */
2332 n = CHILD(n, idx);
2333 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002334 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 ast_error(n, "trailing comma not allowed without"
2336 " surrounding parentheses");
2337 return NULL;
2338 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002339 break;
2340 default:
2341 ast_error(n, "Unexpected node-type in from-import");
2342 return NULL;
2343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344
Thomas Wouters89f507f2006-12-13 04:49:30 +00002345 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2346 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348
2349 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002350 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002351 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002352 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002356 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002357 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002358 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2359 if (!import_alias)
2360 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002361 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002362 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002364 if (mod != NULL)
2365 modname = mod->name;
2366 else
2367 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002368 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002369 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 }
Neal Norwitz79792652005-11-14 04:25:03 +00002371 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 "unknown import statement: starts with command '%s'",
2373 STR(CHILD(n, 0)));
2374 return NULL;
2375}
2376
2377static stmt_ty
2378ast_for_global_stmt(struct compiling *c, const node *n)
2379{
2380 /* global_stmt: 'global' NAME (',' NAME)* */
2381 identifier name;
2382 asdl_seq *s;
2383 int i;
2384
2385 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002386 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002388 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 name = NEW_IDENTIFIER(CHILD(n, i));
2391 if (!name)
2392 return NULL;
2393 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002395 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396}
2397
2398static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002399ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2400{
2401 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2402 identifier name;
2403 asdl_seq *s;
2404 int i;
2405
2406 REQ(n, nonlocal_stmt);
2407 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2408 if (!s)
2409 return NULL;
2410 for (i = 1; i < NCH(n); i += 2) {
2411 name = NEW_IDENTIFIER(CHILD(n, i));
2412 if (!name)
2413 return NULL;
2414 asdl_seq_SET(s, i / 2, name);
2415 }
2416 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2417}
2418
2419static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420ast_for_assert_stmt(struct compiling *c, const node *n)
2421{
2422 /* assert_stmt: 'assert' test [',' test] */
2423 REQ(n, assert_stmt);
2424 if (NCH(n) == 2) {
2425 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2426 if (!expression)
2427 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002428 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 }
2430 else if (NCH(n) == 4) {
2431 expr_ty expr1, expr2;
2432
2433 expr1 = ast_for_expr(c, CHILD(n, 1));
2434 if (!expr1)
2435 return NULL;
2436 expr2 = ast_for_expr(c, CHILD(n, 3));
2437 if (!expr2)
2438 return NULL;
2439
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 }
Neal Norwitz79792652005-11-14 04:25:03 +00002442 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 "improper number of parts to 'assert' statement: %d",
2444 NCH(n));
2445 return NULL;
2446}
2447
2448static asdl_seq *
2449ast_for_suite(struct compiling *c, const node *n)
2450{
2451 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002452 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 stmt_ty s;
2454 int i, total, num, end, pos = 0;
2455 node *ch;
2456
2457 REQ(n, suite);
2458
2459 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002460 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 n = CHILD(n, 0);
2465 /* simple_stmt always ends with a NEWLINE,
2466 and may have a trailing SEMI
2467 */
2468 end = NCH(n) - 1;
2469 if (TYPE(CHILD(n, end - 1)) == SEMI)
2470 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 for (i = 0; i < end; i += 2) {
2473 ch = CHILD(n, i);
2474 s = ast_for_stmt(c, ch);
2475 if (!s)
2476 return NULL;
2477 asdl_seq_SET(seq, pos++, s);
2478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 }
2480 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 for (i = 2; i < (NCH(n) - 1); i++) {
2482 ch = CHILD(n, i);
2483 REQ(ch, stmt);
2484 num = num_stmts(ch);
2485 if (num == 1) {
2486 /* small_stmt or compound_stmt with only one child */
2487 s = ast_for_stmt(c, ch);
2488 if (!s)
2489 return NULL;
2490 asdl_seq_SET(seq, pos++, s);
2491 }
2492 else {
2493 int j;
2494 ch = CHILD(ch, 0);
2495 REQ(ch, simple_stmt);
2496 for (j = 0; j < NCH(ch); j += 2) {
2497 /* statement terminates with a semi-colon ';' */
2498 if (NCH(CHILD(ch, j)) == 0) {
2499 assert((j + 1) == NCH(ch));
2500 break;
2501 }
2502 s = ast_for_stmt(c, CHILD(ch, j));
2503 if (!s)
2504 return NULL;
2505 asdl_seq_SET(seq, pos++, s);
2506 }
2507 }
2508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 }
2510 assert(pos == seq->size);
2511 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512}
2513
2514static stmt_ty
2515ast_for_if_stmt(struct compiling *c, const node *n)
2516{
2517 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2518 ['else' ':' suite]
2519 */
2520 char *s;
2521
2522 REQ(n, if_stmt);
2523
2524 if (NCH(n) == 4) {
2525 expr_ty expression;
2526 asdl_seq *suite_seq;
2527
2528 expression = ast_for_expr(c, CHILD(n, 1));
2529 if (!expression)
2530 return NULL;
2531 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002532 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 return NULL;
2534
Thomas Wouters89f507f2006-12-13 04:49:30 +00002535 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002537
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 s = STR(CHILD(n, 4));
2539 /* s[2], the third character in the string, will be
2540 's' for el_s_e, or
2541 'i' for el_i_f
2542 */
2543 if (s[2] == 's') {
2544 expr_ty expression;
2545 asdl_seq *seq1, *seq2;
2546
2547 expression = ast_for_expr(c, CHILD(n, 1));
2548 if (!expression)
2549 return NULL;
2550 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002551 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 return NULL;
2553 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002554 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 return NULL;
2556
Thomas Wouters89f507f2006-12-13 04:49:30 +00002557 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 }
2559 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002560 int i, n_elif, has_else = 0;
2561 asdl_seq *orelse = NULL;
2562 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 /* must reference the child n_elif+1 since 'else' token is third,
2564 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2566 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2567 has_else = 1;
2568 n_elif -= 3;
2569 }
2570 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571
Thomas Wouters89f507f2006-12-13 04:49:30 +00002572 if (has_else) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 expr_ty expression;
2574 asdl_seq *seq1, *seq2;
2575
Thomas Wouters89f507f2006-12-13 04:49:30 +00002576 orelse = asdl_seq_new(1, c->c_arena);
2577 if (!orelse)
2578 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002580 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002583 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002586 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
2590 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002591 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 /* the just-created orelse handled the last elif */
2593 n_elif--;
2594 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595
Thomas Wouters89f507f2006-12-13 04:49:30 +00002596 for (i = 0; i < n_elif; i++) {
2597 int off = 5 + (n_elif - i - 1) * 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 expr_ty expression;
2599 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002600 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2601 if (!newobj)
2602 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002604 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002607 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609
Thomas Wouters89f507f2006-12-13 04:49:30 +00002610 asdl_seq_SET(newobj, 0,
2611 If(expression, suite_seq, orelse,
2612 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
2613 orelse = newobj;
2614 }
2615 return If(ast_for_expr(c, CHILD(n, 1)),
2616 ast_for_suite(c, CHILD(n, 3)),
2617 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002619
2620 PyErr_Format(PyExc_SystemError,
2621 "unexpected token in 'if' statement: %s", s);
2622 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623}
2624
2625static stmt_ty
2626ast_for_while_stmt(struct compiling *c, const node *n)
2627{
2628 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2629 REQ(n, while_stmt);
2630
2631 if (NCH(n) == 4) {
2632 expr_ty expression;
2633 asdl_seq *suite_seq;
2634
2635 expression = ast_for_expr(c, CHILD(n, 1));
2636 if (!expression)
2637 return NULL;
2638 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002639 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 }
2643 else if (NCH(n) == 7) {
2644 expr_ty expression;
2645 asdl_seq *seq1, *seq2;
2646
2647 expression = ast_for_expr(c, CHILD(n, 1));
2648 if (!expression)
2649 return NULL;
2650 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002651 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 return NULL;
2653 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002654 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 return NULL;
2656
Thomas Wouters89f507f2006-12-13 04:49:30 +00002657 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002659
2660 PyErr_Format(PyExc_SystemError,
2661 "wrong number of tokens for 'while' statement: %d",
2662 NCH(n));
2663 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664}
2665
2666static stmt_ty
2667ast_for_for_stmt(struct compiling *c, const node *n)
2668{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002669 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 expr_ty expression;
2671 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002672 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2674 REQ(n, for_stmt);
2675
2676 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002677 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 if (!seq)
2679 return NULL;
2680 }
2681
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002682 node_target = CHILD(n, 1);
2683 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002684 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002686 /* Check the # of children rather than the length of _target, since
2687 for x, in ... has 1 element in _target, but still requires a Tuple. */
2688 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002689 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002691 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002693 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002694 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
2696 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002697 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return NULL;
2699
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002700 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2701 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702}
2703
2704static excepthandler_ty
2705ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2706{
2707 /* except_clause: 'except' [test [',' test]] */
2708 REQ(exc, except_clause);
2709 REQ(body, suite);
2710
2711 if (NCH(exc) == 1) {
2712 asdl_seq *suite_seq = ast_for_suite(c, body);
2713 if (!suite_seq)
2714 return NULL;
2715
Thomas Wouters89f507f2006-12-13 04:49:30 +00002716 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002717 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 }
2719 else if (NCH(exc) == 2) {
2720 expr_ty expression;
2721 asdl_seq *suite_seq;
2722
2723 expression = ast_for_expr(c, CHILD(exc, 1));
2724 if (!expression)
2725 return NULL;
2726 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002727 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return NULL;
2729
Thomas Wouters89f507f2006-12-13 04:49:30 +00002730 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002731 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 }
2733 else if (NCH(exc) == 4) {
2734 asdl_seq *suite_seq;
2735 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002736 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002737 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002740 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 return NULL;
2742 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002743 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 return NULL;
2745
Thomas Wouters89f507f2006-12-13 04:49:30 +00002746 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002747 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002749
2750 PyErr_Format(PyExc_SystemError,
2751 "wrong number of children for 'except' clause: %d",
2752 NCH(exc));
2753 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754}
2755
2756static stmt_ty
2757ast_for_try_stmt(struct compiling *c, const node *n)
2758{
Neal Norwitzf599f422005-12-17 21:33:47 +00002759 const int nch = NCH(n);
2760 int n_except = (nch - 3)/3;
2761 asdl_seq *body, *orelse = NULL, *finally = NULL;
2762
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 REQ(n, try_stmt);
2764
Neal Norwitzf599f422005-12-17 21:33:47 +00002765 body = ast_for_suite(c, CHILD(n, 2));
2766 if (body == NULL)
2767 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768
Neal Norwitzf599f422005-12-17 21:33:47 +00002769 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2770 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2771 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2772 /* we can assume it's an "else",
2773 because nch >= 9 for try-else-finally and
2774 it would otherwise have a type of except_clause */
2775 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2776 if (orelse == NULL)
2777 return NULL;
2778 n_except--;
2779 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780
Neal Norwitzf599f422005-12-17 21:33:47 +00002781 finally = ast_for_suite(c, CHILD(n, nch - 1));
2782 if (finally == NULL)
2783 return NULL;
2784 n_except--;
2785 }
2786 else {
2787 /* we can assume it's an "else",
2788 otherwise it would have a type of except_clause */
2789 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2790 if (orelse == NULL)
2791 return NULL;
2792 n_except--;
2793 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002795 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002796 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 return NULL;
2798 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002799
2800 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002801 int i;
2802 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002803 /* process except statements to create a try ... except */
2804 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2805 if (handlers == NULL)
2806 return NULL;
2807
2808 for (i = 0; i < n_except; i++) {
2809 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2810 CHILD(n, 5 + i * 3));
2811 if (!e)
2812 return NULL;
2813 asdl_seq_SET(handlers, i, e);
2814 }
2815
Thomas Wouters89f507f2006-12-13 04:49:30 +00002816 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002817 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002818 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002819 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002820
2821 /* if a 'finally' is present too, we nest the TryExcept within a
2822 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002823 body = asdl_seq_new(1, c->c_arena);
2824 if (body == NULL)
2825 return NULL;
2826 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002827 }
2828
2829 /* must be a try ... finally (except clauses are in body, if any exist) */
2830 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002831 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832}
2833
Guido van Rossumc2e20742006-02-27 22:32:47 +00002834static expr_ty
2835ast_for_with_var(struct compiling *c, const node *n)
2836{
2837 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002838 return ast_for_expr(c, CHILD(n, 1));
2839}
2840
2841/* with_stmt: 'with' test [ with_var ] ':' suite */
2842static stmt_ty
2843ast_for_with_stmt(struct compiling *c, const node *n)
2844{
2845 expr_ty context_expr, optional_vars = NULL;
2846 int suite_index = 3; /* skip 'with', test, and ':' */
2847 asdl_seq *suite_seq;
2848
2849 assert(TYPE(n) == with_stmt);
2850 context_expr = ast_for_expr(c, CHILD(n, 1));
2851 if (TYPE(CHILD(n, 2)) == with_var) {
2852 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2853
2854 if (!optional_vars) {
2855 return NULL;
2856 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002857 if (!set_context(optional_vars, Store, n)) {
2858 return NULL;
2859 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002860 suite_index = 4;
2861 }
2862
2863 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2864 if (!suite_seq) {
2865 return NULL;
2866 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002867 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002868 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002869}
2870
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871static stmt_ty
2872ast_for_classdef(struct compiling *c, const node *n)
2873{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002874 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2875 asdl_seq *s;
2876 expr_ty call, dummy;
2877
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 REQ(n, classdef);
2879
2880 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002881 ast_error(n, "assignment to None");
2882 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 }
2884
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002885 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 s = ast_for_suite(c, CHILD(n, 3));
2887 if (!s)
2888 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002889 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2890 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002892
2893 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002894 s = ast_for_suite(c, CHILD(n,5));
2895 if (!s)
2896 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002897 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2898 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 }
2900
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002901 /* class NAME '(' arglist ')' ':' suite */
2902 /* build up a fake Call node so we can extract its pieces */
2903 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2904 call = ast_for_call(c, CHILD(n, 3), dummy);
2905 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002908 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002910
2911 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2912 call->v.Call.args, call->v.Call.keywords,
2913 call->v.Call.starargs, call->v.Call.kwargs, s,
2914 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915}
2916
2917static stmt_ty
2918ast_for_stmt(struct compiling *c, const node *n)
2919{
2920 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 assert(NCH(n) == 1);
2922 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 }
2924 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002925 assert(num_stmts(n) == 1);
2926 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 }
2928 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002929 REQ(n, small_stmt);
2930 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002931 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2932 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002933 */
2934 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935 case expr_stmt:
2936 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 case del_stmt:
2938 return ast_for_del_stmt(c, n);
2939 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002940 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 case flow_stmt:
2942 return ast_for_flow_stmt(c, n);
2943 case import_stmt:
2944 return ast_for_import_stmt(c, n);
2945 case global_stmt:
2946 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002947 case nonlocal_stmt:
2948 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 case assert_stmt:
2950 return ast_for_assert_stmt(c, n);
2951 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002952 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2954 TYPE(n), NCH(n));
2955 return NULL;
2956 }
2957 }
2958 else {
2959 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 | funcdef | classdef
2961 */
2962 node *ch = CHILD(n, 0);
2963 REQ(n, compound_stmt);
2964 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 case if_stmt:
2966 return ast_for_if_stmt(c, ch);
2967 case while_stmt:
2968 return ast_for_while_stmt(c, ch);
2969 case for_stmt:
2970 return ast_for_for_stmt(c, ch);
2971 case try_stmt:
2972 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973 case with_stmt:
2974 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 case funcdef:
2976 return ast_for_funcdef(c, ch);
2977 case classdef:
2978 return ast_for_classdef(c, ch);
2979 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002980 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2982 TYPE(n), NCH(n));
2983 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 }
2986}
2987
2988static PyObject *
2989parsenumber(const char *s)
2990{
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 const char *end;
2992 long x;
2993 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002994#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00002995 Py_complex c;
2996 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997#endif
2998
Thomas Wouters89f507f2006-12-13 04:49:30 +00002999 errno = 0;
3000 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003002 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003004 if (*end == 'l' || *end == 'L')
3005 return PyLong_FromString((char *)s, (char **)0, 0);
3006 if (s[0] == '0') {
3007 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3008 if (x < 0 && errno == 0) {
3009 return PyLong_FromString((char *)s,
3010 (char **)0,
3011 0);
3012 }
3013 }
3014 else
3015 x = PyOS_strtol((char *)s, (char **)&end, 0);
3016 if (*end == '\0') {
3017 if (errno != 0)
3018 return PyLong_FromString((char *)s, (char **)0, 0);
3019 return PyInt_FromLong(x);
3020 }
3021 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003023 if (imflag) {
3024 c.real = 0.;
3025 PyFPE_START_PROTECT("atof", return 0)
3026 c.imag = PyOS_ascii_atof(s);
3027 PyFPE_END_PROTECT(c)
3028 return PyComplex_FromCComplex(c);
3029 }
3030 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003032 {
3033 PyFPE_START_PROTECT("atof", return 0)
3034 dx = PyOS_ascii_atof(s);
3035 PyFPE_END_PROTECT(dx)
3036 return PyFloat_FromDouble(dx);
3037 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038}
3039
3040static PyObject *
3041decode_utf8(const char **sPtr, const char *end, char* encoding)
3042{
3043#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003044 Py_FatalError("decode_utf8 should not be called in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 return NULL;
3046#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003047 PyObject *u, *v;
3048 char *s, *t;
3049 t = s = (char *)*sPtr;
3050 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3051 while (s < end && (*s & 0x80)) s++;
3052 *sPtr = s;
3053 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3054 if (u == NULL)
3055 return NULL;
3056 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3057 Py_DECREF(u);
3058 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059#endif
3060}
3061
3062static PyObject *
3063decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3064{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003065 PyObject *v, *u;
3066 char *buf;
3067 char *p;
3068 const char *end;
3069 if (encoding == NULL) {
3070 buf = (char *)s;
3071 u = NULL;
3072 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3073 buf = (char *)s;
3074 u = NULL;
3075 } else {
3076 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3077 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3078 if (u == NULL)
3079 return NULL;
3080 p = buf = PyString_AsString(u);
3081 end = s + len;
3082 while (s < end) {
3083 if (*s == '\\') {
3084 *p++ = *s++;
3085 if (*s & 0x80) {
3086 strcpy(p, "u005c");
3087 p += 5;
3088 }
3089 }
3090 if (*s & 0x80) { /* XXX inefficient */
3091 PyObject *w;
3092 char *r;
3093 Py_ssize_t rn, i;
3094 w = decode_utf8(&s, end, "utf-16-be");
3095 if (w == NULL) {
3096 Py_DECREF(u);
3097 return NULL;
3098 }
3099 r = PyString_AsString(w);
3100 rn = PyString_Size(w);
3101 assert(rn % 2 == 0);
3102 for (i = 0; i < rn; i += 2) {
3103 sprintf(p, "\\u%02x%02x",
3104 r[i + 0] & 0xFF,
3105 r[i + 1] & 0xFF);
3106 p += 6;
3107 }
3108 Py_DECREF(w);
3109 } else {
3110 *p++ = *s++;
3111 }
3112 }
3113 len = p - buf;
3114 s = buf;
3115 }
3116 if (rawmode)
3117 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3118 else
3119 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3120 Py_XDECREF(u);
3121 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122}
3123
3124/* s is a Python string literal, including the bracketing quote characters,
3125 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3126 * parsestr parses it, and returns the decoded Python string object.
3127 */
3128static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003129parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003131 size_t len;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003132 const char *s = STR(n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003133 int quote = Py_CHARMASK(*s);
3134 int rawmode = 0;
3135 int need_encoding;
3136 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137
Thomas Wouters89f507f2006-12-13 04:49:30 +00003138 if (isalpha(quote) || quote == '_') {
3139 if (quote == 'u' || quote == 'U') {
3140 quote = *++s;
3141 unicode = 1;
3142 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003143 if (quote == 'b' || quote == 'B') {
3144 quote = *++s;
3145 *bytesmode = 1;
3146 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003147 if (quote == 'r' || quote == 'R') {
3148 quote = *++s;
3149 rawmode = 1;
3150 }
3151 }
3152 if (quote != '\'' && quote != '\"') {
3153 PyErr_BadInternalCall();
3154 return NULL;
3155 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003156 if (unicode && *bytesmode) {
3157 ast_error(n, "string cannot be both bytes and unicode");
3158 return NULL;
3159 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003160 s++;
3161 len = strlen(s);
3162 if (len > INT_MAX) {
3163 PyErr_SetString(PyExc_OverflowError,
3164 "string to parse is too long");
3165 return NULL;
3166 }
3167 if (s[--len] != quote) {
3168 PyErr_BadInternalCall();
3169 return NULL;
3170 }
3171 if (len >= 4 && s[0] == quote && s[1] == quote) {
3172 s += 2;
3173 len -= 2;
3174 if (s[--len] != quote || s[--len] != quote) {
3175 PyErr_BadInternalCall();
3176 return NULL;
3177 }
3178 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003180 if (unicode || Py_UnicodeFlag) {
3181 return decode_unicode(s, len, rawmode, encoding);
3182 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183#endif
Thomas Wouters00e41de2007-02-23 19:56:57 +00003184 if (*bytesmode) {
3185 /* Disallow non-ascii characters (but not escapes) */
3186 const char *c;
3187 for (c = s; *c; c++) {
3188 if (Py_CHARMASK(*c) >= 0x80) {
3189 ast_error(n, "bytes can only contain ASCII "
3190 "literal characters.");
3191 return NULL;
3192 }
3193 }
3194 }
3195 need_encoding = (!*bytesmode && encoding != NULL &&
Thomas Wouters89f507f2006-12-13 04:49:30 +00003196 strcmp(encoding, "utf-8") != 0 &&
3197 strcmp(encoding, "iso-8859-1") != 0);
3198 if (rawmode || strchr(s, '\\') == NULL) {
3199 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003201 /* This should not happen - we never see any other
3202 encoding. */
3203 Py_FatalError(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003204 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003206 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3207 if (u == NULL)
3208 return NULL;
3209 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3210 Py_DECREF(u);
3211 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003213 } else {
3214 return PyString_FromStringAndSize(s, len);
3215 }
3216 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 return PyString_DecodeEscape(s, len, NULL, unicode,
3219 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220}
3221
3222/* Build a Python string object out of a STRING atom. This takes care of
3223 * compile-time literal catenation, calling parsestr() on each piece, and
3224 * pasting the intermediate results together.
3225 */
3226static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003227parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003229 PyObject *v;
3230 int i;
3231 REQ(CHILD(n, 0), STRING);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003232 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3233 if (v != NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003234 /* String literal concatenation */
3235 for (i = 1; i < NCH(n); i++) {
3236 PyObject *s;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003237 int subbm = 0;
3238 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003239 if (s == NULL)
3240 goto onError;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003241 if (*bytesmode != subbm) {
3242 ast_error(n, "cannot mix bytes and nonbytes"
3243 "literals");
3244 goto onError;
3245 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003246 if (PyString_Check(v) && PyString_Check(s)) {
3247 PyString_ConcatAndDel(&v, s);
3248 if (v == NULL)
3249 goto onError;
3250 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003252 else {
3253 PyObject *temp = PyUnicode_Concat(v, s);
3254 Py_DECREF(s);
3255 Py_DECREF(v);
3256 v = temp;
3257 if (v == NULL)
3258 goto onError;
3259 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003260#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003261 }
3262 }
3263 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264
3265 onError:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003266 Py_XDECREF(v);
3267 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268}