blob: b34411ba41ffad19039f96c90627dea1e949390d [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000031static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
36static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000037static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
38static PyObject *parsestrplus(struct compiling *, const node *n,
39 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000042#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#endif
44
Nick Coghlan650f0d02007-04-15 12:05:43 +000045#define COMP_GENEXP 0
46#define COMP_LISTCOMP 1
47#define COMP_SETCOMP 2
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
Martin v. Löwis5b222132007-06-10 09:51:05 +000051 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
52 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000053 PyArena_AddPyObject(arena, id);
54 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055}
56
Neal Norwitzadb69fc2005-12-17 20:54:49 +000057#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000058
59/* This routine provides an invalid object for the syntax error.
60 The outermost routine must unpack this error and create the
61 proper object. We do this so that we don't have to pass
62 the filename to everything function.
63
64 XXX Maybe we should just pass the filename...
65*/
66
67static int
68ast_error(const node *n, const char *errstr)
69{
70 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
71 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000072 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000073 PyErr_SetObject(PyExc_SyntaxError, u);
74 Py_DECREF(u);
75 return 0;
76}
77
78static void
79ast_error_finish(const char *filename)
80{
81 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000082 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000083
84 assert(PyErr_Occurred());
85 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +000086 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000087
88 PyErr_Fetch(&type, &value, &tback);
89 errstr = PyTuple_GetItem(value, 0);
90 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +000091 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 Py_INCREF(errstr);
93 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000094 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 Py_DECREF(errstr);
96 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000097 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098 Py_DECREF(value);
99
100 loc = PyErr_ProgramText(filename, lineno);
101 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000102 Py_INCREF(Py_None);
103 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000107 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000108 Py_DECREF(errstr);
109 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000110 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112 Py_DECREF(errstr);
113 Py_DECREF(tmp);
114 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000116 PyErr_Restore(type, value, tback);
117}
118
119/* num_stmts() returns number of contained statements.
120
121 Use this routine to determine how big a sequence is needed for
122 the statements in a parse tree. Its raison d'etre is this bit of
123 grammar:
124
125 stmt: simple_stmt | compound_stmt
126 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
127
128 A simple_stmt can contain multiple small_stmt elements joined
129 by semicolons. If the arg is a simple_stmt, the number of
130 small_stmt elements is returned.
131*/
132
133static int
134num_stmts(const node *n)
135{
136 int i, l;
137 node *ch;
138
139 switch (TYPE(n)) {
140 case single_input:
141 if (TYPE(CHILD(n, 0)) == NEWLINE)
142 return 0;
143 else
144 return num_stmts(CHILD(n, 0));
145 case file_input:
146 l = 0;
147 for (i = 0; i < NCH(n); i++) {
148 ch = CHILD(n, i);
149 if (TYPE(ch) == stmt)
150 l += num_stmts(ch);
151 }
152 return l;
153 case stmt:
154 return num_stmts(CHILD(n, 0));
155 case compound_stmt:
156 return 1;
157 case simple_stmt:
158 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
159 case suite:
160 if (NCH(n) == 1)
161 return num_stmts(CHILD(n, 0));
162 else {
163 l = 0;
164 for (i = 2; i < (NCH(n) - 1); i++)
165 l += num_stmts(CHILD(n, i));
166 return l;
167 }
168 default: {
169 char buf[128];
170
171 sprintf(buf, "Non-statement found: %d %d\n",
172 TYPE(n), NCH(n));
173 Py_FatalError(buf);
174 }
175 }
176 assert(0);
177 return 0;
178}
179
180/* Transform the CST rooted at node * to the appropriate AST
181*/
182
183mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000184PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
185 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000187 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188 asdl_seq *stmts = NULL;
189 stmt_ty s;
190 node *ch;
191 struct compiling c;
192
193 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000194 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000195 if (TYPE(n) == encoding_decl) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000196 ast_error(n, "encoding declaration in Unicode string");
197 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000198 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000199 } else if (TYPE(n) == encoding_decl) {
200 c.c_encoding = STR(n);
201 n = CHILD(n, 0);
202 } else {
203 c.c_encoding = NULL;
204 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000205 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206
Jeremy Hyltona8293132006-02-28 17:58:27 +0000207 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208 switch (TYPE(n)) {
209 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000210 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000212 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000213 for (i = 0; i < NCH(n) - 1; i++) {
214 ch = CHILD(n, i);
215 if (TYPE(ch) == NEWLINE)
216 continue;
217 REQ(ch, stmt);
218 num = num_stmts(ch);
219 if (num == 1) {
220 s = ast_for_stmt(&c, ch);
221 if (!s)
222 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000223 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000224 }
225 else {
226 ch = CHILD(ch, 0);
227 REQ(ch, simple_stmt);
228 for (j = 0; j < num; j++) {
229 s = ast_for_stmt(&c, CHILD(ch, j * 2));
230 if (!s)
231 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000232 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 }
234 }
235 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000236 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000237 case eval_input: {
238 expr_ty testlist_ast;
239
Nick Coghlan650f0d02007-04-15 12:05:43 +0000240 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000241 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242 if (!testlist_ast)
243 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000244 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245 }
246 case single_input:
247 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000248 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000250 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000251 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
252 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000253 if (!asdl_seq_GET(stmts, 0))
254 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000255 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256 }
257 else {
258 n = CHILD(n, 0);
259 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000260 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000262 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000263 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000264 s = ast_for_stmt(&c, n);
265 if (!s)
266 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 asdl_seq_SET(stmts, 0, s);
268 }
269 else {
270 /* Only a simple_stmt can contain multiple statements. */
271 REQ(n, simple_stmt);
272 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 if (TYPE(CHILD(n, i)) == NEWLINE)
274 break;
275 s = ast_for_stmt(&c, CHILD(n, i));
276 if (!s)
277 goto error;
278 asdl_seq_SET(stmts, i / 2, s);
279 }
280 }
281
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000282 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283 }
284 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000285 PyErr_Format(PyExc_SystemError,
286 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 goto error;
288 }
289 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 ast_error_finish(filename);
291 return NULL;
292}
293
294/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
295*/
296
297static operator_ty
298get_operator(const node *n)
299{
300 switch (TYPE(n)) {
301 case VBAR:
302 return BitOr;
303 case CIRCUMFLEX:
304 return BitXor;
305 case AMPER:
306 return BitAnd;
307 case LEFTSHIFT:
308 return LShift;
309 case RIGHTSHIFT:
310 return RShift;
311 case PLUS:
312 return Add;
313 case MINUS:
314 return Sub;
315 case STAR:
316 return Mult;
317 case SLASH:
318 return Div;
319 case DOUBLESLASH:
320 return FloorDiv;
321 case PERCENT:
322 return Mod;
323 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000324 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 }
326}
327
Guido van Rossume7ba4952007-06-06 23:52:48 +0000328static const char* FORBIDDEN[] = {
329 "None",
330 "True",
331 "False",
332 NULL,
333};
334
335static int
336forbidden_name(expr_ty e, const node *n)
337{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000338 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000339 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000340 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000341 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000342 ast_error(n, "assignment to keyword");
343 return 1;
344 }
345 }
346 return 0;
347}
348
Jeremy Hyltona8293132006-02-28 17:58:27 +0000349/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350
351 Only sets context for expr kinds that "can appear in assignment context"
352 (according to ../Parser/Python.asdl). For other expr kinds, it sets
353 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000354*/
355
356static int
357set_context(expr_ty e, expr_context_ty ctx, const node *n)
358{
359 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000360 /* If a particular expression type can't be used for assign / delete,
361 set expr_name to its name and an error message will be generated.
362 */
363 const char* expr_name = NULL;
364
365 /* The ast defines augmented store and load contexts, but the
366 implementation here doesn't actually use them. The code may be
367 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000368 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000369 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000370 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000371 */
372 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373
374 switch (e->kind) {
375 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000376 if (ctx == Store &&
Martin v. Löwis5b222132007-06-10 09:51:05 +0000377 !PyUnicode_CompareWithASCIIString(e->v.Attribute.attr, "None")) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000378 return ast_error(n, "assignment to None");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000379 }
380 e->v.Attribute.ctx = ctx;
381 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000382 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000383 e->v.Subscript.ctx = ctx;
384 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000385 case Starred_kind:
386 e->v.Starred.ctx = ctx;
387 if (!set_context(e->v.Starred.value, ctx, n))
388 return 0;
389 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000390 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000391 if (ctx == Store) {
392 if (forbidden_name(e, n))
393 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000394 }
395 e->v.Name.ctx = ctx;
396 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000398 e->v.List.ctx = ctx;
399 s = e->v.List.elts;
400 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000401 case Tuple_kind:
402 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
403 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404 e->v.Tuple.ctx = ctx;
405 s = e->v.Tuple.elts;
406 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000407 case Lambda_kind:
408 expr_name = "lambda";
409 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000410 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000411 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000412 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000413 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000415 case UnaryOp_kind:
416 expr_name = "operator";
417 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000419 expr_name = "generator expression";
420 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000421 case Yield_kind:
422 expr_name = "yield expression";
423 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000424 case ListComp_kind:
425 expr_name = "list comprehension";
426 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000427 case SetComp_kind:
428 expr_name = "set comprehension";
429 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000430 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000431 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432 case Num_kind:
433 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000434 expr_name = "literal";
435 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000436 case Ellipsis_kind:
437 expr_name = "Ellipsis";
438 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000439 case Compare_kind:
440 expr_name = "comparison";
441 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000442 case IfExp_kind:
443 expr_name = "conditional expression";
444 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000445 default:
446 PyErr_Format(PyExc_SystemError,
447 "unexpected expression in assignment %d (line %d)",
448 e->kind, e->lineno);
449 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000450 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000451 /* Check for error string set by switch */
452 if (expr_name) {
453 char buf[300];
454 PyOS_snprintf(buf, sizeof(buf),
455 "can't %s %s",
456 ctx == Store ? "assign to" : "delete",
457 expr_name);
458 return ast_error(n, buf);
459 }
460
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000461 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000462 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 */
464 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000465 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466
Thomas Wouters89f507f2006-12-13 04:49:30 +0000467 for (i = 0; i < asdl_seq_LEN(s); i++) {
468 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
469 return 0;
470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000471 }
472 return 1;
473}
474
475static operator_ty
476ast_for_augassign(const node *n)
477{
478 REQ(n, augassign);
479 n = CHILD(n, 0);
480 switch (STR(n)[0]) {
481 case '+':
482 return Add;
483 case '-':
484 return Sub;
485 case '/':
486 if (STR(n)[1] == '/')
487 return FloorDiv;
488 else
489 return Div;
490 case '%':
491 return Mod;
492 case '<':
493 return LShift;
494 case '>':
495 return RShift;
496 case '&':
497 return BitAnd;
498 case '^':
499 return BitXor;
500 case '|':
501 return BitOr;
502 case '*':
503 if (STR(n)[1] == '*')
504 return Pow;
505 else
506 return Mult;
507 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000508 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000509 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000510 }
511}
512
513static cmpop_ty
514ast_for_comp_op(const node *n)
515{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000516 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000517 |'is' 'not'
518 */
519 REQ(n, comp_op);
520 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000521 n = CHILD(n, 0);
522 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 case LESS:
524 return Lt;
525 case GREATER:
526 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000527 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000528 return Eq;
529 case LESSEQUAL:
530 return LtE;
531 case GREATEREQUAL:
532 return GtE;
533 case NOTEQUAL:
534 return NotEq;
535 case NAME:
536 if (strcmp(STR(n), "in") == 0)
537 return In;
538 if (strcmp(STR(n), "is") == 0)
539 return Is;
540 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000541 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000543 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000544 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 }
546 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000547 /* handle "not in" and "is not" */
548 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549 case NAME:
550 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
551 return NotIn;
552 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
553 return IsNot;
554 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000555 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000557 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000558 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559 }
Neal Norwitz79792652005-11-14 04:25:03 +0000560 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000562 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563}
564
565static asdl_seq *
566seq_for_testlist(struct compiling *c, const node *n)
567{
568 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000569 asdl_seq *seq;
570 expr_ty expression;
571 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000572 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000574 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575 if (!seq)
576 return NULL;
577
578 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000579 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580
581 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000582 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584
585 assert(i / 2 < seq->size);
586 asdl_seq_SET(seq, i / 2, expression);
587 }
588 return seq;
589}
590
Neal Norwitzc1505362006-12-28 06:47:50 +0000591static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000592compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000593{
594 identifier name;
595 expr_ty annotation = NULL;
596 node *ch;
597
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000598 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000599 ch = CHILD(n, 0);
600 if (!strcmp(STR(ch), "None")) {
601 ast_error(ch, "assignment to None");
602 return NULL;
603 }
604 name = NEW_IDENTIFIER(ch);
605 if (!name)
606 return NULL;
607
608 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
609 annotation = ast_for_expr(c, CHILD(n, 2));
610 if (!annotation)
611 return NULL;
612 }
613
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000614 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615}
616
Guido van Rossum4f72a782006-10-27 23:31:49 +0000617/* returns -1 if failed to handle keyword only arguments
618 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000619 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000620 ^^^
621 start pointing here
622 */
623static int
624handle_keywordonly_args(struct compiling *c, const node *n, int start,
625 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
626{
627 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000628 expr_ty expression, annotation;
629 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000630 int i = start;
631 int j = 0; /* index for kwdefaults and kwonlyargs */
632 assert(kwonlyargs != NULL);
633 assert(kwdefaults != NULL);
634 while (i < NCH(n)) {
635 ch = CHILD(n, i);
636 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000637 case vfpdef:
638 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000639 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000640 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000641 if (!expression) {
642 ast_error(ch, "assignment to None");
643 goto error;
644 }
645 asdl_seq_SET(kwdefaults, j, expression);
646 i += 2; /* '=' and test */
647 }
648 else { /* setting NULL if no default value exists */
649 asdl_seq_SET(kwdefaults, j, NULL);
650 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000651 if (NCH(ch) == 3) {
652 /* ch is NAME ':' test */
653 annotation = ast_for_expr(c, CHILD(ch, 2));
654 if (!annotation) {
655 ast_error(ch, "expected expression");
656 goto error;
657 }
658 }
659 else {
660 annotation = NULL;
661 }
662 ch = CHILD(ch, 0);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000663 if (!strcmp(STR(ch), "None")) {
664 ast_error(ch, "assignment to None");
665 goto error;
666 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000667 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000668 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000669 ast_error(ch, "expecting name");
670 goto error;
671 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000672 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000673 i += 2; /* the name and the comma */
674 break;
675 case DOUBLESTAR:
676 return i;
677 default:
678 ast_error(ch, "unexpected node");
679 goto error;
680 }
681 }
682 return i;
683 error:
684 return -1;
685}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000686
Jeremy Hyltona8293132006-02-28 17:58:27 +0000687/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000688
689static arguments_ty
690ast_for_arguments(struct compiling *c, const node *n)
691{
Neal Norwitzc1505362006-12-28 06:47:50 +0000692 /* This function handles both typedargslist (function definition)
693 and varargslist (lambda definition).
694
695 parameters: '(' [typedargslist] ')'
696 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000697 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
698 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000699 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000700 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000701 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000702 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
703 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000704 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000705 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000706 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000707 int i, j, k, nposargs = 0, nkwonlyargs = 0;
708 int nposdefaults = 0, found_default = 0;
709 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000710 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000711 arg_ty arg;
712 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 node *ch;
714
715 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000716 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000717 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
718 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000719 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000721 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722
Guido van Rossum4f72a782006-10-27 23:31:49 +0000723 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000724 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000725 ch = CHILD(n, i);
726 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000727 /* skip star and possible argument */
728 i++;
729 i += (TYPE(CHILD(n, i)) == tfpdef
730 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000731 break;
732 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000733 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000734 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000737 /* count the number of keyword only args &
738 defaults for keyword only args */
739 for ( ; i < NCH(n); ++i) {
740 ch = CHILD(n, i);
741 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000742 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000743 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
745 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 kwonlyargs = (nkwonlyargs ?
748 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
749 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000750 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000751 posdefaults = (nposdefaults ?
752 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
753 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000754 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000755 /* The length of kwonlyargs and kwdefaults are same
756 since we set NULL as default for keyword only argument w/o default
757 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000758 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000759 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
760 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000761 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000762
763 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000764 ast_error(n, "more than 255 arguments");
765 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000768 /* tfpdef: NAME [':' test]
769 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 */
771 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000772 j = 0; /* index for defaults */
773 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000775 ch = CHILD(n, i);
776 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000777 case tfpdef:
778 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
780 anything other than EQUAL or a comma? */
781 /* XXX Should NCH(n) check be made a separate check? */
782 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000783 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
784 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000785 goto error;
786 assert(posdefaults != NULL);
787 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000789 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 else if (found_default) {
792 ast_error(n,
793 "non-default argument follows default argument");
794 goto error;
795 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000796 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000797 if (!arg)
798 goto error;
799 asdl_seq_SET(posargs, k++, arg);
800
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801 i += 2; /* the name and the comma */
802 break;
803 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 if (i+1 >= NCH(n)) {
805 ast_error(CHILD(n, i), "no name for vararg");
Neal Norwitzc1505362006-12-28 06:47:50 +0000806 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000808 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 if (TYPE(ch) == COMMA) {
810 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000811 i += 2; /* now follows keyword only arguments */
812 res = handle_keywordonly_args(c, n, i,
813 kwonlyargs, kwdefaults);
814 if (res == -1) goto error;
815 i = res; /* res has new position to process */
816 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000817 else if (!strcmp(STR(CHILD(ch, 0)), "None")) {
818 ast_error(CHILD(ch, 0), "assignment to None");
819 goto error;
820 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000821 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000822 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
823 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000824 /* there is an annotation on the vararg */
825 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000826 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000827 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000828 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
829 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000830 int res = 0;
831 res = handle_keywordonly_args(c, n, i,
832 kwonlyargs, kwdefaults);
833 if (res == -1) goto error;
834 i = res; /* res has new position to process */
835 }
836 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 break;
838 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000839 ch = CHILD(n, i+1); /* tfpdef */
840 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000841 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
842 ast_error(CHILD(ch, 0), "assignment to None");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000843 goto error;
844 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000845 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
846 if (NCH(ch) > 1) {
847 /* there is an annotation on the kwarg */
848 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000850 i += 3;
851 break;
852 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000853 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 "unexpected node in varargslist: %d @ %d",
855 TYPE(ch), i);
856 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000857 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000859 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
860 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000862 Py_XDECREF(vararg);
863 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864 return NULL;
865}
866
867static expr_ty
868ast_for_dotted_name(struct compiling *c, const node *n)
869{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000870 expr_ty e;
871 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000872 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 int i;
874
875 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000876
877 lineno = LINENO(n);
878 col_offset = n->n_col_offset;
879
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 id = NEW_IDENTIFIER(CHILD(n, 0));
881 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000882 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000883 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000885 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886
887 for (i = 2; i < NCH(n); i+=2) {
888 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000889 if (!id)
890 return NULL;
891 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
892 if (!e)
893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894 }
895
896 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897}
898
899static expr_ty
900ast_for_decorator(struct compiling *c, const node *n)
901{
902 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
903 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000904 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905
906 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000907 REQ(CHILD(n, 0), AT);
908 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909
910 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
911 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000912 return NULL;
913
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 d = name_expr;
916 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917 }
918 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000920 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000921 if (!d)
922 return NULL;
923 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 }
925 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000926 d = ast_for_call(c, CHILD(n, 3), name_expr);
927 if (!d)
928 return NULL;
929 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000930 }
931
932 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933}
934
935static asdl_seq*
936ast_for_decorators(struct compiling *c, const node *n)
937{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000938 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000939 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 int i;
941
942 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000943 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 if (!decorator_seq)
945 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000946
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000948 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 if (!d)
950 return NULL;
951 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952 }
953 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954}
955
956static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000957ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000959 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000960 identifier name;
961 arguments_ty args;
962 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000963 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000964 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965
966 REQ(n, funcdef);
967
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 name = NEW_IDENTIFIER(CHILD(n, name_i));
969 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000972 ast_error(CHILD(n, name_i), "assignment to None");
973 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 }
975 args = ast_for_arguments(c, CHILD(n, name_i + 1));
976 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000977 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000978 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
979 returns = ast_for_expr(c, CHILD(n, name_i + 3));
980 if (!returns)
981 return NULL;
982 name_i += 2;
983 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 body = ast_for_suite(c, CHILD(n, name_i + 3));
985 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000986 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987
Neal Norwitzc1505362006-12-28 06:47:50 +0000988 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000989 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990}
991
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000992static stmt_ty
993ast_for_decorated(struct compiling *c, const node *n)
994{
995 /* decorated: decorators (classdef | funcdef) */
996 stmt_ty thing = NULL;
997 asdl_seq *decorator_seq = NULL;
998
999 REQ(n, decorated);
1000
1001 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1002 if (!decorator_seq)
1003 return NULL;
1004
1005 assert(TYPE(CHILD(n, 1)) == funcdef ||
1006 TYPE(CHILD(n, 1)) == classdef);
1007
1008 if (TYPE(CHILD(n, 1)) == funcdef) {
1009 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1010 } else if (TYPE(CHILD(n, 1)) == classdef) {
1011 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1012 }
1013 return thing;
1014}
1015
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016static expr_ty
1017ast_for_lambdef(struct compiling *c, const node *n)
1018{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001019 /* lambdef: 'lambda' [varargslist] ':' test
1020 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 arguments_ty args;
1022 expr_ty expression;
1023
1024 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001025 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1026 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027 if (!args)
1028 return NULL;
1029 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001030 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 }
1033 else {
1034 args = ast_for_arguments(c, CHILD(n, 1));
1035 if (!args)
1036 return NULL;
1037 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001038 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 }
1041
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001042 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043}
1044
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001045static expr_ty
1046ast_for_ifexpr(struct compiling *c, const node *n)
1047{
1048 /* test: or_test 'if' or_test 'else' test */
1049 expr_ty expression, body, orelse;
1050
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001051 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001052 body = ast_for_expr(c, CHILD(n, 0));
1053 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001054 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001055 expression = ast_for_expr(c, CHILD(n, 2));
1056 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001057 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001058 orelse = ast_for_expr(c, CHILD(n, 4));
1059 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001060 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001061 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1062 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001063}
1064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001066 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067
Nick Coghlan650f0d02007-04-15 12:05:43 +00001068 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069*/
1070
1071static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001072count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001074 int n_fors = 0;
1075 node *ch = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076
Guido van Rossumd8faa362007-04-27 19:54:29 +00001077 count_comp_for:
1078 n_fors++;
1079 REQ(ch, comp_for);
1080 if (NCH(ch) == 5)
1081 ch = CHILD(ch, 4);
1082 else
1083 return n_fors;
1084 count_comp_iter:
1085 REQ(ch, comp_iter);
1086 ch = CHILD(ch, 0);
1087 if (TYPE(ch) == comp_for)
1088 goto count_comp_for;
1089 else if (TYPE(ch) == comp_if) {
1090 if (NCH(ch) == 3) {
1091 ch = CHILD(ch, 2);
1092 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001093 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001094 else
1095 return n_fors;
1096 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001097
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098 /* Should never be reached */
1099 PyErr_SetString(PyExc_SystemError,
1100 "logic error in count_comp_fors");
1101 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102}
1103
Nick Coghlan650f0d02007-04-15 12:05:43 +00001104/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105
Nick Coghlan650f0d02007-04-15 12:05:43 +00001106 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107*/
1108
1109static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001110count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001112 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
Guido van Rossumd8faa362007-04-27 19:54:29 +00001114 while (1) {
1115 REQ(n, comp_iter);
1116 if (TYPE(CHILD(n, 0)) == comp_for)
1117 return n_ifs;
1118 n = CHILD(n, 0);
1119 REQ(n, comp_if);
1120 n_ifs++;
1121 if (NCH(n) == 2)
1122 return n_ifs;
1123 n = CHILD(n, 2);
1124 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125}
1126
1127static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001128ast_for_comprehension(struct compiling *c, const node *n, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001130 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1131 argument: [test '='] test [comp_for] # Really [keyword '='] test */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132 expr_ty elt;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001133 asdl_seq *comps;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 int i, n_fors;
1135 node *ch;
1136
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 assert(NCH(n) > 1);
1138
1139 elt = ast_for_expr(c, CHILD(n, 0));
1140 if (!elt)
1141 return NULL;
1142
Nick Coghlan650f0d02007-04-15 12:05:43 +00001143 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144 if (n_fors == -1)
1145 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001146
Nick Coghlan650f0d02007-04-15 12:05:43 +00001147 comps = asdl_seq_new(n_fors, c->c_arena);
1148 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001150
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 ch = CHILD(n, 1);
1152 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001153 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 asdl_seq *t;
1155 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001156 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157
Nick Coghlan650f0d02007-04-15 12:05:43 +00001158 REQ(ch, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159
Thomas Wouters89f507f2006-12-13 04:49:30 +00001160 for_ch = CHILD(ch, 1);
1161 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001162 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001164 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001165 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167
Thomas Wouters89f507f2006-12-13 04:49:30 +00001168 /* Check the # of children rather than the length of t, since
1169 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1170 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001171 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1172 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173 else
Nick Coghlan650f0d02007-04-15 12:05:43 +00001174 comp = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1175 c->c_arena),
1176 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001177
Nick Coghlan650f0d02007-04-15 12:05:43 +00001178 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 if (NCH(ch) == 5) {
1182 int j, n_ifs;
1183 asdl_seq *ifs;
1184
1185 ch = CHILD(ch, 4);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001186 n_ifs = count_comp_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001187 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001188 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001189
1190 ifs = asdl_seq_new(n_ifs, c->c_arena);
1191 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001193
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 for (j = 0; j < n_ifs; j++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001195 REQ(ch, comp_iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001197 REQ(ch, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001199 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001201 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001202 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 if (NCH(ch) == 3)
1204 ch = CHILD(ch, 2);
1205 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001206 /* on exit, must guarantee that ch is a comp_for */
1207 if (TYPE(ch) == comp_iter)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 ch = CHILD(ch, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001209 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001211 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001213
1214 if (type == COMP_GENEXP)
1215 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1216 else if (type == COMP_LISTCOMP)
1217 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1218 else if (type == COMP_SETCOMP)
1219 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1220 else
1221 /* Should never happen */
1222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223}
1224
1225static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001226ast_for_genexp(struct compiling *c, const node *n)
1227{
1228 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1229 return ast_for_comprehension(c, n, COMP_GENEXP);
1230}
1231
1232static expr_ty
1233ast_for_listcomp(struct compiling *c, const node *n)
1234{
1235 assert(TYPE(n) == (testlist_comp));
1236 return ast_for_comprehension(c, n, COMP_LISTCOMP);
1237}
1238
1239static expr_ty
1240ast_for_setcomp(struct compiling *c, const node *n)
1241{
1242 assert(TYPE(n) == (dictorsetmaker));
1243 return ast_for_comprehension(c, n, COMP_SETCOMP);
1244}
1245
1246
1247static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248ast_for_atom(struct compiling *c, const node *n)
1249{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001250 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1251 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001252 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253 */
1254 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001255 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256
1257 switch (TYPE(ch)) {
1258 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001259 /* All names start in Load context, but may later be
1260 changed. */
1261 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001263 PyObject *str = parsestrplus(c, n, &bytesmode);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001264 if (!str)
1265 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001266
Thomas Wouters89f507f2006-12-13 04:49:30 +00001267 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001268 if (bytesmode)
1269 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1270 else
1271 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 }
1273 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001274 PyObject *pynum = parsenumber(STR(ch));
1275 if (!pynum)
1276 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001277
Thomas Wouters89f507f2006-12-13 04:49:30 +00001278 PyArena_AddPyObject(c->c_arena, pynum);
1279 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 }
Georg Brandldde00282007-03-18 19:01:53 +00001281 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001282 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001284 ch = CHILD(n, 1);
1285
1286 if (TYPE(ch) == RPAR)
1287 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1288
1289 if (TYPE(ch) == yield_expr)
1290 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001291
1292 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1293 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001294 return ast_for_genexp(c, ch);
1295
Nick Coghlan650f0d02007-04-15 12:05:43 +00001296 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001298 ch = CHILD(n, 1);
1299
1300 if (TYPE(ch) == RSQB)
1301 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1302
Nick Coghlan650f0d02007-04-15 12:05:43 +00001303 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001304 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1305 asdl_seq *elts = seq_for_testlist(c, ch);
1306 if (!elts)
1307 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001308
Thomas Wouters89f507f2006-12-13 04:49:30 +00001309 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1310 }
1311 else
1312 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001314 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1315 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001316 int i, size;
1317 asdl_seq *keys, *values;
1318
1319 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001320 if (TYPE(ch) == RBRACE) {
1321 /* it's an empty dict */
1322 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1323 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1324 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001325 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001326 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001327 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001328 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001329 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001330 for (i = 0; i < NCH(ch); i += 2) {
1331 expr_ty expression;
1332 expression = ast_for_expr(c, CHILD(ch, i));
1333 if (!expression)
1334 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001335 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001336 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001337 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1338 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1339 /* it's a set comprehension */
1340 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001341 } else {
1342 /* it's a dict */
1343 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1344 keys = asdl_seq_new(size, c->c_arena);
1345 if (!keys)
1346 return NULL;
1347
1348 values = asdl_seq_new(size, c->c_arena);
1349 if (!values)
1350 return NULL;
1351
1352 for (i = 0; i < NCH(ch); i += 4) {
1353 expr_ty expression;
1354
1355 expression = ast_for_expr(c, CHILD(ch, i));
1356 if (!expression)
1357 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001358
Guido van Rossum86e58e22006-08-28 15:27:34 +00001359 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001360
Guido van Rossum86e58e22006-08-28 15:27:34 +00001361 expression = ast_for_expr(c, CHILD(ch, i + 2));
1362 if (!expression)
1363 return NULL;
1364
1365 asdl_seq_SET(values, i / 4, expression);
1366 }
1367 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1368 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001371 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1372 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373 }
1374}
1375
1376static slice_ty
1377ast_for_slice(struct compiling *c, const node *n)
1378{
1379 node *ch;
1380 expr_ty lower = NULL, upper = NULL, step = NULL;
1381
1382 REQ(n, subscript);
1383
1384 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001385 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 sliceop: ':' [test]
1387 */
1388 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 if (NCH(n) == 1 && TYPE(ch) == test) {
1390 /* 'step' variable hold no significance in terms of being used over
1391 other vars */
1392 step = ast_for_expr(c, ch);
1393 if (!step)
1394 return NULL;
1395
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 }
1398
1399 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001400 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 if (!lower)
1402 return NULL;
1403 }
1404
1405 /* If there's an upper bound it's in the second or third position. */
1406 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001407 if (NCH(n) > 1) {
1408 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 if (TYPE(n2) == test) {
1411 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 if (!upper)
1413 return NULL;
1414 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001415 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001417 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418
Thomas Wouters89f507f2006-12-13 04:49:30 +00001419 if (TYPE(n2) == test) {
1420 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421 if (!upper)
1422 return NULL;
1423 }
1424 }
1425
1426 ch = CHILD(n, NCH(n) - 1);
1427 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001428 if (NCH(ch) == 1) {
1429 /* No expression, so step is None */
1430 ch = CHILD(ch, 0);
1431 step = Name(new_identifier("None", c->c_arena), Load,
1432 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433 if (!step)
1434 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001435 } else {
1436 ch = CHILD(ch, 1);
1437 if (TYPE(ch) == test) {
1438 step = ast_for_expr(c, ch);
1439 if (!step)
1440 return NULL;
1441 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442 }
1443 }
1444
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001445 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446}
1447
1448static expr_ty
1449ast_for_binop(struct compiling *c, const node *n)
1450{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001451 /* Must account for a sequence of expressions.
1452 How should A op B op C by represented?
1453 BinOp(BinOp(A, op, B), op, C).
1454 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455
Guido van Rossumd8faa362007-04-27 19:54:29 +00001456 int i, nops;
1457 expr_ty expr1, expr2, result;
1458 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459
Guido van Rossumd8faa362007-04-27 19:54:29 +00001460 expr1 = ast_for_expr(c, CHILD(n, 0));
1461 if (!expr1)
1462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463
Guido van Rossumd8faa362007-04-27 19:54:29 +00001464 expr2 = ast_for_expr(c, CHILD(n, 2));
1465 if (!expr2)
1466 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467
Guido van Rossumd8faa362007-04-27 19:54:29 +00001468 newoperator = get_operator(CHILD(n, 1));
1469 if (!newoperator)
1470 return NULL;
1471
1472 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1473 c->c_arena);
1474 if (!result)
1475 return NULL;
1476
1477 nops = (NCH(n) - 1) / 2;
1478 for (i = 1; i < nops; i++) {
1479 expr_ty tmp_result, tmp;
1480 const node* next_oper = CHILD(n, i * 2 + 1);
1481
1482 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001483 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 return NULL;
1485
Guido van Rossumd8faa362007-04-27 19:54:29 +00001486 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1487 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 return NULL;
1489
Guido van Rossumd8faa362007-04-27 19:54:29 +00001490 tmp_result = BinOp(result, newoperator, tmp,
1491 LINENO(next_oper), next_oper->n_col_offset,
1492 c->c_arena);
1493 if (!tmp)
1494 return NULL;
1495 result = tmp_result;
1496 }
1497 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498}
1499
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001500static expr_ty
1501ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1502{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001503 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1504 subscriptlist: subscript (',' subscript)* [',']
1505 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1506 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001507 REQ(n, trailer);
1508 if (TYPE(CHILD(n, 0)) == LPAR) {
1509 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001510 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1511 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001512 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001513 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001514 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001515 else if (TYPE(CHILD(n, 0)) == DOT ) {
1516 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001517 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001518 }
1519 else {
1520 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001521 REQ(CHILD(n, 2), RSQB);
1522 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001523 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001524 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1525 if (!slc)
1526 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001527 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1528 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001529 }
1530 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001531 /* The grammar is ambiguous here. The ambiguity is resolved
1532 by treating the sequence as a tuple literal if there are
1533 no slice features.
1534 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001535 int j;
1536 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001537 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001538 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001539 asdl_seq *slices, *elts;
1540 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001541 if (!slices)
1542 return NULL;
1543 for (j = 0; j < NCH(n); j += 2) {
1544 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001545 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001546 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001547 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001548 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001549 asdl_seq_SET(slices, j / 2, slc);
1550 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001551 if (!simple) {
1552 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001553 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001554 }
1555 /* extract Index values and put them in a Tuple */
1556 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001557 if (!elts)
1558 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001559 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1560 slc = (slice_ty)asdl_seq_GET(slices, j);
1561 assert(slc->kind == Index_kind && slc->v.Index.value);
1562 asdl_seq_SET(elts, j, slc->v.Index.value);
1563 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001564 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001565 if (!e)
1566 return NULL;
1567 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001568 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001569 }
1570 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001571}
1572
1573static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001574ast_for_factor(struct compiling *c, const node *n)
1575{
1576 node *pfactor, *ppower, *patom, *pnum;
1577 expr_ty expression;
1578
1579 /* If the unary - operator is applied to a constant, don't generate
1580 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1581 constant. The peephole optimizer already does something like
1582 this but it doesn't handle the case where the constant is
1583 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1584 PyLongObject.
1585 */
1586 if (TYPE(CHILD(n, 0)) == MINUS
1587 && NCH(n) == 2
1588 && TYPE((pfactor = CHILD(n, 1))) == factor
1589 && NCH(pfactor) == 1
1590 && TYPE((ppower = CHILD(pfactor, 0))) == power
1591 && NCH(ppower) == 1
1592 && TYPE((patom = CHILD(ppower, 0))) == atom
1593 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1594 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1595 if (s == NULL)
1596 return NULL;
1597 s[0] = '-';
1598 strcpy(s + 1, STR(pnum));
1599 PyObject_FREE(STR(pnum));
1600 STR(pnum) = s;
1601 return ast_for_atom(c, patom);
1602 }
1603
1604 expression = ast_for_expr(c, CHILD(n, 1));
1605 if (!expression)
1606 return NULL;
1607
1608 switch (TYPE(CHILD(n, 0))) {
1609 case PLUS:
1610 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1611 c->c_arena);
1612 case MINUS:
1613 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1614 c->c_arena);
1615 case TILDE:
1616 return UnaryOp(Invert, expression, LINENO(n),
1617 n->n_col_offset, c->c_arena);
1618 }
1619 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1620 TYPE(CHILD(n, 0)));
1621 return NULL;
1622}
1623
1624static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625ast_for_power(struct compiling *c, const node *n)
1626{
1627 /* power: atom trailer* ('**' factor)*
1628 */
1629 int i;
1630 expr_ty e, tmp;
1631 REQ(n, power);
1632 e = ast_for_atom(c, CHILD(n, 0));
1633 if (!e)
1634 return NULL;
1635 if (NCH(n) == 1)
1636 return e;
1637 for (i = 1; i < NCH(n); i++) {
1638 node *ch = CHILD(n, i);
1639 if (TYPE(ch) != trailer)
1640 break;
1641 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001642 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001643 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001644 tmp->lineno = e->lineno;
1645 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 e = tmp;
1647 }
1648 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1649 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001650 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001651 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001652 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001653 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001654 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001655 e = tmp;
1656 }
1657 return e;
1658}
1659
Guido van Rossum0368b722007-05-11 16:50:42 +00001660static expr_ty
1661ast_for_starred(struct compiling *c, const node *n)
1662{
1663 expr_ty tmp;
1664 REQ(n, star_expr);
1665
1666 tmp = ast_for_expr(c, CHILD(n, 1));
1667 if (!tmp)
1668 return NULL;
1669
1670 /* The Load context is changed later. */
1671 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1672}
1673
1674
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675/* Do not name a variable 'expr'! Will cause a compile error.
1676*/
1677
1678static expr_ty
1679ast_for_expr(struct compiling *c, const node *n)
1680{
1681 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001682 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001683 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001684 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685 and_test: not_test ('and' not_test)*
1686 not_test: 'not' not_test | comparison
1687 comparison: expr (comp_op expr)*
1688 expr: xor_expr ('|' xor_expr)*
1689 xor_expr: and_expr ('^' and_expr)*
1690 and_expr: shift_expr ('&' shift_expr)*
1691 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1692 arith_expr: term (('+'|'-') term)*
1693 term: factor (('*'|'/'|'%'|'//') factor)*
1694 factor: ('+'|'-'|'~') factor | power
1695 power: atom trailer* ('**' factor)*
1696 */
1697
1698 asdl_seq *seq;
1699 int i;
1700
1701 loop:
1702 switch (TYPE(n)) {
1703 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001704 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001705 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001706 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001707 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001708 else if (NCH(n) > 1)
1709 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001710 /* Fallthrough */
1711 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 case and_test:
1713 if (NCH(n) == 1) {
1714 n = CHILD(n, 0);
1715 goto loop;
1716 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001717 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 if (!seq)
1719 return NULL;
1720 for (i = 0; i < NCH(n); i += 2) {
1721 expr_ty e = ast_for_expr(c, CHILD(n, i));
1722 if (!e)
1723 return NULL;
1724 asdl_seq_SET(seq, i / 2, e);
1725 }
1726 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001727 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1728 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001729 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001730 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 case not_test:
1732 if (NCH(n) == 1) {
1733 n = CHILD(n, 0);
1734 goto loop;
1735 }
1736 else {
1737 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1738 if (!expression)
1739 return NULL;
1740
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001741 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1742 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 }
1744 case comparison:
1745 if (NCH(n) == 1) {
1746 n = CHILD(n, 0);
1747 goto loop;
1748 }
1749 else {
1750 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001751 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001752 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001753 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754 if (!ops)
1755 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001756 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 return NULL;
1759 }
1760 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001761 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001763 newoperator = ast_for_comp_op(CHILD(n, i));
1764 if (!newoperator) {
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
1768 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001769 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001771 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001772
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001773 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 asdl_seq_SET(cmps, i / 2, expression);
1775 }
1776 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001777 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001779 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001781 return Compare(expression, ops, cmps, LINENO(n),
1782 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783 }
1784 break;
1785
Guido van Rossum0368b722007-05-11 16:50:42 +00001786 case star_expr:
1787 if (TYPE(CHILD(n, 0)) == STAR) {
1788 return ast_for_starred(c, n);
1789 }
1790 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 /* The next five cases all handle BinOps. The main body of code
1792 is the same in each case, but the switch turned inside out to
1793 reuse the code for each type of operator.
1794 */
1795 case expr:
1796 case xor_expr:
1797 case and_expr:
1798 case shift_expr:
1799 case arith_expr:
1800 case term:
1801 if (NCH(n) == 1) {
1802 n = CHILD(n, 0);
1803 goto loop;
1804 }
1805 return ast_for_binop(c, n);
1806 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001807 expr_ty exp = NULL;
1808 if (NCH(n) == 2) {
1809 exp = ast_for_testlist(c, CHILD(n, 1));
1810 if (!exp)
1811 return NULL;
1812 }
1813 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1814 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001815 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 if (NCH(n) == 1) {
1817 n = CHILD(n, 0);
1818 goto loop;
1819 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001820 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001821 case power:
1822 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001824 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 return NULL;
1826 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001827 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 return NULL;
1829}
1830
1831static expr_ty
1832ast_for_call(struct compiling *c, const node *n, expr_ty func)
1833{
1834 /*
1835 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1836 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001837 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838 */
1839
1840 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001841 asdl_seq *args;
1842 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 expr_ty vararg = NULL, kwarg = NULL;
1844
1845 REQ(n, arglist);
1846
1847 nargs = 0;
1848 nkeywords = 0;
1849 ngens = 0;
1850 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001851 node *ch = CHILD(n, i);
1852 if (TYPE(ch) == argument) {
1853 if (NCH(ch) == 1)
1854 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001855 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001856 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 nkeywords++;
1859 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 }
1861 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001862 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 "if not sole argument");
1864 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 }
1866
1867 if (nargs + nkeywords + ngens > 255) {
1868 ast_error(n, "more than 255 arguments");
1869 return NULL;
1870 }
1871
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001872 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001874 return NULL;
1875 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001877 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 nargs = 0;
1879 nkeywords = 0;
1880 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 node *ch = CHILD(n, i);
1882 if (TYPE(ch) == argument) {
1883 expr_ty e;
1884 if (NCH(ch) == 1) {
1885 if (nkeywords) {
1886 ast_error(CHILD(ch, 0),
1887 "non-keyword arg after keyword arg");
1888 return NULL;
1889 }
1890 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001892 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 asdl_seq_SET(args, nargs++, e);
1894 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001895 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001898 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 else {
1902 keyword_ty kw;
1903 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 /* CHILD(ch, 0) is test, but must be an identifier? */
1906 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001908 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 /* f(lambda x: x[0] = 3) ends up getting parsed with
1910 * LHS test = lambda x: x[0], and RHS test = 3.
1911 * SF bug 132313 points out that complaining about a keyword
1912 * then is very confusing.
1913 */
1914 if (e->kind == Lambda_kind) {
1915 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001916 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917 } else if (e->kind != Name_kind) {
1918 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001919 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001920 } else if (forbidden_name(e, ch)) {
1921 return NULL;
1922 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001923 key = e->v.Name.id;
1924 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001926 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001927 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001929 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001930 asdl_seq_SET(keywords, nkeywords++, kw);
1931 }
1932 }
1933 else if (TYPE(ch) == STAR) {
1934 vararg = ast_for_expr(c, CHILD(n, i+1));
1935 i++;
1936 }
1937 else if (TYPE(ch) == DOUBLESTAR) {
1938 kwarg = ast_for_expr(c, CHILD(n, i+1));
1939 i++;
1940 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 }
1942
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001943 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944}
1945
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001947ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001949 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001950 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001951 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001953 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001954 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001955 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001956 }
1957 else {
1958 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001959 TYPE(n) == testlist1);
1960 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001962 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 else {
1964 asdl_seq *tmp = seq_for_testlist(c, n);
1965 if (!tmp)
1966 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001967 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001969}
1970
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971static stmt_ty
1972ast_for_expr_stmt(struct compiling *c, const node *n)
1973{
1974 REQ(n, expr_stmt);
1975 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1976 | ('=' (yield_expr|testlist))*)
1977 testlist: test (',' test)* [',']
1978 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00001979 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 test: ... here starts the operator precendence dance
1981 */
1982
1983 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001984 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 if (!e)
1986 return NULL;
1987
Thomas Wouters89f507f2006-12-13 04:49:30 +00001988 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 }
1990 else if (TYPE(CHILD(n, 1)) == augassign) {
1991 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001992 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001993 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 if (!expr1)
1997 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001998 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001999 switch (expr1->kind) {
2000 case GeneratorExp_kind:
2001 ast_error(ch, "augmented assignment to generator "
2002 "expression not possible");
2003 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002004 case Yield_kind:
2005 ast_error(ch, "augmented assignment to yield "
2006 "expression not possible");
2007 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002008 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002009 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002010 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002011 break;
2012 }
2013 case Attribute_kind:
2014 case Subscript_kind:
2015 break;
2016 default:
2017 ast_error(ch, "illegal expression for augmented "
2018 "assignment");
2019 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022
Thomas Wouters89f507f2006-12-13 04:49:30 +00002023 ch = CHILD(n, 2);
2024 if (TYPE(ch) == testlist)
2025 expr2 = ast_for_testlist(c, ch);
2026 else
2027 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002028 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 return NULL;
2030
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002031 newoperator = ast_for_augassign(CHILD(n, 1));
2032 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 return NULL;
2034
Thomas Wouters89f507f2006-12-13 04:49:30 +00002035 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 }
2037 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 int i;
2039 asdl_seq *targets;
2040 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041 expr_ty expression;
2042
Thomas Wouters89f507f2006-12-13 04:49:30 +00002043 /* a normal assignment */
2044 REQ(CHILD(n, 1), EQUAL);
2045 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2046 if (!targets)
2047 return NULL;
2048 for (i = 0; i < NCH(n) - 2; i += 2) {
2049 expr_ty e;
2050 node *ch = CHILD(n, i);
2051 if (TYPE(ch) == yield_expr) {
2052 ast_error(ch, "assignment to yield expression not possible");
2053 return NULL;
2054 }
2055 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056
Thomas Wouters89f507f2006-12-13 04:49:30 +00002057 /* set context to assign */
2058 if (!e)
2059 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060
Thomas Wouters89f507f2006-12-13 04:49:30 +00002061 if (!set_context(e, Store, CHILD(n, i)))
2062 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063
Thomas Wouters89f507f2006-12-13 04:49:30 +00002064 asdl_seq_SET(targets, i / 2, e);
2065 }
2066 value = CHILD(n, NCH(n) - 1);
2067 if (TYPE(value) == testlist)
2068 expression = ast_for_testlist(c, value);
2069 else
2070 expression = ast_for_expr(c, value);
2071 if (!expression)
2072 return NULL;
2073 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075}
2076
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002078ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079{
2080 asdl_seq *seq;
2081 int i;
2082 expr_ty e;
2083
2084 REQ(n, exprlist);
2085
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002086 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002088 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002090 e = ast_for_expr(c, CHILD(n, i));
2091 if (!e)
2092 return NULL;
2093 asdl_seq_SET(seq, i / 2, e);
2094 if (context && !set_context(e, context, CHILD(n, i)))
2095 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096 }
2097 return seq;
2098}
2099
2100static stmt_ty
2101ast_for_del_stmt(struct compiling *c, const node *n)
2102{
2103 asdl_seq *expr_list;
2104
2105 /* del_stmt: 'del' exprlist */
2106 REQ(n, del_stmt);
2107
2108 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2109 if (!expr_list)
2110 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002111 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112}
2113
2114static stmt_ty
2115ast_for_flow_stmt(struct compiling *c, const node *n)
2116{
2117 /*
2118 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2119 | yield_stmt
2120 break_stmt: 'break'
2121 continue_stmt: 'continue'
2122 return_stmt: 'return' [testlist]
2123 yield_stmt: yield_expr
2124 yield_expr: 'yield' testlist
2125 raise_stmt: 'raise' [test [',' test [',' test]]]
2126 */
2127 node *ch;
2128
2129 REQ(n, flow_stmt);
2130 ch = CHILD(n, 0);
2131 switch (TYPE(ch)) {
2132 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002133 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002135 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2138 if (!exp)
2139 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002140 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141 }
2142 case return_stmt:
2143 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002144 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002146 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 if (!expression)
2148 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002149 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150 }
2151 case raise_stmt:
2152 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002153 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 else if (NCH(ch) == 2) {
2155 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2156 if (!expression)
2157 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002158 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159 }
2160 else if (NCH(ch) == 4) {
2161 expr_ty expr1, expr2;
2162
2163 expr1 = ast_for_expr(c, CHILD(ch, 1));
2164 if (!expr1)
2165 return NULL;
2166 expr2 = ast_for_expr(c, CHILD(ch, 3));
2167 if (!expr2)
2168 return NULL;
2169
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002170 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 }
2172 else if (NCH(ch) == 6) {
2173 expr_ty expr1, expr2, expr3;
2174
2175 expr1 = ast_for_expr(c, CHILD(ch, 1));
2176 if (!expr1)
2177 return NULL;
2178 expr2 = ast_for_expr(c, CHILD(ch, 3));
2179 if (!expr2)
2180 return NULL;
2181 expr3 = ast_for_expr(c, CHILD(ch, 5));
2182 if (!expr3)
2183 return NULL;
2184
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002185 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 }
2187 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002188 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 "unexpected flow_stmt: %d", TYPE(ch));
2190 return NULL;
2191 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002192
2193 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2194 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002195}
2196
2197static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002198alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199{
2200 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002201 import_as_name: NAME ['as' NAME]
2202 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 dotted_name: NAME ('.' NAME)*
2204 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002205 PyObject *str;
2206
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 loop:
2208 switch (TYPE(n)) {
2209 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002210 str = NULL;
2211 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002212 str = NEW_IDENTIFIER(CHILD(n, 2));
2213 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002214 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215 case dotted_as_name:
2216 if (NCH(n) == 1) {
2217 n = CHILD(n, 0);
2218 goto loop;
2219 }
2220 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002221 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002222 if (!a)
2223 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 assert(!a->asname);
2225 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2226 return a;
2227 }
2228 break;
2229 case dotted_name:
2230 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002231 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 else {
2233 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002234 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002235 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002237 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238
2239 len = 0;
2240 for (i = 0; i < NCH(n); i += 2)
2241 /* length of string plus one for the dot */
2242 len += strlen(STR(CHILD(n, i))) + 1;
2243 len--; /* the last name doesn't have a dot */
2244 str = PyString_FromStringAndSize(NULL, len);
2245 if (!str)
2246 return NULL;
2247 s = PyString_AS_STRING(str);
2248 if (!s)
2249 return NULL;
2250 for (i = 0; i < NCH(n); i += 2) {
2251 char *sch = STR(CHILD(n, i));
2252 strcpy(s, STR(CHILD(n, i)));
2253 s += strlen(sch);
2254 *s++ = '.';
2255 }
2256 --s;
2257 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002258 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2259 PyString_GET_SIZE(str),
2260 NULL);
2261 Py_DECREF(str);
2262 if (!uni)
2263 return NULL;
2264 str = uni;
2265 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002266 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002267 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 }
2269 break;
2270 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002271 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002272 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002273 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002275 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 "unexpected import name: %d", TYPE(n));
2277 return NULL;
2278 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002279
2280 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 return NULL;
2282}
2283
2284static stmt_ty
2285ast_for_import_stmt(struct compiling *c, const node *n)
2286{
2287 /*
2288 import_stmt: import_name | import_from
2289 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002290 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2291 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002293 int lineno;
2294 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295 int i;
2296 asdl_seq *aliases;
2297
2298 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002299 lineno = LINENO(n);
2300 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002302 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002304 REQ(n, dotted_as_names);
2305 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2306 if (!aliases)
2307 return NULL;
2308 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002309 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002310 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002312 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002314 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002316 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002318 int idx, ndots = 0;
2319 alias_ty mod = NULL;
2320 identifier modname;
2321
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002322 /* Count the number of dots (for relative imports) and check for the
2323 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002324 for (idx = 1; idx < NCH(n); idx++) {
2325 if (TYPE(CHILD(n, idx)) == dotted_name) {
2326 mod = alias_for_import_name(c, CHILD(n, idx));
2327 idx++;
2328 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002329 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2330 /* three consecutive dots are tokenized as one ELLIPSIS */
2331 ndots += 3;
2332 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002333 } else if (TYPE(CHILD(n, idx)) != DOT) {
2334 break;
2335 }
2336 ndots++;
2337 }
2338 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002339 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002340 case STAR:
2341 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 n = CHILD(n, idx);
2343 n_children = 1;
2344 if (ndots) {
2345 ast_error(n, "'import *' not allowed with 'from .'");
2346 return NULL;
2347 }
2348 break;
2349 case LPAR:
2350 /* from ... import (x, y, z) */
2351 n = CHILD(n, idx + 1);
2352 n_children = NCH(n);
2353 break;
2354 case import_as_names:
2355 /* from ... import x, y, z */
2356 n = CHILD(n, idx);
2357 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002358 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 ast_error(n, "trailing comma not allowed without"
2360 " surrounding parentheses");
2361 return NULL;
2362 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002363 break;
2364 default:
2365 ast_error(n, "Unexpected node-type in from-import");
2366 return NULL;
2367 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368
Thomas Wouters89f507f2006-12-13 04:49:30 +00002369 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2370 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372
2373 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002374 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002375 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002376 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002380 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002381 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002382 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2383 if (!import_alias)
2384 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002385 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002386 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002388 if (mod != NULL)
2389 modname = mod->name;
2390 else
2391 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002392 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002393 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 }
Neal Norwitz79792652005-11-14 04:25:03 +00002395 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 "unknown import statement: starts with command '%s'",
2397 STR(CHILD(n, 0)));
2398 return NULL;
2399}
2400
2401static stmt_ty
2402ast_for_global_stmt(struct compiling *c, const node *n)
2403{
2404 /* global_stmt: 'global' NAME (',' NAME)* */
2405 identifier name;
2406 asdl_seq *s;
2407 int i;
2408
2409 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002410 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002414 name = NEW_IDENTIFIER(CHILD(n, i));
2415 if (!name)
2416 return NULL;
2417 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002419 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420}
2421
2422static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002423ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2424{
2425 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2426 identifier name;
2427 asdl_seq *s;
2428 int i;
2429
2430 REQ(n, nonlocal_stmt);
2431 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2432 if (!s)
2433 return NULL;
2434 for (i = 1; i < NCH(n); i += 2) {
2435 name = NEW_IDENTIFIER(CHILD(n, i));
2436 if (!name)
2437 return NULL;
2438 asdl_seq_SET(s, i / 2, name);
2439 }
2440 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2441}
2442
2443static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444ast_for_assert_stmt(struct compiling *c, const node *n)
2445{
2446 /* assert_stmt: 'assert' test [',' test] */
2447 REQ(n, assert_stmt);
2448 if (NCH(n) == 2) {
2449 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2450 if (!expression)
2451 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002452 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 }
2454 else if (NCH(n) == 4) {
2455 expr_ty expr1, expr2;
2456
2457 expr1 = ast_for_expr(c, CHILD(n, 1));
2458 if (!expr1)
2459 return NULL;
2460 expr2 = ast_for_expr(c, CHILD(n, 3));
2461 if (!expr2)
2462 return NULL;
2463
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 }
Neal Norwitz79792652005-11-14 04:25:03 +00002466 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 "improper number of parts to 'assert' statement: %d",
2468 NCH(n));
2469 return NULL;
2470}
2471
2472static asdl_seq *
2473ast_for_suite(struct compiling *c, const node *n)
2474{
2475 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002476 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 stmt_ty s;
2478 int i, total, num, end, pos = 0;
2479 node *ch;
2480
2481 REQ(n, suite);
2482
2483 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002484 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 n = CHILD(n, 0);
2489 /* simple_stmt always ends with a NEWLINE,
2490 and may have a trailing SEMI
2491 */
2492 end = NCH(n) - 1;
2493 if (TYPE(CHILD(n, end - 1)) == SEMI)
2494 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 for (i = 0; i < end; i += 2) {
2497 ch = CHILD(n, i);
2498 s = ast_for_stmt(c, ch);
2499 if (!s)
2500 return NULL;
2501 asdl_seq_SET(seq, pos++, s);
2502 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 }
2504 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 for (i = 2; i < (NCH(n) - 1); i++) {
2506 ch = CHILD(n, i);
2507 REQ(ch, stmt);
2508 num = num_stmts(ch);
2509 if (num == 1) {
2510 /* small_stmt or compound_stmt with only one child */
2511 s = ast_for_stmt(c, ch);
2512 if (!s)
2513 return NULL;
2514 asdl_seq_SET(seq, pos++, s);
2515 }
2516 else {
2517 int j;
2518 ch = CHILD(ch, 0);
2519 REQ(ch, simple_stmt);
2520 for (j = 0; j < NCH(ch); j += 2) {
2521 /* statement terminates with a semi-colon ';' */
2522 if (NCH(CHILD(ch, j)) == 0) {
2523 assert((j + 1) == NCH(ch));
2524 break;
2525 }
2526 s = ast_for_stmt(c, CHILD(ch, j));
2527 if (!s)
2528 return NULL;
2529 asdl_seq_SET(seq, pos++, s);
2530 }
2531 }
2532 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 }
2534 assert(pos == seq->size);
2535 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536}
2537
2538static stmt_ty
2539ast_for_if_stmt(struct compiling *c, const node *n)
2540{
2541 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2542 ['else' ':' suite]
2543 */
2544 char *s;
2545
2546 REQ(n, if_stmt);
2547
2548 if (NCH(n) == 4) {
2549 expr_ty expression;
2550 asdl_seq *suite_seq;
2551
2552 expression = ast_for_expr(c, CHILD(n, 1));
2553 if (!expression)
2554 return NULL;
2555 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002556 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 return NULL;
2558
Guido van Rossumd8faa362007-04-27 19:54:29 +00002559 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2560 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002562
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 s = STR(CHILD(n, 4));
2564 /* s[2], the third character in the string, will be
2565 's' for el_s_e, or
2566 'i' for el_i_f
2567 */
2568 if (s[2] == 's') {
2569 expr_ty expression;
2570 asdl_seq *seq1, *seq2;
2571
2572 expression = ast_for_expr(c, CHILD(n, 1));
2573 if (!expression)
2574 return NULL;
2575 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002576 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 return NULL;
2578 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002579 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 return NULL;
2581
Guido van Rossumd8faa362007-04-27 19:54:29 +00002582 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2583 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 }
2585 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002586 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002587 expr_ty expression;
2588 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 asdl_seq *orelse = NULL;
2590 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 /* must reference the child n_elif+1 since 'else' token is third,
2592 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002593 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2594 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2595 has_else = 1;
2596 n_elif -= 3;
2597 }
2598 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599
Thomas Wouters89f507f2006-12-13 04:49:30 +00002600 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002601 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602
Thomas Wouters89f507f2006-12-13 04:49:30 +00002603 orelse = asdl_seq_new(1, c->c_arena);
2604 if (!orelse)
2605 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002607 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002609 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2610 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002612 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2613 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615
Guido van Rossumd8faa362007-04-27 19:54:29 +00002616 asdl_seq_SET(orelse, 0,
2617 If(expression, suite_seq, suite_seq2,
2618 LINENO(CHILD(n, NCH(n) - 6)),
2619 CHILD(n, NCH(n) - 6)->n_col_offset,
2620 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 /* the just-created orelse handled the last elif */
2622 n_elif--;
2623 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624
Thomas Wouters89f507f2006-12-13 04:49:30 +00002625 for (i = 0; i < n_elif; i++) {
2626 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002627 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2628 if (!newobj)
2629 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002631 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002634 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636
Thomas Wouters89f507f2006-12-13 04:49:30 +00002637 asdl_seq_SET(newobj, 0,
2638 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002639 LINENO(CHILD(n, off)),
2640 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 orelse = newobj;
2642 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002643 expression = ast_for_expr(c, CHILD(n, 1));
2644 if (!expression)
2645 return NULL;
2646 suite_seq = ast_for_suite(c, CHILD(n, 3));
2647 if (!suite_seq)
2648 return NULL;
2649 return If(expression, suite_seq, orelse,
2650 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002652
2653 PyErr_Format(PyExc_SystemError,
2654 "unexpected token in 'if' statement: %s", s);
2655 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656}
2657
2658static stmt_ty
2659ast_for_while_stmt(struct compiling *c, const node *n)
2660{
2661 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2662 REQ(n, while_stmt);
2663
2664 if (NCH(n) == 4) {
2665 expr_ty expression;
2666 asdl_seq *suite_seq;
2667
2668 expression = ast_for_expr(c, CHILD(n, 1));
2669 if (!expression)
2670 return NULL;
2671 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002672 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002674 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 }
2676 else if (NCH(n) == 7) {
2677 expr_ty expression;
2678 asdl_seq *seq1, *seq2;
2679
2680 expression = ast_for_expr(c, CHILD(n, 1));
2681 if (!expression)
2682 return NULL;
2683 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002684 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 return NULL;
2686 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002687 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 return NULL;
2689
Thomas Wouters89f507f2006-12-13 04:49:30 +00002690 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002692
2693 PyErr_Format(PyExc_SystemError,
2694 "wrong number of tokens for 'while' statement: %d",
2695 NCH(n));
2696 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697}
2698
2699static stmt_ty
2700ast_for_for_stmt(struct compiling *c, const node *n)
2701{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002702 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 expr_ty expression;
2704 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002705 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2707 REQ(n, for_stmt);
2708
2709 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002710 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 if (!seq)
2712 return NULL;
2713 }
2714
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002715 node_target = CHILD(n, 1);
2716 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002717 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002719 /* Check the # of children rather than the length of _target, since
2720 for x, in ... has 1 element in _target, but still requires a Tuple. */
2721 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002724 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002726 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002727 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return NULL;
2729 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002730 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 return NULL;
2732
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002733 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2734 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735}
2736
2737static excepthandler_ty
2738ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2739{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002740 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 REQ(exc, except_clause);
2742 REQ(body, suite);
2743
2744 if (NCH(exc) == 1) {
2745 asdl_seq *suite_seq = ast_for_suite(c, body);
2746 if (!suite_seq)
2747 return NULL;
2748
Thomas Wouters89f507f2006-12-13 04:49:30 +00002749 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002750 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751 }
2752 else if (NCH(exc) == 2) {
2753 expr_ty expression;
2754 asdl_seq *suite_seq;
2755
2756 expression = ast_for_expr(c, CHILD(exc, 1));
2757 if (!expression)
2758 return NULL;
2759 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002760 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 return NULL;
2762
Thomas Wouters89f507f2006-12-13 04:49:30 +00002763 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002764 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 }
2766 else if (NCH(exc) == 4) {
2767 asdl_seq *suite_seq;
2768 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002769 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002770 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002773 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return NULL;
2775 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 return NULL;
2778
Thomas Wouters89f507f2006-12-13 04:49:30 +00002779 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002780 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002782
2783 PyErr_Format(PyExc_SystemError,
2784 "wrong number of children for 'except' clause: %d",
2785 NCH(exc));
2786 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787}
2788
2789static stmt_ty
2790ast_for_try_stmt(struct compiling *c, const node *n)
2791{
Neal Norwitzf599f422005-12-17 21:33:47 +00002792 const int nch = NCH(n);
2793 int n_except = (nch - 3)/3;
2794 asdl_seq *body, *orelse = NULL, *finally = NULL;
2795
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 REQ(n, try_stmt);
2797
Neal Norwitzf599f422005-12-17 21:33:47 +00002798 body = ast_for_suite(c, CHILD(n, 2));
2799 if (body == NULL)
2800 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801
Neal Norwitzf599f422005-12-17 21:33:47 +00002802 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2803 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2804 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2805 /* we can assume it's an "else",
2806 because nch >= 9 for try-else-finally and
2807 it would otherwise have a type of except_clause */
2808 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2809 if (orelse == NULL)
2810 return NULL;
2811 n_except--;
2812 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813
Neal Norwitzf599f422005-12-17 21:33:47 +00002814 finally = ast_for_suite(c, CHILD(n, nch - 1));
2815 if (finally == NULL)
2816 return NULL;
2817 n_except--;
2818 }
2819 else {
2820 /* we can assume it's an "else",
2821 otherwise it would have a type of except_clause */
2822 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2823 if (orelse == NULL)
2824 return NULL;
2825 n_except--;
2826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002828 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002829 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 return NULL;
2831 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002832
2833 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002834 int i;
2835 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002836 /* process except statements to create a try ... except */
2837 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2838 if (handlers == NULL)
2839 return NULL;
2840
2841 for (i = 0; i < n_except; i++) {
2842 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2843 CHILD(n, 5 + i * 3));
2844 if (!e)
2845 return NULL;
2846 asdl_seq_SET(handlers, i, e);
2847 }
2848
Thomas Wouters89f507f2006-12-13 04:49:30 +00002849 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002850 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002851 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002852 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002853
2854 /* if a 'finally' is present too, we nest the TryExcept within a
2855 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002856 body = asdl_seq_new(1, c->c_arena);
2857 if (body == NULL)
2858 return NULL;
2859 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002860 }
2861
2862 /* must be a try ... finally (except clauses are in body, if any exist) */
2863 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002864 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865}
2866
Guido van Rossumc2e20742006-02-27 22:32:47 +00002867static expr_ty
2868ast_for_with_var(struct compiling *c, const node *n)
2869{
2870 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002871 return ast_for_expr(c, CHILD(n, 1));
2872}
2873
2874/* with_stmt: 'with' test [ with_var ] ':' suite */
2875static stmt_ty
2876ast_for_with_stmt(struct compiling *c, const node *n)
2877{
2878 expr_ty context_expr, optional_vars = NULL;
2879 int suite_index = 3; /* skip 'with', test, and ':' */
2880 asdl_seq *suite_seq;
2881
2882 assert(TYPE(n) == with_stmt);
2883 context_expr = ast_for_expr(c, CHILD(n, 1));
2884 if (TYPE(CHILD(n, 2)) == with_var) {
2885 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2886
2887 if (!optional_vars) {
2888 return NULL;
2889 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002890 if (!set_context(optional_vars, Store, n)) {
2891 return NULL;
2892 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002893 suite_index = 4;
2894 }
2895
2896 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2897 if (!suite_seq) {
2898 return NULL;
2899 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002900 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002902}
2903
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002904static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002905ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002907 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2908 asdl_seq *s;
2909 expr_ty call, dummy;
2910
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 REQ(n, classdef);
2912
2913 if (!strcmp(STR(CHILD(n, 1)), "None")) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002914 ast_error(n, "assignment to None");
2915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 }
2917
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002918 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 s = ast_for_suite(c, CHILD(n, 3));
2920 if (!s)
2921 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002922 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002923 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002925
2926 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002927 s = ast_for_suite(c, CHILD(n,5));
2928 if (!s)
2929 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002930 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002931 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932 }
2933
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002934 /* class NAME '(' arglist ')' ':' suite */
2935 /* build up a fake Call node so we can extract its pieces */
2936 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2937 call = ast_for_call(c, CHILD(n, 3), dummy);
2938 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002941 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002943
2944 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2945 call->v.Call.args, call->v.Call.keywords,
2946 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002947 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948}
2949
2950static stmt_ty
2951ast_for_stmt(struct compiling *c, const node *n)
2952{
2953 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002954 assert(NCH(n) == 1);
2955 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 }
2957 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 assert(num_stmts(n) == 1);
2959 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 }
2961 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00002962 REQ(n, small_stmt);
2963 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002964 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
2965 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00002966 */
2967 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 case expr_stmt:
2969 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 case del_stmt:
2971 return ast_for_del_stmt(c, n);
2972 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002973 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 case flow_stmt:
2975 return ast_for_flow_stmt(c, n);
2976 case import_stmt:
2977 return ast_for_import_stmt(c, n);
2978 case global_stmt:
2979 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00002980 case nonlocal_stmt:
2981 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 case assert_stmt:
2983 return ast_for_assert_stmt(c, n);
2984 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002985 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2987 TYPE(n), NCH(n));
2988 return NULL;
2989 }
2990 }
2991 else {
2992 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002993 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00002994 */
2995 node *ch = CHILD(n, 0);
2996 REQ(n, compound_stmt);
2997 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998 case if_stmt:
2999 return ast_for_if_stmt(c, ch);
3000 case while_stmt:
3001 return ast_for_while_stmt(c, ch);
3002 case for_stmt:
3003 return ast_for_for_stmt(c, ch);
3004 case try_stmt:
3005 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003006 case with_stmt:
3007 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003009 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003011 return ast_for_classdef(c, ch, NULL);
3012 case decorated:
3013 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003015 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3017 TYPE(n), NCH(n));
3018 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003019 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020 }
3021}
3022
3023static PyObject *
3024parsenumber(const char *s)
3025{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003026 const char *end;
3027 long x;
3028 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003030 Py_complex c;
3031 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032#endif
3033
Guido van Rossumd8faa362007-04-27 19:54:29 +00003034 errno = 0;
3035 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003037 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003039 if (*end == 'l' || *end == 'L')
3040 return PyLong_FromString((char *)s, (char **)0, 0);
3041 if (s[0] == '0') {
3042 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3043 if (x < 0 && errno == 0) {
3044 return PyLong_FromString((char *)s,
3045 (char **)0,
3046 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003047 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003048 }
3049 else
3050 x = PyOS_strtol((char *)s, (char **)&end, 0);
3051 if (*end == '\0') {
3052 if (errno != 0)
3053 return PyLong_FromString((char *)s, (char **)0, 0);
3054 return PyInt_FromLong(x);
3055 }
3056 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003058 if (imflag) {
3059 c.real = 0.;
3060 PyFPE_START_PROTECT("atof", return 0)
3061 c.imag = PyOS_ascii_atof(s);
3062 PyFPE_END_PROTECT(c)
3063 return PyComplex_FromCComplex(c);
3064 }
3065 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003067 {
3068 PyFPE_START_PROTECT("atof", return 0)
3069 dx = PyOS_ascii_atof(s);
3070 PyFPE_END_PROTECT(dx)
3071 return PyFloat_FromDouble(dx);
3072 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073}
3074
3075static PyObject *
3076decode_utf8(const char **sPtr, const char *end, char* encoding)
3077{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003078 PyObject *u, *v;
3079 char *s, *t;
3080 t = s = (char *)*sPtr;
3081 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3082 while (s < end && (*s & 0x80)) s++;
3083 *sPtr = s;
3084 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3085 if (u == NULL)
3086 return NULL;
3087 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3088 Py_DECREF(u);
3089 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090}
3091
3092static PyObject *
3093decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3094{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003095 PyObject *v, *u;
3096 char *buf;
3097 char *p;
3098 const char *end;
3099 if (encoding == NULL) {
3100 buf = (char *)s;
3101 u = NULL;
3102 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3103 buf = (char *)s;
3104 u = NULL;
3105 } else {
3106 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3107 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3108 if (u == NULL)
3109 return NULL;
3110 p = buf = PyString_AsString(u);
3111 end = s + len;
3112 while (s < end) {
3113 if (*s == '\\') {
3114 *p++ = *s++;
3115 if (*s & 0x80) {
3116 strcpy(p, "u005c");
3117 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003118 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003119 }
3120 if (*s & 0x80) { /* XXX inefficient */
3121 PyObject *w;
3122 char *r;
3123 Py_ssize_t rn, i;
3124 w = decode_utf8(&s, end, "utf-16-be");
3125 if (w == NULL) {
3126 Py_DECREF(u);
3127 return NULL;
3128 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00003129 assert(PyBytes_Check(w));
3130 r = PyBytes_AsString(w);
3131 rn = PyBytes_Size(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003132 assert(rn % 2 == 0);
3133 for (i = 0; i < rn; i += 2) {
3134 sprintf(p, "\\u%02x%02x",
3135 r[i + 0] & 0xFF,
3136 r[i + 1] & 0xFF);
3137 p += 6;
3138 }
3139 Py_DECREF(w);
3140 } else {
3141 *p++ = *s++;
3142 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003143 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003144 len = p - buf;
3145 s = buf;
3146 }
3147 if (rawmode)
3148 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3149 else
3150 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3151 Py_XDECREF(u);
3152 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153}
3154
3155/* s is a Python string literal, including the bracketing quote characters,
3156 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3157 * parsestr parses it, and returns the decoded Python string object.
3158 */
3159static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003160parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 size_t len;
3163 const char *s = STR(n);
3164 int quote = Py_CHARMASK(*s);
3165 int rawmode = 0;
3166 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167
Guido van Rossumd8faa362007-04-27 19:54:29 +00003168 if (isalpha(quote) || quote == '_') {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 if (quote == 'b' || quote == 'B') {
3170 quote = *++s;
3171 *bytesmode = 1;
3172 }
3173 if (quote == 'r' || quote == 'R') {
3174 quote = *++s;
3175 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003176 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003177 }
3178 if (quote != '\'' && quote != '\"') {
3179 PyErr_BadInternalCall();
3180 return NULL;
3181 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 s++;
3183 len = strlen(s);
3184 if (len > INT_MAX) {
3185 PyErr_SetString(PyExc_OverflowError,
3186 "string to parse is too long");
3187 return NULL;
3188 }
3189 if (s[--len] != quote) {
3190 PyErr_BadInternalCall();
3191 return NULL;
3192 }
3193 if (len >= 4 && s[0] == quote && s[1] == quote) {
3194 s += 2;
3195 len -= 2;
3196 if (s[--len] != quote || s[--len] != quote) {
3197 PyErr_BadInternalCall();
3198 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003199 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003200 }
Guido van Rossum572dbf82007-04-27 23:53:51 +00003201 if (!*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 return decode_unicode(s, len, rawmode, encoding);
3203 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 if (*bytesmode) {
3205 /* Disallow non-ascii characters (but not escapes) */
3206 const char *c;
3207 for (c = s; *c; c++) {
3208 if (Py_CHARMASK(*c) >= 0x80) {
3209 ast_error(n, "bytes can only contain ASCII "
3210 "literal characters.");
3211 return NULL;
3212 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003213 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003214 }
3215 need_encoding = (!*bytesmode && encoding != NULL &&
3216 strcmp(encoding, "utf-8") != 0 &&
3217 strcmp(encoding, "iso-8859-1") != 0);
3218 if (rawmode || strchr(s, '\\') == NULL) {
3219 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003220 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3221 if (u == NULL)
3222 return NULL;
3223 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3224 Py_DECREF(u);
3225 return v;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003226 } else {
3227 return PyString_FromStringAndSize(s, len);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003228 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230
Guido van Rossumbdde0112007-05-11 16:26:27 +00003231 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233}
3234
3235/* Build a Python string object out of a STRING atom. This takes care of
3236 * compile-time literal catenation, calling parsestr() on each piece, and
3237 * pasting the intermediate results together.
3238 */
3239static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003240parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003241{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 PyObject *v;
3243 int i;
3244 REQ(CHILD(n, 0), STRING);
3245 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3246 if (v != NULL) {
3247 /* String literal concatenation */
3248 for (i = 1; i < NCH(n); i++) {
3249 PyObject *s;
3250 int subbm = 0;
3251 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3252 if (s == NULL)
3253 goto onError;
3254 if (*bytesmode != subbm) {
3255 ast_error(n, "cannot mix bytes and nonbytes"
3256 "literals");
3257 goto onError;
3258 }
3259 if (PyString_Check(v) && PyString_Check(s)) {
3260 PyString_ConcatAndDel(&v, s);
3261 if (v == NULL)
3262 goto onError;
3263 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003264 else {
3265 PyObject *temp = PyUnicode_Concat(v, s);
3266 Py_DECREF(s);
3267 Py_DECREF(v);
3268 v = temp;
3269 if (v == NULL)
3270 goto onError;
3271 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003272 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003273 }
3274 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275
Guido van Rossumd8faa362007-04-27 19:54:29 +00003276 onError:
3277 Py_XDECREF(v);
3278 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279}