blob: dbfec20b382407d2a6fcbc631723b70a6a3f33db [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/* XXX TO DO
19 - re-indent this file (should be done)
20 - internal error checking (freeing memory, etc.)
21 - syntax errors
22*/
23
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024/* Data structure used internally */
25struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000026 char *c_encoding; /* source encoding */
27 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028};
29
30static asdl_seq *seq_for_testlist(struct compiling *, const node *);
31static expr_ty ast_for_expr(struct compiling *, const node *);
32static stmt_ty ast_for_stmt(struct compiling *, const node *);
33static asdl_seq *ast_for_suite(struct compiling *, const node *);
34static asdl_seq *ast_for_exprlist(struct compiling *, const node *, int);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000035static expr_ty ast_for_testlist(struct compiling *, const node *);
36static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037
38/* Note different signature for ast_for_call */
39static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
40
41static PyObject *parsenumber(const char *);
42static PyObject *parsestr(const char *s, const char *encoding);
43static PyObject *parsestrplus(struct compiling *, const node *n);
44
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#ifndef LINENO
46#define LINENO(n) ((n)->n_lineno)
47#endif
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
51 PyObject* id = PyString_InternFromString(n);
52 PyArena_AddPyObject(arena, id);
53 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000054}
55
Neal Norwitzadb69fc2005-12-17 20:54:49 +000056#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057
58/* This routine provides an invalid object for the syntax error.
59 The outermost routine must unpack this error and create the
60 proper object. We do this so that we don't have to pass
61 the filename to everything function.
62
63 XXX Maybe we should just pass the filename...
64*/
65
66static int
67ast_error(const node *n, const char *errstr)
68{
69 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
70 if (!u)
71 return 0;
72 PyErr_SetObject(PyExc_SyntaxError, u);
73 Py_DECREF(u);
74 return 0;
75}
76
77static void
78ast_error_finish(const char *filename)
79{
80 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000081 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082
83 assert(PyErr_Occurred());
84 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
85 return;
86
87 PyErr_Fetch(&type, &value, &tback);
88 errstr = PyTuple_GetItem(value, 0);
89 if (!errstr)
90 return;
91 Py_INCREF(errstr);
92 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000093 if (lineno == -1) {
94 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000096 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097 Py_DECREF(value);
98
99 loc = PyErr_ProgramText(filename, lineno);
100 if (!loc) {
101 Py_INCREF(Py_None);
102 loc = Py_None;
103 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000104 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000106 if (!tmp) {
107 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000109 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110 value = Py_BuildValue("(OO)", errstr, tmp);
111 Py_DECREF(errstr);
112 Py_DECREF(tmp);
113 if (!value)
114 return;
115 PyErr_Restore(type, value, tback);
116}
117
118/* num_stmts() returns number of contained statements.
119
120 Use this routine to determine how big a sequence is needed for
121 the statements in a parse tree. Its raison d'etre is this bit of
122 grammar:
123
124 stmt: simple_stmt | compound_stmt
125 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
126
127 A simple_stmt can contain multiple small_stmt elements joined
128 by semicolons. If the arg is a simple_stmt, the number of
129 small_stmt elements is returned.
130*/
131
132static int
133num_stmts(const node *n)
134{
135 int i, l;
136 node *ch;
137
138 switch (TYPE(n)) {
139 case single_input:
140 if (TYPE(CHILD(n, 0)) == NEWLINE)
141 return 0;
142 else
143 return num_stmts(CHILD(n, 0));
144 case file_input:
145 l = 0;
146 for (i = 0; i < NCH(n); i++) {
147 ch = CHILD(n, i);
148 if (TYPE(ch) == stmt)
149 l += num_stmts(ch);
150 }
151 return l;
152 case stmt:
153 return num_stmts(CHILD(n, 0));
154 case compound_stmt:
155 return 1;
156 case simple_stmt:
157 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
158 case suite:
159 if (NCH(n) == 1)
160 return num_stmts(CHILD(n, 0));
161 else {
162 l = 0;
163 for (i = 2; i < (NCH(n) - 1); i++)
164 l += num_stmts(CHILD(n, i));
165 return l;
166 }
167 default: {
168 char buf[128];
169
170 sprintf(buf, "Non-statement found: %d %d\n",
171 TYPE(n), NCH(n));
172 Py_FatalError(buf);
173 }
174 }
175 assert(0);
176 return 0;
177}
178
179/* Transform the CST rooted at node * to the appropriate AST
180*/
181
182mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000183PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
184 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185{
186 int i, j, num;
187 asdl_seq *stmts = NULL;
188 stmt_ty s;
189 node *ch;
190 struct compiling c;
191
192 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000193 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000194 } else if (TYPE(n) == encoding_decl) {
195 c.c_encoding = STR(n);
196 n = CHILD(n, 0);
197 } else {
198 c.c_encoding = NULL;
199 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000200 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000201
202 switch (TYPE(n)) {
203 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205 if (!stmts)
206 return NULL;
207 for (i = 0; i < NCH(n) - 1; i++) {
208 ch = CHILD(n, i);
209 if (TYPE(ch) == NEWLINE)
210 continue;
211 REQ(ch, stmt);
212 num = num_stmts(ch);
213 if (num == 1) {
214 s = ast_for_stmt(&c, ch);
215 if (!s)
216 goto error;
217 asdl_seq_APPEND(stmts, s);
218 }
219 else {
220 ch = CHILD(ch, 0);
221 REQ(ch, simple_stmt);
222 for (j = 0; j < num; j++) {
223 s = ast_for_stmt(&c, CHILD(ch, j * 2));
224 if (!s)
225 goto error;
226 asdl_seq_APPEND(stmts, s);
227 }
228 }
229 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000230 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 case eval_input: {
232 expr_ty testlist_ast;
233
234 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000235 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 if (!testlist_ast)
237 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 }
240 case single_input:
241 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000242 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000243 if (!stmts)
244 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000245 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, arena));
246 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000247 }
248 else {
249 n = CHILD(n, 0);
250 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000251 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 if (!stmts)
253 goto error;
254 if (num == 1) {
Neal Norwitz406c6402006-01-07 21:23:26 +0000255 s = ast_for_stmt(&c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256 if (!s)
257 goto error;
258 asdl_seq_SET(stmts, 0, s);
259 }
260 else {
261 /* Only a simple_stmt can contain multiple statements. */
262 REQ(n, simple_stmt);
263 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 if (TYPE(CHILD(n, i)) == NEWLINE)
265 break;
266 s = ast_for_stmt(&c, CHILD(n, i));
267 if (!s)
268 goto error;
269 asdl_seq_SET(stmts, i / 2, s);
270 }
271 }
272
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000273 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 }
275 default:
276 goto error;
277 }
278 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 ast_error_finish(filename);
280 return NULL;
281}
282
283/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
284*/
285
286static operator_ty
287get_operator(const node *n)
288{
289 switch (TYPE(n)) {
290 case VBAR:
291 return BitOr;
292 case CIRCUMFLEX:
293 return BitXor;
294 case AMPER:
295 return BitAnd;
296 case LEFTSHIFT:
297 return LShift;
298 case RIGHTSHIFT:
299 return RShift;
300 case PLUS:
301 return Add;
302 case MINUS:
303 return Sub;
304 case STAR:
305 return Mult;
306 case SLASH:
307 return Div;
308 case DOUBLESLASH:
309 return FloorDiv;
310 case PERCENT:
311 return Mod;
312 default:
313 return 0;
314 }
315}
316
Guido van Rossumc2e20742006-02-27 22:32:47 +0000317/* Set the context ctx for expr_ty e returning 1 on success, 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318
319 Only sets context for expr kinds that "can appear in assignment context"
320 (according to ../Parser/Python.asdl). For other expr kinds, it sets
321 an appropriate syntax error and returns false.
322
323 If e is a sequential type, items in sequence will also have their context
324 set.
325
326*/
327
328static int
329set_context(expr_ty e, expr_context_ty ctx, const node *n)
330{
331 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000332 /* If a particular expression type can't be used for assign / delete,
333 set expr_name to its name and an error message will be generated.
334 */
335 const char* expr_name = NULL;
336
337 /* The ast defines augmented store and load contexts, but the
338 implementation here doesn't actually use them. The code may be
339 a little more complex than necessary as a result. It also means
340 that expressions in an augmented assignment have no context.
341 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000342 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343 */
344 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345
346 switch (e->kind) {
347 case Attribute_kind:
348 if (ctx == Store &&
349 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
350 return ast_error(n, "assignment to None");
351 }
352 e->v.Attribute.ctx = ctx;
353 break;
354 case Subscript_kind:
355 e->v.Subscript.ctx = ctx;
356 break;
357 case Name_kind:
358 if (ctx == Store &&
359 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
360 return ast_error(n, "assignment to None");
361 }
362 e->v.Name.ctx = ctx;
363 break;
364 case List_kind:
365 e->v.List.ctx = ctx;
366 s = e->v.List.elts;
367 break;
368 case Tuple_kind:
369 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
370 return ast_error(n, "can't assign to ()");
371 e->v.Tuple.ctx = ctx;
372 s = e->v.Tuple.elts;
373 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000374 case Lambda_kind:
375 expr_name = "lambda";
376 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000377 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000378 expr_name = "function call";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 case UnaryOp_kind:
383 expr_name = "operator";
384 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000385 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000386 expr_name = "generator expression";
387 break;
388 case ListComp_kind:
389 expr_name = "list comprehension";
390 break;
391 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392 case Num_kind:
393 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 expr_name = "literal";
395 break;
396 case Compare_kind:
397 expr_name = "comparison";
398 break;
399 case Repr_kind:
400 expr_name = "repr";
401 break;
402 default:
403 PyErr_Format(PyExc_SystemError,
404 "unexpected expression in assignment %d (line %d)",
405 e->kind, e->lineno);
406 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 /* Check for error string set by switch */
409 if (expr_name) {
410 char buf[300];
411 PyOS_snprintf(buf, sizeof(buf),
412 "can't %s %s",
413 ctx == Store ? "assign to" : "delete",
414 expr_name);
415 return ast_error(n, buf);
416 }
417
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 /* If the LHS is a list or tuple, we need to set the assignment
419 context for all the tuple elements.
420 */
421 if (s) {
422 int i;
423
424 for (i = 0; i < asdl_seq_LEN(s); i++) {
425 if (!set_context(asdl_seq_GET(s, i), ctx, n))
426 return 0;
427 }
428 }
429 return 1;
430}
431
432static operator_ty
433ast_for_augassign(const node *n)
434{
435 REQ(n, augassign);
436 n = CHILD(n, 0);
437 switch (STR(n)[0]) {
438 case '+':
439 return Add;
440 case '-':
441 return Sub;
442 case '/':
443 if (STR(n)[1] == '/')
444 return FloorDiv;
445 else
446 return Div;
447 case '%':
448 return Mod;
449 case '<':
450 return LShift;
451 case '>':
452 return RShift;
453 case '&':
454 return BitAnd;
455 case '^':
456 return BitXor;
457 case '|':
458 return BitOr;
459 case '*':
460 if (STR(n)[1] == '*')
461 return Pow;
462 else
463 return Mult;
464 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000465 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466 return 0;
467 }
468}
469
470static cmpop_ty
471ast_for_comp_op(const node *n)
472{
473 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
474 |'is' 'not'
475 */
476 REQ(n, comp_op);
477 if (NCH(n) == 1) {
478 n = CHILD(n, 0);
479 switch (TYPE(n)) {
480 case LESS:
481 return Lt;
482 case GREATER:
483 return Gt;
484 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485 return Eq;
486 case LESSEQUAL:
487 return LtE;
488 case GREATEREQUAL:
489 return GtE;
490 case NOTEQUAL:
491 return NotEq;
492 case NAME:
493 if (strcmp(STR(n), "in") == 0)
494 return In;
495 if (strcmp(STR(n), "is") == 0)
496 return Is;
497 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000498 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 STR(n));
500 return 0;
501 }
502 }
503 else if (NCH(n) == 2) {
504 /* handle "not in" and "is not" */
505 switch (TYPE(CHILD(n, 0))) {
506 case NAME:
507 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
508 return NotIn;
509 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
510 return IsNot;
511 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000512 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
514 return 0;
515 }
516 }
Neal Norwitz79792652005-11-14 04:25:03 +0000517 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518 NCH(n));
519 return 0;
520}
521
522static asdl_seq *
523seq_for_testlist(struct compiling *c, const node *n)
524{
525 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000526 asdl_seq *seq;
527 expr_ty expression;
528 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529 assert(TYPE(n) == testlist
530 || TYPE(n) == listmaker
531 || TYPE(n) == testlist_gexp
532 || TYPE(n) == testlist_safe
533 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000535 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000536 if (!seq)
537 return NULL;
538
539 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000540 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541
542 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000543 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545
546 assert(i / 2 < seq->size);
547 asdl_seq_SET(seq, i / 2, expression);
548 }
549 return seq;
550}
551
552static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000553compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554{
555 int i, len = (NCH(n) + 1) / 2;
556 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000557 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558 if (!args)
559 return NULL;
560
561 REQ(n, fplist);
562
563 for (i = 0; i < len; i++) {
564 const node *child = CHILD(CHILD(n, 2*i), 0);
565 expr_ty arg;
566 if (TYPE(child) == NAME) {
567 if (!strcmp(STR(child), "None")) {
568 ast_error(child, "assignment to None");
569 return NULL;
570 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000571 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
572 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 }
574 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000575 arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 set_context(arg, Store, n);
577 asdl_seq_SET(args, i, arg);
578 }
579
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000580 result = Tuple(args, Store, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 set_context(result, Store, n);
582 return result;
583}
584
585/* Create AST for argument list.
586
587 XXX TO DO:
588 - check for invalid argument lists like normal after default
589*/
590
591static arguments_ty
592ast_for_arguments(struct compiling *c, const node *n)
593{
594 /* parameters: '(' [varargslist] ')'
595 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
596 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
597 */
598 int i, n_args = 0, n_defaults = 0, found_default = 0;
599 asdl_seq *args, *defaults;
600 identifier vararg = NULL, kwarg = NULL;
601 node *ch;
602
603 if (TYPE(n) == parameters) {
604 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000605 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 n = CHILD(n, 1);
607 }
608 REQ(n, varargslist);
609
610 /* first count the number of normal args & defaults */
611 for (i = 0; i < NCH(n); i++) {
612 ch = CHILD(n, i);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000613 if (TYPE(ch) == fpdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 n_args++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615 if (TYPE(ch) == EQUAL)
616 n_defaults++;
617 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000618 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619 if (!args && n_args)
620 return NULL; /* Don't need to go to NULL; nothing allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000621 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 if (!defaults && n_defaults)
623 goto error;
624
625 /* fpdef: NAME | '(' fplist ')'
626 fplist: fpdef (',' fpdef)* [',']
627 */
628 i = 0;
629 while (i < NCH(n)) {
630 ch = CHILD(n, i);
631 switch (TYPE(ch)) {
632 case fpdef:
633 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
634 anything other than EQUAL or a comma? */
635 /* XXX Should NCH(n) check be made a separate check? */
636 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
637 asdl_seq_APPEND(defaults,
638 ast_for_expr(c, CHILD(n, i + 2)));
639 i += 2;
640 found_default = 1;
641 }
642 else if (found_default) {
643 ast_error(n,
644 "non-default argument follows default argument");
645 goto error;
646 }
647
648 if (NCH(ch) == 3) {
649 asdl_seq_APPEND(args,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000650 compiler_complex_args(c, CHILD(ch, 1)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000651 }
652 else if (TYPE(CHILD(ch, 0)) == NAME) {
Armin Rigo31441302005-10-21 12:57:31 +0000653 expr_ty name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000654 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
655 ast_error(CHILD(ch, 0), "assignment to None");
656 goto error;
657 }
Armin Rigo31441302005-10-21 12:57:31 +0000658 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000659 Param, LINENO(ch), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660 if (!name)
661 goto error;
662 asdl_seq_APPEND(args, name);
663
664 }
665 i += 2; /* the name and the comma */
666 break;
667 case STAR:
668 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
669 ast_error(CHILD(n, i+1), "assignment to None");
670 goto error;
671 }
672 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
673 i += 3;
674 break;
675 case DOUBLESTAR:
676 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
677 ast_error(CHILD(n, i+1), "assignment to None");
678 goto error;
679 }
680 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
681 i += 3;
682 break;
683 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000684 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685 "unexpected node in varargslist: %d @ %d",
686 TYPE(ch), i);
687 goto error;
688 }
689 }
690
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000691 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000692
693 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000694 Py_XDECREF(vararg);
695 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000696 return NULL;
697}
698
699static expr_ty
700ast_for_dotted_name(struct compiling *c, const node *n)
701{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000702 expr_ty e;
703 identifier id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704 int i;
705
706 REQ(n, dotted_name);
707
708 id = NEW_IDENTIFIER(CHILD(n, 0));
709 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000710 return NULL;
711 e = Name(id, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714
715 for (i = 2; i < NCH(n); i+=2) {
716 id = NEW_IDENTIFIER(CHILD(n, i));
717 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000718 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000719 e = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena);
720 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 }
723
724 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725}
726
727static expr_ty
728ast_for_decorator(struct compiling *c, const node *n)
729{
730 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
731 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000732 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733
734 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000735 REQ(CHILD(n, 0), AT);
736 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737
738 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
739 if (!name_expr)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000740 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741
742 if (NCH(n) == 3) { /* No arguments */
743 d = name_expr;
744 name_expr = NULL;
745 }
746 else if (NCH(n) == 5) { /* Call with no arguments */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000747 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 name_expr = NULL;
751 }
752 else {
753 d = ast_for_call(c, CHILD(n, 3), name_expr);
754 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000755 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 name_expr = NULL;
757 }
758
759 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760}
761
762static asdl_seq*
763ast_for_decorators(struct compiling *c, const node *n)
764{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000765 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000766 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 int i;
768
769 REQ(n, decorators);
770
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000771 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 if (!decorator_seq)
773 return NULL;
774
775 for (i = 0; i < NCH(n); i++) {
776 d = ast_for_decorator(c, CHILD(n, i));
777 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000778 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 asdl_seq_APPEND(decorator_seq, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 }
781 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782}
783
784static stmt_ty
785ast_for_funcdef(struct compiling *c, const node *n)
786{
787 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000788 identifier name;
789 arguments_ty args;
790 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 asdl_seq *decorator_seq = NULL;
792 int name_i;
793
794 REQ(n, funcdef);
795
796 if (NCH(n) == 6) { /* decorators are present */
797 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
798 if (!decorator_seq)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 name_i = 2;
801 }
802 else {
803 name_i = 1;
804 }
805
806 name = NEW_IDENTIFIER(CHILD(n, name_i));
807 if (!name)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000808 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Neal Norwitze76adcd2005-11-15 05:04:31 +0000810 ast_error(CHILD(n, name_i), "assignment to None");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000811 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 }
813 args = ast_for_arguments(c, CHILD(n, name_i + 1));
814 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000815 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 body = ast_for_suite(c, CHILD(n, name_i + 3));
817 if (!body)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000818 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000820 return FunctionDef(name, args, body, decorator_seq, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821}
822
823static expr_ty
824ast_for_lambdef(struct compiling *c, const node *n)
825{
826 /* lambdef: 'lambda' [varargslist] ':' test */
827 arguments_ty args;
828 expr_ty expression;
829
830 if (NCH(n) == 3) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000831 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832 if (!args)
833 return NULL;
834 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000835 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 }
838 else {
839 args = ast_for_arguments(c, CHILD(n, 1));
840 if (!args)
841 return NULL;
842 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000843 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 }
846
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000847 return Lambda(args, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848}
849
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000850static expr_ty
851ast_for_ifexpr(struct compiling *c, const node *n)
852{
853 /* test: or_test 'if' or_test 'else' test */
854 expr_ty expression, body, orelse;
855
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000856 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000857 body = ast_for_expr(c, CHILD(n, 0));
858 if (!body)
859 return NULL;
860 expression = ast_for_expr(c, CHILD(n, 2));
861 if (!expression)
862 return NULL;
863 orelse = ast_for_expr(c, CHILD(n, 4));
864 if (!orelse)
865 return NULL;
866 return IfExp(expression, body, orelse, LINENO(n), c->c_arena);
867}
868
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869/* Count the number of 'for' loop in a list comprehension.
870
871 Helper for ast_for_listcomp().
872*/
873
874static int
875count_list_fors(const node *n)
876{
877 int n_fors = 0;
878 node *ch = CHILD(n, 1);
879
880 count_list_for:
881 n_fors++;
882 REQ(ch, list_for);
883 if (NCH(ch) == 5)
884 ch = CHILD(ch, 4);
885 else
886 return n_fors;
887 count_list_iter:
888 REQ(ch, list_iter);
889 ch = CHILD(ch, 0);
890 if (TYPE(ch) == list_for)
891 goto count_list_for;
892 else if (TYPE(ch) == list_if) {
893 if (NCH(ch) == 3) {
894 ch = CHILD(ch, 2);
895 goto count_list_iter;
896 }
897 else
898 return n_fors;
899 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000900
901 /* Should never be reached */
902 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
903 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000904}
905
906/* Count the number of 'if' statements in a list comprehension.
907
908 Helper for ast_for_listcomp().
909*/
910
911static int
912count_list_ifs(const node *n)
913{
914 int n_ifs = 0;
915
916 count_list_iter:
917 REQ(n, list_iter);
918 if (TYPE(CHILD(n, 0)) == list_for)
919 return n_ifs;
920 n = CHILD(n, 0);
921 REQ(n, list_if);
922 n_ifs++;
923 if (NCH(n) == 2)
924 return n_ifs;
925 n = CHILD(n, 2);
926 goto count_list_iter;
927}
928
929static expr_ty
930ast_for_listcomp(struct compiling *c, const node *n)
931{
932 /* listmaker: test ( list_for | (',' test)* [','] )
933 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
934 list_iter: list_for | list_if
935 list_if: 'if' test [list_iter]
936 testlist_safe: test [(',' test)+ [',']]
937 */
938 expr_ty elt;
939 asdl_seq *listcomps;
940 int i, n_fors;
941 node *ch;
942
943 REQ(n, listmaker);
944 assert(NCH(n) > 1);
945
946 elt = ast_for_expr(c, CHILD(n, 0));
947 if (!elt)
948 return NULL;
949
950 n_fors = count_list_fors(n);
951 if (n_fors == -1)
952 return NULL;
953
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000954 listcomps = asdl_seq_new(n_fors, c->c_arena);
955 if (!listcomps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000957
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958 ch = CHILD(n, 1);
959 for (i = 0; i < n_fors; i++) {
960 comprehension_ty lc;
961 asdl_seq *t;
962 expr_ty expression;
963
964 REQ(ch, list_for);
965
966 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000967 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000969 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000970 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000973 if (asdl_seq_LEN(t) == 1)
974 lc = comprehension(asdl_seq_GET(t, 0), expression, NULL,
975 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000977 lc = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena),
978 expression, NULL, c->c_arena);
979 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981
982 if (NCH(ch) == 5) {
983 int j, n_ifs;
984 asdl_seq *ifs;
985
986 ch = CHILD(ch, 4);
987 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000988 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000991 ifs = asdl_seq_new(n_ifs, c->c_arena);
992 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994
995 for (j = 0; j < n_ifs; j++) {
996 REQ(ch, list_iter);
997
998 ch = CHILD(ch, 0);
999 REQ(ch, list_if);
1000
1001 asdl_seq_APPEND(ifs, ast_for_expr(c, CHILD(ch, 1)));
1002 if (NCH(ch) == 3)
1003 ch = CHILD(ch, 2);
1004 }
1005 /* on exit, must guarantee that ch is a list_for */
1006 if (TYPE(ch) == list_iter)
1007 ch = CHILD(ch, 0);
1008 lc->ifs = ifs;
1009 }
1010 asdl_seq_APPEND(listcomps, lc);
1011 }
1012
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001013 return ListComp(elt, listcomps, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014}
1015
1016/*
1017 Count the number of 'for' loops in a generator expression.
1018
1019 Helper for ast_for_genexp().
1020*/
1021
1022static int
1023count_gen_fors(const node *n)
1024{
1025 int n_fors = 0;
1026 node *ch = CHILD(n, 1);
1027
1028 count_gen_for:
1029 n_fors++;
1030 REQ(ch, gen_for);
1031 if (NCH(ch) == 5)
1032 ch = CHILD(ch, 4);
1033 else
1034 return n_fors;
1035 count_gen_iter:
1036 REQ(ch, gen_iter);
1037 ch = CHILD(ch, 0);
1038 if (TYPE(ch) == gen_for)
1039 goto count_gen_for;
1040 else if (TYPE(ch) == gen_if) {
1041 if (NCH(ch) == 3) {
1042 ch = CHILD(ch, 2);
1043 goto count_gen_iter;
1044 }
1045 else
1046 return n_fors;
1047 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001048
1049 /* Should never be reached */
1050 PyErr_SetString(PyExc_SystemError,
1051 "logic error in count_gen_fors");
1052 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053}
1054
1055/* Count the number of 'if' statements in a generator expression.
1056
1057 Helper for ast_for_genexp().
1058*/
1059
1060static int
1061count_gen_ifs(const node *n)
1062{
1063 int n_ifs = 0;
1064
1065 while (1) {
1066 REQ(n, gen_iter);
1067 if (TYPE(CHILD(n, 0)) == gen_for)
1068 return n_ifs;
1069 n = CHILD(n, 0);
1070 REQ(n, gen_if);
1071 n_ifs++;
1072 if (NCH(n) == 2)
1073 return n_ifs;
1074 n = CHILD(n, 2);
1075 }
1076}
1077
1078static expr_ty
1079ast_for_genexp(struct compiling *c, const node *n)
1080{
1081 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1082 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1083 expr_ty elt;
1084 asdl_seq *genexps;
1085 int i, n_fors;
1086 node *ch;
1087
1088 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1089 assert(NCH(n) > 1);
1090
1091 elt = ast_for_expr(c, CHILD(n, 0));
1092 if (!elt)
1093 return NULL;
1094
1095 n_fors = count_gen_fors(n);
1096 if (n_fors == -1)
1097 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001098
1099 genexps = asdl_seq_new(n_fors, c->c_arena);
1100 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001102
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 ch = CHILD(n, 1);
1104 for (i = 0; i < n_fors; i++) {
1105 comprehension_ty ge;
1106 asdl_seq *t;
1107 expr_ty expression;
1108
1109 REQ(ch, gen_for);
1110
1111 t = ast_for_exprlist(c, CHILD(ch, 1), Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001112 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001114 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001115 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001117
1118 if (asdl_seq_LEN(t) == 1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119 ge = comprehension(asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001120 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001122 ge = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena),
1123 expression, NULL, c->c_arena);
1124
1125 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001127
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128 if (NCH(ch) == 5) {
1129 int j, n_ifs;
1130 asdl_seq *ifs;
1131
1132 ch = CHILD(ch, 4);
1133 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001134 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001136
1137 ifs = asdl_seq_new(n_ifs, c->c_arena);
1138 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001140
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141 for (j = 0; j < n_ifs; j++) {
1142 REQ(ch, gen_iter);
1143 ch = CHILD(ch, 0);
1144 REQ(ch, gen_if);
1145
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001146 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001147 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001148 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001149 asdl_seq_APPEND(ifs, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150 if (NCH(ch) == 3)
1151 ch = CHILD(ch, 2);
1152 }
1153 /* on exit, must guarantee that ch is a gen_for */
1154 if (TYPE(ch) == gen_iter)
1155 ch = CHILD(ch, 0);
1156 ge->ifs = ifs;
1157 }
1158 asdl_seq_APPEND(genexps, ge);
1159 }
1160
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001161 return GeneratorExp(elt, genexps, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162}
1163
1164static expr_ty
1165ast_for_atom(struct compiling *c, const node *n)
1166{
1167 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1168 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1169 */
1170 node *ch = CHILD(n, 0);
1171
1172 switch (TYPE(ch)) {
1173 case NAME:
1174 /* All names start in Load context, but may later be
1175 changed. */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001176 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 case STRING: {
1178 PyObject *str = parsestrplus(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 if (!str)
1180 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001181
1182 PyArena_AddPyObject(c->c_arena, str);
1183 return Str(str, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 }
1185 case NUMBER: {
1186 PyObject *pynum = parsenumber(STR(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 if (!pynum)
1188 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001189
1190 PyArena_AddPyObject(c->c_arena, pynum);
1191 return Num(pynum, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 }
1193 case LPAR: /* some parenthesized expressions */
1194 ch = CHILD(n, 1);
1195
1196 if (TYPE(ch) == RPAR)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197 return Tuple(NULL, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198
1199 if (TYPE(ch) == yield_expr)
1200 return ast_for_expr(c, ch);
1201
1202 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1203 return ast_for_genexp(c, ch);
1204
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001205 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 case LSQB: /* list (or list comprehension) */
1207 ch = CHILD(n, 1);
1208
1209 if (TYPE(ch) == RSQB)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210 return List(NULL, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211
1212 REQ(ch, listmaker);
1213 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1214 asdl_seq *elts = seq_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 if (!elts)
1216 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217
1218 return List(elts, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219 }
1220 else
1221 return ast_for_listcomp(c, ch);
1222 case LBRACE: {
1223 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1224 int i, size;
1225 asdl_seq *keys, *values;
1226
1227 ch = CHILD(n, 1);
1228 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001229 keys = asdl_seq_new(size, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 if (!keys)
1231 return NULL;
1232
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001233 values = asdl_seq_new(size, c->c_arena);
1234 if (!values)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236
1237 for (i = 0; i < NCH(ch); i += 4) {
1238 expr_ty expression;
1239
1240 expression = ast_for_expr(c, CHILD(ch, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001241 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001242 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001243
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 expression = ast_for_expr(c, CHILD(ch, i + 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001247 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001249
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 asdl_seq_SET(values, i / 4, expression);
1251 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001252 return Dict(keys, values, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253 }
1254 case BACKQUOTE: { /* repr */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001255 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256 if (!expression)
1257 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001258
1259 return Repr(expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260 }
1261 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001262 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 return NULL;
1264 }
1265}
1266
1267static slice_ty
1268ast_for_slice(struct compiling *c, const node *n)
1269{
1270 node *ch;
1271 expr_ty lower = NULL, upper = NULL, step = NULL;
1272
1273 REQ(n, subscript);
1274
1275 /*
1276 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1277 sliceop: ':' [test]
1278 */
1279 ch = CHILD(n, 0);
1280 if (TYPE(ch) == DOT)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001281 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001282
1283 if (NCH(n) == 1 && TYPE(ch) == test) {
1284 /* 'step' variable hold no significance in terms of being used over
1285 other vars */
1286 step = ast_for_expr(c, ch);
1287 if (!step)
1288 return NULL;
1289
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001290 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 }
1292
1293 if (TYPE(ch) == test) {
1294 lower = ast_for_expr(c, ch);
1295 if (!lower)
1296 return NULL;
1297 }
1298
1299 /* If there's an upper bound it's in the second or third position. */
1300 if (TYPE(ch) == COLON) {
1301 if (NCH(n) > 1) {
1302 node *n2 = CHILD(n, 1);
1303
1304 if (TYPE(n2) == test) {
1305 upper = ast_for_expr(c, n2);
1306 if (!upper)
1307 return NULL;
1308 }
1309 }
1310 } else if (NCH(n) > 2) {
1311 node *n2 = CHILD(n, 2);
1312
1313 if (TYPE(n2) == test) {
1314 upper = ast_for_expr(c, n2);
1315 if (!upper)
1316 return NULL;
1317 }
1318 }
1319
1320 ch = CHILD(n, NCH(n) - 1);
1321 if (TYPE(ch) == sliceop) {
1322 if (NCH(ch) == 1)
1323 /* XXX: If only 1 child, then should just be a colon. Should we
1324 just skip assigning and just get to the return? */
1325 ch = CHILD(ch, 0);
1326 else
1327 ch = CHILD(ch, 1);
1328 if (TYPE(ch) == test) {
1329 step = ast_for_expr(c, ch);
1330 if (!step)
1331 return NULL;
1332 }
1333 }
1334
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001335 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336}
1337
1338static expr_ty
1339ast_for_binop(struct compiling *c, const node *n)
1340{
1341 /* Must account for a sequence of expressions.
1342 How should A op B op C by represented?
1343 BinOp(BinOp(A, op, B), op, C).
1344 */
1345
1346 int i, nops;
1347 expr_ty expr1, expr2, result;
1348 operator_ty operator;
1349
1350 expr1 = ast_for_expr(c, CHILD(n, 0));
1351 if (!expr1)
1352 return NULL;
1353
1354 expr2 = ast_for_expr(c, CHILD(n, 2));
1355 if (!expr2)
1356 return NULL;
1357
1358 operator = get_operator(CHILD(n, 1));
1359 if (!operator)
1360 return NULL;
1361
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001362 result = BinOp(expr1, operator, expr2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001363 if (!result)
1364 return NULL;
1365
1366 nops = (NCH(n) - 1) / 2;
1367 for (i = 1; i < nops; i++) {
1368 expr_ty tmp_result, tmp;
1369 const node* next_oper = CHILD(n, i * 2 + 1);
1370
1371 operator = get_operator(next_oper);
1372 if (!operator)
1373 return NULL;
1374
1375 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1376 if (!tmp)
1377 return NULL;
1378
1379 tmp_result = BinOp(result, operator, tmp,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001380 LINENO(next_oper), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381 if (!tmp)
1382 return NULL;
1383 result = tmp_result;
1384 }
1385 return result;
1386}
1387
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001388static expr_ty
1389ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1390{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001391 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1392 subscriptlist: subscript (',' subscript)* [',']
1393 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1394 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001395 REQ(n, trailer);
1396 if (TYPE(CHILD(n, 0)) == LPAR) {
1397 if (NCH(n) == 2)
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001398 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001399 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001400 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001401 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001402 else if (TYPE(CHILD(n, 0)) == DOT ) {
1403 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
1404 LINENO(n), c->c_arena);
1405 }
1406 else {
1407 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001408 REQ(CHILD(n, 2), RSQB);
1409 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001410 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001411 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1412 if (!slc)
1413 return NULL;
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001414 return Subscript(left_expr, slc, Load, LINENO(n), c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001415 }
1416 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001417 /* The grammar is ambiguous here. The ambiguity is resolved
1418 by treating the sequence as a tuple literal if there are
1419 no slice features.
1420 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001421 int j;
1422 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001423 expr_ty e;
1424 bool simple;
1425 asdl_seq *slices, *elts;
1426 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001427 if (!slices)
1428 return NULL;
1429 for (j = 0; j < NCH(n); j += 2) {
1430 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001431 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001432 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001433 if (slc->kind != Index_kind)
1434 simple = false;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001435 asdl_seq_SET(slices, j / 2, slc);
1436 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001437 if (!simple) {
1438 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1439 Load, LINENO(n), c->c_arena);
1440 }
1441 /* extract Index values and put them in a Tuple */
1442 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1443 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1444 slc = (slice_ty)asdl_seq_GET(slices, j);
1445 assert(slc->kind == Index_kind && slc->v.Index.value);
1446 asdl_seq_SET(elts, j, slc->v.Index.value);
1447 }
1448 e = Tuple(elts, Load, LINENO(n), c->c_arena);
1449 if (!e)
1450 return NULL;
1451 return Subscript(left_expr, Index(e, c->c_arena),
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001452 Load, LINENO(n), c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001453 }
1454 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001455}
1456
1457static expr_ty
1458ast_for_power(struct compiling *c, const node *n)
1459{
1460 /* power: atom trailer* ('**' factor)*
1461 */
1462 int i;
1463 expr_ty e, tmp;
1464 REQ(n, power);
1465 e = ast_for_atom(c, CHILD(n, 0));
1466 if (!e)
1467 return NULL;
1468 if (NCH(n) == 1)
1469 return e;
1470 for (i = 1; i < NCH(n); i++) {
1471 node *ch = CHILD(n, i);
1472 if (TYPE(ch) != trailer)
1473 break;
1474 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001475 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001476 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001477 e = tmp;
1478 }
1479 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1480 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001481 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001482 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001483 tmp = BinOp(e, Pow, f, LINENO(n), c->c_arena);
1484 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001485 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001486 e = tmp;
1487 }
1488 return e;
1489}
1490
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491/* Do not name a variable 'expr'! Will cause a compile error.
1492*/
1493
1494static expr_ty
1495ast_for_expr(struct compiling *c, const node *n)
1496{
1497 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001498 test: or_test ['if' or_test 'else' test] | lambdef
1499 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 and_test: not_test ('and' not_test)*
1501 not_test: 'not' not_test | comparison
1502 comparison: expr (comp_op expr)*
1503 expr: xor_expr ('|' xor_expr)*
1504 xor_expr: and_expr ('^' and_expr)*
1505 and_expr: shift_expr ('&' shift_expr)*
1506 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1507 arith_expr: term (('+'|'-') term)*
1508 term: factor (('*'|'/'|'%'|'//') factor)*
1509 factor: ('+'|'-'|'~') factor | power
1510 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001511
1512 As well as modified versions that exist for backward compatibility,
1513 to explicitly allow:
1514 [ x for x in lambda: 0, lambda: 1 ]
1515 (which would be ambiguous without these extra rules)
1516
1517 old_test: or_test | old_lambdef
1518 old_lambdef: 'lambda' [vararglist] ':' old_test
1519
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 */
1521
1522 asdl_seq *seq;
1523 int i;
1524
1525 loop:
1526 switch (TYPE(n)) {
1527 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001528 case old_test:
1529 if (TYPE(CHILD(n, 0)) == lambdef ||
1530 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001532 else if (NCH(n) > 1)
1533 return ast_for_ifexpr(c, n);
1534 /* Fallthrough */
1535 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536 case and_test:
1537 if (NCH(n) == 1) {
1538 n = CHILD(n, 0);
1539 goto loop;
1540 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001541 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542 if (!seq)
1543 return NULL;
1544 for (i = 0; i < NCH(n); i += 2) {
1545 expr_ty e = ast_for_expr(c, CHILD(n, i));
1546 if (!e)
1547 return NULL;
1548 asdl_seq_SET(seq, i / 2, e);
1549 }
1550 if (!strcmp(STR(CHILD(n, 1)), "and"))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001551 return BoolOp(And, seq, LINENO(n), c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001552 assert(!strcmp(STR(CHILD(n, 1)), "or"));
1553 return BoolOp(Or, seq, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001554 case not_test:
1555 if (NCH(n) == 1) {
1556 n = CHILD(n, 0);
1557 goto loop;
1558 }
1559 else {
1560 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1561 if (!expression)
1562 return NULL;
1563
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001564 return UnaryOp(Not, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 }
1566 case comparison:
1567 if (NCH(n) == 1) {
1568 n = CHILD(n, 0);
1569 goto loop;
1570 }
1571 else {
1572 expr_ty expression;
1573 asdl_seq *ops, *cmps;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001574 ops = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 if (!ops)
1576 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001577 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579 return NULL;
1580 }
1581 for (i = 1; i < NCH(n); i += 2) {
1582 /* XXX cmpop_ty is just an enum */
1583 cmpop_ty operator;
1584
1585 operator = ast_for_comp_op(CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001586 if (!operator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001588 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589
1590 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001591 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001593 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001595 asdl_seq_SET(ops, i / 2, (void *)(Py_uintptr_t)operator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596 asdl_seq_SET(cmps, i / 2, expression);
1597 }
1598 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001599 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001603 return Compare(expression, ops, cmps, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604 }
1605 break;
1606
1607 /* The next five cases all handle BinOps. The main body of code
1608 is the same in each case, but the switch turned inside out to
1609 reuse the code for each type of operator.
1610 */
1611 case expr:
1612 case xor_expr:
1613 case and_expr:
1614 case shift_expr:
1615 case arith_expr:
1616 case term:
1617 if (NCH(n) == 1) {
1618 n = CHILD(n, 0);
1619 goto loop;
1620 }
1621 return ast_for_binop(c, n);
1622 case yield_expr: {
1623 expr_ty exp = NULL;
1624 if (NCH(n) == 2) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001625 exp = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001626 if (!exp)
1627 return NULL;
1628 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001629 return Yield(exp, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630 }
1631 case factor: {
1632 expr_ty expression;
1633
1634 if (NCH(n) == 1) {
1635 n = CHILD(n, 0);
1636 goto loop;
1637 }
1638
1639 expression = ast_for_expr(c, CHILD(n, 1));
1640 if (!expression)
1641 return NULL;
1642
1643 switch (TYPE(CHILD(n, 0))) {
1644 case PLUS:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001645 return UnaryOp(UAdd, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646 case MINUS:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001647 return UnaryOp(USub, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648 case TILDE:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001649 return UnaryOp(Invert, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650 }
Neal Norwitze76adcd2005-11-15 05:04:31 +00001651 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1652 TYPE(CHILD(n, 0)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653 break;
1654 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001655 case power:
1656 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001657 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001658 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659 return NULL;
1660 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001661 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001662 return NULL;
1663}
1664
1665static expr_ty
1666ast_for_call(struct compiling *c, const node *n, expr_ty func)
1667{
1668 /*
1669 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1670 | '**' test)
1671 argument: [test '='] test [gen_for] # Really [keyword '='] test
1672 */
1673
1674 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001675 asdl_seq *args;
1676 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 expr_ty vararg = NULL, kwarg = NULL;
1678
1679 REQ(n, arglist);
1680
1681 nargs = 0;
1682 nkeywords = 0;
1683 ngens = 0;
1684 for (i = 0; i < NCH(n); i++) {
1685 node *ch = CHILD(n, i);
1686 if (TYPE(ch) == argument) {
1687 if (NCH(ch) == 1)
1688 nargs++;
1689 else if (TYPE(CHILD(ch, 1)) == gen_for)
1690 ngens++;
1691 else
1692 nkeywords++;
1693 }
1694 }
1695 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001696 ast_error(n, "Generator expression must be parenthesized "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 "if not sole argument");
1698 return NULL;
1699 }
1700
1701 if (nargs + nkeywords + ngens > 255) {
1702 ast_error(n, "more than 255 arguments");
1703 return NULL;
1704 }
1705
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001706 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001707 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001708 return NULL;
1709 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001711 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 nargs = 0;
1713 nkeywords = 0;
1714 for (i = 0; i < NCH(n); i++) {
1715 node *ch = CHILD(n, i);
1716 if (TYPE(ch) == argument) {
1717 expr_ty e;
1718 if (NCH(ch) == 1) {
1719 e = ast_for_expr(c, CHILD(ch, 0));
1720 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 asdl_seq_SET(args, nargs++, e);
1723 }
1724 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1725 e = ast_for_genexp(c, ch);
1726 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 asdl_seq_SET(args, nargs++, e);
1729 }
1730 else {
1731 keyword_ty kw;
1732 identifier key;
1733
1734 /* CHILD(ch, 0) is test, but must be an identifier? */
1735 e = ast_for_expr(c, CHILD(ch, 0));
1736 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001737 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738 /* f(lambda x: x[0] = 3) ends up getting parsed with
1739 * LHS test = lambda x: x[0], and RHS test = 3.
1740 * SF bug 132313 points out that complaining about a keyword
1741 * then is very confusing.
1742 */
1743 if (e->kind == Lambda_kind) {
1744 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 } else if (e->kind != Name_kind) {
1747 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001748 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749 }
1750 key = e->v.Name.id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001751 e = ast_for_expr(c, CHILD(ch, 2));
1752 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001753 return NULL;
1754 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 asdl_seq_SET(keywords, nkeywords++, kw);
1758 }
1759 }
1760 else if (TYPE(ch) == STAR) {
1761 vararg = ast_for_expr(c, CHILD(n, i+1));
1762 i++;
1763 }
1764 else if (TYPE(ch) == DOUBLESTAR) {
1765 kwarg = ast_for_expr(c, CHILD(n, i+1));
1766 i++;
1767 }
1768 }
1769
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001770 return Call(func, args, keywords, vararg, kwarg, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771}
1772
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001774ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001776 /* testlist_gexp: test (',' test)* [','] */
1777 /* testlist: test (',' test)* [','] */
1778 /* testlist_safe: test (',' test)+ [','] */
1779 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001781 if (TYPE(n) == testlist_gexp) {
1782 if (NCH(n) > 1)
1783 assert(TYPE(CHILD(n, 1)) != gen_for);
1784 }
1785 else {
1786 assert(TYPE(n) == testlist ||
1787 TYPE(n) == testlist_safe ||
1788 TYPE(n) == testlist1);
1789 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790 if (NCH(n) == 1)
1791 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792 else {
1793 asdl_seq *tmp = seq_for_testlist(c, n);
1794 if (!tmp)
1795 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001796 return Tuple(tmp, Load, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001798}
1799
1800static expr_ty
1801ast_for_testlist_gexp(struct compiling *c, const node* n)
1802{
1803 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1804 /* argument: test [ gen_for ] */
1805 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001806 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001807 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001808 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001809}
1810
1811/* like ast_for_testlist() but returns a sequence */
1812static asdl_seq*
1813ast_for_class_bases(struct compiling *c, const node* n)
1814{
1815 /* testlist: test (',' test)* [','] */
1816 assert(NCH(n) > 0);
1817 REQ(n, testlist);
1818 if (NCH(n) == 1) {
1819 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001820 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001821 if (!bases)
1822 return NULL;
1823 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001824 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001825 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001826 asdl_seq_SET(bases, 0, base);
1827 return bases;
1828 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001829
1830 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831}
1832
1833static stmt_ty
1834ast_for_expr_stmt(struct compiling *c, const node *n)
1835{
1836 REQ(n, expr_stmt);
1837 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1838 | ('=' (yield_expr|testlist))*)
1839 testlist: test (',' test)* [',']
1840 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
1841 | '<<=' | '>>=' | '**=' | '//='
1842 test: ... here starts the operator precendence dance
1843 */
1844
1845 if (NCH(n) == 1) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001846 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 if (!e)
1848 return NULL;
1849
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001850 return Expr(e, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851 }
1852 else if (TYPE(CHILD(n, 1)) == augassign) {
1853 expr_ty expr1, expr2;
1854 operator_ty operator;
1855 node *ch = CHILD(n, 0);
1856
1857 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001858 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001860 expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch),
1861 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862
1863 if (!expr1)
1864 return NULL;
Neal Norwitz96e48d42006-02-05 02:07:19 +00001865 /* TODO(jhylton): Figure out why set_context() can't be used here. */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001866 switch (expr1->kind) {
1867 case GeneratorExp_kind:
1868 ast_error(ch, "augmented assignment to generator "
1869 "expression not possible");
1870 return NULL;
1871 case Name_kind: {
1872 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1873 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1874 ast_error(ch, "assignment to None");
1875 return NULL;
1876 }
1877 break;
1878 }
1879 case Attribute_kind:
1880 case Subscript_kind:
1881 break;
1882 default:
1883 ast_error(ch, "illegal expression for augmented "
1884 "assignment");
1885 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887
1888 ch = CHILD(n, 2);
1889 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001890 expr2 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001892 expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001893 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894 return NULL;
1895
1896 operator = ast_for_augassign(CHILD(n, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001897 if (!operator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 return NULL;
1899
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001900 return AugAssign(expr1, operator, expr2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 }
1902 else {
1903 int i;
1904 asdl_seq *targets;
1905 node *value;
1906 expr_ty expression;
1907
1908 /* a normal assignment */
1909 REQ(CHILD(n, 1), EQUAL);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001910 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911 if (!targets)
1912 return NULL;
1913 for (i = 0; i < NCH(n) - 2; i += 2) {
Armin Rigo31441302005-10-21 12:57:31 +00001914 expr_ty e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915 node *ch = CHILD(n, i);
1916 if (TYPE(ch) == yield_expr) {
1917 ast_error(ch, "assignment to yield expression not possible");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001918 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001920 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921
1922 /* set context to assign */
1923 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001924 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925
Neal Norwitz84456bd2005-12-18 03:16:20 +00001926 if (!set_context(e, Store, CHILD(n, i)))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001927 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928
1929 asdl_seq_SET(targets, i / 2, e);
1930 }
1931 value = CHILD(n, NCH(n) - 1);
1932 if (TYPE(value) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001933 expression = ast_for_testlist(c, value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934 else
1935 expression = ast_for_expr(c, value);
1936 if (!expression)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001937 return NULL;
1938 return Assign(targets, expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940}
1941
1942static stmt_ty
1943ast_for_print_stmt(struct compiling *c, const node *n)
1944{
1945 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
1946 | '>>' test [ (',' test)+ [','] ] )
1947 */
1948 expr_ty dest = NULL, expression;
1949 asdl_seq *seq;
1950 bool nl;
1951 int i, start = 1;
1952
1953 REQ(n, print_stmt);
1954 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
1955 dest = ast_for_expr(c, CHILD(n, 2));
1956 if (!dest)
1957 return NULL;
1958 start = 4;
1959 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 if (!seq)
1962 return NULL;
1963 for (i = start; i < NCH(n); i += 2) {
1964 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001965 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967
1968 asdl_seq_APPEND(seq, expression);
1969 }
1970 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001971 return Print(dest, seq, nl, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972}
1973
1974static asdl_seq *
1975ast_for_exprlist(struct compiling *c, const node *n, int context)
1976{
1977 asdl_seq *seq;
1978 int i;
1979 expr_ty e;
1980
1981 REQ(n, exprlist);
1982
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001983 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 if (!seq)
1985 return NULL;
1986 for (i = 0; i < NCH(n); i += 2) {
1987 e = ast_for_expr(c, CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001988 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001989 return NULL;
Neal Norwitz6b347892005-11-15 07:17:53 +00001990 asdl_seq_SET(seq, i / 2, e);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001991 if (context && !set_context(e, context, CHILD(n, i)))
1992 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 }
1994 return seq;
1995}
1996
1997static stmt_ty
1998ast_for_del_stmt(struct compiling *c, const node *n)
1999{
2000 asdl_seq *expr_list;
2001
2002 /* del_stmt: 'del' exprlist */
2003 REQ(n, del_stmt);
2004
2005 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2006 if (!expr_list)
2007 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002008 return Delete(expr_list, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009}
2010
2011static stmt_ty
2012ast_for_flow_stmt(struct compiling *c, const node *n)
2013{
2014 /*
2015 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2016 | yield_stmt
2017 break_stmt: 'break'
2018 continue_stmt: 'continue'
2019 return_stmt: 'return' [testlist]
2020 yield_stmt: yield_expr
2021 yield_expr: 'yield' testlist
2022 raise_stmt: 'raise' [test [',' test [',' test]]]
2023 */
2024 node *ch;
2025
2026 REQ(n, flow_stmt);
2027 ch = CHILD(n, 0);
2028 switch (TYPE(ch)) {
2029 case break_stmt:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002030 return Break(LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 case continue_stmt:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002032 return Continue(LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 case yield_stmt: { /* will reduce to yield_expr */
2034 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2035 if (!exp)
2036 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002037 return Expr(exp, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038 }
2039 case return_stmt:
2040 if (NCH(ch) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041 return Return(NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002043 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 if (!expression)
2045 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002046 return Return(expression, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 }
2048 case raise_stmt:
2049 if (NCH(ch) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002050 return Raise(NULL, NULL, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051 else if (NCH(ch) == 2) {
2052 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2053 if (!expression)
2054 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002055 return Raise(expression, NULL, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056 }
2057 else if (NCH(ch) == 4) {
2058 expr_ty expr1, expr2;
2059
2060 expr1 = ast_for_expr(c, CHILD(ch, 1));
2061 if (!expr1)
2062 return NULL;
2063 expr2 = ast_for_expr(c, CHILD(ch, 3));
2064 if (!expr2)
2065 return NULL;
2066
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002067 return Raise(expr1, expr2, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 }
2069 else if (NCH(ch) == 6) {
2070 expr_ty expr1, expr2, expr3;
2071
2072 expr1 = ast_for_expr(c, CHILD(ch, 1));
2073 if (!expr1)
2074 return NULL;
2075 expr2 = ast_for_expr(c, CHILD(ch, 3));
2076 if (!expr2)
2077 return NULL;
2078 expr3 = ast_for_expr(c, CHILD(ch, 5));
2079 if (!expr3)
2080 return NULL;
2081
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002082 return Raise(expr1, expr2, expr3, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083 }
2084 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002085 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 "unexpected flow_stmt: %d", TYPE(ch));
2087 return NULL;
2088 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002089
2090 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092}
2093
2094static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002095alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096{
2097 /*
2098 import_as_name: NAME [NAME NAME]
2099 dotted_as_name: dotted_name [NAME NAME]
2100 dotted_name: NAME ('.' NAME)*
2101 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002102 PyObject *str;
2103
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 loop:
2105 switch (TYPE(n)) {
2106 case import_as_name:
Neal Norwitz84456bd2005-12-18 03:16:20 +00002107 str = (NCH(n) == 3) ? NEW_IDENTIFIER(CHILD(n, 2)) : NULL;
2108 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 case dotted_as_name:
2110 if (NCH(n) == 1) {
2111 n = CHILD(n, 0);
2112 goto loop;
2113 }
2114 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002115 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 assert(!a->asname);
2117 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2118 return a;
2119 }
2120 break;
2121 case dotted_name:
2122 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002123 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124 else {
2125 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002126 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002127 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128 char *s;
2129
2130 len = 0;
2131 for (i = 0; i < NCH(n); i += 2)
2132 /* length of string plus one for the dot */
2133 len += strlen(STR(CHILD(n, i))) + 1;
2134 len--; /* the last name doesn't have a dot */
2135 str = PyString_FromStringAndSize(NULL, len);
2136 if (!str)
2137 return NULL;
2138 s = PyString_AS_STRING(str);
2139 if (!s)
2140 return NULL;
2141 for (i = 0; i < NCH(n); i += 2) {
2142 char *sch = STR(CHILD(n, i));
2143 strcpy(s, STR(CHILD(n, i)));
2144 s += strlen(sch);
2145 *s++ = '.';
2146 }
2147 --s;
2148 *s = '\0';
2149 PyString_InternInPlace(&str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002150 PyArena_AddPyObject(c->c_arena, str);
2151 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002152 }
2153 break;
2154 case STAR:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002155 str = PyString_InternFromString("*");
2156 PyArena_AddPyObject(c->c_arena, str);
2157 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002159 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 "unexpected import name: %d", TYPE(n));
2161 return NULL;
2162 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002163
2164 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165 return NULL;
2166}
2167
2168static stmt_ty
2169ast_for_import_stmt(struct compiling *c, const node *n)
2170{
2171 /*
2172 import_stmt: import_name | import_from
2173 import_name: 'import' dotted_as_names
2174 import_from: 'from' dotted_name 'import' ('*' |
2175 '(' import_as_names ')' |
2176 import_as_names)
2177 */
2178 int i;
2179 asdl_seq *aliases;
2180
2181 REQ(n, import_stmt);
2182 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002183 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184 n = CHILD(n, 1);
Neil Schemenauer147b7592005-10-23 03:38:19 +00002185 REQ(n, dotted_as_names);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002186 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 if (!aliases)
2188 return NULL;
2189 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002190 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002191 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002192 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 asdl_seq_SET(aliases, i / 2, import_alias);
2194 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002195 return Import(aliases, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002197 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 int n_children;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199 int lineno = LINENO(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002200 alias_ty mod = alias_for_import_name(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 if (!mod)
2202 return NULL;
2203
Thomas Wouters106203c2006-02-27 17:05:19 +00002204 switch (TYPE(CHILD(n, 3))) {
2205 case STAR:
2206 /* from ... import * */
2207 n = CHILD(n, 3);
2208 n_children = 1;
2209 break;
2210 case LPAR:
2211 /* from ... import (x, y, z) */
2212 n = CHILD(n, 4);
2213 n_children = NCH(n);
2214 break;
2215 case import_as_names:
2216 /* from ... import x, y, z */
2217 n = CHILD(n, 3);
2218 n_children = NCH(n);
2219 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 ast_error(n, "trailing comma not allowed without"
2221 " surrounding parentheses");
2222 return NULL;
2223 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002224 break;
2225 default:
2226 ast_error(n, "Unexpected node-type in from-import");
2227 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00002228 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002230 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002231 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233
2234 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002235 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002236 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002237 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 asdl_seq_APPEND(aliases, import_alias);
2240 }
2241
2242 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002243 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002244 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246 asdl_seq_APPEND(aliases, import_alias);
2247 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002248 return ImportFrom(mod->name, aliases, lineno, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 }
Neal Norwitz79792652005-11-14 04:25:03 +00002250 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 "unknown import statement: starts with command '%s'",
2252 STR(CHILD(n, 0)));
2253 return NULL;
2254}
2255
2256static stmt_ty
2257ast_for_global_stmt(struct compiling *c, const node *n)
2258{
2259 /* global_stmt: 'global' NAME (',' NAME)* */
2260 identifier name;
2261 asdl_seq *s;
2262 int i;
2263
2264 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002265 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266 if (!s)
2267 return NULL;
2268 for (i = 1; i < NCH(n); i += 2) {
2269 name = NEW_IDENTIFIER(CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002270 if (!name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 asdl_seq_SET(s, i / 2, name);
2273 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002274 return Global(s, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275}
2276
2277static stmt_ty
2278ast_for_exec_stmt(struct compiling *c, const node *n)
2279{
2280 expr_ty expr1, globals = NULL, locals = NULL;
2281 int n_children = NCH(n);
2282 if (n_children != 2 && n_children != 4 && n_children != 6) {
Neal Norwitz79792652005-11-14 04:25:03 +00002283 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 "poorly formed 'exec' statement: %d parts to statement",
2285 n_children);
2286 return NULL;
2287 }
2288
2289 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2290 REQ(n, exec_stmt);
2291 expr1 = ast_for_expr(c, CHILD(n, 1));
2292 if (!expr1)
2293 return NULL;
2294 if (n_children >= 4) {
2295 globals = ast_for_expr(c, CHILD(n, 3));
2296 if (!globals)
2297 return NULL;
2298 }
2299 if (n_children == 6) {
2300 locals = ast_for_expr(c, CHILD(n, 5));
2301 if (!locals)
2302 return NULL;
2303 }
2304
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002305 return Exec(expr1, globals, locals, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306}
2307
2308static stmt_ty
2309ast_for_assert_stmt(struct compiling *c, const node *n)
2310{
2311 /* assert_stmt: 'assert' test [',' test] */
2312 REQ(n, assert_stmt);
2313 if (NCH(n) == 2) {
2314 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2315 if (!expression)
2316 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002317 return Assert(expression, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 }
2319 else if (NCH(n) == 4) {
2320 expr_ty expr1, expr2;
2321
2322 expr1 = ast_for_expr(c, CHILD(n, 1));
2323 if (!expr1)
2324 return NULL;
2325 expr2 = ast_for_expr(c, CHILD(n, 3));
2326 if (!expr2)
2327 return NULL;
2328
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002329 return Assert(expr1, expr2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 }
Neal Norwitz79792652005-11-14 04:25:03 +00002331 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 "improper number of parts to 'assert' statement: %d",
2333 NCH(n));
2334 return NULL;
2335}
2336
2337static asdl_seq *
2338ast_for_suite(struct compiling *c, const node *n)
2339{
2340 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002341 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 stmt_ty s;
2343 int i, total, num, end, pos = 0;
2344 node *ch;
2345
2346 REQ(n, suite);
2347
2348 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002349 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 if (!seq)
2351 return NULL;
2352 if (TYPE(CHILD(n, 0)) == simple_stmt) {
2353 n = CHILD(n, 0);
2354 /* simple_stmt always ends with a NEWLINE,
2355 and may have a trailing SEMI
2356 */
2357 end = NCH(n) - 1;
2358 if (TYPE(CHILD(n, end - 1)) == SEMI)
2359 end--;
2360 /* loop by 2 to skip semi-colons */
2361 for (i = 0; i < end; i += 2) {
2362 ch = CHILD(n, i);
2363 s = ast_for_stmt(c, ch);
2364 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002365 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 asdl_seq_SET(seq, pos++, s);
2367 }
2368 }
2369 else {
2370 for (i = 2; i < (NCH(n) - 1); i++) {
2371 ch = CHILD(n, i);
2372 REQ(ch, stmt);
2373 num = num_stmts(ch);
2374 if (num == 1) {
2375 /* small_stmt or compound_stmt with only one child */
2376 s = ast_for_stmt(c, ch);
2377 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002378 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 asdl_seq_SET(seq, pos++, s);
2380 }
2381 else {
2382 int j;
2383 ch = CHILD(ch, 0);
2384 REQ(ch, simple_stmt);
2385 for (j = 0; j < NCH(ch); j += 2) {
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002386 /* statement terminates with a semi-colon ';' */
2387 if (NCH(CHILD(ch, j)) == 0) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002388 assert((j + 1) == NCH(ch));
2389 break;
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 s = ast_for_stmt(c, CHILD(ch, j));
2392 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002393 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 asdl_seq_SET(seq, pos++, s);
2395 }
2396 }
2397 }
2398 }
2399 assert(pos == seq->size);
2400 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401}
2402
2403static stmt_ty
2404ast_for_if_stmt(struct compiling *c, const node *n)
2405{
2406 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2407 ['else' ':' suite]
2408 */
2409 char *s;
2410
2411 REQ(n, if_stmt);
2412
2413 if (NCH(n) == 4) {
2414 expr_ty expression;
2415 asdl_seq *suite_seq;
2416
2417 expression = ast_for_expr(c, CHILD(n, 1));
2418 if (!expression)
2419 return NULL;
2420 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002421 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 return NULL;
2423
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002424 return If(expression, suite_seq, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002426
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 s = STR(CHILD(n, 4));
2428 /* s[2], the third character in the string, will be
2429 's' for el_s_e, or
2430 'i' for el_i_f
2431 */
2432 if (s[2] == 's') {
2433 expr_ty expression;
2434 asdl_seq *seq1, *seq2;
2435
2436 expression = ast_for_expr(c, CHILD(n, 1));
2437 if (!expression)
2438 return NULL;
2439 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002440 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 return NULL;
2442 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002443 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 return NULL;
2445
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002446 return If(expression, seq1, seq2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 }
2448 else if (s[2] == 'i') {
2449 int i, n_elif, has_else = 0;
2450 asdl_seq *orelse = NULL;
2451 n_elif = NCH(n) - 4;
2452 /* must reference the child n_elif+1 since 'else' token is third,
2453 not fourth, child from the end. */
2454 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2455 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2456 has_else = 1;
2457 n_elif -= 3;
2458 }
2459 n_elif /= 4;
2460
2461 if (has_else) {
2462 expr_ty expression;
2463 asdl_seq *seq1, *seq2;
2464
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002465 orelse = asdl_seq_new(1, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 if (!orelse)
2467 return NULL;
2468 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002469 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002472 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002475 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002476 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477
2478 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002479 LINENO(CHILD(n, NCH(n) - 6)),
2480 c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 /* the just-created orelse handled the last elif */
2482 n_elif--;
2483 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484
2485 for (i = 0; i < n_elif; i++) {
2486 int off = 5 + (n_elif - i - 1) * 4;
2487 expr_ty expression;
2488 asdl_seq *suite_seq;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002489 asdl_seq *new = asdl_seq_new(1, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002490 if (!new)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 return NULL;
2492 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002493 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002496 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498
2499 asdl_seq_SET(new, 0,
2500 If(expression, suite_seq, orelse,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002501 LINENO(CHILD(n, off)), c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 orelse = new;
2503 }
2504 return If(ast_for_expr(c, CHILD(n, 1)),
2505 ast_for_suite(c, CHILD(n, 3)),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002506 orelse, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002508
2509 PyErr_Format(PyExc_SystemError,
2510 "unexpected token in 'if' statement: %s", s);
2511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512}
2513
2514static stmt_ty
2515ast_for_while_stmt(struct compiling *c, const node *n)
2516{
2517 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2518 REQ(n, while_stmt);
2519
2520 if (NCH(n) == 4) {
2521 expr_ty expression;
2522 asdl_seq *suite_seq;
2523
2524 expression = ast_for_expr(c, CHILD(n, 1));
2525 if (!expression)
2526 return NULL;
2527 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002528 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002530 return While(expression, suite_seq, NULL, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 }
2532 else if (NCH(n) == 7) {
2533 expr_ty expression;
2534 asdl_seq *seq1, *seq2;
2535
2536 expression = ast_for_expr(c, CHILD(n, 1));
2537 if (!expression)
2538 return NULL;
2539 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002540 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 return NULL;
2542 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002543 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 return NULL;
2545
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002546 return While(expression, seq1, seq2, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002548
2549 PyErr_Format(PyExc_SystemError,
2550 "wrong number of tokens for 'while' statement: %d",
2551 NCH(n));
2552 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553}
2554
2555static stmt_ty
2556ast_for_for_stmt(struct compiling *c, const node *n)
2557{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002558 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 expr_ty expression;
2560 expr_ty target;
2561 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2562 REQ(n, for_stmt);
2563
2564 if (NCH(n) == 9) {
2565 seq = ast_for_suite(c, CHILD(n, 8));
2566 if (!seq)
2567 return NULL;
2568 }
2569
2570 _target = ast_for_exprlist(c, CHILD(n, 1), Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002571 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002573 if (asdl_seq_LEN(_target) == 1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 target = asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002576 target = Tuple(_target, Store, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002578 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002579 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 return NULL;
2581 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002582 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 return NULL;
2584
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002585 return For(target, expression, suite_seq, seq, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586}
2587
2588static excepthandler_ty
2589ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2590{
2591 /* except_clause: 'except' [test [',' test]] */
2592 REQ(exc, except_clause);
2593 REQ(body, suite);
2594
2595 if (NCH(exc) == 1) {
2596 asdl_seq *suite_seq = ast_for_suite(c, body);
2597 if (!suite_seq)
2598 return NULL;
2599
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002600 return excepthandler(NULL, NULL, suite_seq, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 }
2602 else if (NCH(exc) == 2) {
2603 expr_ty expression;
2604 asdl_seq *suite_seq;
2605
2606 expression = ast_for_expr(c, CHILD(exc, 1));
2607 if (!expression)
2608 return NULL;
2609 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002610 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 return NULL;
2612
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002613 return excepthandler(expression, NULL, suite_seq, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 }
2615 else if (NCH(exc) == 4) {
2616 asdl_seq *suite_seq;
2617 expr_ty expression;
2618 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2619 if (!e)
2620 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002621 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 return NULL;
2623 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002624 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 return NULL;
2626 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002627 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 return NULL;
2629
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002630 return excepthandler(expression, e, suite_seq, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002632
2633 PyErr_Format(PyExc_SystemError,
2634 "wrong number of children for 'except' clause: %d",
2635 NCH(exc));
2636 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637}
2638
2639static stmt_ty
2640ast_for_try_stmt(struct compiling *c, const node *n)
2641{
Neal Norwitzf599f422005-12-17 21:33:47 +00002642 const int nch = NCH(n);
2643 int n_except = (nch - 3)/3;
2644 asdl_seq *body, *orelse = NULL, *finally = NULL;
2645
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646 REQ(n, try_stmt);
2647
Neal Norwitzf599f422005-12-17 21:33:47 +00002648 body = ast_for_suite(c, CHILD(n, 2));
2649 if (body == NULL)
2650 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651
Neal Norwitzf599f422005-12-17 21:33:47 +00002652 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2653 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2654 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2655 /* we can assume it's an "else",
2656 because nch >= 9 for try-else-finally and
2657 it would otherwise have a type of except_clause */
2658 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2659 if (orelse == NULL)
2660 return NULL;
2661 n_except--;
2662 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663
Neal Norwitzf599f422005-12-17 21:33:47 +00002664 finally = ast_for_suite(c, CHILD(n, nch - 1));
2665 if (finally == NULL)
2666 return NULL;
2667 n_except--;
2668 }
2669 else {
2670 /* we can assume it's an "else",
2671 otherwise it would have a type of except_clause */
2672 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2673 if (orelse == NULL)
2674 return NULL;
2675 n_except--;
2676 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002678 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002679 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 return NULL;
2681 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002682
2683 if (n_except > 0) {
2684 int i;
2685 stmt_ty except_st;
2686 /* process except statements to create a try ... except */
2687 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2688 if (handlers == NULL)
2689 return NULL;
2690
2691 for (i = 0; i < n_except; i++) {
2692 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2693 CHILD(n, 5 + i * 3));
2694 if (!e)
2695 return NULL;
2696 asdl_seq_SET(handlers, i, e);
2697 }
2698
2699 except_st = TryExcept(body, handlers, orelse, LINENO(n), c->c_arena);
2700 if (!finally)
2701 return except_st;
2702
2703 /* if a 'finally' is present too, we nest the TryExcept within a
2704 TryFinally to emulate try ... except ... finally */
2705 body = asdl_seq_new(1, c->c_arena);
2706 if (body == NULL)
2707 return NULL;
2708 asdl_seq_SET(body, 0, except_st);
2709 }
2710
2711 /* must be a try ... finally (except clauses are in body, if any exist) */
2712 assert(finally != NULL);
2713 return TryFinally(body, finally, LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714}
2715
Guido van Rossumc2e20742006-02-27 22:32:47 +00002716static expr_ty
2717ast_for_with_var(struct compiling *c, const node *n)
2718{
2719 REQ(n, with_var);
2720 if (strcmp(STR(CHILD(n, 0)), "as") != 0) {
2721 ast_error(n, "expected \"with [expr] as [var]\"");
2722 return NULL;
2723 }
2724 return ast_for_expr(c, CHILD(n, 1));
2725}
2726
2727/* with_stmt: 'with' test [ with_var ] ':' suite */
2728static stmt_ty
2729ast_for_with_stmt(struct compiling *c, const node *n)
2730{
2731 expr_ty context_expr, optional_vars = NULL;
2732 int suite_index = 3; /* skip 'with', test, and ':' */
2733 asdl_seq *suite_seq;
2734
2735 assert(TYPE(n) == with_stmt);
2736 context_expr = ast_for_expr(c, CHILD(n, 1));
2737 if (TYPE(CHILD(n, 2)) == with_var) {
2738 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2739
2740 if (!optional_vars) {
2741 return NULL;
2742 }
2743 if (!set_context(optional_vars, Store, n)) {
2744 return NULL;
2745 }
2746 suite_index = 4;
2747 }
2748
2749 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2750 if (!suite_seq) {
2751 return NULL;
2752 }
2753 return With(context_expr, optional_vars, suite_seq, LINENO(n), c->c_arena);
2754}
2755
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756static stmt_ty
2757ast_for_classdef(struct compiling *c, const node *n)
2758{
2759 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 asdl_seq *bases, *s;
2761
2762 REQ(n, classdef);
2763
2764 if (!strcmp(STR(CHILD(n, 1)), "None")) {
2765 ast_error(n, "assignment to None");
2766 return NULL;
2767 }
2768
2769 if (NCH(n) == 4) {
2770 s = ast_for_suite(c, CHILD(n, 3));
2771 if (!s)
2772 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002773 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2774 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 }
2776 /* check for empty base list */
2777 if (TYPE(CHILD(n,3)) == RPAR) {
2778 s = ast_for_suite(c, CHILD(n,5));
2779 if (!s)
2780 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002781 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2782 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 }
2784
2785 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002786 bases = ast_for_class_bases(c, CHILD(n, 3));
2787 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002788 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789
2790 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002791 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002793 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
2794 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795}
2796
2797static stmt_ty
2798ast_for_stmt(struct compiling *c, const node *n)
2799{
2800 if (TYPE(n) == stmt) {
2801 assert(NCH(n) == 1);
2802 n = CHILD(n, 0);
2803 }
2804 if (TYPE(n) == simple_stmt) {
2805 assert(num_stmts(n) == 1);
2806 n = CHILD(n, 0);
2807 }
2808 if (TYPE(n) == small_stmt) {
2809 REQ(n, small_stmt);
2810 n = CHILD(n, 0);
2811 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2812 | flow_stmt | import_stmt | global_stmt | exec_stmt
2813 | assert_stmt
2814 */
2815 switch (TYPE(n)) {
2816 case expr_stmt:
2817 return ast_for_expr_stmt(c, n);
2818 case print_stmt:
2819 return ast_for_print_stmt(c, n);
2820 case del_stmt:
2821 return ast_for_del_stmt(c, n);
2822 case pass_stmt:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002823 return Pass(LINENO(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 case flow_stmt:
2825 return ast_for_flow_stmt(c, n);
2826 case import_stmt:
2827 return ast_for_import_stmt(c, n);
2828 case global_stmt:
2829 return ast_for_global_stmt(c, n);
2830 case exec_stmt:
2831 return ast_for_exec_stmt(c, n);
2832 case assert_stmt:
2833 return ast_for_assert_stmt(c, n);
2834 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002835 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2837 TYPE(n), NCH(n));
2838 return NULL;
2839 }
2840 }
2841 else {
2842 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
2843 | funcdef | classdef
2844 */
2845 node *ch = CHILD(n, 0);
2846 REQ(n, compound_stmt);
2847 switch (TYPE(ch)) {
2848 case if_stmt:
2849 return ast_for_if_stmt(c, ch);
2850 case while_stmt:
2851 return ast_for_while_stmt(c, ch);
2852 case for_stmt:
2853 return ast_for_for_stmt(c, ch);
2854 case try_stmt:
2855 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002856 case with_stmt:
2857 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 case funcdef:
2859 return ast_for_funcdef(c, ch);
2860 case classdef:
2861 return ast_for_classdef(c, ch);
2862 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002863 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2865 TYPE(n), NCH(n));
2866 return NULL;
2867 }
2868 }
2869}
2870
2871static PyObject *
2872parsenumber(const char *s)
2873{
2874 const char *end;
2875 long x;
2876 double dx;
2877#ifndef WITHOUT_COMPLEX
2878 Py_complex c;
2879 int imflag;
2880#endif
2881
2882 errno = 0;
2883 end = s + strlen(s) - 1;
2884#ifndef WITHOUT_COMPLEX
2885 imflag = *end == 'j' || *end == 'J';
2886#endif
2887 if (*end == 'l' || *end == 'L')
2888 return PyLong_FromString((char *)s, (char **)0, 0);
2889 if (s[0] == '0') {
2890 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
2891 if (x < 0 && errno == 0) {
2892 return PyLong_FromString((char *)s,
2893 (char **)0,
2894 0);
2895 }
2896 }
2897 else
2898 x = PyOS_strtol((char *)s, (char **)&end, 0);
2899 if (*end == '\0') {
2900 if (errno != 0)
2901 return PyLong_FromString((char *)s, (char **)0, 0);
2902 return PyInt_FromLong(x);
2903 }
2904 /* XXX Huge floats may silently fail */
2905#ifndef WITHOUT_COMPLEX
2906 if (imflag) {
2907 c.real = 0.;
2908 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00002909 c.imag = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 PyFPE_END_PROTECT(c)
2911 return PyComplex_FromCComplex(c);
2912 }
2913 else
2914#endif
2915 {
2916 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00002917 dx = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002918 PyFPE_END_PROTECT(dx)
2919 return PyFloat_FromDouble(dx);
2920 }
2921}
2922
2923static PyObject *
2924decode_utf8(const char **sPtr, const char *end, char* encoding)
2925{
2926#ifndef Py_USING_UNICODE
2927 Py_FatalError("decode_utf8 should not be called in this build.");
2928 return NULL;
2929#else
2930 PyObject *u, *v;
2931 char *s, *t;
2932 t = s = (char *)*sPtr;
2933 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
2934 while (s < end && (*s & 0x80)) s++;
2935 *sPtr = s;
2936 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
2937 if (u == NULL)
2938 return NULL;
2939 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2940 Py_DECREF(u);
2941 return v;
2942#endif
2943}
2944
2945static PyObject *
2946decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
2947{
2948 PyObject *v, *u;
2949 char *buf;
2950 char *p;
2951 const char *end;
2952 if (encoding == NULL) {
2953 buf = (char *)s;
2954 u = NULL;
2955 } else if (strcmp(encoding, "iso-8859-1") == 0) {
2956 buf = (char *)s;
2957 u = NULL;
2958 } else {
2959 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
2960 u = PyString_FromStringAndSize((char *)NULL, len * 4);
2961 if (u == NULL)
2962 return NULL;
2963 p = buf = PyString_AsString(u);
2964 end = s + len;
2965 while (s < end) {
2966 if (*s == '\\') {
2967 *p++ = *s++;
2968 if (*s & 0x80) {
2969 strcpy(p, "u005c");
2970 p += 5;
2971 }
2972 }
2973 if (*s & 0x80) { /* XXX inefficient */
2974 PyObject *w;
2975 char *r;
2976 int rn, i;
2977 w = decode_utf8(&s, end, "utf-16-be");
2978 if (w == NULL) {
2979 Py_DECREF(u);
2980 return NULL;
2981 }
2982 r = PyString_AsString(w);
2983 rn = PyString_Size(w);
2984 assert(rn % 2 == 0);
2985 for (i = 0; i < rn; i += 2) {
2986 sprintf(p, "\\u%02x%02x",
2987 r[i + 0] & 0xFF,
2988 r[i + 1] & 0xFF);
2989 p += 6;
2990 }
2991 Py_DECREF(w);
2992 } else {
2993 *p++ = *s++;
2994 }
2995 }
2996 len = p - buf;
2997 s = buf;
2998 }
2999 if (rawmode)
3000 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3001 else
3002 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3003 Py_XDECREF(u);
3004 return v;
3005}
3006
3007/* s is a Python string literal, including the bracketing quote characters,
3008 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3009 * parsestr parses it, and returns the decoded Python string object.
3010 */
3011static PyObject *
3012parsestr(const char *s, const char *encoding)
3013{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 size_t len;
Neal Norwitz30b5c5d2005-12-19 06:05:18 +00003015 int quote = Py_CHARMASK(*s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 int rawmode = 0;
3017 int need_encoding;
3018 int unicode = 0;
3019
3020 if (isalpha(quote) || quote == '_') {
3021 if (quote == 'u' || quote == 'U') {
3022 quote = *++s;
3023 unicode = 1;
3024 }
3025 if (quote == 'r' || quote == 'R') {
3026 quote = *++s;
3027 rawmode = 1;
3028 }
3029 }
3030 if (quote != '\'' && quote != '\"') {
3031 PyErr_BadInternalCall();
3032 return NULL;
3033 }
3034 s++;
3035 len = strlen(s);
3036 if (len > INT_MAX) {
3037 PyErr_SetString(PyExc_OverflowError,
3038 "string to parse is too long");
3039 return NULL;
3040 }
3041 if (s[--len] != quote) {
3042 PyErr_BadInternalCall();
3043 return NULL;
3044 }
3045 if (len >= 4 && s[0] == quote && s[1] == quote) {
3046 s += 2;
3047 len -= 2;
3048 if (s[--len] != quote || s[--len] != quote) {
3049 PyErr_BadInternalCall();
3050 return NULL;
3051 }
3052 }
3053#ifdef Py_USING_UNICODE
3054 if (unicode || Py_UnicodeFlag) {
3055 return decode_unicode(s, len, rawmode, encoding);
3056 }
3057#endif
3058 need_encoding = (encoding != NULL &&
3059 strcmp(encoding, "utf-8") != 0 &&
3060 strcmp(encoding, "iso-8859-1") != 0);
3061 if (rawmode || strchr(s, '\\') == NULL) {
3062 if (need_encoding) {
3063#ifndef Py_USING_UNICODE
3064 /* This should not happen - we never see any other
3065 encoding. */
3066 Py_FatalError("cannot deal with encodings in this build.");
3067#else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003068 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 if (u == NULL)
3070 return NULL;
3071 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3072 Py_DECREF(u);
3073 return v;
3074#endif
3075 } else {
3076 return PyString_FromStringAndSize(s, len);
3077 }
3078 }
3079
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003080 return PyString_DecodeEscape(s, len, NULL, unicode,
3081 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082}
3083
3084/* Build a Python string object out of a STRING atom. This takes care of
3085 * compile-time literal catenation, calling parsestr() on each piece, and
3086 * pasting the intermediate results together.
3087 */
3088static PyObject *
3089parsestrplus(struct compiling *c, const node *n)
3090{
3091 PyObject *v;
3092 int i;
3093 REQ(CHILD(n, 0), STRING);
3094 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3095 /* String literal concatenation */
3096 for (i = 1; i < NCH(n); i++) {
3097 PyObject *s;
3098 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3099 if (s == NULL)
3100 goto onError;
3101 if (PyString_Check(v) && PyString_Check(s)) {
3102 PyString_ConcatAndDel(&v, s);
3103 if (v == NULL)
3104 goto onError;
3105 }
3106#ifdef Py_USING_UNICODE
3107 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003108 PyObject *temp = PyUnicode_Concat(v, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 Py_DECREF(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 Py_DECREF(v);
3111 v = temp;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003112 if (v == NULL)
3113 goto onError;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 }
3115#endif
3116 }
3117 }
3118 return v;
3119
3120 onError:
3121 Py_XDECREF(v);
3122 return NULL;
3123}