symbian-qemu-0.9.1-12/python-2.6.1/Python/ast.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     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"
       
    10 #include "pyarena.h"
       
    11 #include "ast.h"
       
    12 #include "token.h"
       
    13 #include "parsetok.h"
       
    14 #include "graminit.h"
       
    15 
       
    16 #include <assert.h>
       
    17 
       
    18 /* Data structure used internally */
       
    19 struct compiling {
       
    20     char *c_encoding; /* source encoding */
       
    21     int c_future_unicode; /* __future__ unicode literals flag */
       
    22     PyArena *c_arena; /* arena for allocating memeory */
       
    23     const char *c_filename; /* filename */
       
    24 };
       
    25 
       
    26 static asdl_seq *seq_for_testlist(struct compiling *, const node *);
       
    27 static expr_ty ast_for_expr(struct compiling *, const node *);
       
    28 static stmt_ty ast_for_stmt(struct compiling *, const node *);
       
    29 static asdl_seq *ast_for_suite(struct compiling *, const node *);
       
    30 static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
       
    31                                   expr_context_ty);
       
    32 static expr_ty ast_for_testlist(struct compiling *, const node *);
       
    33 static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
       
    34 static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
       
    35 
       
    36 /* Note different signature for ast_for_call */
       
    37 static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
       
    38 
       
    39 static PyObject *parsenumber(struct compiling *, const char *);
       
    40 static PyObject *parsestr(struct compiling *, const char *);
       
    41 static PyObject *parsestrplus(struct compiling *, const node *n);
       
    42 
       
    43 #ifndef LINENO
       
    44 #define LINENO(n)       ((n)->n_lineno)
       
    45 #endif
       
    46 
       
    47 static identifier
       
    48 new_identifier(const char* n, PyArena *arena) {
       
    49     PyObject* id = PyString_InternFromString(n);
       
    50     if (id != NULL)
       
    51         PyArena_AddPyObject(arena, id);
       
    52     return id;
       
    53 }
       
    54 
       
    55 #define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
       
    56 
       
    57 /* This routine provides an invalid object for the syntax error.
       
    58    The outermost routine must unpack this error and create the
       
    59    proper object.  We do this so that we don't have to pass
       
    60    the filename to everything function.
       
    61 
       
    62    XXX Maybe we should just pass the filename...
       
    63 */
       
    64 
       
    65 static int
       
    66 ast_error(const node *n, const char *errstr)
       
    67 {
       
    68     PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
       
    69     if (!u)
       
    70         return 0;
       
    71     PyErr_SetObject(PyExc_SyntaxError, u);
       
    72     Py_DECREF(u);
       
    73     return 0;
       
    74 }
       
    75 
       
    76 static void
       
    77 ast_error_finish(const char *filename)
       
    78 {
       
    79     PyObject *type, *value, *tback, *errstr, *loc, *tmp;
       
    80     long lineno;
       
    81 
       
    82     assert(PyErr_Occurred());
       
    83     if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
       
    84         return;
       
    85 
       
    86     PyErr_Fetch(&type, &value, &tback);
       
    87     errstr = PyTuple_GetItem(value, 0);
       
    88     if (!errstr)
       
    89         return;
       
    90     Py_INCREF(errstr);
       
    91     lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
       
    92     if (lineno == -1) {
       
    93         Py_DECREF(errstr);
       
    94         return;
       
    95     }
       
    96     Py_DECREF(value);
       
    97 
       
    98     loc = PyErr_ProgramText(filename, lineno);
       
    99     if (!loc) {
       
   100         Py_INCREF(Py_None);
       
   101         loc = Py_None;
       
   102     }
       
   103     tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
       
   104     Py_DECREF(loc);
       
   105     if (!tmp) {
       
   106         Py_DECREF(errstr);
       
   107         return;
       
   108     }
       
   109     value = PyTuple_Pack(2, errstr, tmp);
       
   110     Py_DECREF(errstr);
       
   111     Py_DECREF(tmp);
       
   112     if (!value)
       
   113         return;
       
   114     PyErr_Restore(type, value, tback);
       
   115 }
       
   116 
       
   117 static int
       
   118 ast_warn(struct compiling *c, const node *n, char *msg)
       
   119 {
       
   120     if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, LINENO(n),
       
   121                            NULL, NULL) < 0) {
       
   122         /* if -Werr, change it to a SyntaxError */
       
   123         if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning))
       
   124             ast_error(n, msg);
       
   125         return 0;
       
   126     }
       
   127     return 1;
       
   128 }
       
   129 
       
   130 static int
       
   131 forbidden_check(struct compiling *c, const node *n, const char *x)
       
   132 {
       
   133     if (!strcmp(x, "None"))
       
   134         return ast_error(n, "assignment to None");
       
   135     if (Py_Py3kWarningFlag && !(strcmp(x, "True") && strcmp(x, "False")) &&
       
   136         !ast_warn(c, n, "assignment to True or False is forbidden in 3.x"))
       
   137         return 0;
       
   138     return 1;
       
   139 }
       
   140 
       
   141 /* num_stmts() returns number of contained statements.
       
   142 
       
   143    Use this routine to determine how big a sequence is needed for
       
   144    the statements in a parse tree.  Its raison d'etre is this bit of
       
   145    grammar:
       
   146 
       
   147    stmt: simple_stmt | compound_stmt
       
   148    simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
       
   149 
       
   150    A simple_stmt can contain multiple small_stmt elements joined
       
   151    by semicolons.  If the arg is a simple_stmt, the number of
       
   152    small_stmt elements is returned.
       
   153 */
       
   154 
       
   155 static int
       
   156 num_stmts(const node *n)
       
   157 {
       
   158     int i, l;
       
   159     node *ch;
       
   160 
       
   161     switch (TYPE(n)) {
       
   162         case single_input:
       
   163             if (TYPE(CHILD(n, 0)) == NEWLINE)
       
   164                 return 0;
       
   165             else
       
   166                 return num_stmts(CHILD(n, 0));
       
   167         case file_input:
       
   168             l = 0;
       
   169             for (i = 0; i < NCH(n); i++) {
       
   170                 ch = CHILD(n, i);
       
   171                 if (TYPE(ch) == stmt)
       
   172                     l += num_stmts(ch);
       
   173             }
       
   174             return l;
       
   175         case stmt:
       
   176             return num_stmts(CHILD(n, 0));
       
   177         case compound_stmt:
       
   178             return 1;
       
   179         case simple_stmt:
       
   180             return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
       
   181         case suite:
       
   182             if (NCH(n) == 1)
       
   183                 return num_stmts(CHILD(n, 0));
       
   184             else {
       
   185                 l = 0;
       
   186                 for (i = 2; i < (NCH(n) - 1); i++)
       
   187                     l += num_stmts(CHILD(n, i));
       
   188                 return l;
       
   189             }
       
   190         default: {
       
   191             char buf[128];
       
   192 
       
   193             sprintf(buf, "Non-statement found: %d %d\n",
       
   194                     TYPE(n), NCH(n));
       
   195             Py_FatalError(buf);
       
   196         }
       
   197     }
       
   198     assert(0);
       
   199     return 0;
       
   200 }
       
   201 
       
   202 /* Transform the CST rooted at node * to the appropriate AST
       
   203 */
       
   204 
       
   205 mod_ty
       
   206 PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
       
   207                PyArena *arena)
       
   208 {
       
   209     int i, j, k, num;
       
   210     asdl_seq *stmts = NULL;
       
   211     stmt_ty s;
       
   212     node *ch;
       
   213     struct compiling c;
       
   214 
       
   215     if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
       
   216         c.c_encoding = "utf-8";
       
   217         if (TYPE(n) == encoding_decl) {
       
   218             ast_error(n, "encoding declaration in Unicode string");
       
   219             goto error;
       
   220         }
       
   221     } else if (TYPE(n) == encoding_decl) {
       
   222         c.c_encoding = STR(n);
       
   223         n = CHILD(n, 0);
       
   224     } else {
       
   225         c.c_encoding = NULL;
       
   226     }
       
   227     c.c_future_unicode = flags && flags->cf_flags & CO_FUTURE_UNICODE_LITERALS;
       
   228     c.c_arena = arena;
       
   229     c.c_filename = filename;
       
   230 
       
   231     k = 0;
       
   232     switch (TYPE(n)) {
       
   233         case file_input:
       
   234             stmts = asdl_seq_new(num_stmts(n), arena);
       
   235             if (!stmts)
       
   236                 return NULL;
       
   237             for (i = 0; i < NCH(n) - 1; i++) {
       
   238                 ch = CHILD(n, i);
       
   239                 if (TYPE(ch) == NEWLINE)
       
   240                     continue;
       
   241                 REQ(ch, stmt);
       
   242                 num = num_stmts(ch);
       
   243                 if (num == 1) {
       
   244                     s = ast_for_stmt(&c, ch);
       
   245                     if (!s)
       
   246                         goto error;
       
   247                     asdl_seq_SET(stmts, k++, s);
       
   248                 }
       
   249                 else {
       
   250                     ch = CHILD(ch, 0);
       
   251                     REQ(ch, simple_stmt);
       
   252                     for (j = 0; j < num; j++) {
       
   253                         s = ast_for_stmt(&c, CHILD(ch, j * 2));
       
   254                         if (!s)
       
   255                             goto error;
       
   256                         asdl_seq_SET(stmts, k++, s);
       
   257                     }
       
   258                 }
       
   259             }
       
   260             return Module(stmts, arena);
       
   261         case eval_input: {
       
   262             expr_ty testlist_ast;
       
   263 
       
   264             /* XXX Why not gen_for here? */
       
   265             testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
       
   266             if (!testlist_ast)
       
   267                 goto error;
       
   268             return Expression(testlist_ast, arena);
       
   269         }
       
   270         case single_input:
       
   271             if (TYPE(CHILD(n, 0)) == NEWLINE) {
       
   272                 stmts = asdl_seq_new(1, arena);
       
   273                 if (!stmts)
       
   274                     goto error;
       
   275                 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
       
   276                                             arena));
       
   277                 if (!asdl_seq_GET(stmts, 0))
       
   278                     goto error;
       
   279                 return Interactive(stmts, arena);
       
   280             }
       
   281             else {
       
   282                 n = CHILD(n, 0);
       
   283                 num = num_stmts(n);
       
   284                 stmts = asdl_seq_new(num, arena);
       
   285                 if (!stmts)
       
   286                     goto error;
       
   287                 if (num == 1) {
       
   288                     s = ast_for_stmt(&c, n);
       
   289                     if (!s)
       
   290                         goto error;
       
   291                     asdl_seq_SET(stmts, 0, s);
       
   292                 }
       
   293                 else {
       
   294                     /* Only a simple_stmt can contain multiple statements. */
       
   295                     REQ(n, simple_stmt);
       
   296                     for (i = 0; i < NCH(n); i += 2) {
       
   297                         if (TYPE(CHILD(n, i)) == NEWLINE)
       
   298                             break;
       
   299                         s = ast_for_stmt(&c, CHILD(n, i));
       
   300                         if (!s)
       
   301                             goto error;
       
   302                         asdl_seq_SET(stmts, i / 2, s);
       
   303                     }
       
   304                 }
       
   305 
       
   306                 return Interactive(stmts, arena);
       
   307             }
       
   308         default:
       
   309             PyErr_Format(PyExc_SystemError,
       
   310                          "invalid node %d for PyAST_FromNode", TYPE(n));
       
   311             goto error;
       
   312     }
       
   313  error:
       
   314     ast_error_finish(filename);
       
   315     return NULL;
       
   316 }
       
   317 
       
   318 /* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
       
   319 */
       
   320 
       
   321 static operator_ty
       
   322 get_operator(const node *n)
       
   323 {
       
   324     switch (TYPE(n)) {
       
   325         case VBAR:
       
   326             return BitOr;
       
   327         case CIRCUMFLEX:
       
   328             return BitXor;
       
   329         case AMPER:
       
   330             return BitAnd;
       
   331         case LEFTSHIFT:
       
   332             return LShift;
       
   333         case RIGHTSHIFT:
       
   334             return RShift;
       
   335         case PLUS:
       
   336             return Add;
       
   337         case MINUS:
       
   338             return Sub;
       
   339         case STAR:
       
   340             return Mult;
       
   341         case SLASH:
       
   342             return Div;
       
   343         case DOUBLESLASH:
       
   344             return FloorDiv;
       
   345         case PERCENT:
       
   346             return Mod;
       
   347         default:
       
   348             return (operator_ty)0;
       
   349     }
       
   350 }
       
   351 
       
   352 /* Set the context ctx for expr_ty e, recursively traversing e.
       
   353 
       
   354    Only sets context for expr kinds that "can appear in assignment context"
       
   355    (according to ../Parser/Python.asdl).  For other expr kinds, it sets
       
   356    an appropriate syntax error and returns false.
       
   357 */
       
   358 
       
   359 static int
       
   360 set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
       
   361 {
       
   362     asdl_seq *s = NULL;
       
   363     /* If a particular expression type can't be used for assign / delete,
       
   364        set expr_name to its name and an error message will be generated.
       
   365     */
       
   366     const char* expr_name = NULL;
       
   367 
       
   368     /* The ast defines augmented store and load contexts, but the
       
   369        implementation here doesn't actually use them.  The code may be
       
   370        a little more complex than necessary as a result.  It also means
       
   371        that expressions in an augmented assignment have a Store context.
       
   372        Consider restructuring so that augmented assignment uses
       
   373        set_context(), too.
       
   374     */
       
   375     assert(ctx != AugStore && ctx != AugLoad);
       
   376 
       
   377     switch (e->kind) {
       
   378         case Attribute_kind:
       
   379             if (ctx == Store && !forbidden_check(c, n,
       
   380                                 PyBytes_AS_STRING(e->v.Attribute.attr)))
       
   381                     return 0;
       
   382             e->v.Attribute.ctx = ctx;
       
   383             break;
       
   384         case Subscript_kind:
       
   385             e->v.Subscript.ctx = ctx;
       
   386             break;
       
   387         case Name_kind:
       
   388             if (ctx == Store && !forbidden_check(c, n,
       
   389                                 PyBytes_AS_STRING(e->v.Name.id)))
       
   390                     return 0;
       
   391             e->v.Name.ctx = ctx;
       
   392             break;
       
   393         case List_kind:
       
   394             e->v.List.ctx = ctx;
       
   395             s = e->v.List.elts;
       
   396             break;
       
   397         case Tuple_kind:
       
   398             if (asdl_seq_LEN(e->v.Tuple.elts) == 0) 
       
   399                 return ast_error(n, "can't assign to ()");
       
   400             e->v.Tuple.ctx = ctx;
       
   401             s = e->v.Tuple.elts;
       
   402             break;
       
   403         case Lambda_kind:
       
   404             expr_name = "lambda";
       
   405             break;
       
   406         case Call_kind:
       
   407             expr_name = "function call";
       
   408             break;
       
   409         case BoolOp_kind:
       
   410         case BinOp_kind:
       
   411         case UnaryOp_kind:
       
   412             expr_name = "operator";
       
   413             break;
       
   414         case GeneratorExp_kind:
       
   415             expr_name = "generator expression";
       
   416             break;
       
   417         case Yield_kind:
       
   418             expr_name = "yield expression";
       
   419             break;
       
   420         case ListComp_kind:
       
   421             expr_name = "list comprehension";
       
   422             break;
       
   423         case Dict_kind:
       
   424         case Num_kind:
       
   425         case Str_kind:
       
   426             expr_name = "literal";
       
   427             break;
       
   428         case Compare_kind:
       
   429             expr_name = "comparison";
       
   430             break;
       
   431         case Repr_kind:
       
   432             expr_name = "repr";
       
   433             break;
       
   434         case IfExp_kind:
       
   435             expr_name = "conditional expression";
       
   436             break;
       
   437         default:
       
   438             PyErr_Format(PyExc_SystemError, 
       
   439                          "unexpected expression in assignment %d (line %d)", 
       
   440                          e->kind, e->lineno);
       
   441             return 0;
       
   442     }
       
   443     /* Check for error string set by switch */
       
   444     if (expr_name) {
       
   445         char buf[300];
       
   446         PyOS_snprintf(buf, sizeof(buf),
       
   447                       "can't %s %s",
       
   448                       ctx == Store ? "assign to" : "delete",
       
   449                       expr_name);
       
   450         return ast_error(n, buf);
       
   451     }
       
   452 
       
   453     /* If the LHS is a list or tuple, we need to set the assignment
       
   454        context for all the contained elements.  
       
   455     */
       
   456     if (s) {
       
   457         int i;
       
   458 
       
   459         for (i = 0; i < asdl_seq_LEN(s); i++) {
       
   460             if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
       
   461                 return 0;
       
   462         }
       
   463     }
       
   464     return 1;
       
   465 }
       
   466 
       
   467 static operator_ty
       
   468 ast_for_augassign(struct compiling *c, const node *n)
       
   469 {
       
   470     REQ(n, augassign);
       
   471     n = CHILD(n, 0);
       
   472     switch (STR(n)[0]) {
       
   473         case '+':
       
   474             return Add;
       
   475         case '-':
       
   476             return Sub;
       
   477         case '/':
       
   478             if (STR(n)[1] == '/')
       
   479                 return FloorDiv;
       
   480             else
       
   481                 return Div;
       
   482         case '%':
       
   483             return Mod;
       
   484         case '<':
       
   485             return LShift;
       
   486         case '>':
       
   487             return RShift;
       
   488         case '&':
       
   489             return BitAnd;
       
   490         case '^':
       
   491             return BitXor;
       
   492         case '|':
       
   493             return BitOr;
       
   494         case '*':
       
   495             if (STR(n)[1] == '*')
       
   496                 return Pow;
       
   497             else
       
   498                 return Mult;
       
   499         default:
       
   500             PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
       
   501             return (operator_ty)0;
       
   502     }
       
   503 }
       
   504 
       
   505 static cmpop_ty
       
   506 ast_for_comp_op(struct compiling *c, const node *n)
       
   507 {
       
   508     /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
       
   509                |'is' 'not'
       
   510     */
       
   511     REQ(n, comp_op);
       
   512     if (NCH(n) == 1) {
       
   513         n = CHILD(n, 0);
       
   514         switch (TYPE(n)) {
       
   515             case LESS:
       
   516                 return Lt;
       
   517             case GREATER:
       
   518                 return Gt;
       
   519             case EQEQUAL:                       /* == */
       
   520                 return Eq;
       
   521             case LESSEQUAL:
       
   522                 return LtE;
       
   523             case GREATEREQUAL:
       
   524                 return GtE;
       
   525             case NOTEQUAL:
       
   526                 return NotEq;
       
   527             case NAME:
       
   528                 if (strcmp(STR(n), "in") == 0)
       
   529                     return In;
       
   530                 if (strcmp(STR(n), "is") == 0)
       
   531                     return Is;
       
   532             default:
       
   533                 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
       
   534                              STR(n));
       
   535                 return (cmpop_ty)0;
       
   536         }
       
   537     }
       
   538     else if (NCH(n) == 2) {
       
   539         /* handle "not in" and "is not" */
       
   540         switch (TYPE(CHILD(n, 0))) {
       
   541             case NAME:
       
   542                 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
       
   543                     return NotIn;
       
   544                 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
       
   545                     return IsNot;
       
   546             default:
       
   547                 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
       
   548                              STR(CHILD(n, 0)), STR(CHILD(n, 1)));
       
   549                 return (cmpop_ty)0;
       
   550         }
       
   551     }
       
   552     PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
       
   553                  NCH(n));
       
   554     return (cmpop_ty)0;
       
   555 }
       
   556 
       
   557 static asdl_seq *
       
   558 seq_for_testlist(struct compiling *c, const node *n)
       
   559 {
       
   560     /* testlist: test (',' test)* [','] */
       
   561     asdl_seq *seq;
       
   562     expr_ty expression;
       
   563     int i;
       
   564     assert(TYPE(n) == testlist ||
       
   565            TYPE(n) == listmaker ||
       
   566            TYPE(n) == testlist_gexp ||
       
   567            TYPE(n) == testlist_safe ||
       
   568            TYPE(n) == testlist1);
       
   569 
       
   570     seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
       
   571     if (!seq)
       
   572         return NULL;
       
   573 
       
   574     for (i = 0; i < NCH(n); i += 2) {
       
   575         assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
       
   576 
       
   577         expression = ast_for_expr(c, CHILD(n, i));
       
   578         if (!expression)
       
   579             return NULL;
       
   580 
       
   581         assert(i / 2 < seq->size);
       
   582         asdl_seq_SET(seq, i / 2, expression);
       
   583     }
       
   584     return seq;
       
   585 }
       
   586 
       
   587 static expr_ty
       
   588 compiler_complex_args(struct compiling *c, const node *n)
       
   589 {
       
   590     int i, len = (NCH(n) + 1) / 2;
       
   591     expr_ty result;
       
   592     asdl_seq *args = asdl_seq_new(len, c->c_arena);
       
   593     if (!args)
       
   594         return NULL;
       
   595 
       
   596     /* fpdef: NAME | '(' fplist ')'
       
   597        fplist: fpdef (',' fpdef)* [',']
       
   598     */
       
   599     REQ(n, fplist);
       
   600     for (i = 0; i < len; i++) {
       
   601         PyObject *arg_id;
       
   602         const node *fpdef_node = CHILD(n, 2*i);
       
   603         const node *child;
       
   604         expr_ty arg;
       
   605 set_name:
       
   606         /* fpdef_node is either a NAME or an fplist */
       
   607         child = CHILD(fpdef_node, 0);
       
   608         if (TYPE(child) == NAME) {
       
   609             if (!forbidden_check(c, n, STR(child)))
       
   610                 return NULL;
       
   611             arg_id = NEW_IDENTIFIER(child);
       
   612             if (!arg_id)
       
   613                 return NULL;
       
   614             arg = Name(arg_id, Store, LINENO(child), child->n_col_offset,
       
   615                        c->c_arena);
       
   616         }
       
   617         else {
       
   618             assert(TYPE(fpdef_node) == fpdef);
       
   619             /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
       
   620             child = CHILD(fpdef_node, 1);
       
   621             assert(TYPE(child) == fplist);
       
   622             /* NCH == 1 means we have (x), we need to elide the extra parens */
       
   623             if (NCH(child) == 1) {
       
   624                 fpdef_node = CHILD(child, 0);
       
   625                 assert(TYPE(fpdef_node) == fpdef);
       
   626                 goto set_name;
       
   627             }
       
   628             arg = compiler_complex_args(c, child);
       
   629         }
       
   630         asdl_seq_SET(args, i, arg);
       
   631     }
       
   632 
       
   633     result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
       
   634     if (!set_context(c, result, Store, n))
       
   635         return NULL;
       
   636     return result;
       
   637 }
       
   638 
       
   639 
       
   640 /* Create AST for argument list. */
       
   641 
       
   642 static arguments_ty
       
   643 ast_for_arguments(struct compiling *c, const node *n)
       
   644 {
       
   645     /* parameters: '(' [varargslist] ')'
       
   646        varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
       
   647             | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
       
   648     */
       
   649     int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
       
   650     asdl_seq *args, *defaults;
       
   651     identifier vararg = NULL, kwarg = NULL;
       
   652     node *ch;
       
   653 
       
   654     if (TYPE(n) == parameters) {
       
   655         if (NCH(n) == 2) /* () as argument list */
       
   656             return arguments(NULL, NULL, NULL, NULL, c->c_arena);
       
   657         n = CHILD(n, 1);
       
   658     }
       
   659     REQ(n, varargslist);
       
   660 
       
   661     /* first count the number of normal args & defaults */
       
   662     for (i = 0; i < NCH(n); i++) {
       
   663         ch = CHILD(n, i);
       
   664         if (TYPE(ch) == fpdef)
       
   665             n_args++;
       
   666         if (TYPE(ch) == EQUAL)
       
   667             n_defaults++;
       
   668     }
       
   669     args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
       
   670     if (!args && n_args)
       
   671         return NULL; /* Don't need to goto error; no objects allocated */
       
   672     defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
       
   673     if (!defaults && n_defaults)
       
   674         return NULL; /* Don't need to goto error; no objects allocated */
       
   675 
       
   676     /* fpdef: NAME | '(' fplist ')'
       
   677        fplist: fpdef (',' fpdef)* [',']
       
   678     */
       
   679     i = 0;
       
   680     j = 0;  /* index for defaults */
       
   681     k = 0;  /* index for args */
       
   682     while (i < NCH(n)) {
       
   683         ch = CHILD(n, i);
       
   684         switch (TYPE(ch)) {
       
   685             case fpdef:
       
   686             handle_fpdef:
       
   687                 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
       
   688                    anything other than EQUAL or a comma? */
       
   689                 /* XXX Should NCH(n) check be made a separate check? */
       
   690                 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
       
   691                     expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
       
   692                     if (!expression)
       
   693                         goto error;
       
   694                     assert(defaults != NULL);
       
   695                     asdl_seq_SET(defaults, j++, expression);
       
   696                     i += 2;
       
   697                     found_default = 1;
       
   698                 }
       
   699                 else if (found_default) {
       
   700                     ast_error(n, 
       
   701                              "non-default argument follows default argument");
       
   702                     goto error;
       
   703                 }
       
   704                 if (NCH(ch) == 3) {
       
   705                     ch = CHILD(ch, 1);
       
   706                     /* def foo((x)): is not complex, special case. */
       
   707                     if (NCH(ch) != 1) {
       
   708                         /* We have complex arguments, setup for unpacking. */
       
   709                         if (Py_Py3kWarningFlag && !ast_warn(c, ch,
       
   710                             "tuple parameter unpacking has been removed in 3.x"))
       
   711                             goto error;
       
   712                         asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
       
   713                         if (!asdl_seq_GET(args, k-1))
       
   714                                 goto error;
       
   715                     } else {
       
   716                         /* def foo((x)): setup for checking NAME below. */
       
   717                         /* Loop because there can be many parens and tuple
       
   718                            unpacking mixed in. */
       
   719                         ch = CHILD(ch, 0);
       
   720                         assert(TYPE(ch) == fpdef);
       
   721                         goto handle_fpdef;
       
   722                     }
       
   723                 }
       
   724                 if (TYPE(CHILD(ch, 0)) == NAME) {
       
   725                     PyObject *id;
       
   726                     expr_ty name;
       
   727                     if (!forbidden_check(c, n, STR(CHILD(ch, 0))))
       
   728                         goto error;
       
   729                     id = NEW_IDENTIFIER(CHILD(ch, 0));
       
   730                     if (!id)
       
   731                         goto error;
       
   732                     name = Name(id, Param, LINENO(ch), ch->n_col_offset,
       
   733                                 c->c_arena);
       
   734                     if (!name)
       
   735                         goto error;
       
   736                     asdl_seq_SET(args, k++, name);
       
   737                                          
       
   738                 }
       
   739                 i += 2; /* the name and the comma */
       
   740                 break;
       
   741             case STAR:
       
   742                 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
       
   743                     goto error;
       
   744                 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
       
   745                 if (!vararg)
       
   746                     goto error;
       
   747                 i += 3;
       
   748                 break;
       
   749             case DOUBLESTAR:
       
   750                 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
       
   751                     goto error;
       
   752                 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
       
   753                 if (!kwarg)
       
   754                     goto error;
       
   755                 i += 3;
       
   756                 break;
       
   757             default:
       
   758                 PyErr_Format(PyExc_SystemError,
       
   759                              "unexpected node in varargslist: %d @ %d",
       
   760                              TYPE(ch), i);
       
   761                 goto error;
       
   762         }
       
   763     }
       
   764 
       
   765     return arguments(args, vararg, kwarg, defaults, c->c_arena);
       
   766 
       
   767  error:
       
   768     Py_XDECREF(vararg);
       
   769     Py_XDECREF(kwarg);
       
   770     return NULL;
       
   771 }
       
   772 
       
   773 static expr_ty
       
   774 ast_for_dotted_name(struct compiling *c, const node *n)
       
   775 {
       
   776     expr_ty e;
       
   777     identifier id;
       
   778     int lineno, col_offset;
       
   779     int i;
       
   780 
       
   781     REQ(n, dotted_name);
       
   782 
       
   783     lineno = LINENO(n);
       
   784     col_offset = n->n_col_offset;
       
   785 
       
   786     id = NEW_IDENTIFIER(CHILD(n, 0));
       
   787     if (!id)
       
   788         return NULL;
       
   789     e = Name(id, Load, lineno, col_offset, c->c_arena);
       
   790     if (!e)
       
   791         return NULL;
       
   792 
       
   793     for (i = 2; i < NCH(n); i+=2) {
       
   794         id = NEW_IDENTIFIER(CHILD(n, i));
       
   795         if (!id)
       
   796             return NULL;
       
   797         e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
       
   798         if (!e)
       
   799             return NULL;
       
   800     }
       
   801 
       
   802     return e;
       
   803 }
       
   804 
       
   805 static expr_ty
       
   806 ast_for_decorator(struct compiling *c, const node *n)
       
   807 {
       
   808     /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
       
   809     expr_ty d = NULL;
       
   810     expr_ty name_expr;
       
   811     
       
   812     REQ(n, decorator);
       
   813     REQ(CHILD(n, 0), AT);
       
   814     REQ(RCHILD(n, -1), NEWLINE);
       
   815     
       
   816     name_expr = ast_for_dotted_name(c, CHILD(n, 1));
       
   817     if (!name_expr)
       
   818         return NULL;
       
   819         
       
   820     if (NCH(n) == 3) { /* No arguments */
       
   821         d = name_expr;
       
   822         name_expr = NULL;
       
   823     }
       
   824     else if (NCH(n) == 5) { /* Call with no arguments */
       
   825         d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
       
   826                  n->n_col_offset, c->c_arena);
       
   827         if (!d)
       
   828             return NULL;
       
   829         name_expr = NULL;
       
   830     }
       
   831     else {
       
   832         d = ast_for_call(c, CHILD(n, 3), name_expr);
       
   833         if (!d)
       
   834             return NULL;
       
   835         name_expr = NULL;
       
   836     }
       
   837 
       
   838     return d;
       
   839 }
       
   840 
       
   841 static asdl_seq*
       
   842 ast_for_decorators(struct compiling *c, const node *n)
       
   843 {
       
   844     asdl_seq* decorator_seq;
       
   845     expr_ty d;
       
   846     int i;
       
   847     
       
   848     REQ(n, decorators);
       
   849     decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
       
   850     if (!decorator_seq)
       
   851         return NULL;
       
   852         
       
   853     for (i = 0; i < NCH(n); i++) {
       
   854         d = ast_for_decorator(c, CHILD(n, i));
       
   855             if (!d)
       
   856                 return NULL;
       
   857             asdl_seq_SET(decorator_seq, i, d);
       
   858     }
       
   859     return decorator_seq;
       
   860 }
       
   861 
       
   862 static stmt_ty
       
   863 ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
       
   864 {
       
   865     /* funcdef: 'def' NAME parameters ':' suite */
       
   866     identifier name;
       
   867     arguments_ty args;
       
   868     asdl_seq *body;
       
   869     int name_i = 1;
       
   870 
       
   871     REQ(n, funcdef);
       
   872 
       
   873     name = NEW_IDENTIFIER(CHILD(n, name_i));
       
   874     if (!name)
       
   875         return NULL;
       
   876     else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i))))
       
   877         return NULL;
       
   878     args = ast_for_arguments(c, CHILD(n, name_i + 1));
       
   879     if (!args)
       
   880         return NULL;
       
   881     body = ast_for_suite(c, CHILD(n, name_i + 3));
       
   882     if (!body)
       
   883         return NULL;
       
   884 
       
   885     return FunctionDef(name, args, body, decorator_seq, LINENO(n),
       
   886                        n->n_col_offset, c->c_arena);
       
   887 }
       
   888 
       
   889 static stmt_ty
       
   890 ast_for_decorated(struct compiling *c, const node *n)
       
   891 {
       
   892     /* decorated: decorators (classdef | funcdef) */
       
   893     stmt_ty thing = NULL;
       
   894     asdl_seq *decorator_seq = NULL;
       
   895 
       
   896     REQ(n, decorated);
       
   897 
       
   898     decorator_seq = ast_for_decorators(c, CHILD(n, 0));
       
   899     if (!decorator_seq)
       
   900       return NULL;
       
   901 
       
   902     assert(TYPE(CHILD(n, 1)) == funcdef ||
       
   903 	   TYPE(CHILD(n, 1)) == classdef);
       
   904 
       
   905     if (TYPE(CHILD(n, 1)) == funcdef) {
       
   906       thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
       
   907     } else if (TYPE(CHILD(n, 1)) == classdef) {
       
   908       thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
       
   909     }
       
   910     /* we count the decorators in when talking about the class' or
       
   911        function's line number */
       
   912     if (thing) {
       
   913         thing->lineno = LINENO(n);
       
   914         thing->col_offset = n->n_col_offset;
       
   915     }
       
   916     return thing;
       
   917 }
       
   918 
       
   919 static expr_ty
       
   920 ast_for_lambdef(struct compiling *c, const node *n)
       
   921 {
       
   922     /* lambdef: 'lambda' [varargslist] ':' test */
       
   923     arguments_ty args;
       
   924     expr_ty expression;
       
   925 
       
   926     if (NCH(n) == 3) {
       
   927         args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
       
   928         if (!args)
       
   929             return NULL;
       
   930         expression = ast_for_expr(c, CHILD(n, 2));
       
   931         if (!expression)
       
   932             return NULL;
       
   933     }
       
   934     else {
       
   935         args = ast_for_arguments(c, CHILD(n, 1));
       
   936         if (!args)
       
   937             return NULL;
       
   938         expression = ast_for_expr(c, CHILD(n, 3));
       
   939         if (!expression)
       
   940             return NULL;
       
   941     }
       
   942 
       
   943     return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
       
   944 }
       
   945 
       
   946 static expr_ty
       
   947 ast_for_ifexpr(struct compiling *c, const node *n)
       
   948 {
       
   949     /* test: or_test 'if' or_test 'else' test */ 
       
   950     expr_ty expression, body, orelse;
       
   951 
       
   952     assert(NCH(n) == 5);
       
   953     body = ast_for_expr(c, CHILD(n, 0));
       
   954     if (!body)
       
   955         return NULL;
       
   956     expression = ast_for_expr(c, CHILD(n, 2));
       
   957     if (!expression)
       
   958         return NULL;
       
   959     orelse = ast_for_expr(c, CHILD(n, 4));
       
   960     if (!orelse)
       
   961         return NULL;
       
   962     return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
       
   963                  c->c_arena);
       
   964 }
       
   965 
       
   966 /* XXX(nnorwitz): the listcomp and genexpr code should be refactored
       
   967    so there is only a single version.  Possibly for loops can also re-use
       
   968    the code.
       
   969 */
       
   970 
       
   971 /* Count the number of 'for' loop in a list comprehension.
       
   972 
       
   973    Helper for ast_for_listcomp().
       
   974 */
       
   975 
       
   976 static int
       
   977 count_list_fors(struct compiling *c, const node *n)
       
   978 {
       
   979     int n_fors = 0;
       
   980     node *ch = CHILD(n, 1);
       
   981 
       
   982  count_list_for:
       
   983     n_fors++;
       
   984     REQ(ch, list_for);
       
   985     if (NCH(ch) == 5)
       
   986         ch = CHILD(ch, 4);
       
   987     else
       
   988         return n_fors;
       
   989  count_list_iter:
       
   990     REQ(ch, list_iter);
       
   991     ch = CHILD(ch, 0);
       
   992     if (TYPE(ch) == list_for)
       
   993         goto count_list_for;
       
   994     else if (TYPE(ch) == list_if) {
       
   995         if (NCH(ch) == 3) {
       
   996             ch = CHILD(ch, 2);
       
   997             goto count_list_iter;
       
   998         }
       
   999         else
       
  1000             return n_fors;
       
  1001     }
       
  1002 
       
  1003     /* Should never be reached */
       
  1004     PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
       
  1005     return -1;
       
  1006 }
       
  1007 
       
  1008 /* Count the number of 'if' statements in a list comprehension.
       
  1009 
       
  1010    Helper for ast_for_listcomp().
       
  1011 */
       
  1012 
       
  1013 static int
       
  1014 count_list_ifs(struct compiling *c, const node *n)
       
  1015 {
       
  1016     int n_ifs = 0;
       
  1017 
       
  1018  count_list_iter:
       
  1019     REQ(n, list_iter);
       
  1020     if (TYPE(CHILD(n, 0)) == list_for)
       
  1021         return n_ifs;
       
  1022     n = CHILD(n, 0);
       
  1023     REQ(n, list_if);
       
  1024     n_ifs++;
       
  1025     if (NCH(n) == 2)
       
  1026         return n_ifs;
       
  1027     n = CHILD(n, 2);
       
  1028     goto count_list_iter;
       
  1029 }
       
  1030 
       
  1031 static expr_ty
       
  1032 ast_for_listcomp(struct compiling *c, const node *n)
       
  1033 {
       
  1034     /* listmaker: test ( list_for | (',' test)* [','] )
       
  1035        list_for: 'for' exprlist 'in' testlist_safe [list_iter]
       
  1036        list_iter: list_for | list_if
       
  1037        list_if: 'if' test [list_iter]
       
  1038        testlist_safe: test [(',' test)+ [',']]
       
  1039     */
       
  1040     expr_ty elt;
       
  1041     asdl_seq *listcomps;
       
  1042     int i, n_fors;
       
  1043     node *ch;
       
  1044 
       
  1045     REQ(n, listmaker);
       
  1046     assert(NCH(n) > 1);
       
  1047 
       
  1048     elt = ast_for_expr(c, CHILD(n, 0));
       
  1049     if (!elt)
       
  1050         return NULL;
       
  1051 
       
  1052     n_fors = count_list_fors(c, n);
       
  1053     if (n_fors == -1)
       
  1054         return NULL;
       
  1055 
       
  1056     listcomps = asdl_seq_new(n_fors, c->c_arena);
       
  1057     if (!listcomps)
       
  1058         return NULL;
       
  1059 
       
  1060     ch = CHILD(n, 1);
       
  1061     for (i = 0; i < n_fors; i++) {
       
  1062         comprehension_ty lc;
       
  1063         asdl_seq *t;
       
  1064         expr_ty expression;
       
  1065         node *for_ch;
       
  1066         
       
  1067         REQ(ch, list_for);
       
  1068         
       
  1069         for_ch = CHILD(ch, 1);
       
  1070         t = ast_for_exprlist(c, for_ch, Store);
       
  1071         if (!t)
       
  1072             return NULL;
       
  1073         expression = ast_for_testlist(c, CHILD(ch, 3));
       
  1074         if (!expression)
       
  1075             return NULL;
       
  1076         
       
  1077         /* Check the # of children rather than the length of t, since
       
  1078            [x for x, in ... ] has 1 element in t, but still requires a Tuple.
       
  1079         */
       
  1080         if (NCH(for_ch) == 1)
       
  1081             lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
       
  1082                                c->c_arena);
       
  1083         else
       
  1084             lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
       
  1085                                      c->c_arena),
       
  1086                                expression, NULL, c->c_arena);
       
  1087         if (!lc)
       
  1088             return NULL;
       
  1089 
       
  1090         if (NCH(ch) == 5) {
       
  1091             int j, n_ifs;
       
  1092             asdl_seq *ifs;
       
  1093             expr_ty list_for_expr;
       
  1094 
       
  1095             ch = CHILD(ch, 4);
       
  1096             n_ifs = count_list_ifs(c, ch);
       
  1097             if (n_ifs == -1)
       
  1098                 return NULL;
       
  1099 
       
  1100             ifs = asdl_seq_new(n_ifs, c->c_arena);
       
  1101             if (!ifs)
       
  1102                 return NULL;
       
  1103 
       
  1104             for (j = 0; j < n_ifs; j++) {
       
  1105                 REQ(ch, list_iter);
       
  1106                 ch = CHILD(ch, 0);
       
  1107                 REQ(ch, list_if);
       
  1108                 
       
  1109                 list_for_expr = ast_for_expr(c, CHILD(ch, 1));
       
  1110                 if (!list_for_expr)
       
  1111                     return NULL;
       
  1112                 
       
  1113                 asdl_seq_SET(ifs, j, list_for_expr);
       
  1114                 if (NCH(ch) == 3)
       
  1115                     ch = CHILD(ch, 2);
       
  1116             }
       
  1117             /* on exit, must guarantee that ch is a list_for */
       
  1118             if (TYPE(ch) == list_iter)
       
  1119                 ch = CHILD(ch, 0);
       
  1120             lc->ifs = ifs;
       
  1121         }
       
  1122         asdl_seq_SET(listcomps, i, lc);
       
  1123     }
       
  1124 
       
  1125     return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
       
  1126 }
       
  1127 
       
  1128 /* Count the number of 'for' loops in a generator expression.
       
  1129 
       
  1130    Helper for ast_for_genexp().
       
  1131 */
       
  1132 
       
  1133 static int
       
  1134 count_gen_fors(struct compiling *c, const node *n)
       
  1135 {
       
  1136     int n_fors = 0;
       
  1137     node *ch = CHILD(n, 1);
       
  1138 
       
  1139  count_gen_for:
       
  1140     n_fors++;
       
  1141     REQ(ch, gen_for);
       
  1142     if (NCH(ch) == 5)
       
  1143         ch = CHILD(ch, 4);
       
  1144     else
       
  1145         return n_fors;
       
  1146  count_gen_iter:
       
  1147     REQ(ch, gen_iter);
       
  1148     ch = CHILD(ch, 0);
       
  1149     if (TYPE(ch) == gen_for)
       
  1150         goto count_gen_for;
       
  1151     else if (TYPE(ch) == gen_if) {
       
  1152         if (NCH(ch) == 3) {
       
  1153             ch = CHILD(ch, 2);
       
  1154             goto count_gen_iter;
       
  1155         }
       
  1156         else
       
  1157             return n_fors;
       
  1158     }
       
  1159     
       
  1160     /* Should never be reached */
       
  1161     PyErr_SetString(PyExc_SystemError,
       
  1162                     "logic error in count_gen_fors");
       
  1163     return -1;
       
  1164 }
       
  1165 
       
  1166 /* Count the number of 'if' statements in a generator expression.
       
  1167 
       
  1168    Helper for ast_for_genexp().
       
  1169 */
       
  1170 
       
  1171 static int
       
  1172 count_gen_ifs(struct compiling *c, const node *n)
       
  1173 {
       
  1174     int n_ifs = 0;
       
  1175 
       
  1176     while (1) {
       
  1177         REQ(n, gen_iter);
       
  1178         if (TYPE(CHILD(n, 0)) == gen_for)
       
  1179             return n_ifs;
       
  1180         n = CHILD(n, 0);
       
  1181         REQ(n, gen_if);
       
  1182         n_ifs++;
       
  1183         if (NCH(n) == 2)
       
  1184             return n_ifs;
       
  1185         n = CHILD(n, 2);
       
  1186     }
       
  1187 }
       
  1188 
       
  1189 /* TODO(jhylton): Combine with list comprehension code? */
       
  1190 static expr_ty
       
  1191 ast_for_genexp(struct compiling *c, const node *n)
       
  1192 {
       
  1193     /* testlist_gexp: test ( gen_for | (',' test)* [','] )
       
  1194        argument: [test '='] test [gen_for]       # Really [keyword '='] test */
       
  1195     expr_ty elt;
       
  1196     asdl_seq *genexps;
       
  1197     int i, n_fors;
       
  1198     node *ch;
       
  1199     
       
  1200     assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
       
  1201     assert(NCH(n) > 1);
       
  1202     
       
  1203     elt = ast_for_expr(c, CHILD(n, 0));
       
  1204     if (!elt)
       
  1205         return NULL;
       
  1206     
       
  1207     n_fors = count_gen_fors(c, n);
       
  1208     if (n_fors == -1)
       
  1209         return NULL;
       
  1210 
       
  1211     genexps = asdl_seq_new(n_fors, c->c_arena);
       
  1212     if (!genexps)
       
  1213         return NULL;
       
  1214 
       
  1215     ch = CHILD(n, 1);
       
  1216     for (i = 0; i < n_fors; i++) {
       
  1217         comprehension_ty ge;
       
  1218         asdl_seq *t;
       
  1219         expr_ty expression;
       
  1220         node *for_ch;
       
  1221         
       
  1222         REQ(ch, gen_for);
       
  1223         
       
  1224         for_ch = CHILD(ch, 1);
       
  1225         t = ast_for_exprlist(c, for_ch, Store);
       
  1226         if (!t)
       
  1227             return NULL;
       
  1228         expression = ast_for_expr(c, CHILD(ch, 3));
       
  1229         if (!expression)
       
  1230             return NULL;
       
  1231 
       
  1232         /* Check the # of children rather than the length of t, since
       
  1233            (x for x, in ...) has 1 element in t, but still requires a Tuple. */
       
  1234         if (NCH(for_ch) == 1)
       
  1235             ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
       
  1236                                NULL, c->c_arena);
       
  1237         else
       
  1238             ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
       
  1239                                      c->c_arena),
       
  1240                                expression, NULL, c->c_arena);
       
  1241 
       
  1242         if (!ge)
       
  1243             return NULL;
       
  1244 
       
  1245         if (NCH(ch) == 5) {
       
  1246             int j, n_ifs;
       
  1247             asdl_seq *ifs;
       
  1248             
       
  1249             ch = CHILD(ch, 4);
       
  1250             n_ifs = count_gen_ifs(c, ch);
       
  1251             if (n_ifs == -1)
       
  1252                 return NULL;
       
  1253 
       
  1254             ifs = asdl_seq_new(n_ifs, c->c_arena);
       
  1255             if (!ifs)
       
  1256                 return NULL;
       
  1257 
       
  1258             for (j = 0; j < n_ifs; j++) {
       
  1259                 REQ(ch, gen_iter);
       
  1260                 ch = CHILD(ch, 0);
       
  1261                 REQ(ch, gen_if);
       
  1262                 
       
  1263                 expression = ast_for_expr(c, CHILD(ch, 1));
       
  1264                 if (!expression)
       
  1265                     return NULL;
       
  1266                 asdl_seq_SET(ifs, j, expression);
       
  1267                 if (NCH(ch) == 3)
       
  1268                     ch = CHILD(ch, 2);
       
  1269             }
       
  1270             /* on exit, must guarantee that ch is a gen_for */
       
  1271             if (TYPE(ch) == gen_iter)
       
  1272                 ch = CHILD(ch, 0);
       
  1273             ge->ifs = ifs;
       
  1274         }
       
  1275         asdl_seq_SET(genexps, i, ge);
       
  1276     }
       
  1277     
       
  1278     return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
       
  1279 }
       
  1280 
       
  1281 static expr_ty
       
  1282 ast_for_atom(struct compiling *c, const node *n)
       
  1283 {
       
  1284     /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
       
  1285        | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
       
  1286     */
       
  1287     node *ch = CHILD(n, 0);
       
  1288     
       
  1289     switch (TYPE(ch)) {
       
  1290     case NAME: {
       
  1291         /* All names start in Load context, but may later be
       
  1292            changed. */
       
  1293         PyObject *name = NEW_IDENTIFIER(ch);
       
  1294         if (!name)
       
  1295             return NULL;
       
  1296         return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  1297     }
       
  1298     case STRING: {
       
  1299         PyObject *str = parsestrplus(c, n);
       
  1300         if (!str) {
       
  1301 #ifdef Py_USING_UNICODE
       
  1302             if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
       
  1303                 PyObject *type, *value, *tback, *errstr;
       
  1304                 PyErr_Fetch(&type, &value, &tback);
       
  1305                 errstr = PyObject_Str(value);
       
  1306                 if (errstr) {
       
  1307                     char *s = "";
       
  1308                     char buf[128];
       
  1309                     s = PyString_AsString(errstr);
       
  1310                     PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
       
  1311                     ast_error(n, buf);
       
  1312                     Py_DECREF(errstr);
       
  1313                 } else {
       
  1314                     ast_error(n, "(unicode error) unknown error");
       
  1315                 }
       
  1316                 Py_DECREF(type);
       
  1317                 Py_DECREF(value);
       
  1318                 Py_XDECREF(tback);
       
  1319             }
       
  1320 #endif
       
  1321             return NULL;
       
  1322         }
       
  1323         PyArena_AddPyObject(c->c_arena, str);
       
  1324         return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
       
  1325     }
       
  1326     case NUMBER: {
       
  1327         PyObject *pynum = parsenumber(c, STR(ch));
       
  1328         if (!pynum)
       
  1329             return NULL;
       
  1330 
       
  1331         PyArena_AddPyObject(c->c_arena, pynum);
       
  1332         return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
       
  1333     }
       
  1334     case LPAR: /* some parenthesized expressions */
       
  1335         ch = CHILD(n, 1);
       
  1336         
       
  1337         if (TYPE(ch) == RPAR)
       
  1338             return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  1339         
       
  1340         if (TYPE(ch) == yield_expr)
       
  1341             return ast_for_expr(c, ch);
       
  1342         
       
  1343         if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
       
  1344             return ast_for_genexp(c, ch);
       
  1345         
       
  1346         return ast_for_testlist_gexp(c, ch);
       
  1347     case LSQB: /* list (or list comprehension) */
       
  1348         ch = CHILD(n, 1);
       
  1349         
       
  1350         if (TYPE(ch) == RSQB)
       
  1351             return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  1352         
       
  1353         REQ(ch, listmaker);
       
  1354         if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
       
  1355             asdl_seq *elts = seq_for_testlist(c, ch);
       
  1356             if (!elts)
       
  1357                 return NULL;
       
  1358 
       
  1359             return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  1360         }
       
  1361         else
       
  1362             return ast_for_listcomp(c, ch);
       
  1363     case LBRACE: {
       
  1364         /* dictmaker: test ':' test (',' test ':' test)* [','] */
       
  1365         int i, size;
       
  1366         asdl_seq *keys, *values;
       
  1367         
       
  1368         ch = CHILD(n, 1);
       
  1369         size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
       
  1370         keys = asdl_seq_new(size, c->c_arena);
       
  1371         if (!keys)
       
  1372             return NULL;
       
  1373         
       
  1374         values = asdl_seq_new(size, c->c_arena);
       
  1375         if (!values)
       
  1376             return NULL;
       
  1377         
       
  1378         for (i = 0; i < NCH(ch); i += 4) {
       
  1379             expr_ty expression;
       
  1380             
       
  1381             expression = ast_for_expr(c, CHILD(ch, i));
       
  1382             if (!expression)
       
  1383                 return NULL;
       
  1384 
       
  1385             asdl_seq_SET(keys, i / 4, expression);
       
  1386 
       
  1387             expression = ast_for_expr(c, CHILD(ch, i + 2));
       
  1388             if (!expression)
       
  1389                 return NULL;
       
  1390 
       
  1391             asdl_seq_SET(values, i / 4, expression);
       
  1392         }
       
  1393         return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
       
  1394     }
       
  1395     case BACKQUOTE: { /* repr */
       
  1396         expr_ty expression;
       
  1397         if (Py_Py3kWarningFlag &&
       
  1398             !ast_warn(c, n, "backquote not supported in 3.x; use repr()"))
       
  1399             return NULL;
       
  1400         expression = ast_for_testlist(c, CHILD(n, 1));
       
  1401         if (!expression)
       
  1402             return NULL;
       
  1403 
       
  1404         return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
       
  1405     }
       
  1406     default:
       
  1407         PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
       
  1408         return NULL;
       
  1409     }
       
  1410 }
       
  1411 
       
  1412 static slice_ty
       
  1413 ast_for_slice(struct compiling *c, const node *n)
       
  1414 {
       
  1415     node *ch;
       
  1416     expr_ty lower = NULL, upper = NULL, step = NULL;
       
  1417 
       
  1418     REQ(n, subscript);
       
  1419 
       
  1420     /*
       
  1421        subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
       
  1422        sliceop: ':' [test]
       
  1423     */
       
  1424     ch = CHILD(n, 0);
       
  1425     if (TYPE(ch) == DOT)
       
  1426         return Ellipsis(c->c_arena);
       
  1427 
       
  1428     if (NCH(n) == 1 && TYPE(ch) == test) {
       
  1429         /* 'step' variable hold no significance in terms of being used over
       
  1430            other vars */
       
  1431         step = ast_for_expr(c, ch); 
       
  1432         if (!step)
       
  1433             return NULL;
       
  1434             
       
  1435         return Index(step, c->c_arena);
       
  1436     }
       
  1437 
       
  1438     if (TYPE(ch) == test) {
       
  1439         lower = ast_for_expr(c, ch);
       
  1440         if (!lower)
       
  1441             return NULL;
       
  1442     }
       
  1443 
       
  1444     /* If there's an upper bound it's in the second or third position. */
       
  1445     if (TYPE(ch) == COLON) {
       
  1446         if (NCH(n) > 1) {
       
  1447             node *n2 = CHILD(n, 1);
       
  1448 
       
  1449             if (TYPE(n2) == test) {
       
  1450                 upper = ast_for_expr(c, n2);
       
  1451                 if (!upper)
       
  1452                     return NULL;
       
  1453             }
       
  1454         }
       
  1455     } else if (NCH(n) > 2) {
       
  1456         node *n2 = CHILD(n, 2);
       
  1457 
       
  1458         if (TYPE(n2) == test) {
       
  1459             upper = ast_for_expr(c, n2);
       
  1460             if (!upper)
       
  1461                 return NULL;
       
  1462         }
       
  1463     }
       
  1464 
       
  1465     ch = CHILD(n, NCH(n) - 1);
       
  1466     if (TYPE(ch) == sliceop) {
       
  1467         if (NCH(ch) == 1) {
       
  1468             /* No expression, so step is None */
       
  1469             ch = CHILD(ch, 0);
       
  1470             step = Name(new_identifier("None", c->c_arena), Load,
       
  1471                         LINENO(ch), ch->n_col_offset, c->c_arena);
       
  1472             if (!step)
       
  1473                 return NULL;
       
  1474         } else {
       
  1475             ch = CHILD(ch, 1);
       
  1476             if (TYPE(ch) == test) {
       
  1477                 step = ast_for_expr(c, ch);
       
  1478                 if (!step)
       
  1479                     return NULL;
       
  1480             }
       
  1481         }
       
  1482     }
       
  1483 
       
  1484     return Slice(lower, upper, step, c->c_arena);
       
  1485 }
       
  1486 
       
  1487 static expr_ty
       
  1488 ast_for_binop(struct compiling *c, const node *n)
       
  1489 {
       
  1490         /* Must account for a sequence of expressions.
       
  1491            How should A op B op C by represented?  
       
  1492            BinOp(BinOp(A, op, B), op, C).
       
  1493         */
       
  1494 
       
  1495         int i, nops;
       
  1496         expr_ty expr1, expr2, result;
       
  1497         operator_ty newoperator;
       
  1498 
       
  1499         expr1 = ast_for_expr(c, CHILD(n, 0));
       
  1500         if (!expr1)
       
  1501             return NULL;
       
  1502 
       
  1503         expr2 = ast_for_expr(c, CHILD(n, 2));
       
  1504         if (!expr2)
       
  1505             return NULL;
       
  1506 
       
  1507         newoperator = get_operator(CHILD(n, 1));
       
  1508         if (!newoperator)
       
  1509             return NULL;
       
  1510 
       
  1511         result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
       
  1512                        c->c_arena);
       
  1513         if (!result)
       
  1514             return NULL;
       
  1515 
       
  1516         nops = (NCH(n) - 1) / 2;
       
  1517         for (i = 1; i < nops; i++) {
       
  1518                 expr_ty tmp_result, tmp;
       
  1519                 const node* next_oper = CHILD(n, i * 2 + 1);
       
  1520 
       
  1521                 newoperator = get_operator(next_oper);
       
  1522                 if (!newoperator)
       
  1523                     return NULL;
       
  1524 
       
  1525                 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
       
  1526                 if (!tmp)
       
  1527                     return NULL;
       
  1528 
       
  1529                 tmp_result = BinOp(result, newoperator, tmp, 
       
  1530                                    LINENO(next_oper), next_oper->n_col_offset,
       
  1531                                    c->c_arena);
       
  1532                 if (!tmp_result) 
       
  1533                         return NULL;
       
  1534                 result = tmp_result;
       
  1535         }
       
  1536         return result;
       
  1537 }
       
  1538 
       
  1539 static expr_ty
       
  1540 ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
       
  1541 {
       
  1542     /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME 
       
  1543        subscriptlist: subscript (',' subscript)* [',']
       
  1544        subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
       
  1545      */
       
  1546     REQ(n, trailer);
       
  1547     if (TYPE(CHILD(n, 0)) == LPAR) {
       
  1548         if (NCH(n) == 2)
       
  1549             return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
       
  1550                         n->n_col_offset, c->c_arena);
       
  1551         else
       
  1552             return ast_for_call(c, CHILD(n, 1), left_expr);
       
  1553     }
       
  1554     else if (TYPE(CHILD(n, 0)) == DOT ) {
       
  1555         PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
       
  1556         if (!attr_id)
       
  1557             return NULL;
       
  1558         return Attribute(left_expr, attr_id, Load,
       
  1559                          LINENO(n), n->n_col_offset, c->c_arena);
       
  1560     }
       
  1561     else {
       
  1562         REQ(CHILD(n, 0), LSQB);
       
  1563         REQ(CHILD(n, 2), RSQB);
       
  1564         n = CHILD(n, 1);
       
  1565         if (NCH(n) == 1) {
       
  1566             slice_ty slc = ast_for_slice(c, CHILD(n, 0));
       
  1567             if (!slc)
       
  1568                 return NULL;
       
  1569             return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
       
  1570                              c->c_arena);
       
  1571         }
       
  1572         else {
       
  1573             /* The grammar is ambiguous here. The ambiguity is resolved 
       
  1574                by treating the sequence as a tuple literal if there are
       
  1575                no slice features.
       
  1576             */
       
  1577             int j;
       
  1578             slice_ty slc;
       
  1579             expr_ty e;
       
  1580             bool simple = true;
       
  1581             asdl_seq *slices, *elts;
       
  1582             slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
       
  1583             if (!slices)
       
  1584                 return NULL;
       
  1585             for (j = 0; j < NCH(n); j += 2) {
       
  1586                 slc = ast_for_slice(c, CHILD(n, j));
       
  1587                 if (!slc)
       
  1588                     return NULL;
       
  1589                 if (slc->kind != Index_kind)
       
  1590                     simple = false;
       
  1591                 asdl_seq_SET(slices, j / 2, slc);
       
  1592             }
       
  1593             if (!simple) {
       
  1594                 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
       
  1595                                  Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  1596             }
       
  1597             /* extract Index values and put them in a Tuple */
       
  1598             elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
       
  1599             if (!elts)
       
  1600                 return NULL;
       
  1601             for (j = 0; j < asdl_seq_LEN(slices); ++j) {
       
  1602                 slc = (slice_ty)asdl_seq_GET(slices, j);
       
  1603                 assert(slc->kind == Index_kind  && slc->v.Index.value);
       
  1604                 asdl_seq_SET(elts, j, slc->v.Index.value);
       
  1605             }
       
  1606             e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  1607             if (!e)
       
  1608                 return NULL;
       
  1609             return Subscript(left_expr, Index(e, c->c_arena),
       
  1610                              Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  1611         }
       
  1612     }
       
  1613 }
       
  1614 
       
  1615 static expr_ty
       
  1616 ast_for_factor(struct compiling *c, const node *n)
       
  1617 {
       
  1618     node *pfactor, *ppower, *patom, *pnum;
       
  1619     expr_ty expression;
       
  1620 
       
  1621     /* If the unary - operator is applied to a constant, don't generate
       
  1622        a UNARY_NEGATIVE opcode.  Just store the approriate value as a
       
  1623        constant.  The peephole optimizer already does something like
       
  1624        this but it doesn't handle the case where the constant is
       
  1625        (sys.maxint - 1).  In that case, we want a PyIntObject, not a
       
  1626        PyLongObject.
       
  1627     */
       
  1628     if (TYPE(CHILD(n, 0)) == MINUS &&
       
  1629         NCH(n) == 2 &&
       
  1630         TYPE((pfactor = CHILD(n, 1))) == factor &&
       
  1631         NCH(pfactor) == 1 &&
       
  1632         TYPE((ppower = CHILD(pfactor, 0))) == power &&
       
  1633         NCH(ppower) == 1 &&
       
  1634         TYPE((patom = CHILD(ppower, 0))) == atom &&
       
  1635         TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
       
  1636         char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
       
  1637         if (s == NULL)
       
  1638             return NULL;
       
  1639         s[0] = '-';
       
  1640         strcpy(s + 1, STR(pnum));
       
  1641         PyObject_FREE(STR(pnum));
       
  1642         STR(pnum) = s;
       
  1643         return ast_for_atom(c, patom);
       
  1644     }
       
  1645 
       
  1646     expression = ast_for_expr(c, CHILD(n, 1));
       
  1647     if (!expression)
       
  1648         return NULL;
       
  1649 
       
  1650     switch (TYPE(CHILD(n, 0))) {
       
  1651         case PLUS:
       
  1652             return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
       
  1653                            c->c_arena);
       
  1654         case MINUS:
       
  1655             return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
       
  1656                            c->c_arena);
       
  1657         case TILDE:
       
  1658             return UnaryOp(Invert, expression, LINENO(n),
       
  1659                            n->n_col_offset, c->c_arena);
       
  1660     }
       
  1661     PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
       
  1662                  TYPE(CHILD(n, 0)));
       
  1663     return NULL;
       
  1664 }
       
  1665 
       
  1666 static expr_ty
       
  1667 ast_for_power(struct compiling *c, const node *n)
       
  1668 {
       
  1669     /* power: atom trailer* ('**' factor)*
       
  1670      */
       
  1671     int i;
       
  1672     expr_ty e, tmp;
       
  1673     REQ(n, power);
       
  1674     e = ast_for_atom(c, CHILD(n, 0));
       
  1675     if (!e)
       
  1676         return NULL;
       
  1677     if (NCH(n) == 1)
       
  1678         return e;
       
  1679     for (i = 1; i < NCH(n); i++) {
       
  1680         node *ch = CHILD(n, i);
       
  1681         if (TYPE(ch) != trailer)
       
  1682             break;
       
  1683         tmp = ast_for_trailer(c, ch, e);
       
  1684         if (!tmp)
       
  1685             return NULL;
       
  1686         tmp->lineno = e->lineno;
       
  1687         tmp->col_offset = e->col_offset;
       
  1688         e = tmp;
       
  1689     }
       
  1690     if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
       
  1691         expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
       
  1692         if (!f)
       
  1693             return NULL;
       
  1694         tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
       
  1695         if (!tmp)
       
  1696             return NULL;
       
  1697         e = tmp;
       
  1698     }
       
  1699     return e;
       
  1700 }
       
  1701 
       
  1702 /* Do not name a variable 'expr'!  Will cause a compile error.
       
  1703 */
       
  1704 
       
  1705 static expr_ty
       
  1706 ast_for_expr(struct compiling *c, const node *n)
       
  1707 {
       
  1708     /* handle the full range of simple expressions
       
  1709        test: or_test ['if' or_test 'else' test] | lambdef
       
  1710        or_test: and_test ('or' and_test)* 
       
  1711        and_test: not_test ('and' not_test)*
       
  1712        not_test: 'not' not_test | comparison
       
  1713        comparison: expr (comp_op expr)*
       
  1714        expr: xor_expr ('|' xor_expr)*
       
  1715        xor_expr: and_expr ('^' and_expr)*
       
  1716        and_expr: shift_expr ('&' shift_expr)*
       
  1717        shift_expr: arith_expr (('<<'|'>>') arith_expr)*
       
  1718        arith_expr: term (('+'|'-') term)*
       
  1719        term: factor (('*'|'/'|'%'|'//') factor)*
       
  1720        factor: ('+'|'-'|'~') factor | power
       
  1721        power: atom trailer* ('**' factor)*
       
  1722 
       
  1723        As well as modified versions that exist for backward compatibility,
       
  1724        to explicitly allow:
       
  1725        [ x for x in lambda: 0, lambda: 1 ]
       
  1726        (which would be ambiguous without these extra rules)
       
  1727        
       
  1728        old_test: or_test | old_lambdef
       
  1729        old_lambdef: 'lambda' [vararglist] ':' old_test
       
  1730 
       
  1731     */
       
  1732 
       
  1733     asdl_seq *seq;
       
  1734     int i;
       
  1735 
       
  1736  loop:
       
  1737     switch (TYPE(n)) {
       
  1738         case test:
       
  1739         case old_test:
       
  1740             if (TYPE(CHILD(n, 0)) == lambdef ||
       
  1741                 TYPE(CHILD(n, 0)) == old_lambdef)
       
  1742                 return ast_for_lambdef(c, CHILD(n, 0));
       
  1743             else if (NCH(n) > 1)
       
  1744                 return ast_for_ifexpr(c, n);
       
  1745             /* Fallthrough */
       
  1746         case or_test:
       
  1747         case and_test:
       
  1748             if (NCH(n) == 1) {
       
  1749                 n = CHILD(n, 0);
       
  1750                 goto loop;
       
  1751             }
       
  1752             seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
       
  1753             if (!seq)
       
  1754                 return NULL;
       
  1755             for (i = 0; i < NCH(n); i += 2) {
       
  1756                 expr_ty e = ast_for_expr(c, CHILD(n, i));
       
  1757                 if (!e)
       
  1758                     return NULL;
       
  1759                 asdl_seq_SET(seq, i / 2, e);
       
  1760             }
       
  1761             if (!strcmp(STR(CHILD(n, 1)), "and"))
       
  1762                 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
       
  1763                               c->c_arena);
       
  1764             assert(!strcmp(STR(CHILD(n, 1)), "or"));
       
  1765             return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
       
  1766         case not_test:
       
  1767             if (NCH(n) == 1) {
       
  1768                 n = CHILD(n, 0);
       
  1769                 goto loop;
       
  1770             }
       
  1771             else {
       
  1772                 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
       
  1773                 if (!expression)
       
  1774                     return NULL;
       
  1775 
       
  1776                 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
       
  1777                                c->c_arena);
       
  1778             }
       
  1779         case comparison:
       
  1780             if (NCH(n) == 1) {
       
  1781                 n = CHILD(n, 0);
       
  1782                 goto loop;
       
  1783             }
       
  1784             else {
       
  1785                 expr_ty expression;
       
  1786                 asdl_int_seq *ops;
       
  1787                 asdl_seq *cmps;
       
  1788                 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
       
  1789                 if (!ops)
       
  1790                     return NULL;
       
  1791                 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
       
  1792                 if (!cmps) {
       
  1793                     return NULL;
       
  1794                 }
       
  1795                 for (i = 1; i < NCH(n); i += 2) {
       
  1796                     cmpop_ty newoperator;
       
  1797 
       
  1798                     newoperator = ast_for_comp_op(c, CHILD(n, i));
       
  1799                     if (!newoperator) {
       
  1800                         return NULL;
       
  1801                     }
       
  1802 
       
  1803                     expression = ast_for_expr(c, CHILD(n, i + 1));
       
  1804                     if (!expression) {
       
  1805                         return NULL;
       
  1806                     }
       
  1807                         
       
  1808                     asdl_seq_SET(ops, i / 2, newoperator);
       
  1809                     asdl_seq_SET(cmps, i / 2, expression);
       
  1810                 }
       
  1811                 expression = ast_for_expr(c, CHILD(n, 0));
       
  1812                 if (!expression) {
       
  1813                     return NULL;
       
  1814                 }
       
  1815                     
       
  1816                 return Compare(expression, ops, cmps, LINENO(n),
       
  1817                                n->n_col_offset, c->c_arena);
       
  1818             }
       
  1819             break;
       
  1820 
       
  1821         /* The next five cases all handle BinOps.  The main body of code
       
  1822            is the same in each case, but the switch turned inside out to
       
  1823            reuse the code for each type of operator.
       
  1824          */
       
  1825         case expr:
       
  1826         case xor_expr:
       
  1827         case and_expr:
       
  1828         case shift_expr:
       
  1829         case arith_expr:
       
  1830         case term:
       
  1831             if (NCH(n) == 1) {
       
  1832                 n = CHILD(n, 0);
       
  1833                 goto loop;
       
  1834             }
       
  1835             return ast_for_binop(c, n);
       
  1836         case yield_expr: {
       
  1837             expr_ty exp = NULL;
       
  1838             if (NCH(n) == 2) {
       
  1839                 exp = ast_for_testlist(c, CHILD(n, 1));
       
  1840                 if (!exp)
       
  1841                     return NULL;
       
  1842             }
       
  1843             return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
       
  1844         }
       
  1845         case factor:
       
  1846             if (NCH(n) == 1) {
       
  1847                 n = CHILD(n, 0);
       
  1848                 goto loop;
       
  1849             }
       
  1850             return ast_for_factor(c, n);
       
  1851         case power:
       
  1852             return ast_for_power(c, n);
       
  1853         default:
       
  1854             PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
       
  1855             return NULL;
       
  1856     }
       
  1857     /* should never get here unless if error is set */
       
  1858     return NULL;
       
  1859 }
       
  1860 
       
  1861 static expr_ty
       
  1862 ast_for_call(struct compiling *c, const node *n, expr_ty func)
       
  1863 {
       
  1864     /*
       
  1865       arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
       
  1866                | '**' test)
       
  1867       argument: [test '='] test [gen_for]        # Really [keyword '='] test
       
  1868     */
       
  1869 
       
  1870     int i, nargs, nkeywords, ngens;
       
  1871     asdl_seq *args;
       
  1872     asdl_seq *keywords;
       
  1873     expr_ty vararg = NULL, kwarg = NULL;
       
  1874 
       
  1875     REQ(n, arglist);
       
  1876 
       
  1877     nargs = 0;
       
  1878     nkeywords = 0;
       
  1879     ngens = 0;
       
  1880     for (i = 0; i < NCH(n); i++) {
       
  1881         node *ch = CHILD(n, i);
       
  1882         if (TYPE(ch) == argument) {
       
  1883             if (NCH(ch) == 1)
       
  1884                 nargs++;
       
  1885             else if (TYPE(CHILD(ch, 1)) == gen_for)
       
  1886                 ngens++;
       
  1887             else
       
  1888                 nkeywords++;
       
  1889         }
       
  1890     }
       
  1891     if (ngens > 1 || (ngens && (nargs || nkeywords))) {
       
  1892         ast_error(n, "Generator expression must be parenthesized "
       
  1893                   "if not sole argument");
       
  1894         return NULL;
       
  1895     }
       
  1896 
       
  1897     if (nargs + nkeywords + ngens > 255) {
       
  1898       ast_error(n, "more than 255 arguments");
       
  1899       return NULL;
       
  1900     }
       
  1901 
       
  1902     args = asdl_seq_new(nargs + ngens, c->c_arena);
       
  1903     if (!args)
       
  1904         return NULL;
       
  1905     keywords = asdl_seq_new(nkeywords, c->c_arena);
       
  1906     if (!keywords)
       
  1907         return NULL;
       
  1908     nargs = 0;
       
  1909     nkeywords = 0;
       
  1910     for (i = 0; i < NCH(n); i++) {
       
  1911         node *ch = CHILD(n, i);
       
  1912         if (TYPE(ch) == argument) {
       
  1913             expr_ty e;
       
  1914             if (NCH(ch) == 1) {
       
  1915                 if (nkeywords) {
       
  1916                     ast_error(CHILD(ch, 0),
       
  1917                               "non-keyword arg after keyword arg");
       
  1918                     return NULL;
       
  1919                 }
       
  1920                 if (vararg) {
       
  1921                     ast_error(CHILD(ch, 0),
       
  1922                               "only named arguments may follow *expression");
       
  1923                     return NULL;
       
  1924                 }
       
  1925                 e = ast_for_expr(c, CHILD(ch, 0));
       
  1926                 if (!e)
       
  1927                     return NULL;
       
  1928                 asdl_seq_SET(args, nargs++, e);
       
  1929             }  
       
  1930             else if (TYPE(CHILD(ch, 1)) == gen_for) {
       
  1931                 e = ast_for_genexp(c, ch);
       
  1932                 if (!e)
       
  1933                     return NULL;
       
  1934                 asdl_seq_SET(args, nargs++, e);
       
  1935             }
       
  1936             else {
       
  1937                 keyword_ty kw;
       
  1938                 identifier key;
       
  1939                 int k;
       
  1940                 char *tmp;
       
  1941 
       
  1942                 /* CHILD(ch, 0) is test, but must be an identifier? */ 
       
  1943                 e = ast_for_expr(c, CHILD(ch, 0));
       
  1944                 if (!e)
       
  1945                     return NULL;
       
  1946                 /* f(lambda x: x[0] = 3) ends up getting parsed with
       
  1947                  * LHS test = lambda x: x[0], and RHS test = 3.
       
  1948                  * SF bug 132313 points out that complaining about a keyword
       
  1949                  * then is very confusing.
       
  1950                  */
       
  1951                 if (e->kind == Lambda_kind) {
       
  1952                     ast_error(CHILD(ch, 0),
       
  1953                               "lambda cannot contain assignment");
       
  1954                     return NULL;
       
  1955                 } else if (e->kind != Name_kind) {
       
  1956                     ast_error(CHILD(ch, 0), "keyword can't be an expression");
       
  1957                     return NULL;
       
  1958                 }
       
  1959                 key = e->v.Name.id;
       
  1960                 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
       
  1961                     return NULL;
       
  1962                 for (k = 0; k < nkeywords; k++) {
       
  1963                     tmp = PyString_AS_STRING(
       
  1964                         ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
       
  1965                     if (!strcmp(tmp, PyString_AS_STRING(key))) {
       
  1966                         ast_error(CHILD(ch, 0), "keyword argument repeated");
       
  1967                         return NULL;
       
  1968                     }
       
  1969                 }
       
  1970                 e = ast_for_expr(c, CHILD(ch, 2));
       
  1971                 if (!e)
       
  1972                     return NULL;
       
  1973                 kw = keyword(key, e, c->c_arena);
       
  1974                 if (!kw)
       
  1975                     return NULL;
       
  1976                 asdl_seq_SET(keywords, nkeywords++, kw);
       
  1977             }
       
  1978         }
       
  1979         else if (TYPE(ch) == STAR) {
       
  1980             vararg = ast_for_expr(c, CHILD(n, i+1));
       
  1981             if (!vararg)
       
  1982                 return NULL;
       
  1983             i++;
       
  1984         }
       
  1985         else if (TYPE(ch) == DOUBLESTAR) {
       
  1986             kwarg = ast_for_expr(c, CHILD(n, i+1));
       
  1987             if (!kwarg)
       
  1988                 return NULL;
       
  1989             i++;
       
  1990         }
       
  1991     }
       
  1992 
       
  1993     return Call(func, args, keywords, vararg, kwarg, func->lineno,
       
  1994                 func->col_offset, c->c_arena);
       
  1995 }
       
  1996 
       
  1997 static expr_ty
       
  1998 ast_for_testlist(struct compiling *c, const node* n)
       
  1999 {
       
  2000     /* testlist_gexp: test (',' test)* [','] */
       
  2001     /* testlist: test (',' test)* [','] */
       
  2002     /* testlist_safe: test (',' test)+ [','] */
       
  2003     /* testlist1: test (',' test)* */
       
  2004     assert(NCH(n) > 0);
       
  2005     if (TYPE(n) == testlist_gexp) {
       
  2006         if (NCH(n) > 1)
       
  2007             assert(TYPE(CHILD(n, 1)) != gen_for);
       
  2008     }
       
  2009     else {
       
  2010         assert(TYPE(n) == testlist ||
       
  2011                TYPE(n) == testlist_safe ||
       
  2012                TYPE(n) == testlist1);
       
  2013     }
       
  2014     if (NCH(n) == 1)
       
  2015         return ast_for_expr(c, CHILD(n, 0));
       
  2016     else {
       
  2017         asdl_seq *tmp = seq_for_testlist(c, n);
       
  2018         if (!tmp)
       
  2019             return NULL;
       
  2020         return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
       
  2021     }
       
  2022 }
       
  2023 
       
  2024 static expr_ty
       
  2025 ast_for_testlist_gexp(struct compiling *c, const node* n)
       
  2026 {
       
  2027     /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
       
  2028     /* argument: test [ gen_for ] */
       
  2029     assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
       
  2030     if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
       
  2031         return ast_for_genexp(c, n);
       
  2032     return ast_for_testlist(c, n);
       
  2033 }
       
  2034 
       
  2035 /* like ast_for_testlist() but returns a sequence */
       
  2036 static asdl_seq*
       
  2037 ast_for_class_bases(struct compiling *c, const node* n)
       
  2038 {
       
  2039     /* testlist: test (',' test)* [','] */
       
  2040     assert(NCH(n) > 0);
       
  2041     REQ(n, testlist);
       
  2042     if (NCH(n) == 1) {
       
  2043         expr_ty base;
       
  2044         asdl_seq *bases = asdl_seq_new(1, c->c_arena);
       
  2045         if (!bases)
       
  2046             return NULL;
       
  2047         base = ast_for_expr(c, CHILD(n, 0));
       
  2048         if (!base)
       
  2049             return NULL;
       
  2050         asdl_seq_SET(bases, 0, base);
       
  2051         return bases;
       
  2052     }
       
  2053 
       
  2054     return seq_for_testlist(c, n);
       
  2055 }
       
  2056 
       
  2057 static stmt_ty
       
  2058 ast_for_expr_stmt(struct compiling *c, const node *n)
       
  2059 {
       
  2060     REQ(n, expr_stmt);
       
  2061     /* expr_stmt: testlist (augassign (yield_expr|testlist) 
       
  2062                 | ('=' (yield_expr|testlist))*)
       
  2063        testlist: test (',' test)* [',']
       
  2064        augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
       
  2065                 | '<<=' | '>>=' | '**=' | '//='
       
  2066        test: ... here starts the operator precendence dance
       
  2067      */
       
  2068 
       
  2069     if (NCH(n) == 1) {
       
  2070         expr_ty e = ast_for_testlist(c, CHILD(n, 0));
       
  2071         if (!e)
       
  2072             return NULL;
       
  2073 
       
  2074         return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
       
  2075     }
       
  2076     else if (TYPE(CHILD(n, 1)) == augassign) {
       
  2077         expr_ty expr1, expr2;
       
  2078         operator_ty newoperator;
       
  2079         node *ch = CHILD(n, 0);
       
  2080 
       
  2081         expr1 = ast_for_testlist(c, ch);
       
  2082         if (!expr1)
       
  2083             return NULL;
       
  2084         /* TODO(nas): Remove duplicated error checks (set_context does it) */
       
  2085         switch (expr1->kind) {
       
  2086             case GeneratorExp_kind:
       
  2087                 ast_error(ch, "augmented assignment to generator "
       
  2088                           "expression not possible");
       
  2089                 return NULL;
       
  2090             case Yield_kind:
       
  2091                 ast_error(ch, "augmented assignment to yield "
       
  2092                           "expression not possible");
       
  2093                 return NULL;
       
  2094             case Name_kind: {
       
  2095                 const char *var_name = PyBytes_AS_STRING(expr1->v.Name.id);
       
  2096                 if ((var_name[0] == 'N' || var_name[0] == 'T' || var_name[0] == 'F') &&
       
  2097                     !forbidden_check(c, ch, var_name))
       
  2098                     return NULL;
       
  2099                 break;
       
  2100             }
       
  2101             case Attribute_kind:
       
  2102             case Subscript_kind:
       
  2103                 break;
       
  2104             default:
       
  2105                 ast_error(ch, "illegal expression for augmented "
       
  2106                           "assignment");
       
  2107                 return NULL;
       
  2108         }
       
  2109         if(!set_context(c, expr1, Store, ch))
       
  2110             return NULL;
       
  2111 
       
  2112         ch = CHILD(n, 2);
       
  2113         if (TYPE(ch) == testlist)
       
  2114             expr2 = ast_for_testlist(c, ch);
       
  2115         else
       
  2116             expr2 = ast_for_expr(c, ch);
       
  2117         if (!expr2)
       
  2118             return NULL;
       
  2119 
       
  2120         newoperator = ast_for_augassign(c, CHILD(n, 1));
       
  2121         if (!newoperator)
       
  2122             return NULL;
       
  2123 
       
  2124         return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
       
  2125                          c->c_arena);
       
  2126     }
       
  2127     else {
       
  2128         int i;
       
  2129         asdl_seq *targets;
       
  2130         node *value;
       
  2131         expr_ty expression;
       
  2132 
       
  2133         /* a normal assignment */
       
  2134         REQ(CHILD(n, 1), EQUAL);
       
  2135         targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
       
  2136         if (!targets)
       
  2137             return NULL;
       
  2138         for (i = 0; i < NCH(n) - 2; i += 2) {
       
  2139             expr_ty e;
       
  2140             node *ch = CHILD(n, i);
       
  2141             if (TYPE(ch) == yield_expr) {
       
  2142                 ast_error(ch, "assignment to yield expression not possible");
       
  2143                 return NULL;
       
  2144             }
       
  2145             e = ast_for_testlist(c, ch);
       
  2146 
       
  2147             /* set context to assign */
       
  2148             if (!e) 
       
  2149                 return NULL;
       
  2150 
       
  2151             if (!set_context(c, e, Store, CHILD(n, i)))
       
  2152                 return NULL;
       
  2153 
       
  2154             asdl_seq_SET(targets, i / 2, e);
       
  2155         }
       
  2156         value = CHILD(n, NCH(n) - 1);
       
  2157         if (TYPE(value) == testlist)
       
  2158             expression = ast_for_testlist(c, value);
       
  2159         else
       
  2160             expression = ast_for_expr(c, value);
       
  2161         if (!expression)
       
  2162             return NULL;
       
  2163         return Assign(targets, expression, LINENO(n), n->n_col_offset,
       
  2164                       c->c_arena);
       
  2165     }
       
  2166 }
       
  2167 
       
  2168 static stmt_ty
       
  2169 ast_for_print_stmt(struct compiling *c, const node *n)
       
  2170 {
       
  2171     /* print_stmt: 'print' ( [ test (',' test)* [','] ]
       
  2172                              | '>>' test [ (',' test)+ [','] ] )
       
  2173      */
       
  2174     expr_ty dest = NULL, expression;
       
  2175     asdl_seq *seq;
       
  2176     bool nl;
       
  2177     int i, j, start = 1;
       
  2178 
       
  2179     REQ(n, print_stmt);
       
  2180     if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
       
  2181         dest = ast_for_expr(c, CHILD(n, 2));
       
  2182         if (!dest)
       
  2183             return NULL;
       
  2184             start = 4;
       
  2185     }
       
  2186     seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
       
  2187     if (!seq)
       
  2188         return NULL;
       
  2189     for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
       
  2190         expression = ast_for_expr(c, CHILD(n, i));
       
  2191         if (!expression)
       
  2192             return NULL;
       
  2193         asdl_seq_SET(seq, j, expression);
       
  2194     }
       
  2195     nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
       
  2196     return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
       
  2197 }
       
  2198 
       
  2199 static asdl_seq *
       
  2200 ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
       
  2201 {
       
  2202     asdl_seq *seq;
       
  2203     int i;
       
  2204     expr_ty e;
       
  2205 
       
  2206     REQ(n, exprlist);
       
  2207 
       
  2208     seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
       
  2209     if (!seq)
       
  2210         return NULL;
       
  2211     for (i = 0; i < NCH(n); i += 2) {
       
  2212         e = ast_for_expr(c, CHILD(n, i));
       
  2213         if (!e)
       
  2214             return NULL;
       
  2215         asdl_seq_SET(seq, i / 2, e);
       
  2216         if (context && !set_context(c, e, context, CHILD(n, i)))
       
  2217             return NULL;
       
  2218     }
       
  2219     return seq;
       
  2220 }
       
  2221 
       
  2222 static stmt_ty
       
  2223 ast_for_del_stmt(struct compiling *c, const node *n)
       
  2224 {
       
  2225     asdl_seq *expr_list;
       
  2226     
       
  2227     /* del_stmt: 'del' exprlist */
       
  2228     REQ(n, del_stmt);
       
  2229 
       
  2230     expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
       
  2231     if (!expr_list)
       
  2232         return NULL;
       
  2233     return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
       
  2234 }
       
  2235 
       
  2236 static stmt_ty
       
  2237 ast_for_flow_stmt(struct compiling *c, const node *n)
       
  2238 {
       
  2239     /*
       
  2240       flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
       
  2241                  | yield_stmt
       
  2242       break_stmt: 'break'
       
  2243       continue_stmt: 'continue'
       
  2244       return_stmt: 'return' [testlist]
       
  2245       yield_stmt: yield_expr
       
  2246       yield_expr: 'yield' testlist
       
  2247       raise_stmt: 'raise' [test [',' test [',' test]]]
       
  2248     */
       
  2249     node *ch;
       
  2250 
       
  2251     REQ(n, flow_stmt);
       
  2252     ch = CHILD(n, 0);
       
  2253     switch (TYPE(ch)) {
       
  2254         case break_stmt:
       
  2255             return Break(LINENO(n), n->n_col_offset, c->c_arena);
       
  2256         case continue_stmt:
       
  2257             return Continue(LINENO(n), n->n_col_offset, c->c_arena);
       
  2258         case yield_stmt: { /* will reduce to yield_expr */
       
  2259             expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
       
  2260             if (!exp)
       
  2261                 return NULL;
       
  2262             return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
       
  2263         }
       
  2264         case return_stmt:
       
  2265             if (NCH(ch) == 1)
       
  2266                 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
       
  2267             else {
       
  2268                 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
       
  2269                 if (!expression)
       
  2270                     return NULL;
       
  2271                 return Return(expression, LINENO(n), n->n_col_offset,
       
  2272                               c->c_arena);
       
  2273             }
       
  2274         case raise_stmt:
       
  2275             if (NCH(ch) == 1)
       
  2276                 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
       
  2277                              c->c_arena);
       
  2278             else if (NCH(ch) == 2) {
       
  2279                 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
       
  2280                 if (!expression)
       
  2281                     return NULL;
       
  2282                 return Raise(expression, NULL, NULL, LINENO(n),
       
  2283                              n->n_col_offset, c->c_arena);
       
  2284             }
       
  2285             else if (NCH(ch) == 4) {
       
  2286                 expr_ty expr1, expr2;
       
  2287 
       
  2288                 expr1 = ast_for_expr(c, CHILD(ch, 1));
       
  2289                 if (!expr1)
       
  2290                     return NULL;
       
  2291                 expr2 = ast_for_expr(c, CHILD(ch, 3));
       
  2292                 if (!expr2)
       
  2293                     return NULL;
       
  2294 
       
  2295                 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
       
  2296                              c->c_arena);
       
  2297             }
       
  2298             else if (NCH(ch) == 6) {
       
  2299                 expr_ty expr1, expr2, expr3;
       
  2300 
       
  2301                 expr1 = ast_for_expr(c, CHILD(ch, 1));
       
  2302                 if (!expr1)
       
  2303                     return NULL;
       
  2304                 expr2 = ast_for_expr(c, CHILD(ch, 3));
       
  2305                 if (!expr2)
       
  2306                     return NULL;
       
  2307                 expr3 = ast_for_expr(c, CHILD(ch, 5));
       
  2308                 if (!expr3)
       
  2309                     return NULL;
       
  2310                     
       
  2311                 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
       
  2312                              c->c_arena);
       
  2313             }
       
  2314         default:
       
  2315             PyErr_Format(PyExc_SystemError,
       
  2316                          "unexpected flow_stmt: %d", TYPE(ch));
       
  2317             return NULL;
       
  2318     }
       
  2319 
       
  2320     PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
       
  2321     return NULL;
       
  2322 }
       
  2323 
       
  2324 static alias_ty
       
  2325 alias_for_import_name(struct compiling *c, const node *n)
       
  2326 {
       
  2327     /*
       
  2328       import_as_name: NAME ['as' NAME]
       
  2329       dotted_as_name: dotted_name ['as' NAME]
       
  2330       dotted_name: NAME ('.' NAME)*
       
  2331     */
       
  2332     PyObject *str, *name;
       
  2333 
       
  2334  loop:
       
  2335     switch (TYPE(n)) {
       
  2336         case import_as_name:
       
  2337             str = NULL;
       
  2338             if (NCH(n) == 3) {
       
  2339                 str = NEW_IDENTIFIER(CHILD(n, 2));
       
  2340                 if (!str)
       
  2341                     return NULL;
       
  2342             }
       
  2343             name = NEW_IDENTIFIER(CHILD(n, 0));
       
  2344             if (!name)
       
  2345                 return NULL;
       
  2346             return alias(name, str, c->c_arena);
       
  2347         case dotted_as_name:
       
  2348             if (NCH(n) == 1) {
       
  2349                 n = CHILD(n, 0);
       
  2350                 goto loop;
       
  2351             }
       
  2352             else {
       
  2353                 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
       
  2354                 if (!a)
       
  2355                     return NULL;
       
  2356                 assert(!a->asname);
       
  2357                 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
       
  2358                 if (!a->asname)
       
  2359                     return NULL;
       
  2360                 return a;
       
  2361             }
       
  2362             break;
       
  2363         case dotted_name:
       
  2364             if (NCH(n) == 1) {
       
  2365                 name = NEW_IDENTIFIER(CHILD(n, 0));
       
  2366                 if (!name)
       
  2367                     return NULL;
       
  2368                 return alias(name, NULL, c->c_arena);
       
  2369             }
       
  2370             else {
       
  2371                 /* Create a string of the form "a.b.c" */
       
  2372                 int i;
       
  2373                 size_t len;
       
  2374                 char *s;
       
  2375 
       
  2376                 len = 0;
       
  2377                 for (i = 0; i < NCH(n); i += 2)
       
  2378                     /* length of string plus one for the dot */
       
  2379                     len += strlen(STR(CHILD(n, i))) + 1;
       
  2380                 len--; /* the last name doesn't have a dot */
       
  2381                 str = PyString_FromStringAndSize(NULL, len);
       
  2382                 if (!str)
       
  2383                     return NULL;
       
  2384                 s = PyString_AS_STRING(str);
       
  2385                 if (!s)
       
  2386                     return NULL;
       
  2387                 for (i = 0; i < NCH(n); i += 2) {
       
  2388                     char *sch = STR(CHILD(n, i));
       
  2389                     strcpy(s, STR(CHILD(n, i)));
       
  2390                     s += strlen(sch);
       
  2391                     *s++ = '.';
       
  2392                 }
       
  2393                 --s;
       
  2394                 *s = '\0';
       
  2395                 PyString_InternInPlace(&str);
       
  2396                 PyArena_AddPyObject(c->c_arena, str);
       
  2397                 return alias(str, NULL, c->c_arena);
       
  2398             }
       
  2399             break;
       
  2400         case STAR:
       
  2401             str = PyString_InternFromString("*");
       
  2402             PyArena_AddPyObject(c->c_arena, str);
       
  2403             return alias(str, NULL, c->c_arena);
       
  2404         default:
       
  2405             PyErr_Format(PyExc_SystemError,
       
  2406                          "unexpected import name: %d", TYPE(n));
       
  2407             return NULL;
       
  2408     }
       
  2409 
       
  2410     PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
       
  2411     return NULL;
       
  2412 }
       
  2413 
       
  2414 static stmt_ty
       
  2415 ast_for_import_stmt(struct compiling *c, const node *n)
       
  2416 {
       
  2417     /*
       
  2418       import_stmt: import_name | import_from
       
  2419       import_name: 'import' dotted_as_names
       
  2420       import_from: 'from' ('.'* dotted_name | '.') 'import'
       
  2421                           ('*' | '(' import_as_names ')' | import_as_names)
       
  2422     */
       
  2423     int lineno;
       
  2424     int col_offset;
       
  2425     int i;
       
  2426     asdl_seq *aliases;
       
  2427 
       
  2428     REQ(n, import_stmt);
       
  2429     lineno = LINENO(n);
       
  2430     col_offset = n->n_col_offset;
       
  2431     n = CHILD(n, 0);
       
  2432     if (TYPE(n) == import_name) {
       
  2433         n = CHILD(n, 1);
       
  2434         REQ(n, dotted_as_names);
       
  2435         aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
       
  2436         if (!aliases)
       
  2437             return NULL;
       
  2438         for (i = 0; i < NCH(n); i += 2) {
       
  2439             alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
       
  2440             if (!import_alias)
       
  2441                 return NULL;
       
  2442             asdl_seq_SET(aliases, i / 2, import_alias);
       
  2443         }
       
  2444         return Import(aliases, lineno, col_offset, c->c_arena);
       
  2445     }
       
  2446     else if (TYPE(n) == import_from) {
       
  2447         int n_children;
       
  2448         int idx, ndots = 0;
       
  2449         alias_ty mod = NULL;
       
  2450         identifier modname;
       
  2451         
       
  2452        /* Count the number of dots (for relative imports) and check for the
       
  2453           optional module name */
       
  2454         for (idx = 1; idx < NCH(n); idx++) {
       
  2455             if (TYPE(CHILD(n, idx)) == dotted_name) {
       
  2456                 mod = alias_for_import_name(c, CHILD(n, idx));
       
  2457                 idx++;
       
  2458                 break;
       
  2459             } else if (TYPE(CHILD(n, idx)) != DOT) {
       
  2460                 break;
       
  2461             }
       
  2462             ndots++;
       
  2463         }
       
  2464         idx++; /* skip over the 'import' keyword */
       
  2465         switch (TYPE(CHILD(n, idx))) {
       
  2466         case STAR:
       
  2467             /* from ... import * */
       
  2468             n = CHILD(n, idx);
       
  2469             n_children = 1;
       
  2470             break;
       
  2471         case LPAR:
       
  2472             /* from ... import (x, y, z) */
       
  2473             n = CHILD(n, idx + 1);
       
  2474             n_children = NCH(n);
       
  2475             break;
       
  2476         case import_as_names:
       
  2477             /* from ... import x, y, z */
       
  2478             n = CHILD(n, idx);
       
  2479             n_children = NCH(n);
       
  2480             if (n_children % 2 == 0) {
       
  2481                 ast_error(n, "trailing comma not allowed without"
       
  2482                              " surrounding parentheses");
       
  2483                 return NULL;
       
  2484             }
       
  2485             break;
       
  2486         default:
       
  2487             ast_error(n, "Unexpected node-type in from-import");
       
  2488             return NULL;
       
  2489         }
       
  2490 
       
  2491         aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
       
  2492         if (!aliases)
       
  2493             return NULL;
       
  2494 
       
  2495         /* handle "from ... import *" special b/c there's no children */
       
  2496         if (TYPE(n) == STAR) {
       
  2497             alias_ty import_alias = alias_for_import_name(c, n);
       
  2498             if (!import_alias)
       
  2499                 return NULL;
       
  2500                 asdl_seq_SET(aliases, 0, import_alias);
       
  2501         }
       
  2502         else {
       
  2503             for (i = 0; i < NCH(n); i += 2) {
       
  2504                 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
       
  2505                 if (!import_alias)
       
  2506                     return NULL;
       
  2507                     asdl_seq_SET(aliases, i / 2, import_alias);
       
  2508             }
       
  2509         }
       
  2510         if (mod != NULL)
       
  2511             modname = mod->name;
       
  2512         else
       
  2513             modname = new_identifier("", c->c_arena);
       
  2514         return ImportFrom(modname, aliases, ndots, lineno, col_offset,
       
  2515                           c->c_arena);
       
  2516     }
       
  2517     PyErr_Format(PyExc_SystemError,
       
  2518                  "unknown import statement: starts with command '%s'",
       
  2519                  STR(CHILD(n, 0)));
       
  2520     return NULL;
       
  2521 }
       
  2522 
       
  2523 static stmt_ty
       
  2524 ast_for_global_stmt(struct compiling *c, const node *n)
       
  2525 {
       
  2526     /* global_stmt: 'global' NAME (',' NAME)* */
       
  2527     identifier name;
       
  2528     asdl_seq *s;
       
  2529     int i;
       
  2530 
       
  2531     REQ(n, global_stmt);
       
  2532     s = asdl_seq_new(NCH(n) / 2, c->c_arena);
       
  2533     if (!s)
       
  2534         return NULL;
       
  2535     for (i = 1; i < NCH(n); i += 2) {
       
  2536         name = NEW_IDENTIFIER(CHILD(n, i));
       
  2537         if (!name)
       
  2538             return NULL;
       
  2539         asdl_seq_SET(s, i / 2, name);
       
  2540     }
       
  2541     return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
       
  2542 }
       
  2543 
       
  2544 static stmt_ty
       
  2545 ast_for_exec_stmt(struct compiling *c, const node *n)
       
  2546 {
       
  2547     expr_ty expr1, globals = NULL, locals = NULL;
       
  2548     int n_children = NCH(n);
       
  2549     if (n_children != 2 && n_children != 4 && n_children != 6) {
       
  2550         PyErr_Format(PyExc_SystemError,
       
  2551                      "poorly formed 'exec' statement: %d parts to statement",
       
  2552                      n_children);
       
  2553         return NULL;
       
  2554     }
       
  2555 
       
  2556     /* exec_stmt: 'exec' expr ['in' test [',' test]] */
       
  2557     REQ(n, exec_stmt);
       
  2558     expr1 = ast_for_expr(c, CHILD(n, 1));
       
  2559     if (!expr1)
       
  2560         return NULL;
       
  2561     if (n_children >= 4) {
       
  2562         globals = ast_for_expr(c, CHILD(n, 3));
       
  2563         if (!globals)
       
  2564             return NULL;
       
  2565     }
       
  2566     if (n_children == 6) {
       
  2567         locals = ast_for_expr(c, CHILD(n, 5));
       
  2568         if (!locals)
       
  2569             return NULL;
       
  2570     }
       
  2571 
       
  2572     return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
       
  2573                 c->c_arena);
       
  2574 }
       
  2575 
       
  2576 static stmt_ty
       
  2577 ast_for_assert_stmt(struct compiling *c, const node *n)
       
  2578 {
       
  2579     /* assert_stmt: 'assert' test [',' test] */
       
  2580     REQ(n, assert_stmt);
       
  2581     if (NCH(n) == 2) {
       
  2582         expr_ty expression = ast_for_expr(c, CHILD(n, 1));
       
  2583         if (!expression)
       
  2584             return NULL;
       
  2585         return Assert(expression, NULL, LINENO(n), n->n_col_offset,
       
  2586                       c->c_arena);
       
  2587     }
       
  2588     else if (NCH(n) == 4) {
       
  2589         expr_ty expr1, expr2;
       
  2590 
       
  2591         expr1 = ast_for_expr(c, CHILD(n, 1));
       
  2592         if (!expr1)
       
  2593             return NULL;
       
  2594         expr2 = ast_for_expr(c, CHILD(n, 3));
       
  2595         if (!expr2)
       
  2596             return NULL;
       
  2597             
       
  2598         return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
       
  2599     }
       
  2600     PyErr_Format(PyExc_SystemError,
       
  2601                  "improper number of parts to 'assert' statement: %d",
       
  2602                  NCH(n));
       
  2603     return NULL;
       
  2604 }
       
  2605 
       
  2606 static asdl_seq *
       
  2607 ast_for_suite(struct compiling *c, const node *n)
       
  2608 {
       
  2609     /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
       
  2610     asdl_seq *seq;
       
  2611     stmt_ty s;
       
  2612     int i, total, num, end, pos = 0;
       
  2613     node *ch;
       
  2614 
       
  2615     REQ(n, suite);
       
  2616 
       
  2617     total = num_stmts(n);
       
  2618     seq = asdl_seq_new(total, c->c_arena);
       
  2619     if (!seq)
       
  2620         return NULL;
       
  2621     if (TYPE(CHILD(n, 0)) == simple_stmt) {
       
  2622         n = CHILD(n, 0);
       
  2623         /* simple_stmt always ends with a NEWLINE,
       
  2624            and may have a trailing SEMI 
       
  2625         */
       
  2626         end = NCH(n) - 1;
       
  2627         if (TYPE(CHILD(n, end - 1)) == SEMI)
       
  2628             end--;
       
  2629         /* loop by 2 to skip semi-colons */
       
  2630         for (i = 0; i < end; i += 2) {
       
  2631             ch = CHILD(n, i);
       
  2632             s = ast_for_stmt(c, ch);
       
  2633             if (!s)
       
  2634                 return NULL;
       
  2635             asdl_seq_SET(seq, pos++, s);
       
  2636         }
       
  2637     }
       
  2638     else {
       
  2639         for (i = 2; i < (NCH(n) - 1); i++) {
       
  2640             ch = CHILD(n, i);
       
  2641             REQ(ch, stmt);
       
  2642             num = num_stmts(ch);
       
  2643             if (num == 1) {
       
  2644                 /* small_stmt or compound_stmt with only one child */
       
  2645                 s = ast_for_stmt(c, ch);
       
  2646                 if (!s)
       
  2647                     return NULL;
       
  2648                 asdl_seq_SET(seq, pos++, s);
       
  2649             }
       
  2650             else {
       
  2651                 int j;
       
  2652                 ch = CHILD(ch, 0);
       
  2653                 REQ(ch, simple_stmt);
       
  2654                 for (j = 0; j < NCH(ch); j += 2) {
       
  2655                     /* statement terminates with a semi-colon ';' */
       
  2656                     if (NCH(CHILD(ch, j)) == 0) {
       
  2657                         assert((j + 1) == NCH(ch));
       
  2658                         break;
       
  2659                     }
       
  2660                     s = ast_for_stmt(c, CHILD(ch, j));
       
  2661                     if (!s)
       
  2662                         return NULL;
       
  2663                     asdl_seq_SET(seq, pos++, s);
       
  2664                 }
       
  2665             }
       
  2666         }
       
  2667     }
       
  2668     assert(pos == seq->size);
       
  2669     return seq;
       
  2670 }
       
  2671 
       
  2672 static stmt_ty
       
  2673 ast_for_if_stmt(struct compiling *c, const node *n)
       
  2674 {
       
  2675     /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
       
  2676        ['else' ':' suite]
       
  2677     */
       
  2678     char *s;
       
  2679 
       
  2680     REQ(n, if_stmt);
       
  2681 
       
  2682     if (NCH(n) == 4) {
       
  2683         expr_ty expression;
       
  2684         asdl_seq *suite_seq;
       
  2685 
       
  2686         expression = ast_for_expr(c, CHILD(n, 1));
       
  2687         if (!expression)
       
  2688             return NULL;
       
  2689         suite_seq = ast_for_suite(c, CHILD(n, 3)); 
       
  2690         if (!suite_seq)
       
  2691             return NULL;
       
  2692             
       
  2693         return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
       
  2694                   c->c_arena);
       
  2695     }
       
  2696 
       
  2697     s = STR(CHILD(n, 4));
       
  2698     /* s[2], the third character in the string, will be
       
  2699        's' for el_s_e, or
       
  2700        'i' for el_i_f
       
  2701     */
       
  2702     if (s[2] == 's') {
       
  2703         expr_ty expression;
       
  2704         asdl_seq *seq1, *seq2;
       
  2705 
       
  2706         expression = ast_for_expr(c, CHILD(n, 1));
       
  2707         if (!expression)
       
  2708             return NULL;
       
  2709         seq1 = ast_for_suite(c, CHILD(n, 3));
       
  2710         if (!seq1)
       
  2711             return NULL;
       
  2712         seq2 = ast_for_suite(c, CHILD(n, 6));
       
  2713         if (!seq2)
       
  2714             return NULL;
       
  2715 
       
  2716         return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
       
  2717                   c->c_arena);
       
  2718     }
       
  2719     else if (s[2] == 'i') {
       
  2720         int i, n_elif, has_else = 0;
       
  2721         expr_ty expression;
       
  2722         asdl_seq *suite_seq;
       
  2723         asdl_seq *orelse = NULL;
       
  2724         n_elif = NCH(n) - 4;
       
  2725         /* must reference the child n_elif+1 since 'else' token is third,
       
  2726            not fourth, child from the end. */
       
  2727         if (TYPE(CHILD(n, (n_elif + 1))) == NAME
       
  2728             && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
       
  2729             has_else = 1;
       
  2730             n_elif -= 3;
       
  2731         }
       
  2732         n_elif /= 4;
       
  2733 
       
  2734         if (has_else) {
       
  2735             asdl_seq *suite_seq2;
       
  2736 
       
  2737             orelse = asdl_seq_new(1, c->c_arena);
       
  2738             if (!orelse)
       
  2739                 return NULL;
       
  2740             expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
       
  2741             if (!expression)
       
  2742                 return NULL;
       
  2743             suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
       
  2744             if (!suite_seq)
       
  2745                 return NULL;
       
  2746             suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
       
  2747             if (!suite_seq2)
       
  2748                 return NULL;
       
  2749 
       
  2750             asdl_seq_SET(orelse, 0, 
       
  2751                          If(expression, suite_seq, suite_seq2, 
       
  2752                             LINENO(CHILD(n, NCH(n) - 6)),
       
  2753                             CHILD(n, NCH(n) - 6)->n_col_offset,
       
  2754                             c->c_arena));
       
  2755             /* the just-created orelse handled the last elif */
       
  2756             n_elif--;
       
  2757         }
       
  2758 
       
  2759         for (i = 0; i < n_elif; i++) {
       
  2760             int off = 5 + (n_elif - i - 1) * 4;
       
  2761             asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
       
  2762             if (!newobj)
       
  2763                 return NULL;
       
  2764             expression = ast_for_expr(c, CHILD(n, off));
       
  2765             if (!expression)
       
  2766                 return NULL;
       
  2767             suite_seq = ast_for_suite(c, CHILD(n, off + 2));
       
  2768             if (!suite_seq)
       
  2769                 return NULL;
       
  2770 
       
  2771             asdl_seq_SET(newobj, 0,
       
  2772                          If(expression, suite_seq, orelse, 
       
  2773                             LINENO(CHILD(n, off)),
       
  2774                             CHILD(n, off)->n_col_offset, c->c_arena));
       
  2775             orelse = newobj;
       
  2776         }
       
  2777         expression = ast_for_expr(c, CHILD(n, 1));
       
  2778         if (!expression)
       
  2779             return NULL;
       
  2780         suite_seq = ast_for_suite(c, CHILD(n, 3));
       
  2781         if (!suite_seq)
       
  2782             return NULL;
       
  2783         return If(expression, suite_seq, orelse,
       
  2784                   LINENO(n), n->n_col_offset, c->c_arena);
       
  2785     }
       
  2786 
       
  2787     PyErr_Format(PyExc_SystemError,
       
  2788                  "unexpected token in 'if' statement: %s", s);
       
  2789     return NULL;
       
  2790 }
       
  2791 
       
  2792 static stmt_ty
       
  2793 ast_for_while_stmt(struct compiling *c, const node *n)
       
  2794 {
       
  2795     /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
       
  2796     REQ(n, while_stmt);
       
  2797 
       
  2798     if (NCH(n) == 4) {
       
  2799         expr_ty expression;
       
  2800         asdl_seq *suite_seq;
       
  2801 
       
  2802         expression = ast_for_expr(c, CHILD(n, 1));
       
  2803         if (!expression)
       
  2804             return NULL;
       
  2805         suite_seq = ast_for_suite(c, CHILD(n, 3));
       
  2806         if (!suite_seq)
       
  2807             return NULL;
       
  2808         return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
       
  2809                      c->c_arena);
       
  2810     }
       
  2811     else if (NCH(n) == 7) {
       
  2812         expr_ty expression;
       
  2813         asdl_seq *seq1, *seq2;
       
  2814 
       
  2815         expression = ast_for_expr(c, CHILD(n, 1));
       
  2816         if (!expression)
       
  2817             return NULL;
       
  2818         seq1 = ast_for_suite(c, CHILD(n, 3));
       
  2819         if (!seq1)
       
  2820             return NULL;
       
  2821         seq2 = ast_for_suite(c, CHILD(n, 6));
       
  2822         if (!seq2)
       
  2823             return NULL;
       
  2824 
       
  2825         return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
       
  2826                      c->c_arena);
       
  2827     }
       
  2828 
       
  2829     PyErr_Format(PyExc_SystemError,
       
  2830                  "wrong number of tokens for 'while' statement: %d",
       
  2831                  NCH(n));
       
  2832     return NULL;
       
  2833 }
       
  2834 
       
  2835 static stmt_ty
       
  2836 ast_for_for_stmt(struct compiling *c, const node *n)
       
  2837 {
       
  2838     asdl_seq *_target, *seq = NULL, *suite_seq;
       
  2839     expr_ty expression;
       
  2840     expr_ty target;
       
  2841     const node *node_target;
       
  2842     /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
       
  2843     REQ(n, for_stmt);
       
  2844 
       
  2845     if (NCH(n) == 9) {
       
  2846         seq = ast_for_suite(c, CHILD(n, 8));
       
  2847         if (!seq)
       
  2848             return NULL;
       
  2849     }
       
  2850 
       
  2851     node_target = CHILD(n, 1);
       
  2852     _target = ast_for_exprlist(c, node_target, Store);
       
  2853     if (!_target)
       
  2854         return NULL;
       
  2855     /* Check the # of children rather than the length of _target, since
       
  2856        for x, in ... has 1 element in _target, but still requires a Tuple. */
       
  2857     if (NCH(node_target) == 1)
       
  2858         target = (expr_ty)asdl_seq_GET(_target, 0);
       
  2859     else
       
  2860         target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
       
  2861 
       
  2862     expression = ast_for_testlist(c, CHILD(n, 3));
       
  2863     if (!expression)
       
  2864         return NULL;
       
  2865     suite_seq = ast_for_suite(c, CHILD(n, 5));
       
  2866     if (!suite_seq)
       
  2867         return NULL;
       
  2868 
       
  2869     return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
       
  2870                c->c_arena);
       
  2871 }
       
  2872 
       
  2873 static excepthandler_ty
       
  2874 ast_for_except_clause(struct compiling *c, const node *exc, node *body)
       
  2875 {
       
  2876     /* except_clause: 'except' [test [(',' | 'as') test]] */
       
  2877     REQ(exc, except_clause);
       
  2878     REQ(body, suite);
       
  2879 
       
  2880     if (NCH(exc) == 1) {
       
  2881         asdl_seq *suite_seq = ast_for_suite(c, body);
       
  2882         if (!suite_seq)
       
  2883             return NULL;
       
  2884 
       
  2885         return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
       
  2886                              exc->n_col_offset, c->c_arena);
       
  2887     }
       
  2888     else if (NCH(exc) == 2) {
       
  2889         expr_ty expression;
       
  2890         asdl_seq *suite_seq;
       
  2891 
       
  2892         expression = ast_for_expr(c, CHILD(exc, 1));
       
  2893         if (!expression)
       
  2894             return NULL;
       
  2895         suite_seq = ast_for_suite(c, body);
       
  2896         if (!suite_seq)
       
  2897             return NULL;
       
  2898 
       
  2899         return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
       
  2900                              exc->n_col_offset, c->c_arena);
       
  2901     }
       
  2902     else if (NCH(exc) == 4) {
       
  2903         asdl_seq *suite_seq;
       
  2904         expr_ty expression;
       
  2905         expr_ty e = ast_for_expr(c, CHILD(exc, 3));
       
  2906         if (!e)
       
  2907             return NULL;
       
  2908         if (!set_context(c, e, Store, CHILD(exc, 3)))
       
  2909             return NULL;
       
  2910         expression = ast_for_expr(c, CHILD(exc, 1));
       
  2911         if (!expression)
       
  2912             return NULL;
       
  2913         suite_seq = ast_for_suite(c, body);
       
  2914         if (!suite_seq)
       
  2915             return NULL;
       
  2916 
       
  2917         return ExceptHandler(expression, e, suite_seq, LINENO(exc),
       
  2918                              exc->n_col_offset, c->c_arena);
       
  2919     }
       
  2920 
       
  2921     PyErr_Format(PyExc_SystemError,
       
  2922                  "wrong number of children for 'except' clause: %d",
       
  2923                  NCH(exc));
       
  2924     return NULL;
       
  2925 }
       
  2926 
       
  2927 static stmt_ty
       
  2928 ast_for_try_stmt(struct compiling *c, const node *n)
       
  2929 {
       
  2930     const int nch = NCH(n);
       
  2931     int n_except = (nch - 3)/3;
       
  2932     asdl_seq *body, *orelse = NULL, *finally = NULL;
       
  2933 
       
  2934     REQ(n, try_stmt);
       
  2935 
       
  2936     body = ast_for_suite(c, CHILD(n, 2));
       
  2937     if (body == NULL)
       
  2938         return NULL;
       
  2939 
       
  2940     if (TYPE(CHILD(n, nch - 3)) == NAME) {
       
  2941         if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
       
  2942             if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
       
  2943                 /* we can assume it's an "else",
       
  2944                    because nch >= 9 for try-else-finally and
       
  2945                    it would otherwise have a type of except_clause */
       
  2946                 orelse = ast_for_suite(c, CHILD(n, nch - 4));
       
  2947                 if (orelse == NULL)
       
  2948                     return NULL;
       
  2949                 n_except--;
       
  2950             }
       
  2951 
       
  2952             finally = ast_for_suite(c, CHILD(n, nch - 1));
       
  2953             if (finally == NULL)
       
  2954                 return NULL;
       
  2955             n_except--;
       
  2956         }
       
  2957         else {
       
  2958             /* we can assume it's an "else",
       
  2959                otherwise it would have a type of except_clause */
       
  2960             orelse = ast_for_suite(c, CHILD(n, nch - 1));
       
  2961             if (orelse == NULL)
       
  2962                 return NULL;
       
  2963             n_except--;
       
  2964         }
       
  2965     }
       
  2966     else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
       
  2967         ast_error(n, "malformed 'try' statement");
       
  2968         return NULL;
       
  2969     }
       
  2970     
       
  2971     if (n_except > 0) {
       
  2972         int i;
       
  2973         stmt_ty except_st;
       
  2974         /* process except statements to create a try ... except */
       
  2975         asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
       
  2976         if (handlers == NULL)
       
  2977             return NULL;
       
  2978 
       
  2979         for (i = 0; i < n_except; i++) {
       
  2980             excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
       
  2981                                                        CHILD(n, 5 + i * 3));
       
  2982             if (!e)
       
  2983                 return NULL;
       
  2984             asdl_seq_SET(handlers, i, e);
       
  2985         }
       
  2986 
       
  2987         except_st = TryExcept(body, handlers, orelse, LINENO(n),
       
  2988                               n->n_col_offset, c->c_arena);
       
  2989         if (!finally)
       
  2990             return except_st;
       
  2991 
       
  2992         /* if a 'finally' is present too, we nest the TryExcept within a
       
  2993            TryFinally to emulate try ... except ... finally */
       
  2994         body = asdl_seq_new(1, c->c_arena);
       
  2995         if (body == NULL)
       
  2996             return NULL;
       
  2997         asdl_seq_SET(body, 0, except_st);
       
  2998     }
       
  2999 
       
  3000     /* must be a try ... finally (except clauses are in body, if any exist) */
       
  3001     assert(finally != NULL);
       
  3002     return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
       
  3003 }
       
  3004 
       
  3005 static expr_ty
       
  3006 ast_for_with_var(struct compiling *c, const node *n)
       
  3007 {
       
  3008     REQ(n, with_var);
       
  3009     return ast_for_expr(c, CHILD(n, 1));
       
  3010 }
       
  3011 
       
  3012 /* with_stmt: 'with' test [ with_var ] ':' suite */
       
  3013 static stmt_ty
       
  3014 ast_for_with_stmt(struct compiling *c, const node *n)
       
  3015 {
       
  3016     expr_ty context_expr, optional_vars = NULL;
       
  3017     int suite_index = 3;    /* skip 'with', test, and ':' */
       
  3018     asdl_seq *suite_seq;
       
  3019 
       
  3020     assert(TYPE(n) == with_stmt);
       
  3021     context_expr = ast_for_expr(c, CHILD(n, 1));
       
  3022     if (!context_expr)
       
  3023         return NULL;
       
  3024     if (TYPE(CHILD(n, 2)) == with_var) {
       
  3025         optional_vars = ast_for_with_var(c, CHILD(n, 2));
       
  3026 
       
  3027         if (!optional_vars) {
       
  3028             return NULL;
       
  3029         }
       
  3030         if (!set_context(c, optional_vars, Store, n)) {
       
  3031             return NULL;
       
  3032         }
       
  3033         suite_index = 4;
       
  3034     }
       
  3035 
       
  3036     suite_seq = ast_for_suite(c, CHILD(n, suite_index));
       
  3037     if (!suite_seq) {
       
  3038         return NULL;
       
  3039     }
       
  3040     return With(context_expr, optional_vars, suite_seq, LINENO(n), 
       
  3041                 n->n_col_offset, c->c_arena);
       
  3042 }
       
  3043 
       
  3044 static stmt_ty
       
  3045 ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
       
  3046 {
       
  3047     /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
       
  3048     PyObject *classname;
       
  3049     asdl_seq *bases, *s;
       
  3050     
       
  3051     REQ(n, classdef);
       
  3052 
       
  3053     if (!forbidden_check(c, n, STR(CHILD(n, 1))))
       
  3054             return NULL;
       
  3055 
       
  3056     if (NCH(n) == 4) {
       
  3057         s = ast_for_suite(c, CHILD(n, 3));
       
  3058         if (!s)
       
  3059             return NULL;
       
  3060         classname = NEW_IDENTIFIER(CHILD(n, 1));
       
  3061         if (!classname)
       
  3062             return NULL;
       
  3063         return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
       
  3064                         n->n_col_offset, c->c_arena);
       
  3065     }
       
  3066     /* check for empty base list */
       
  3067     if (TYPE(CHILD(n,3)) == RPAR) {
       
  3068         s = ast_for_suite(c, CHILD(n,5));
       
  3069         if (!s)
       
  3070             return NULL;
       
  3071         classname = NEW_IDENTIFIER(CHILD(n, 1));
       
  3072         if (!classname)
       
  3073             return NULL;
       
  3074         return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
       
  3075                         n->n_col_offset, c->c_arena);
       
  3076     }
       
  3077 
       
  3078     /* else handle the base class list */
       
  3079     bases = ast_for_class_bases(c, CHILD(n, 3));
       
  3080     if (!bases)
       
  3081         return NULL;
       
  3082 
       
  3083     s = ast_for_suite(c, CHILD(n, 6));
       
  3084     if (!s)
       
  3085         return NULL;
       
  3086     classname = NEW_IDENTIFIER(CHILD(n, 1));
       
  3087     if (!classname)
       
  3088         return NULL;
       
  3089     return ClassDef(classname, bases, s, decorator_seq,
       
  3090                     LINENO(n), n->n_col_offset, c->c_arena);
       
  3091 }
       
  3092 
       
  3093 static stmt_ty
       
  3094 ast_for_stmt(struct compiling *c, const node *n)
       
  3095 {
       
  3096     if (TYPE(n) == stmt) {
       
  3097         assert(NCH(n) == 1);
       
  3098         n = CHILD(n, 0);
       
  3099     }
       
  3100     if (TYPE(n) == simple_stmt) {
       
  3101         assert(num_stmts(n) == 1);
       
  3102         n = CHILD(n, 0);
       
  3103     }
       
  3104     if (TYPE(n) == small_stmt) {
       
  3105         REQ(n, small_stmt);
       
  3106         n = CHILD(n, 0);
       
  3107         /* small_stmt: expr_stmt | print_stmt  | del_stmt | pass_stmt
       
  3108                      | flow_stmt | import_stmt | global_stmt | exec_stmt
       
  3109                      | assert_stmt
       
  3110         */
       
  3111         switch (TYPE(n)) {
       
  3112             case expr_stmt:
       
  3113                 return ast_for_expr_stmt(c, n);
       
  3114             case print_stmt:
       
  3115                 return ast_for_print_stmt(c, n);
       
  3116             case del_stmt:
       
  3117                 return ast_for_del_stmt(c, n);
       
  3118             case pass_stmt:
       
  3119                 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
       
  3120             case flow_stmt:
       
  3121                 return ast_for_flow_stmt(c, n);
       
  3122             case import_stmt:
       
  3123                 return ast_for_import_stmt(c, n);
       
  3124             case global_stmt:
       
  3125                 return ast_for_global_stmt(c, n);
       
  3126             case exec_stmt:
       
  3127                 return ast_for_exec_stmt(c, n);
       
  3128             case assert_stmt:
       
  3129                 return ast_for_assert_stmt(c, n);
       
  3130             default:
       
  3131                 PyErr_Format(PyExc_SystemError,
       
  3132                              "unhandled small_stmt: TYPE=%d NCH=%d\n",
       
  3133                              TYPE(n), NCH(n));
       
  3134                 return NULL;
       
  3135         }
       
  3136     }
       
  3137     else {
       
  3138         /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
       
  3139                         | funcdef | classdef | decorated
       
  3140         */
       
  3141         node *ch = CHILD(n, 0);
       
  3142         REQ(n, compound_stmt);
       
  3143         switch (TYPE(ch)) {
       
  3144             case if_stmt:
       
  3145                 return ast_for_if_stmt(c, ch);
       
  3146             case while_stmt:
       
  3147                 return ast_for_while_stmt(c, ch);
       
  3148             case for_stmt:
       
  3149                 return ast_for_for_stmt(c, ch);
       
  3150             case try_stmt:
       
  3151                 return ast_for_try_stmt(c, ch);
       
  3152             case with_stmt:
       
  3153                 return ast_for_with_stmt(c, ch);
       
  3154             case funcdef:
       
  3155                 return ast_for_funcdef(c, ch, NULL);
       
  3156             case classdef:
       
  3157                 return ast_for_classdef(c, ch, NULL);
       
  3158 	    case decorated:
       
  3159 	        return ast_for_decorated(c, ch);
       
  3160             default:
       
  3161                 PyErr_Format(PyExc_SystemError,
       
  3162                              "unhandled small_stmt: TYPE=%d NCH=%d\n",
       
  3163                              TYPE(n), NCH(n));
       
  3164                 return NULL;
       
  3165         }
       
  3166     }
       
  3167 }
       
  3168 
       
  3169 static PyObject *
       
  3170 parsenumber(struct compiling *c, const char *s)
       
  3171 {
       
  3172         const char *end;
       
  3173         long x;
       
  3174         double dx;
       
  3175 #ifndef WITHOUT_COMPLEX
       
  3176         Py_complex complex;
       
  3177         int imflag;
       
  3178 #endif
       
  3179 
       
  3180         errno = 0;
       
  3181         end = s + strlen(s) - 1;
       
  3182 #ifndef WITHOUT_COMPLEX
       
  3183         imflag = *end == 'j' || *end == 'J';
       
  3184 #endif
       
  3185         if (*end == 'l' || *end == 'L')
       
  3186                 return PyLong_FromString((char *)s, (char **)0, 0);
       
  3187         x = PyOS_strtol((char *)s, (char **)&end, 0);
       
  3188         if (*end == '\0') {
       
  3189                 if (errno != 0)
       
  3190                         return PyLong_FromString((char *)s, (char **)0, 0);
       
  3191                 return PyInt_FromLong(x);
       
  3192         }
       
  3193         /* XXX Huge floats may silently fail */
       
  3194 #ifndef WITHOUT_COMPLEX
       
  3195         if (imflag) {
       
  3196                 complex.real = 0.;
       
  3197                 PyFPE_START_PROTECT("atof", return 0)
       
  3198                 complex.imag = PyOS_ascii_atof(s);
       
  3199                 PyFPE_END_PROTECT(complex)
       
  3200                 return PyComplex_FromCComplex(complex);
       
  3201         }
       
  3202         else
       
  3203 #endif
       
  3204         {
       
  3205                 PyFPE_START_PROTECT("atof", return 0)
       
  3206                 dx = PyOS_ascii_atof(s);
       
  3207                 PyFPE_END_PROTECT(dx)
       
  3208                 return PyFloat_FromDouble(dx);
       
  3209         }
       
  3210 }
       
  3211 
       
  3212 static PyObject *
       
  3213 decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
       
  3214 {
       
  3215 #ifndef Py_USING_UNICODE
       
  3216         Py_FatalError("decode_utf8 should not be called in this build.");
       
  3217         return NULL;
       
  3218 #else
       
  3219         PyObject *u, *v;
       
  3220         char *s, *t;
       
  3221         t = s = (char *)*sPtr;
       
  3222         /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
       
  3223         while (s < end && (*s & 0x80)) s++;
       
  3224         *sPtr = s;
       
  3225         u = PyUnicode_DecodeUTF8(t, s - t, NULL);
       
  3226         if (u == NULL)
       
  3227                 return NULL;
       
  3228         v = PyUnicode_AsEncodedString(u, encoding, NULL);
       
  3229         Py_DECREF(u);
       
  3230         return v;
       
  3231 #endif
       
  3232 }
       
  3233 
       
  3234 #ifdef Py_USING_UNICODE
       
  3235 static PyObject *
       
  3236 decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
       
  3237 {
       
  3238         PyObject *v, *u;
       
  3239         char *buf;
       
  3240         char *p;
       
  3241         const char *end;
       
  3242         if (encoding == NULL) {
       
  3243                 buf = (char *)s;
       
  3244                 u = NULL;
       
  3245         } else if (strcmp(encoding, "iso-8859-1") == 0) {
       
  3246                 buf = (char *)s;
       
  3247                 u = NULL;
       
  3248         } else {
       
  3249                 /* check for integer overflow */
       
  3250                 if (len > PY_SIZE_MAX / 4)
       
  3251                         return NULL;
       
  3252                 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
       
  3253                 u = PyString_FromStringAndSize((char *)NULL, len * 4);
       
  3254                 if (u == NULL)
       
  3255                         return NULL;
       
  3256                 p = buf = PyString_AsString(u);
       
  3257                 end = s + len;
       
  3258                 while (s < end) {
       
  3259                         if (*s == '\\') {
       
  3260                                 *p++ = *s++;
       
  3261                                 if (*s & 0x80) {
       
  3262                                         strcpy(p, "u005c");
       
  3263                                         p += 5;
       
  3264                                 }
       
  3265                         }
       
  3266                         if (*s & 0x80) { /* XXX inefficient */
       
  3267                                 PyObject *w;
       
  3268                                 char *r;
       
  3269                                 Py_ssize_t rn, i;
       
  3270                                 w = decode_utf8(c, &s, end, "utf-16-be");
       
  3271                                 if (w == NULL) {
       
  3272                                         Py_DECREF(u);
       
  3273                                         return NULL;
       
  3274                                 }
       
  3275                                 r = PyString_AsString(w);
       
  3276                                 rn = PyString_Size(w);
       
  3277                                 assert(rn % 2 == 0);
       
  3278                                 for (i = 0; i < rn; i += 2) {
       
  3279                                         sprintf(p, "\\u%02x%02x",
       
  3280                                                 r[i + 0] & 0xFF,
       
  3281                                                 r[i + 1] & 0xFF);
       
  3282                                         p += 6;
       
  3283                                 }
       
  3284                                 Py_DECREF(w);
       
  3285                         } else {
       
  3286                                 *p++ = *s++;
       
  3287                         }
       
  3288                 }
       
  3289                 len = p - buf;
       
  3290                 s = buf;
       
  3291         }
       
  3292         if (rawmode)
       
  3293                 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
       
  3294         else
       
  3295                 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
       
  3296         Py_XDECREF(u);
       
  3297         return v;
       
  3298 }
       
  3299 #endif
       
  3300 
       
  3301 /* s is a Python string literal, including the bracketing quote characters,
       
  3302  * and r &/or u prefixes (if any), and embedded escape sequences (if any).
       
  3303  * parsestr parses it, and returns the decoded Python string object.
       
  3304  */
       
  3305 static PyObject *
       
  3306 parsestr(struct compiling *c, const char *s)
       
  3307 {
       
  3308         size_t len;
       
  3309         int quote = Py_CHARMASK(*s);
       
  3310         int rawmode = 0;
       
  3311         int need_encoding;
       
  3312         int unicode = c->c_future_unicode;
       
  3313 
       
  3314         if (isalpha(quote) || quote == '_') {
       
  3315                 if (quote == 'u' || quote == 'U') {
       
  3316                         quote = *++s;
       
  3317                         unicode = 1;
       
  3318                 }
       
  3319                 if (quote == 'b' || quote == 'B') {
       
  3320                         quote = *++s;
       
  3321                         unicode = 0;
       
  3322                 }
       
  3323                 if (quote == 'r' || quote == 'R') {
       
  3324                         quote = *++s;
       
  3325                         rawmode = 1;
       
  3326                 }
       
  3327         }
       
  3328         if (quote != '\'' && quote != '\"') {
       
  3329                 PyErr_BadInternalCall();
       
  3330                 return NULL;
       
  3331         }
       
  3332         s++;
       
  3333         len = strlen(s);
       
  3334         if (len > INT_MAX) {
       
  3335                 PyErr_SetString(PyExc_OverflowError, 
       
  3336                                 "string to parse is too long");
       
  3337                 return NULL;
       
  3338         }
       
  3339         if (s[--len] != quote) {
       
  3340                 PyErr_BadInternalCall();
       
  3341                 return NULL;
       
  3342         }
       
  3343         if (len >= 4 && s[0] == quote && s[1] == quote) {
       
  3344                 s += 2;
       
  3345                 len -= 2;
       
  3346                 if (s[--len] != quote || s[--len] != quote) {
       
  3347                         PyErr_BadInternalCall();
       
  3348                         return NULL;
       
  3349                 }
       
  3350         }
       
  3351 #ifdef Py_USING_UNICODE
       
  3352         if (unicode || Py_UnicodeFlag) {
       
  3353                 return decode_unicode(c, s, len, rawmode, c->c_encoding);
       
  3354         }
       
  3355 #endif
       
  3356         need_encoding = (c->c_encoding != NULL &&
       
  3357                          strcmp(c->c_encoding, "utf-8") != 0 &&
       
  3358                          strcmp(c->c_encoding, "iso-8859-1") != 0);
       
  3359         if (rawmode || strchr(s, '\\') == NULL) {
       
  3360                 if (need_encoding) {
       
  3361 #ifndef Py_USING_UNICODE
       
  3362                         /* This should not happen - we never see any other
       
  3363                            encoding. */
       
  3364                         Py_FatalError(
       
  3365                             "cannot deal with encodings in this build.");
       
  3366 #else
       
  3367                         PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
       
  3368                         if (u == NULL)
       
  3369                                 return NULL;
       
  3370                         v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
       
  3371                         Py_DECREF(u);
       
  3372                         return v;
       
  3373 #endif
       
  3374                 } else {
       
  3375                         return PyString_FromStringAndSize(s, len);
       
  3376                 }
       
  3377         }
       
  3378 
       
  3379         return PyString_DecodeEscape(s, len, NULL, unicode,
       
  3380                                      need_encoding ? c->c_encoding : NULL);
       
  3381 }
       
  3382 
       
  3383 /* Build a Python string object out of a STRING atom.  This takes care of
       
  3384  * compile-time literal catenation, calling parsestr() on each piece, and
       
  3385  * pasting the intermediate results together.
       
  3386  */
       
  3387 static PyObject *
       
  3388 parsestrplus(struct compiling *c, const node *n)
       
  3389 {
       
  3390         PyObject *v;
       
  3391         int i;
       
  3392         REQ(CHILD(n, 0), STRING);
       
  3393         if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
       
  3394                 /* String literal concatenation */
       
  3395                 for (i = 1; i < NCH(n); i++) {
       
  3396                         PyObject *s;
       
  3397                         s = parsestr(c, STR(CHILD(n, i)));
       
  3398                         if (s == NULL)
       
  3399                                 goto onError;
       
  3400                         if (PyString_Check(v) && PyString_Check(s)) {
       
  3401                                 PyString_ConcatAndDel(&v, s);
       
  3402                                 if (v == NULL)
       
  3403                                     goto onError;
       
  3404                         }
       
  3405 #ifdef Py_USING_UNICODE
       
  3406                         else {
       
  3407                                 PyObject *temp = PyUnicode_Concat(v, s);
       
  3408                                 Py_DECREF(s);
       
  3409                                 Py_DECREF(v);
       
  3410                                 v = temp;
       
  3411                                 if (v == NULL)
       
  3412                                     goto onError;
       
  3413                         }
       
  3414 #endif
       
  3415                 }
       
  3416         }
       
  3417         return v;
       
  3418 
       
  3419  onError:
       
  3420         Py_XDECREF(v);
       
  3421         return NULL;
       
  3422 }