blob: 262ade3127aa0e9995eb758b31f4c2961866c6e7 [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
986 if (NCH(n) == 6) { /* 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 Rossum86e58e22006-08-28 15:27:34 +00001328 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001329 asdl_seq *elts = asdl_seq_new(size, c->c_arena);
1330 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001331 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001332 for (i = 0; i < NCH(ch); i += 2) {
1333 expr_ty expression;
1334 expression = ast_for_expr(c, CHILD(ch, i));
1335 if (!expression)
1336 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001337 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001338 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001339 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1340 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1341 /* it's a set comprehension */
1342 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001343 } else {
1344 /* it's a dict */
1345 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1346 keys = asdl_seq_new(size, c->c_arena);
1347 if (!keys)
1348 return NULL;
1349
1350 values = asdl_seq_new(size, c->c_arena);
1351 if (!values)
1352 return NULL;
1353
1354 for (i = 0; i < NCH(ch); i += 4) {
1355 expr_ty expression;
1356
1357 expression = ast_for_expr(c, CHILD(ch, i));
1358 if (!expression)
1359 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001360
Guido van Rossum86e58e22006-08-28 15:27:34 +00001361 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001362
Guido van Rossum86e58e22006-08-28 15:27:34 +00001363 expression = ast_for_expr(c, CHILD(ch, i + 2));
1364 if (!expression)
1365 return NULL;
1366
1367 asdl_seq_SET(values, i / 4, expression);
1368 }
1369 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1370 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001371 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001373 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1374 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375 }
1376}
1377
1378static slice_ty
1379ast_for_slice(struct compiling *c, const node *n)
1380{
1381 node *ch;
1382 expr_ty lower = NULL, upper = NULL, step = NULL;
1383
1384 REQ(n, subscript);
1385
1386 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001387 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388 sliceop: ':' [test]
1389 */
1390 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391 if (NCH(n) == 1 && TYPE(ch) == test) {
1392 /* 'step' variable hold no significance in terms of being used over
1393 other vars */
1394 step = ast_for_expr(c, ch);
1395 if (!step)
1396 return NULL;
1397
Thomas Wouters89f507f2006-12-13 04:49:30 +00001398 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 }
1400
1401 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001402 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403 if (!lower)
1404 return NULL;
1405 }
1406
1407 /* If there's an upper bound it's in the second or third position. */
1408 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001409 if (NCH(n) > 1) {
1410 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411
Thomas Wouters89f507f2006-12-13 04:49:30 +00001412 if (TYPE(n2) == test) {
1413 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414 if (!upper)
1415 return NULL;
1416 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001417 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001419 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420
Thomas Wouters89f507f2006-12-13 04:49:30 +00001421 if (TYPE(n2) == test) {
1422 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423 if (!upper)
1424 return NULL;
1425 }
1426 }
1427
1428 ch = CHILD(n, NCH(n) - 1);
1429 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001430 if (NCH(ch) == 1) {
1431 /* No expression, so step is None */
1432 ch = CHILD(ch, 0);
1433 step = Name(new_identifier("None", c->c_arena), Load,
1434 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 if (!step)
1436 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001437 } else {
1438 ch = CHILD(ch, 1);
1439 if (TYPE(ch) == test) {
1440 step = ast_for_expr(c, ch);
1441 if (!step)
1442 return NULL;
1443 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444 }
1445 }
1446
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001447 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448}
1449
1450static expr_ty
1451ast_for_binop(struct compiling *c, const node *n)
1452{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001453 /* Must account for a sequence of expressions.
1454 How should A op B op C by represented?
1455 BinOp(BinOp(A, op, B), op, C).
1456 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457
Thomas Wouters89f507f2006-12-13 04:49:30 +00001458 int i, nops;
1459 expr_ty expr1, expr2, result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001460 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461
1462 expr1 = ast_for_expr(c, CHILD(n, 0));
1463 if (!expr1)
1464 return NULL;
1465
1466 expr2 = ast_for_expr(c, CHILD(n, 2));
1467 if (!expr2)
1468 return NULL;
1469
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001470 newoperator = get_operator(CHILD(n, 1));
1471 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 return NULL;
1473
Thomas Wouters89f507f2006-12-13 04:49:30 +00001474 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001475 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001476 if (!result)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 return NULL;
1478
Thomas Wouters89f507f2006-12-13 04:49:30 +00001479 nops = (NCH(n) - 1) / 2;
1480 for (i = 1; i < nops; i++) {
1481 expr_ty tmp_result, tmp;
1482 const node* next_oper = CHILD(n, i * 2 + 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001485 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486 return NULL;
1487
1488 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1489 if (!tmp)
1490 return NULL;
1491
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001492 tmp_result = BinOp(result, newoperator, tmp,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001493 LINENO(next_oper), next_oper->n_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001494 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 if (!tmp)
1496 return NULL;
1497 result = tmp_result;
1498 }
1499 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500}
1501
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001502static expr_ty
1503ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1504{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001505 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1506 subscriptlist: subscript (',' subscript)* [',']
1507 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1508 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001509 REQ(n, trailer);
1510 if (TYPE(CHILD(n, 0)) == LPAR) {
1511 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001512 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1513 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001514 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001515 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001516 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001517 else if (TYPE(CHILD(n, 0)) == DOT ) {
1518 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001519 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001520 }
1521 else {
1522 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001523 REQ(CHILD(n, 2), RSQB);
1524 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001525 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001526 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1527 if (!slc)
1528 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001529 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1530 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001531 }
1532 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001533 /* The grammar is ambiguous here. The ambiguity is resolved
1534 by treating the sequence as a tuple literal if there are
1535 no slice features.
1536 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001537 int j;
1538 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001539 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001540 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001541 asdl_seq *slices, *elts;
1542 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001543 if (!slices)
1544 return NULL;
1545 for (j = 0; j < NCH(n); j += 2) {
1546 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001547 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001548 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001549 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001550 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001551 asdl_seq_SET(slices, j / 2, slc);
1552 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001553 if (!simple) {
1554 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001555 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001556 }
1557 /* extract Index values and put them in a Tuple */
1558 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001559 if (!elts)
1560 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001561 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1562 slc = (slice_ty)asdl_seq_GET(slices, j);
1563 assert(slc->kind == Index_kind && slc->v.Index.value);
1564 asdl_seq_SET(elts, j, slc->v.Index.value);
1565 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001566 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001567 if (!e)
1568 return NULL;
1569 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001570 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001571 }
1572 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001573}
1574
1575static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001576ast_for_factor(struct compiling *c, const node *n)
1577{
1578 node *pfactor, *ppower, *patom, *pnum;
1579 expr_ty expression;
1580
1581 /* If the unary - operator is applied to a constant, don't generate
1582 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1583 constant. The peephole optimizer already does something like
1584 this but it doesn't handle the case where the constant is
1585 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1586 PyLongObject.
1587 */
1588 if (TYPE(CHILD(n, 0)) == MINUS
1589 && NCH(n) == 2
1590 && TYPE((pfactor = CHILD(n, 1))) == factor
1591 && NCH(pfactor) == 1
1592 && TYPE((ppower = CHILD(pfactor, 0))) == power
1593 && NCH(ppower) == 1
1594 && TYPE((patom = CHILD(ppower, 0))) == atom
1595 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1596 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1597 if (s == NULL)
1598 return NULL;
1599 s[0] = '-';
1600 strcpy(s + 1, STR(pnum));
1601 PyObject_FREE(STR(pnum));
1602 STR(pnum) = s;
1603 return ast_for_atom(c, patom);
1604 }
1605
1606 expression = ast_for_expr(c, CHILD(n, 1));
1607 if (!expression)
1608 return NULL;
1609
1610 switch (TYPE(CHILD(n, 0))) {
1611 case PLUS:
1612 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1613 c->c_arena);
1614 case MINUS:
1615 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1616 c->c_arena);
1617 case TILDE:
1618 return UnaryOp(Invert, expression, LINENO(n),
1619 n->n_col_offset, c->c_arena);
1620 }
1621 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1622 TYPE(CHILD(n, 0)));
1623 return NULL;
1624}
1625
1626static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001627ast_for_power(struct compiling *c, const node *n)
1628{
1629 /* power: atom trailer* ('**' factor)*
1630 */
1631 int i;
1632 expr_ty e, tmp;
1633 REQ(n, power);
1634 e = ast_for_atom(c, CHILD(n, 0));
1635 if (!e)
1636 return NULL;
1637 if (NCH(n) == 1)
1638 return e;
1639 for (i = 1; i < NCH(n); i++) {
1640 node *ch = CHILD(n, i);
1641 if (TYPE(ch) != trailer)
1642 break;
1643 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001644 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001645 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001646 tmp->lineno = e->lineno;
1647 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001648 e = tmp;
1649 }
1650 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1651 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001652 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001653 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001654 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001655 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001656 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001657 e = tmp;
1658 }
1659 return e;
1660}
1661
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001662/* Do not name a variable 'expr'! Will cause a compile error.
1663*/
1664
1665static expr_ty
1666ast_for_expr(struct compiling *c, const node *n)
1667{
1668 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001669 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001670 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001671 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672 and_test: not_test ('and' not_test)*
1673 not_test: 'not' not_test | comparison
1674 comparison: expr (comp_op expr)*
1675 expr: xor_expr ('|' xor_expr)*
1676 xor_expr: and_expr ('^' and_expr)*
1677 and_expr: shift_expr ('&' shift_expr)*
1678 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1679 arith_expr: term (('+'|'-') term)*
1680 term: factor (('*'|'/'|'%'|'//') factor)*
1681 factor: ('+'|'-'|'~') factor | power
1682 power: atom trailer* ('**' factor)*
1683 */
1684
1685 asdl_seq *seq;
1686 int i;
1687
1688 loop:
1689 switch (TYPE(n)) {
1690 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001691 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001692 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001693 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001695 else if (NCH(n) > 1)
1696 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001697 /* Fallthrough */
1698 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 case and_test:
1700 if (NCH(n) == 1) {
1701 n = CHILD(n, 0);
1702 goto loop;
1703 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705 if (!seq)
1706 return NULL;
1707 for (i = 0; i < NCH(n); i += 2) {
1708 expr_ty e = ast_for_expr(c, CHILD(n, i));
1709 if (!e)
1710 return NULL;
1711 asdl_seq_SET(seq, i / 2, e);
1712 }
1713 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001714 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1715 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001716 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001717 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 case not_test:
1719 if (NCH(n) == 1) {
1720 n = CHILD(n, 0);
1721 goto loop;
1722 }
1723 else {
1724 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1725 if (!expression)
1726 return NULL;
1727
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001728 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1729 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 }
1731 case comparison:
1732 if (NCH(n) == 1) {
1733 n = CHILD(n, 0);
1734 goto loop;
1735 }
1736 else {
1737 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001738 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001739 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001740 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 if (!ops)
1742 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001743 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001744 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 return NULL;
1746 }
1747 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001748 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001750 newoperator = ast_for_comp_op(CHILD(n, i));
1751 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001753 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754
1755 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001756 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001758 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001760 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761 asdl_seq_SET(cmps, i / 2, expression);
1762 }
1763 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001764 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001765 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001766 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001767
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001768 return Compare(expression, ops, cmps, LINENO(n),
1769 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770 }
1771 break;
1772
1773 /* The next five cases all handle BinOps. The main body of code
1774 is the same in each case, but the switch turned inside out to
1775 reuse the code for each type of operator.
1776 */
1777 case expr:
1778 case xor_expr:
1779 case and_expr:
1780 case shift_expr:
1781 case arith_expr:
1782 case term:
1783 if (NCH(n) == 1) {
1784 n = CHILD(n, 0);
1785 goto loop;
1786 }
1787 return ast_for_binop(c, n);
1788 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001789 expr_ty exp = NULL;
1790 if (NCH(n) == 2) {
1791 exp = ast_for_testlist(c, CHILD(n, 1));
1792 if (!exp)
1793 return NULL;
1794 }
1795 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1796 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001797 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798 if (NCH(n) == 1) {
1799 n = CHILD(n, 0);
1800 goto loop;
1801 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001802 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001803 case power:
1804 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001806 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 return NULL;
1808 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001809 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 return NULL;
1811}
1812
1813static expr_ty
1814ast_for_call(struct compiling *c, const node *n, expr_ty func)
1815{
1816 /*
1817 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1818 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001819 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 */
1821
1822 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001823 asdl_seq *args;
1824 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 expr_ty vararg = NULL, kwarg = NULL;
1826
1827 REQ(n, arglist);
1828
1829 nargs = 0;
1830 nkeywords = 0;
1831 ngens = 0;
1832 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001833 node *ch = CHILD(n, i);
1834 if (TYPE(ch) == argument) {
1835 if (NCH(ch) == 1)
1836 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001837 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001838 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001840 nkeywords++;
1841 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 }
1843 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001844 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001845 "if not sole argument");
1846 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 }
1848
1849 if (nargs + nkeywords + ngens > 255) {
1850 ast_error(n, "more than 255 arguments");
1851 return NULL;
1852 }
1853
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001854 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001856 return NULL;
1857 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001859 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 nargs = 0;
1861 nkeywords = 0;
1862 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 node *ch = CHILD(n, i);
1864 if (TYPE(ch) == argument) {
1865 expr_ty e;
1866 if (NCH(ch) == 1) {
1867 if (nkeywords) {
1868 ast_error(CHILD(ch, 0),
1869 "non-keyword arg after keyword arg");
1870 return NULL;
1871 }
1872 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001874 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 asdl_seq_SET(args, nargs++, e);
1876 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001877 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001880 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 else {
1884 keyword_ty kw;
1885 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886
Thomas Wouters89f507f2006-12-13 04:49:30 +00001887 /* CHILD(ch, 0) is test, but must be an identifier? */
1888 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001890 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891 /* f(lambda x: x[0] = 3) ends up getting parsed with
1892 * LHS test = lambda x: x[0], and RHS test = 3.
1893 * SF bug 132313 points out that complaining about a keyword
1894 * then is very confusing.
1895 */
1896 if (e->kind == Lambda_kind) {
1897 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001898 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899 } else if (e->kind != Name_kind) {
1900 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001901 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001903 key = e->v.Name.id;
1904 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001906 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001909 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001910 asdl_seq_SET(keywords, nkeywords++, kw);
1911 }
1912 }
1913 else if (TYPE(ch) == STAR) {
1914 vararg = ast_for_expr(c, CHILD(n, i+1));
1915 i++;
1916 }
1917 else if (TYPE(ch) == DOUBLESTAR) {
1918 kwarg = ast_for_expr(c, CHILD(n, i+1));
1919 i++;
1920 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 }
1922
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001923 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924}
1925
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001926static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001927ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001929 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001930 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001931 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001933 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001934 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001935 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001936 }
1937 else {
1938 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001939 TYPE(n) == testlist1);
1940 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 else {
1944 asdl_seq *tmp = seq_for_testlist(c, n);
1945 if (!tmp)
1946 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001947 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001949}
1950
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951static stmt_ty
1952ast_for_expr_stmt(struct compiling *c, const node *n)
1953{
1954 REQ(n, expr_stmt);
1955 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1956 | ('=' (yield_expr|testlist))*)
1957 testlist: test (',' test)* [',']
1958 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001959 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 test: ... here starts the operator precendence dance
1961 */
1962
1963 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001964 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 if (!e)
1966 return NULL;
1967
Thomas Wouters89f507f2006-12-13 04:49:30 +00001968 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 }
1970 else if (TYPE(CHILD(n, 1)) == augassign) {
1971 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001972 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001973 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974
Thomas Wouters89f507f2006-12-13 04:49:30 +00001975 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976 if (!expr1)
1977 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001978 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001979 switch (expr1->kind) {
1980 case GeneratorExp_kind:
1981 ast_error(ch, "augmented assignment to generator "
1982 "expression not possible");
1983 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001984 case Yield_kind:
1985 ast_error(ch, "augmented assignment to yield "
1986 "expression not possible");
1987 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001988 case Name_kind: {
1989 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1990 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1991 ast_error(ch, "assignment to None");
1992 return NULL;
1993 }
1994 break;
1995 }
1996 case Attribute_kind:
1997 case Subscript_kind:
1998 break;
1999 default:
2000 ast_error(ch, "illegal expression for augmented "
2001 "assignment");
2002 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002004 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 ch = CHILD(n, 2);
2007 if (TYPE(ch) == testlist)
2008 expr2 = ast_for_testlist(c, ch);
2009 else
2010 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002011 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 return NULL;
2013
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002014 newoperator = ast_for_augassign(CHILD(n, 1));
2015 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 return NULL;
2017
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 }
2020 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 int i;
2022 asdl_seq *targets;
2023 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 expr_ty expression;
2025
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 /* a normal assignment */
2027 REQ(CHILD(n, 1), EQUAL);
2028 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2029 if (!targets)
2030 return NULL;
2031 for (i = 0; i < NCH(n) - 2; i += 2) {
2032 expr_ty e;
2033 node *ch = CHILD(n, i);
2034 if (TYPE(ch) == yield_expr) {
2035 ast_error(ch, "assignment to yield expression not possible");
2036 return NULL;
2037 }
2038 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039
Thomas Wouters89f507f2006-12-13 04:49:30 +00002040 /* set context to assign */
2041 if (!e)
2042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 if (!set_context(e, Store, CHILD(n, i)))
2045 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 asdl_seq_SET(targets, i / 2, e);
2048 }
2049 value = CHILD(n, NCH(n) - 1);
2050 if (TYPE(value) == testlist)
2051 expression = ast_for_testlist(c, value);
2052 else
2053 expression = ast_for_expr(c, value);
2054 if (!expression)
2055 return NULL;
2056 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058}
2059
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002061ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062{
2063 asdl_seq *seq;
2064 int i;
2065 expr_ty e;
2066
2067 REQ(n, exprlist);
2068
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002069 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002073 e = ast_for_expr(c, CHILD(n, i));
2074 if (!e)
2075 return NULL;
2076 asdl_seq_SET(seq, i / 2, e);
2077 if (context && !set_context(e, context, CHILD(n, i)))
2078 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 }
2080 return seq;
2081}
2082
2083static stmt_ty
2084ast_for_del_stmt(struct compiling *c, const node *n)
2085{
2086 asdl_seq *expr_list;
2087
2088 /* del_stmt: 'del' exprlist */
2089 REQ(n, del_stmt);
2090
2091 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2092 if (!expr_list)
2093 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002094 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095}
2096
2097static stmt_ty
2098ast_for_flow_stmt(struct compiling *c, const node *n)
2099{
2100 /*
2101 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2102 | yield_stmt
2103 break_stmt: 'break'
2104 continue_stmt: 'continue'
2105 return_stmt: 'return' [testlist]
2106 yield_stmt: yield_expr
2107 yield_expr: 'yield' testlist
2108 raise_stmt: 'raise' [test [',' test [',' test]]]
2109 */
2110 node *ch;
2111
2112 REQ(n, flow_stmt);
2113 ch = CHILD(n, 0);
2114 switch (TYPE(ch)) {
2115 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002116 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002118 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002120 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2121 if (!exp)
2122 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002123 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124 }
2125 case return_stmt:
2126 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002127 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002129 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130 if (!expression)
2131 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002132 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 }
2134 case raise_stmt:
2135 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002136 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 else if (NCH(ch) == 2) {
2138 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2139 if (!expression)
2140 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002141 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 }
2143 else if (NCH(ch) == 4) {
2144 expr_ty expr1, expr2;
2145
2146 expr1 = ast_for_expr(c, CHILD(ch, 1));
2147 if (!expr1)
2148 return NULL;
2149 expr2 = ast_for_expr(c, CHILD(ch, 3));
2150 if (!expr2)
2151 return NULL;
2152
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002153 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 }
2155 else if (NCH(ch) == 6) {
2156 expr_ty expr1, expr2, expr3;
2157
2158 expr1 = ast_for_expr(c, CHILD(ch, 1));
2159 if (!expr1)
2160 return NULL;
2161 expr2 = ast_for_expr(c, CHILD(ch, 3));
2162 if (!expr2)
2163 return NULL;
2164 expr3 = ast_for_expr(c, CHILD(ch, 5));
2165 if (!expr3)
2166 return NULL;
2167
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002168 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 }
2170 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002171 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 "unexpected flow_stmt: %d", TYPE(ch));
2173 return NULL;
2174 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002175
2176 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2177 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178}
2179
2180static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002181alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182{
2183 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002184 import_as_name: NAME ['as' NAME]
2185 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 dotted_name: NAME ('.' NAME)*
2187 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002188 PyObject *str;
2189
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 loop:
2191 switch (TYPE(n)) {
2192 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002193 str = NULL;
2194 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002195 str = NEW_IDENTIFIER(CHILD(n, 2));
2196 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002197 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 case dotted_as_name:
2199 if (NCH(n) == 1) {
2200 n = CHILD(n, 0);
2201 goto loop;
2202 }
2203 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002204 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002205 if (!a)
2206 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 assert(!a->asname);
2208 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2209 return a;
2210 }
2211 break;
2212 case dotted_name:
2213 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002214 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215 else {
2216 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002217 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002218 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 char *s;
2220
2221 len = 0;
2222 for (i = 0; i < NCH(n); i += 2)
2223 /* length of string plus one for the dot */
2224 len += strlen(STR(CHILD(n, i))) + 1;
2225 len--; /* the last name doesn't have a dot */
2226 str = PyString_FromStringAndSize(NULL, len);
2227 if (!str)
2228 return NULL;
2229 s = PyString_AS_STRING(str);
2230 if (!s)
2231 return NULL;
2232 for (i = 0; i < NCH(n); i += 2) {
2233 char *sch = STR(CHILD(n, i));
2234 strcpy(s, STR(CHILD(n, i)));
2235 s += strlen(sch);
2236 *s++ = '.';
2237 }
2238 --s;
2239 *s = '\0';
2240 PyString_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002241 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002242 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 }
2244 break;
2245 case STAR:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002246 str = PyString_InternFromString("*");
2247 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002248 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002250 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 "unexpected import name: %d", TYPE(n));
2252 return NULL;
2253 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002254
2255 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 return NULL;
2257}
2258
2259static stmt_ty
2260ast_for_import_stmt(struct compiling *c, const node *n)
2261{
2262 /*
2263 import_stmt: import_name | import_from
2264 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002265 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2266 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002268 int lineno;
2269 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 int i;
2271 asdl_seq *aliases;
2272
2273 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002274 lineno = LINENO(n);
2275 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002277 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002279 REQ(n, dotted_as_names);
2280 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2281 if (!aliases)
2282 return NULL;
2283 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002284 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002285 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002287 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002289 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002291 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002293 int idx, ndots = 0;
2294 alias_ty mod = NULL;
2295 identifier modname;
2296
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002297 /* Count the number of dots (for relative imports) and check for the
2298 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002299 for (idx = 1; idx < NCH(n); idx++) {
2300 if (TYPE(CHILD(n, idx)) == dotted_name) {
2301 mod = alias_for_import_name(c, CHILD(n, idx));
2302 idx++;
2303 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002304 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2305 /* three consecutive dots are tokenized as one ELLIPSIS */
2306 ndots += 3;
2307 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002308 } else if (TYPE(CHILD(n, idx)) != DOT) {
2309 break;
2310 }
2311 ndots++;
2312 }
2313 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002314 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002315 case STAR:
2316 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002317 n = CHILD(n, idx);
2318 n_children = 1;
2319 if (ndots) {
2320 ast_error(n, "'import *' not allowed with 'from .'");
2321 return NULL;
2322 }
2323 break;
2324 case LPAR:
2325 /* from ... import (x, y, z) */
2326 n = CHILD(n, idx + 1);
2327 n_children = NCH(n);
2328 break;
2329 case import_as_names:
2330 /* from ... import x, y, z */
2331 n = CHILD(n, idx);
2332 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002333 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 ast_error(n, "trailing comma not allowed without"
2335 " surrounding parentheses");
2336 return NULL;
2337 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 break;
2339 default:
2340 ast_error(n, "Unexpected node-type in from-import");
2341 return NULL;
2342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343
Thomas Wouters89f507f2006-12-13 04:49:30 +00002344 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2345 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347
2348 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002349 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002350 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002351 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002353 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002355 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002356 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002357 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2358 if (!import_alias)
2359 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002360 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002361 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002363 if (mod != NULL)
2364 modname = mod->name;
2365 else
2366 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002367 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002368 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 }
Neal Norwitz79792652005-11-14 04:25:03 +00002370 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 "unknown import statement: starts with command '%s'",
2372 STR(CHILD(n, 0)));
2373 return NULL;
2374}
2375
2376static stmt_ty
2377ast_for_global_stmt(struct compiling *c, const node *n)
2378{
2379 /* global_stmt: 'global' NAME (',' NAME)* */
2380 identifier name;
2381 asdl_seq *s;
2382 int i;
2383
2384 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002385 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002389 name = NEW_IDENTIFIER(CHILD(n, i));
2390 if (!name)
2391 return NULL;
2392 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002394 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395}
2396
2397static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002398ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2399{
2400 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2401 identifier name;
2402 asdl_seq *s;
2403 int i;
2404
2405 REQ(n, nonlocal_stmt);
2406 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2407 if (!s)
2408 return NULL;
2409 for (i = 1; i < NCH(n); i += 2) {
2410 name = NEW_IDENTIFIER(CHILD(n, i));
2411 if (!name)
2412 return NULL;
2413 asdl_seq_SET(s, i / 2, name);
2414 }
2415 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2416}
2417
2418static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419ast_for_assert_stmt(struct compiling *c, const node *n)
2420{
2421 /* assert_stmt: 'assert' test [',' test] */
2422 REQ(n, assert_stmt);
2423 if (NCH(n) == 2) {
2424 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2425 if (!expression)
2426 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 }
2429 else if (NCH(n) == 4) {
2430 expr_ty expr1, expr2;
2431
2432 expr1 = ast_for_expr(c, CHILD(n, 1));
2433 if (!expr1)
2434 return NULL;
2435 expr2 = ast_for_expr(c, CHILD(n, 3));
2436 if (!expr2)
2437 return NULL;
2438
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 }
Neal Norwitz79792652005-11-14 04:25:03 +00002441 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 "improper number of parts to 'assert' statement: %d",
2443 NCH(n));
2444 return NULL;
2445}
2446
2447static asdl_seq *
2448ast_for_suite(struct compiling *c, const node *n)
2449{
2450 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002451 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 stmt_ty s;
2453 int i, total, num, end, pos = 0;
2454 node *ch;
2455
2456 REQ(n, suite);
2457
2458 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002459 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002461 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 n = CHILD(n, 0);
2464 /* simple_stmt always ends with a NEWLINE,
2465 and may have a trailing SEMI
2466 */
2467 end = NCH(n) - 1;
2468 if (TYPE(CHILD(n, end - 1)) == SEMI)
2469 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 for (i = 0; i < end; i += 2) {
2472 ch = CHILD(n, i);
2473 s = ast_for_stmt(c, ch);
2474 if (!s)
2475 return NULL;
2476 asdl_seq_SET(seq, pos++, s);
2477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 }
2479 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 for (i = 2; i < (NCH(n) - 1); i++) {
2481 ch = CHILD(n, i);
2482 REQ(ch, stmt);
2483 num = num_stmts(ch);
2484 if (num == 1) {
2485 /* small_stmt or compound_stmt with only one child */
2486 s = ast_for_stmt(c, ch);
2487 if (!s)
2488 return NULL;
2489 asdl_seq_SET(seq, pos++, s);
2490 }
2491 else {
2492 int j;
2493 ch = CHILD(ch, 0);
2494 REQ(ch, simple_stmt);
2495 for (j = 0; j < NCH(ch); j += 2) {
2496 /* statement terminates with a semi-colon ';' */
2497 if (NCH(CHILD(ch, j)) == 0) {
2498 assert((j + 1) == NCH(ch));
2499 break;
2500 }
2501 s = ast_for_stmt(c, CHILD(ch, j));
2502 if (!s)
2503 return NULL;
2504 asdl_seq_SET(seq, pos++, s);
2505 }
2506 }
2507 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 }
2509 assert(pos == seq->size);
2510 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511}
2512
2513static stmt_ty
2514ast_for_if_stmt(struct compiling *c, const node *n)
2515{
2516 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2517 ['else' ':' suite]
2518 */
2519 char *s;
2520
2521 REQ(n, if_stmt);
2522
2523 if (NCH(n) == 4) {
2524 expr_ty expression;
2525 asdl_seq *suite_seq;
2526
2527 expression = ast_for_expr(c, CHILD(n, 1));
2528 if (!expression)
2529 return NULL;
2530 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002531 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 return NULL;
2533
Thomas Wouters89f507f2006-12-13 04:49:30 +00002534 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002536
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 s = STR(CHILD(n, 4));
2538 /* s[2], the third character in the string, will be
2539 's' for el_s_e, or
2540 'i' for el_i_f
2541 */
2542 if (s[2] == 's') {
2543 expr_ty expression;
2544 asdl_seq *seq1, *seq2;
2545
2546 expression = ast_for_expr(c, CHILD(n, 1));
2547 if (!expression)
2548 return NULL;
2549 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002550 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 return NULL;
2552 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002553 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 return NULL;
2555
Thomas Wouters89f507f2006-12-13 04:49:30 +00002556 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 }
2558 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 int i, n_elif, has_else = 0;
2560 asdl_seq *orelse = NULL;
2561 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 /* must reference the child n_elif+1 since 'else' token is third,
2563 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2565 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2566 has_else = 1;
2567 n_elif -= 3;
2568 }
2569 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570
Thomas Wouters89f507f2006-12-13 04:49:30 +00002571 if (has_else) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 expr_ty expression;
2573 asdl_seq *seq1, *seq2;
2574
Thomas Wouters89f507f2006-12-13 04:49:30 +00002575 orelse = asdl_seq_new(1, c->c_arena);
2576 if (!orelse)
2577 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002579 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002582 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002585 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587
Thomas Wouters89f507f2006-12-13 04:49:30 +00002588 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
2589 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002590 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002591 /* the just-created orelse handled the last elif */
2592 n_elif--;
2593 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 for (i = 0; i < n_elif; i++) {
2596 int off = 5 + (n_elif - i - 1) * 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597 expr_ty expression;
2598 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002599 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2600 if (!newobj)
2601 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002603 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002606 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608
Thomas Wouters89f507f2006-12-13 04:49:30 +00002609 asdl_seq_SET(newobj, 0,
2610 If(expression, suite_seq, orelse,
2611 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
2612 orelse = newobj;
2613 }
2614 return If(ast_for_expr(c, CHILD(n, 1)),
2615 ast_for_suite(c, CHILD(n, 3)),
2616 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002618
2619 PyErr_Format(PyExc_SystemError,
2620 "unexpected token in 'if' statement: %s", s);
2621 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622}
2623
2624static stmt_ty
2625ast_for_while_stmt(struct compiling *c, const node *n)
2626{
2627 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2628 REQ(n, while_stmt);
2629
2630 if (NCH(n) == 4) {
2631 expr_ty expression;
2632 asdl_seq *suite_seq;
2633
2634 expression = ast_for_expr(c, CHILD(n, 1));
2635 if (!expression)
2636 return NULL;
2637 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002638 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002640 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 }
2642 else if (NCH(n) == 7) {
2643 expr_ty expression;
2644 asdl_seq *seq1, *seq2;
2645
2646 expression = ast_for_expr(c, CHILD(n, 1));
2647 if (!expression)
2648 return NULL;
2649 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002650 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 return NULL;
2652 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002653 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 return NULL;
2655
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002658
2659 PyErr_Format(PyExc_SystemError,
2660 "wrong number of tokens for 'while' statement: %d",
2661 NCH(n));
2662 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663}
2664
2665static stmt_ty
2666ast_for_for_stmt(struct compiling *c, const node *n)
2667{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002668 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 expr_ty expression;
2670 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002671 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2673 REQ(n, for_stmt);
2674
2675 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 if (!seq)
2678 return NULL;
2679 }
2680
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002681 node_target = CHILD(n, 1);
2682 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002683 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002685 /* Check the # of children rather than the length of _target, since
2686 for x, in ... has 1 element in _target, but still requires a Tuple. */
2687 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002690 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002692 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002693 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return NULL;
2695 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002696 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return NULL;
2698
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002699 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2700 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701}
2702
2703static excepthandler_ty
2704ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2705{
2706 /* except_clause: 'except' [test [',' test]] */
2707 REQ(exc, except_clause);
2708 REQ(body, suite);
2709
2710 if (NCH(exc) == 1) {
2711 asdl_seq *suite_seq = ast_for_suite(c, body);
2712 if (!suite_seq)
2713 return NULL;
2714
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002716 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 }
2718 else if (NCH(exc) == 2) {
2719 expr_ty expression;
2720 asdl_seq *suite_seq;
2721
2722 expression = ast_for_expr(c, CHILD(exc, 1));
2723 if (!expression)
2724 return NULL;
2725 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002726 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 return NULL;
2728
Thomas Wouters89f507f2006-12-13 04:49:30 +00002729 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002730 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 }
2732 else if (NCH(exc) == 4) {
2733 asdl_seq *suite_seq;
2734 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002735 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002736 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002739 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 return NULL;
2741 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002742 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 return NULL;
2744
Thomas Wouters89f507f2006-12-13 04:49:30 +00002745 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002746 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002748
2749 PyErr_Format(PyExc_SystemError,
2750 "wrong number of children for 'except' clause: %d",
2751 NCH(exc));
2752 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753}
2754
2755static stmt_ty
2756ast_for_try_stmt(struct compiling *c, const node *n)
2757{
Neal Norwitzf599f422005-12-17 21:33:47 +00002758 const int nch = NCH(n);
2759 int n_except = (nch - 3)/3;
2760 asdl_seq *body, *orelse = NULL, *finally = NULL;
2761
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 REQ(n, try_stmt);
2763
Neal Norwitzf599f422005-12-17 21:33:47 +00002764 body = ast_for_suite(c, CHILD(n, 2));
2765 if (body == NULL)
2766 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767
Neal Norwitzf599f422005-12-17 21:33:47 +00002768 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2769 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2770 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2771 /* we can assume it's an "else",
2772 because nch >= 9 for try-else-finally and
2773 it would otherwise have a type of except_clause */
2774 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2775 if (orelse == NULL)
2776 return NULL;
2777 n_except--;
2778 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779
Neal Norwitzf599f422005-12-17 21:33:47 +00002780 finally = ast_for_suite(c, CHILD(n, nch - 1));
2781 if (finally == NULL)
2782 return NULL;
2783 n_except--;
2784 }
2785 else {
2786 /* we can assume it's an "else",
2787 otherwise it would have a type of except_clause */
2788 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2789 if (orelse == NULL)
2790 return NULL;
2791 n_except--;
2792 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002794 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002795 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 return NULL;
2797 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002798
2799 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002800 int i;
2801 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002802 /* process except statements to create a try ... except */
2803 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2804 if (handlers == NULL)
2805 return NULL;
2806
2807 for (i = 0; i < n_except; i++) {
2808 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2809 CHILD(n, 5 + i * 3));
2810 if (!e)
2811 return NULL;
2812 asdl_seq_SET(handlers, i, e);
2813 }
2814
Thomas Wouters89f507f2006-12-13 04:49:30 +00002815 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002816 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002817 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002818 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002819
2820 /* if a 'finally' is present too, we nest the TryExcept within a
2821 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002822 body = asdl_seq_new(1, c->c_arena);
2823 if (body == NULL)
2824 return NULL;
2825 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002826 }
2827
2828 /* must be a try ... finally (except clauses are in body, if any exist) */
2829 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002830 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831}
2832
Guido van Rossumc2e20742006-02-27 22:32:47 +00002833static expr_ty
2834ast_for_with_var(struct compiling *c, const node *n)
2835{
2836 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002837 return ast_for_expr(c, CHILD(n, 1));
2838}
2839
2840/* with_stmt: 'with' test [ with_var ] ':' suite */
2841static stmt_ty
2842ast_for_with_stmt(struct compiling *c, const node *n)
2843{
2844 expr_ty context_expr, optional_vars = NULL;
2845 int suite_index = 3; /* skip 'with', test, and ':' */
2846 asdl_seq *suite_seq;
2847
2848 assert(TYPE(n) == with_stmt);
2849 context_expr = ast_for_expr(c, CHILD(n, 1));
2850 if (TYPE(CHILD(n, 2)) == with_var) {
2851 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2852
2853 if (!optional_vars) {
2854 return NULL;
2855 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002856 if (!set_context(optional_vars, Store, n)) {
2857 return NULL;
2858 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002859 suite_index = 4;
2860 }
2861
2862 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2863 if (!suite_seq) {
2864 return NULL;
2865 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002866 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002867 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002868}
2869
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870static stmt_ty
2871ast_for_classdef(struct compiling *c, const node *n)
2872{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002873 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2874 asdl_seq *s;
2875 expr_ty call, dummy;
2876
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 REQ(n, classdef);
2878
2879 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002880 ast_error(n, "assignment to None");
2881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 }
2883
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002884 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885 s = ast_for_suite(c, CHILD(n, 3));
2886 if (!s)
2887 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002888 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2889 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002891
2892 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 s = ast_for_suite(c, CHILD(n,5));
2894 if (!s)
2895 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002896 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
2897 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 }
2899
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002900 /* class NAME '(' arglist ')' ':' suite */
2901 /* build up a fake Call node so we can extract its pieces */
2902 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2903 call = ast_for_call(c, CHILD(n, 3), dummy);
2904 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002907 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002909
2910 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2911 call->v.Call.args, call->v.Call.keywords,
2912 call->v.Call.starargs, call->v.Call.kwargs, s,
2913 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914}
2915
2916static stmt_ty
2917ast_for_stmt(struct compiling *c, const node *n)
2918{
2919 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920 assert(NCH(n) == 1);
2921 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 }
2923 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002924 assert(num_stmts(n) == 1);
2925 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 }
2927 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002928 REQ(n, small_stmt);
2929 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002930 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2931 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 */
2933 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934 case expr_stmt:
2935 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 case del_stmt:
2937 return ast_for_del_stmt(c, n);
2938 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002939 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 case flow_stmt:
2941 return ast_for_flow_stmt(c, n);
2942 case import_stmt:
2943 return ast_for_import_stmt(c, n);
2944 case global_stmt:
2945 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002946 case nonlocal_stmt:
2947 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948 case assert_stmt:
2949 return ast_for_assert_stmt(c, n);
2950 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002951 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2953 TYPE(n), NCH(n));
2954 return NULL;
2955 }
2956 }
2957 else {
2958 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 | funcdef | classdef
2960 */
2961 node *ch = CHILD(n, 0);
2962 REQ(n, compound_stmt);
2963 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 case if_stmt:
2965 return ast_for_if_stmt(c, ch);
2966 case while_stmt:
2967 return ast_for_while_stmt(c, ch);
2968 case for_stmt:
2969 return ast_for_for_stmt(c, ch);
2970 case try_stmt:
2971 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002972 case with_stmt:
2973 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 case funcdef:
2975 return ast_for_funcdef(c, ch);
2976 case classdef:
2977 return ast_for_classdef(c, ch);
2978 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002979 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2981 TYPE(n), NCH(n));
2982 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002983 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 }
2985}
2986
2987static PyObject *
2988parsenumber(const char *s)
2989{
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 const char *end;
2991 long x;
2992 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00002994 Py_complex c;
2995 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996#endif
2997
Thomas Wouters89f507f2006-12-13 04:49:30 +00002998 errno = 0;
2999 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003001 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003003 if (*end == 'l' || *end == 'L')
3004 return PyLong_FromString((char *)s, (char **)0, 0);
3005 if (s[0] == '0') {
3006 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3007 if (x < 0 && errno == 0) {
3008 return PyLong_FromString((char *)s,
3009 (char **)0,
3010 0);
3011 }
3012 }
3013 else
3014 x = PyOS_strtol((char *)s, (char **)&end, 0);
3015 if (*end == '\0') {
3016 if (errno != 0)
3017 return PyLong_FromString((char *)s, (char **)0, 0);
3018 return PyInt_FromLong(x);
3019 }
3020 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021#ifndef WITHOUT_COMPLEX
Thomas Wouters89f507f2006-12-13 04:49:30 +00003022 if (imflag) {
3023 c.real = 0.;
3024 PyFPE_START_PROTECT("atof", return 0)
3025 c.imag = PyOS_ascii_atof(s);
3026 PyFPE_END_PROTECT(c)
3027 return PyComplex_FromCComplex(c);
3028 }
3029 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031 {
3032 PyFPE_START_PROTECT("atof", return 0)
3033 dx = PyOS_ascii_atof(s);
3034 PyFPE_END_PROTECT(dx)
3035 return PyFloat_FromDouble(dx);
3036 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037}
3038
3039static PyObject *
3040decode_utf8(const char **sPtr, const char *end, char* encoding)
3041{
3042#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003043 Py_FatalError("decode_utf8 should not be called in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 return NULL;
3045#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003046 PyObject *u, *v;
3047 char *s, *t;
3048 t = s = (char *)*sPtr;
3049 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3050 while (s < end && (*s & 0x80)) s++;
3051 *sPtr = s;
3052 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3053 if (u == NULL)
3054 return NULL;
3055 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3056 Py_DECREF(u);
3057 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058#endif
3059}
3060
3061static PyObject *
3062decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3063{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003064 PyObject *v, *u;
3065 char *buf;
3066 char *p;
3067 const char *end;
3068 if (encoding == NULL) {
3069 buf = (char *)s;
3070 u = NULL;
3071 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3072 buf = (char *)s;
3073 u = NULL;
3074 } else {
3075 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3076 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3077 if (u == NULL)
3078 return NULL;
3079 p = buf = PyString_AsString(u);
3080 end = s + len;
3081 while (s < end) {
3082 if (*s == '\\') {
3083 *p++ = *s++;
3084 if (*s & 0x80) {
3085 strcpy(p, "u005c");
3086 p += 5;
3087 }
3088 }
3089 if (*s & 0x80) { /* XXX inefficient */
3090 PyObject *w;
3091 char *r;
3092 Py_ssize_t rn, i;
3093 w = decode_utf8(&s, end, "utf-16-be");
3094 if (w == NULL) {
3095 Py_DECREF(u);
3096 return NULL;
3097 }
3098 r = PyString_AsString(w);
3099 rn = PyString_Size(w);
3100 assert(rn % 2 == 0);
3101 for (i = 0; i < rn; i += 2) {
3102 sprintf(p, "\\u%02x%02x",
3103 r[i + 0] & 0xFF,
3104 r[i + 1] & 0xFF);
3105 p += 6;
3106 }
3107 Py_DECREF(w);
3108 } else {
3109 *p++ = *s++;
3110 }
3111 }
3112 len = p - buf;
3113 s = buf;
3114 }
3115 if (rawmode)
3116 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3117 else
3118 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3119 Py_XDECREF(u);
3120 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121}
3122
3123/* s is a Python string literal, including the bracketing quote characters,
3124 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3125 * parsestr parses it, and returns the decoded Python string object.
3126 */
3127static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003128parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003130 size_t len;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003131 const char *s = STR(n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003132 int quote = Py_CHARMASK(*s);
3133 int rawmode = 0;
3134 int need_encoding;
3135 int unicode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136
Thomas Wouters89f507f2006-12-13 04:49:30 +00003137 if (isalpha(quote) || quote == '_') {
3138 if (quote == 'u' || quote == 'U') {
3139 quote = *++s;
3140 unicode = 1;
3141 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003142 if (quote == 'b' || quote == 'B') {
3143 quote = *++s;
3144 *bytesmode = 1;
3145 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003146 if (quote == 'r' || quote == 'R') {
3147 quote = *++s;
3148 rawmode = 1;
3149 }
3150 }
3151 if (quote != '\'' && quote != '\"') {
3152 PyErr_BadInternalCall();
3153 return NULL;
3154 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003155 if (unicode && *bytesmode) {
3156 ast_error(n, "string cannot be both bytes and unicode");
3157 return NULL;
3158 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003159 s++;
3160 len = strlen(s);
3161 if (len > INT_MAX) {
3162 PyErr_SetString(PyExc_OverflowError,
3163 "string to parse is too long");
3164 return NULL;
3165 }
3166 if (s[--len] != quote) {
3167 PyErr_BadInternalCall();
3168 return NULL;
3169 }
3170 if (len >= 4 && s[0] == quote && s[1] == quote) {
3171 s += 2;
3172 len -= 2;
3173 if (s[--len] != quote || s[--len] != quote) {
3174 PyErr_BadInternalCall();
3175 return NULL;
3176 }
3177 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 if (unicode || Py_UnicodeFlag) {
3180 return decode_unicode(s, len, rawmode, encoding);
3181 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182#endif
Thomas Wouters00e41de2007-02-23 19:56:57 +00003183 if (*bytesmode) {
3184 /* Disallow non-ascii characters (but not escapes) */
3185 const char *c;
3186 for (c = s; *c; c++) {
3187 if (Py_CHARMASK(*c) >= 0x80) {
3188 ast_error(n, "bytes can only contain ASCII "
3189 "literal characters.");
3190 return NULL;
3191 }
3192 }
3193 }
3194 need_encoding = (!*bytesmode && encoding != NULL &&
Thomas Wouters89f507f2006-12-13 04:49:30 +00003195 strcmp(encoding, "utf-8") != 0 &&
3196 strcmp(encoding, "iso-8859-1") != 0);
3197 if (rawmode || strchr(s, '\\') == NULL) {
3198 if (need_encoding) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199#ifndef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003200 /* This should not happen - we never see any other
3201 encoding. */
3202 Py_FatalError(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003203 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204#else
Thomas Wouters89f507f2006-12-13 04:49:30 +00003205 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3206 if (u == NULL)
3207 return NULL;
3208 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3209 Py_DECREF(u);
3210 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003212 } else {
3213 return PyString_FromStringAndSize(s, len);
3214 }
3215 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216
Thomas Wouters89f507f2006-12-13 04:49:30 +00003217 return PyString_DecodeEscape(s, len, NULL, unicode,
3218 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219}
3220
3221/* Build a Python string object out of a STRING atom. This takes care of
3222 * compile-time literal catenation, calling parsestr() on each piece, and
3223 * pasting the intermediate results together.
3224 */
3225static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003226parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227{
Thomas Wouters89f507f2006-12-13 04:49:30 +00003228 PyObject *v;
3229 int i;
3230 REQ(CHILD(n, 0), STRING);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003231 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3232 if (v != NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003233 /* String literal concatenation */
3234 for (i = 1; i < NCH(n); i++) {
3235 PyObject *s;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003236 int subbm = 0;
3237 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003238 if (s == NULL)
3239 goto onError;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003240 if (*bytesmode != subbm) {
3241 ast_error(n, "cannot mix bytes and nonbytes"
3242 "literals");
3243 goto onError;
3244 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003245 if (PyString_Check(v) && PyString_Check(s)) {
3246 PyString_ConcatAndDel(&v, s);
3247 if (v == NULL)
3248 goto onError;
3249 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250#ifdef Py_USING_UNICODE
Thomas Wouters89f507f2006-12-13 04:49:30 +00003251 else {
3252 PyObject *temp = PyUnicode_Concat(v, s);
3253 Py_DECREF(s);
3254 Py_DECREF(v);
3255 v = temp;
3256 if (v == NULL)
3257 goto onError;
3258 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003259#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003260 }
3261 }
3262 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263
3264 onError:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003265 Py_XDECREF(v);
3266 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267}